summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl
diff options
context:
space:
mode:
authorSiep Kroonenberg <siepo@cybercomm.nl>2011-02-17 17:32:35 +0000
committerSiep Kroonenberg <siepo@cybercomm.nl>2011-02-17 17:32:35 +0000
commit539135f1864a2356d0eb3666e0f5b335680872a4 (patch)
tree3b214294c17073dfdfbdba13b72b6fa2d10a0a6e /Master/tlpkg/tlperl
parent227723589c9564b9b2b7042dd27eb9aad56a560a (diff)
New tlperl part XII
git-svn-id: svn://tug.org/texlive/trunk@21434 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/tlperl')
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/EXTERN.h61
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/INTERN.h54
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/XSUB.h668
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/arpa/inet.h4
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/av.h100
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/bitcount.h18
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/cc_runtime.h85
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/config.h4647
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/cop.h928
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/cv.h197
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/dirent.h53
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/dosish.h214
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/embed.h4956
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/embedvar.h875
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/fakesdio.h133
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/fakethr.h75
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/form.h27
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/git_version.h8
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/gv.h223
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/handy.h960
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/hv.h546
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/intrpvar.h731
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/iperlsys.h1423
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/keywords.h269
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/libperl512.abin0 -> 1053702 bytes
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/malloc_ctl.h64
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/mg.h72
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/mydtrace.h42
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/netdb.h12
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/nostdio.h136
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/op.h749
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/opcode.h1931
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/opnames.h405
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/overload.h90
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/pad.h371
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/parser.h122
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/patchlevel.h147
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perl.h6158
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perlapi.h861
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perlhost.h2469
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perlio.h394
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perliol.h297
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perlsdio.h164
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perlsfio.h84
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perlvars.h243
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/perly.h226
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/pp.h551
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/pp_proto.h414
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/proto.h6840
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/reentr.h1509
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/regcharclass.h454
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/regcomp.h850
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/regexp.h736
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/regnodes.h664
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/scope.h278
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/sv.h2014
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/sys/socket.h189
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/thread.h448
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/time64.h66
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/time64_config.h85
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/uconfig.h4595
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/unixish.h156
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/utf8.h364
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/utfebcdic.h485
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/util.h49
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/uudmap.h18
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/vdir.h726
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/vmem.h1259
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/warnings.h130
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/win32.h615
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/win32iop-o.h340
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/win32iop.h347
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/win32thread.h197
-rw-r--r--Master/tlpkg/tlperl/lib/CORE/wince.h146
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build.pm1128
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/API.pod1885
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Authoring.pod323
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Base.pm5287
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Bundling.pod147
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Compat.pm628
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Config.pm59
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/ConfigData.pm220
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Cookbook.pm529
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Dumper.pm19
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/ModuleInfo.pm491
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Notes.pm332
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/PPMMaker.pm189
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/Amiga.pm34
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/Default.pm33
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/EBCDIC.pm34
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/MPEiX.pm34
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/MacOS.pm152
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/RiscOS.pm34
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/Unix.pm73
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/VMS.pm539
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/VOS.pm34
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/Windows.pm320
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/aix.pm40
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/cygwin.pm55
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/darwin.pm40
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Platform/os2.pm49
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/PodParser.pm106
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/Version.pm684
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Build/YAML.pm600
-rw-r--r--Master/tlpkg/tlperl/lib/Module/CoreList.pm22855
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Load.pm181
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Load/Conditional.pm654
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Loaded.pm142
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Pluggable.pm355
-rw-r--r--Master/tlpkg/tlperl/lib/Module/Pluggable/Object.pm373
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Checker.pm1268
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Escapes.pm721
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Find.pm535
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Functions.pm376
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Html.pm2235
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/InputObjects.pm936
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/LaTeX.pm1876
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Man.pm1764
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/ParseLink.pm192
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/ParseUtils.pm855
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Parser.pm1829
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc.pm1966
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/BaseTo.pm81
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/GetOptsOO.pm148
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToChecker.pm75
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToMan.pm190
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToNroff.pm103
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToPod.pm93
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToRtf.pm88
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToText.pm95
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToTk.pm132
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Perldoc/ToXml.pm66
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/PlainText.pm738
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Plainer.pm100
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Select.pm746
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple.pm1535
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple.pod274
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/BlackBox.pm1930
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Checker.pm196
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Debug.pm178
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsText.pm155
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsXML.pm170
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/HTML.pm978
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/HTMLBatch.pm1370
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/HTMLLegacy.pm104
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/LinkSection.pm174
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Methody.pm152
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Progress.pm93
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/PullParser.pm843
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/PullParserEndToken.pm120
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/PullParserStartToken.pm161
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/PullParserTextToken.pm128
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/PullParserToken.pm163
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/RTF.pm699
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Search.pm1043
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/SimpleTree.pm180
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Subclassing.pod946
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Text.pm185
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/TextContent.pm112
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/TiedOutFH.pm105
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/Transcode.pm35
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeDumb.pm63
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeSmart.pm44
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/XHTML.pm717
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Simple/XMLOutStream.pm185
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Text.pm878
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Text/Color.pm155
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Text/Overstrike.pm208
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Text/Termcap.pm195
-rw-r--r--Master/tlpkg/tlperl/lib/Pod/Usage.pm730
170 files changed, 127887 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl/lib/CORE/EXTERN.h b/Master/tlpkg/tlperl/lib/CORE/EXTERN.h
new file mode 100644
index 00000000000..58ca37a47ff
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/EXTERN.h
@@ -0,0 +1,61 @@
+/* EXTERN.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * EXT designates a global var which is defined in perl.h
+ * dEXT designates a global var which is defined in another
+ * file, so we can't count on finding it in perl.h
+ * (this practice should be avoided).
+ */
+#undef EXT
+#undef dEXT
+#undef EXTCONST
+#undef dEXTCONST
+#if defined(VMS) && !defined(__GNUC__)
+ /* Suppress portability warnings from DECC for VMS-specific extensions */
+# ifdef __DECC
+# pragma message disable (GLOBALEXT,NOSHAREEXT,READONLYEXT)
+# endif
+# define EXT globalref
+# define dEXT globaldef {"$GLOBAL_RW_VARS"} noshare
+# define EXTCONST globalref
+# define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+#else
+# if (defined(WIN32) || defined(__SYMBIAN32__)) && !defined(PERL_STATIC_SYMS)
+# if defined(PERLDLL) || defined(__SYMBIAN32__)
+# define EXT extern __declspec(dllexport)
+# define dEXT
+# define EXTCONST extern __declspec(dllexport) const
+# define dEXTCONST const
+# else
+# define EXT extern __declspec(dllimport)
+# define dEXT
+# define EXTCONST extern __declspec(dllimport) const
+# define dEXTCONST const
+# endif
+# else
+# if defined(__CYGWIN__) && defined(USEIMPORTLIB)
+# define EXT extern __declspec(dllimport)
+# define dEXT
+# define EXTCONST extern __declspec(dllimport) const
+# define dEXTCONST const
+# else
+# define EXT extern
+# define dEXT
+# define EXTCONST extern const
+# define dEXTCONST const
+# endif
+# endif
+#endif
+
+#undef INIT
+#define INIT(x)
+
+#undef DOINIT
diff --git a/Master/tlpkg/tlperl/lib/CORE/INTERN.h b/Master/tlpkg/tlperl/lib/CORE/INTERN.h
new file mode 100644
index 00000000000..da3057a83c6
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/INTERN.h
@@ -0,0 +1,54 @@
+/* INTERN.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1995, 1996, 1998, 2000, 2001,
+ * by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * EXT designates a global var which is defined in perl.h
+ * dEXT designates a global var which is defined in another
+ * file, so we can't count on finding it in perl.h
+ * (this practice should be avoided).
+ */
+#undef EXT
+#undef dEXT
+#undef EXTCONST
+#undef dEXTCONST
+#if defined(VMS) && !defined(__GNUC__)
+ /* Suppress portability warnings from DECC for VMS-specific extensions */
+# ifdef __DECC
+# pragma message disable (GLOBALEXT,NOSHAREEXT,READONLYEXT)
+# endif
+# define EXT globaldef {"$GLOBAL_RW_VARS"} noshare
+# define dEXT globaldef {"$GLOBAL_RW_VARS"} noshare
+# define EXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+# define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+#else
+# if (defined(WIN32) && defined(__MINGW32__)) || defined(__SYMBIAN32__)
+# define EXT __declspec(dllexport)
+# define dEXT
+# define EXTCONST __declspec(dllexport) const
+# define dEXTCONST const
+# else
+# ifdef __cplusplus
+# define EXT
+# define dEXT
+# define EXTCONST extern const
+# define dEXTCONST const
+# else
+# define EXT
+# define dEXT
+# define EXTCONST const
+# define dEXTCONST const
+# endif
+# endif
+#endif
+
+#undef INIT
+#define INIT(x) = x
+
+#define DOINIT
diff --git a/Master/tlpkg/tlperl/lib/CORE/XSUB.h b/Master/tlpkg/tlperl/lib/CORE/XSUB.h
new file mode 100644
index 00000000000..0d2c24f8b76
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/XSUB.h
@@ -0,0 +1,668 @@
+/* XSUB.h
+ *
+ * Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ * 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef _INC_PERL_XSUB_H
+#define _INC_PERL_XSUB_H 1
+
+/* first, some documentation for xsubpp-generated items */
+
+/*
+=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+=for apidoc Amn|char*|CLASS
+Variable which is setup by C<xsubpp> to indicate the
+class name for a C++ XS constructor. This is always a C<char*>. See C<THIS>.
+
+=for apidoc Amn|(whatever)|RETVAL
+Variable which is setup by C<xsubpp> to hold the return value for an
+XSUB. This is always the proper type for the XSUB. See
+L<perlxs/"The RETVAL Variable">.
+
+=for apidoc Amn|(whatever)|THIS
+Variable which is setup by C<xsubpp> to designate the object in a C++
+XSUB. This is always the proper type for the C++ object. See C<CLASS> and
+L<perlxs/"Using XS With C++">.
+
+=for apidoc Amn|I32|ax
+Variable which is setup by C<xsubpp> to indicate the stack base offset,
+used by the C<ST>, C<XSprePUSH> and C<XSRETURN> macros. The C<dMARK> macro
+must be called prior to setup the C<MARK> variable.
+
+=for apidoc Amn|I32|items
+Variable which is setup by C<xsubpp> to indicate the number of
+items on the stack. See L<perlxs/"Variable-length Parameter Lists">.
+
+=for apidoc Amn|I32|ix
+Variable which is setup by C<xsubpp> to indicate which of an
+XSUB's aliases was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
+
+=for apidoc Am|SV*|ST|int ix
+Used to access elements on the XSUB's stack.
+
+=for apidoc AmU||XS
+Macro to declare an XSUB and its C parameter list. This is handled by
+C<xsubpp>.
+
+=for apidoc Ams||dAX
+Sets up the C<ax> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+=for apidoc Ams||dAXMARK
+Sets up the C<ax> variable and stack marker variable C<mark>.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+=for apidoc Ams||dITEMS
+Sets up the C<items> variable.
+This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
+
+=for apidoc Ams||dXSARGS
+Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.
+Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
+This is usually handled automatically by C<xsubpp>.
+
+=for apidoc Ams||dXSI32
+Sets up the C<ix> variable for an XSUB which has aliases. This is usually
+handled automatically by C<xsubpp>.
+
+=for apidoc Ams||dUNDERBAR
+Sets up the C<padoff_du> variable for an XSUB that wishes to use
+C<UNDERBAR>.
+
+=for apidoc AmU||UNDERBAR
+The SV* corresponding to the $_ variable. Works even if there
+is a lexical $_ in scope.
+
+=cut
+*/
+
+#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
+
+#define ST(off) PL_stack_base[ax + (off)]
+
+/* XSPROTO() is also used by SWIG like this:
+ *
+ * typedef XSPROTO(SwigPerlWrapper);
+ * typedef SwigPerlWrapper *SwigPerlWrapperPtr;
+ *
+ * This code needs to be compilable under both C and C++.
+ *
+ * Don't forget to change the __attribute__unused__ version of XS()
+ * below too if you change XSPROTO() here.
+ */
+#define XSPROTO(name) void name(pTHX_ CV* cv)
+
+#undef XS
+#if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
+# define XS(name) __declspec(dllexport) XSPROTO(name)
+#endif
+#if defined(__SYMBIAN32__)
+# define XS(name) EXPORT_C XSPROTO(name)
+#endif
+#ifndef XS
+# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
+# define XS(name) void name(pTHX_ CV* cv __attribute__unused__)
+# else
+# ifdef __cplusplus
+# define XS(name) extern "C" XSPROTO(name)
+# else
+# define XS(name) XSPROTO(name)
+# endif
+# endif
+#endif
+
+#define dAX const I32 ax = (I32)(MARK - PL_stack_base + 1)
+
+#define dAXMARK \
+ I32 ax = POPMARK; \
+ register SV **mark = PL_stack_base + ax++
+
+#define dITEMS I32 items = (I32)(SP - MARK)
+
+#if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+# define dXSARGS \
+ NOTE(ARGUNUSED(cv)) \
+ dSP; dAXMARK; dITEMS
+#else
+# define dXSARGS \
+ dSP; dAXMARK; dITEMS
+#endif
+
+#define dXSTARG SV * const targ = ((PL_op->op_private & OPpENTERSUB_HASTARG) \
+ ? PAD_SV(PL_op->op_targ) : sv_newmortal())
+
+/* Should be used before final PUSHi etc. if not in PPCODE section. */
+#define XSprePUSH (sp = PL_stack_base + ax - 1)
+
+#define XSANY CvXSUBANY(cv)
+
+#define dXSI32 I32 ix = XSANY.any_i32
+
+#ifdef __cplusplus
+# define XSINTERFACE_CVT(ret,name) ret (*name)(...)
+# define XSINTERFACE_CVT_ANON(ret) ret (*)(...)
+#else
+# define XSINTERFACE_CVT(ret,name) ret (*name)()
+# define XSINTERFACE_CVT_ANON(ret) ret (*)()
+#endif
+#define dXSFUNCTION(ret) XSINTERFACE_CVT(ret,XSFUNCTION)
+#define XSINTERFACE_FUNC(ret,cv,f) ((XSINTERFACE_CVT_ANON(ret))(f))
+#define XSINTERFACE_FUNC_SET(cv,f) \
+ CvXSUBANY(cv).any_dxptr = (void (*) (pTHX_ void*))(f)
+
+#define dUNDERBAR PADOFFSET padoff_du = find_rundefsvoffset()
+#define UNDERBAR ((padoff_du == NOT_IN_PAD \
+ || PAD_COMPNAME_FLAGS_isOUR(padoff_du)) \
+ ? DEFSV : PAD_SVl(padoff_du))
+
+/* Simple macros to put new mortal values onto the stack. */
+/* Typically used to return values from XS functions. */
+
+/*
+=head1 Stack Manipulation Macros
+
+=for apidoc Am|void|XST_mIV|int pos|IV iv
+Place an integer into the specified position C<pos> on the stack. The
+value is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mNV|int pos|NV nv
+Place a double into the specified position C<pos> on the stack. The value
+is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mPV|int pos|char* str
+Place a copy of a string into the specified position C<pos> on the stack.
+The value is stored in a new mortal SV.
+
+=for apidoc Am|void|XST_mNO|int pos
+Place C<&PL_sv_no> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XST_mYES|int pos
+Place C<&PL_sv_yes> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XST_mUNDEF|int pos
+Place C<&PL_sv_undef> into the specified position C<pos> on the
+stack.
+
+=for apidoc Am|void|XSRETURN|int nitems
+Return from XSUB, indicating number of items on the stack. This is usually
+handled by C<xsubpp>.
+
+=for apidoc Am|void|XSRETURN_IV|IV iv
+Return an integer from an XSUB immediately. Uses C<XST_mIV>.
+
+=for apidoc Am|void|XSRETURN_UV|IV uv
+Return an integer from an XSUB immediately. Uses C<XST_mUV>.
+
+=for apidoc Am|void|XSRETURN_NV|NV nv
+Return a double from an XSUB immediately. Uses C<XST_mNV>.
+
+=for apidoc Am|void|XSRETURN_PV|char* str
+Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
+
+=for apidoc Ams||XSRETURN_NO
+Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
+
+=for apidoc Ams||XSRETURN_YES
+Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
+
+=for apidoc Ams||XSRETURN_UNDEF
+Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
+
+=for apidoc Ams||XSRETURN_EMPTY
+Return an empty list from an XSUB immediately.
+
+=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
+
+=for apidoc AmU||newXSproto|char* name|XSUBADDR_t f|char* filename|const char *proto
+Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
+the subs.
+
+=for apidoc AmU||XS_VERSION
+The version identifier for an XS module. This is usually
+handled automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
+
+=for apidoc Ams||XS_VERSION_BOOTCHECK
+Macro to verify that a PM module's $VERSION variable matches the XS
+module's C<XS_VERSION> variable. This is usually handled automatically by
+C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
+
+=head1 Simple Exception Handling Macros
+
+=for apidoc Ams||dXCPT
+Set up necessary local variables for exception handling.
+See L<perlguts/"Exception Handling">.
+
+=for apidoc AmU||XCPT_TRY_START
+Starts a try block. See L<perlguts/"Exception Handling">.
+
+=for apidoc AmU||XCPT_TRY_END
+Ends a try block. See L<perlguts/"Exception Handling">.
+
+=for apidoc AmU||XCPT_CATCH
+Introduces a catch block. See L<perlguts/"Exception Handling">.
+
+=for apidoc Ams||XCPT_RETHROW
+Rethrows a previously caught exception. See L<perlguts/"Exception Handling">.
+
+=cut
+*/
+
+#define XST_mIV(i,v) (ST(i) = sv_2mortal(newSViv(v)) )
+#define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
+#define XST_mNV(i,v) (ST(i) = sv_2mortal(newSVnv(v)) )
+#define XST_mPV(i,v) (ST(i) = sv_2mortal(newSVpv(v,0)))
+#define XST_mPVN(i,v,n) (ST(i) = newSVpvn_flags(v,n, SVs_TEMP))
+#define XST_mNO(i) (ST(i) = &PL_sv_no )
+#define XST_mYES(i) (ST(i) = &PL_sv_yes )
+#define XST_mUNDEF(i) (ST(i) = &PL_sv_undef)
+
+#define XSRETURN(off) \
+ STMT_START { \
+ const IV tmpXSoff = (off); \
+ PL_stack_sp = PL_stack_base + ax + (tmpXSoff - 1); \
+ return; \
+ } STMT_END
+
+#define XSRETURN_IV(v) STMT_START { XST_mIV(0,v); XSRETURN(1); } STMT_END
+#define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
+#define XSRETURN_NV(v) STMT_START { XST_mNV(0,v); XSRETURN(1); } STMT_END
+#define XSRETURN_PV(v) STMT_START { XST_mPV(0,v); XSRETURN(1); } STMT_END
+#define XSRETURN_PVN(v,n) STMT_START { XST_mPVN(0,v,n); XSRETURN(1); } STMT_END
+#define XSRETURN_NO STMT_START { XST_mNO(0); XSRETURN(1); } STMT_END
+#define XSRETURN_YES STMT_START { XST_mYES(0); XSRETURN(1); } STMT_END
+#define XSRETURN_UNDEF STMT_START { XST_mUNDEF(0); XSRETURN(1); } STMT_END
+#define XSRETURN_EMPTY STMT_START { XSRETURN(0); } STMT_END
+
+#define newXSproto(a,b,c,d) newXS_flags(a,b,c,d,0)
+
+#ifdef XS_VERSION
+# define XS_VERSION_BOOTCHECK \
+ STMT_START { \
+ SV *_sv; \
+ const char *vn = NULL, *module = SvPV_nolen_const(ST(0)); \
+ if (items >= 2) /* version supplied as bootstrap arg */ \
+ _sv = ST(1); \
+ else { \
+ /* XXX GV_ADDWARN */ \
+ _sv = get_sv(Perl_form(aTHX_ "%s::%s", module, \
+ vn = "XS_VERSION"), FALSE); \
+ if (!_sv || !SvOK(_sv)) \
+ _sv = get_sv(Perl_form(aTHX_ "%s::%s", module, \
+ vn = "VERSION"), FALSE); \
+ } \
+ if (_sv) { \
+ SV *xpt = NULL; \
+ SV *xssv = Perl_newSVpvn(aTHX_ STR_WITH_LEN(XS_VERSION)); \
+ SV *pmsv = sv_derived_from(_sv, "version") \
+ ? SvREFCNT_inc_simple_NN(_sv) \
+ : new_version(_sv); \
+ xssv = upg_version(xssv, 0); \
+ if ( vcmp(pmsv,xssv) ) { \
+ xpt = Perl_newSVpvf(aTHX_ "%s object version %"SVf \
+ " does not match %s%s%s%s %"SVf, \
+ module, \
+ SVfARG(Perl_sv_2mortal(aTHX_ vstringify(xssv))), \
+ vn ? "$" : "", vn ? module : "", \
+ vn ? "::" : "", \
+ vn ? vn : "bootstrap parameter", \
+ SVfARG(Perl_sv_2mortal(aTHX_ vstringify(pmsv)))); \
+ Perl_sv_2mortal(aTHX_ xpt); \
+ } \
+ SvREFCNT_dec(xssv); \
+ SvREFCNT_dec(pmsv); \
+ if (xpt) \
+ Perl_croak(aTHX_ "%s", SvPVX(xpt)); \
+ } \
+ } STMT_END
+#else
+# define XS_VERSION_BOOTCHECK
+#endif
+
+#ifdef NO_XSLOCKS
+# 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)
+#endif
+
+/*
+ The DBM_setFilter & DBM_ckFilter macros are only used by
+ the *DB*_File modules
+*/
+
+#define DBM_setFilter(db_type,code) \
+ STMT_START { \
+ if (db_type) \
+ RETVAL = sv_mortalcopy(db_type) ; \
+ ST(0) = RETVAL ; \
+ if (db_type && (code == &PL_sv_undef)) { \
+ SvREFCNT_dec(db_type) ; \
+ db_type = NULL ; \
+ } \
+ else if (code) { \
+ if (db_type) \
+ sv_setsv(db_type, code) ; \
+ else \
+ db_type = newSVsv(code) ; \
+ } \
+ } STMT_END
+
+#define DBM_ckFilter(arg,type,name) \
+ STMT_START { \
+ if (db->type) { \
+ if (db->filtering) { \
+ croak("recursion detected in %s", name) ; \
+ } \
+ ENTER ; \
+ SAVETMPS ; \
+ SAVEINT(db->filtering) ; \
+ db->filtering = TRUE ; \
+ SAVE_DEFSV ; \
+ if (name[7] == 's') \
+ arg = newSVsv(arg); \
+ DEFSV_set(arg) ; \
+ SvTEMP_off(arg) ; \
+ PUSHMARK(SP) ; \
+ PUTBACK ; \
+ (void) perl_call_sv(db->type, G_DISCARD); \
+ SPAGAIN ; \
+ PUTBACK ; \
+ FREETMPS ; \
+ LEAVE ; \
+ if (name[7] == 's'){ \
+ arg = sv_2mortal(arg); \
+ } \
+ } } STMT_END
+
+#if 1 /* for compatibility */
+# define VTBL_sv &PL_vtbl_sv
+# define VTBL_env &PL_vtbl_env
+# define VTBL_envelem &PL_vtbl_envelem
+# define VTBL_sig &PL_vtbl_sig
+# define VTBL_sigelem &PL_vtbl_sigelem
+# define VTBL_pack &PL_vtbl_pack
+# define VTBL_packelem &PL_vtbl_packelem
+# define VTBL_dbline &PL_vtbl_dbline
+# define VTBL_isa &PL_vtbl_isa
+# define VTBL_isaelem &PL_vtbl_isaelem
+# define VTBL_arylen &PL_vtbl_arylen
+# define VTBL_glob &PL_vtbl_glob
+# define VTBL_mglob &PL_vtbl_mglob
+# define VTBL_nkeys &PL_vtbl_nkeys
+# define VTBL_taint &PL_vtbl_taint
+# define VTBL_substr &PL_vtbl_substr
+# define VTBL_vec &PL_vtbl_vec
+# define VTBL_pos &PL_vtbl_pos
+# define VTBL_bm &PL_vtbl_bm
+# define VTBL_fm &PL_vtbl_fm
+# define VTBL_uvar &PL_vtbl_uvar
+# define VTBL_defelem &PL_vtbl_defelem
+# define VTBL_regexp &PL_vtbl_regexp
+# define VTBL_regdata &PL_vtbl_regdata
+# define VTBL_regdatum &PL_vtbl_regdatum
+# ifdef USE_LOCALE_COLLATE
+# define VTBL_collxfrm &PL_vtbl_collxfrm
+# endif
+# define VTBL_amagic &PL_vtbl_amagic
+# define VTBL_amagicelem &PL_vtbl_amagicelem
+#endif
+
+#include "perlapi.h"
+
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_GET_CONTEXT) && !defined(PERL_CORE)
+# undef aTHX
+# undef aTHX_
+# define aTHX PERL_GET_THX
+# define aTHX_ aTHX,
+#endif
+
+#if defined(PERL_IMPLICIT_SYS) && !defined(PERL_CORE)
+# ifndef NO_XSLOCKS
+# if defined (NETWARE) && defined (USE_STDIO)
+# define times PerlProc_times
+# define setuid PerlProc_setuid
+# define setgid PerlProc_setgid
+# define getpid PerlProc_getpid
+# define pause PerlProc_pause
+# define exit PerlProc_exit
+# define _exit PerlProc__exit
+# else
+# undef closedir
+# undef opendir
+# undef stdin
+# undef stdout
+# undef stderr
+# undef feof
+# undef ferror
+# undef fgetpos
+# undef ioctl
+# undef getlogin
+# undef setjmp
+# undef getc
+# undef ungetc
+# undef fileno
+
+/* Following symbols were giving redefinition errors while building extensions - sgp 17th Oct 2000 */
+#ifdef NETWARE
+# undef readdir
+# undef fstat
+# undef stat
+# undef longjmp
+# undef endhostent
+# undef endnetent
+# undef endprotoent
+# undef endservent
+# undef gethostbyaddr
+# undef gethostbyname
+# undef gethostent
+# undef getnetbyaddr
+# undef getnetbyname
+# undef getnetent
+# undef getprotobyname
+# undef getprotobynumber
+# undef getprotoent
+# undef getservbyname
+# undef getservbyport
+# undef getservent
+# undef inet_ntoa
+# undef sethostent
+# undef setnetent
+# undef setprotoent
+# undef setservent
+#endif /* NETWARE */
+
+/* to avoid warnings: "xyz" redefined */
+#ifdef WIN32
+# undef popen
+# undef pclose
+#endif /* WIN32 */
+
+# undef socketpair
+
+# define mkdir PerlDir_mkdir
+# define chdir PerlDir_chdir
+# define rmdir PerlDir_rmdir
+# define closedir PerlDir_close
+# define opendir PerlDir_open
+# define readdir PerlDir_read
+# define rewinddir PerlDir_rewind
+# define seekdir PerlDir_seek
+# define telldir PerlDir_tell
+# define putenv PerlEnv_putenv
+# define getenv PerlEnv_getenv
+# define uname PerlEnv_uname
+# define stdin PerlSIO_stdin
+# define stdout PerlSIO_stdout
+# define stderr PerlSIO_stderr
+# define fopen PerlSIO_fopen
+# define fclose PerlSIO_fclose
+# define feof PerlSIO_feof
+# define ferror PerlSIO_ferror
+# define clearerr PerlSIO_clearerr
+# define getc PerlSIO_getc
+# define fgets PerlSIO_fgets
+# define fputc PerlSIO_fputc
+# define fputs PerlSIO_fputs
+# define fflush PerlSIO_fflush
+# define ungetc PerlSIO_ungetc
+# define fileno PerlSIO_fileno
+# define fdopen PerlSIO_fdopen
+# define freopen PerlSIO_freopen
+# define fread PerlSIO_fread
+# define fwrite PerlSIO_fwrite
+# define setbuf PerlSIO_setbuf
+# define setvbuf PerlSIO_setvbuf
+# define setlinebuf PerlSIO_setlinebuf
+# define stdoutf PerlSIO_stdoutf
+# define vfprintf PerlSIO_vprintf
+# define ftell PerlSIO_ftell
+# define fseek PerlSIO_fseek
+# define fgetpos PerlSIO_fgetpos
+# define fsetpos PerlSIO_fsetpos
+# define frewind PerlSIO_rewind
+# define tmpfile PerlSIO_tmpfile
+# define access PerlLIO_access
+# define chmod PerlLIO_chmod
+# define chsize PerlLIO_chsize
+# define close PerlLIO_close
+# define dup PerlLIO_dup
+# define dup2 PerlLIO_dup2
+# define flock PerlLIO_flock
+# define fstat PerlLIO_fstat
+# define ioctl PerlLIO_ioctl
+# define isatty PerlLIO_isatty
+# define link PerlLIO_link
+# define lseek PerlLIO_lseek
+# define lstat PerlLIO_lstat
+# define mktemp PerlLIO_mktemp
+# define open PerlLIO_open
+# define read PerlLIO_read
+# define rename PerlLIO_rename
+# define setmode PerlLIO_setmode
+# define stat(buf,sb) PerlLIO_stat(buf,sb)
+# define tmpnam PerlLIO_tmpnam
+# define umask PerlLIO_umask
+# define unlink PerlLIO_unlink
+# define utime PerlLIO_utime
+# define write PerlLIO_write
+# define malloc PerlMem_malloc
+# define realloc PerlMem_realloc
+# define free PerlMem_free
+# define abort PerlProc_abort
+# define exit PerlProc_exit
+# define _exit PerlProc__exit
+# define execl PerlProc_execl
+# define execv PerlProc_execv
+# define execvp PerlProc_execvp
+# define getuid PerlProc_getuid
+# define geteuid PerlProc_geteuid
+# define getgid PerlProc_getgid
+# define getegid PerlProc_getegid
+# define getlogin PerlProc_getlogin
+# define kill PerlProc_kill
+# define killpg PerlProc_killpg
+# define pause PerlProc_pause
+# define popen PerlProc_popen
+# define pclose PerlProc_pclose
+# define pipe PerlProc_pipe
+# define setuid PerlProc_setuid
+# define setgid PerlProc_setgid
+# define sleep PerlProc_sleep
+# define times PerlProc_times
+# define wait PerlProc_wait
+# define setjmp PerlProc_setjmp
+# define longjmp PerlProc_longjmp
+# define signal PerlProc_signal
+# define getpid PerlProc_getpid
+# define gettimeofday PerlProc_gettimeofday
+# define htonl PerlSock_htonl
+# define htons PerlSock_htons
+# define ntohl PerlSock_ntohl
+# define ntohs PerlSock_ntohs
+# define accept PerlSock_accept
+# define bind PerlSock_bind
+# define connect PerlSock_connect
+# define endhostent PerlSock_endhostent
+# define endnetent PerlSock_endnetent
+# define endprotoent PerlSock_endprotoent
+# define endservent PerlSock_endservent
+# define gethostbyaddr PerlSock_gethostbyaddr
+# define gethostbyname PerlSock_gethostbyname
+# define gethostent PerlSock_gethostent
+# define gethostname PerlSock_gethostname
+# define getnetbyaddr PerlSock_getnetbyaddr
+# define getnetbyname PerlSock_getnetbyname
+# define getnetent PerlSock_getnetent
+# define getpeername PerlSock_getpeername
+# define getprotobyname PerlSock_getprotobyname
+# define getprotobynumber PerlSock_getprotobynumber
+# define getprotoent PerlSock_getprotoent
+# define getservbyname PerlSock_getservbyname
+# define getservbyport PerlSock_getservbyport
+# define getservent PerlSock_getservent
+# define getsockname PerlSock_getsockname
+# define getsockopt PerlSock_getsockopt
+# define inet_addr PerlSock_inet_addr
+# define inet_ntoa PerlSock_inet_ntoa
+# define listen PerlSock_listen
+# define recv PerlSock_recv
+# define recvfrom PerlSock_recvfrom
+# define select PerlSock_select
+# define send PerlSock_send
+# define sendto PerlSock_sendto
+# define sethostent PerlSock_sethostent
+# define setnetent PerlSock_setnetent
+# define setprotoent PerlSock_setprotoent
+# define setservent PerlSock_setservent
+# define setsockopt PerlSock_setsockopt
+# define shutdown PerlSock_shutdown
+# define socket PerlSock_socket
+# define socketpair PerlSock_socketpair
+# endif /* NETWARE && USE_STDIO */
+
+# ifdef USE_SOCKETS_AS_HANDLES
+# undef fd_set
+# undef FD_SET
+# undef FD_CLR
+# undef FD_ISSET
+# undef FD_ZERO
+# define fd_set Perl_fd_set
+# define FD_SET(n,p) PERL_FD_SET(n,p)
+# define FD_CLR(n,p) PERL_FD_CLR(n,p)
+# define FD_ISSET(n,p) PERL_FD_ISSET(n,p)
+# define FD_ZERO(p) PERL_FD_ZERO(p)
+# endif /* USE_SOCKETS_AS_HANDLES */
+
+# endif /* NO_XSLOCKS */
+#endif /* PERL_IMPLICIT_SYS && !PERL_CORE */
+
+#endif /* _INC_PERL_XSUB_H */ /* include guard */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/arpa/inet.h b/Master/tlpkg/tlperl/lib/CORE/arpa/inet.h
new file mode 100644
index 00000000000..0303df0876b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/arpa/inet.h
@@ -0,0 +1,4 @@
+/*
+ * this is a dummy header file for Socket.xs
+ */
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/av.h b/Master/tlpkg/tlperl/lib/CORE/av.h
new file mode 100644
index 00000000000..f8c9d1bdc24
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/av.h
@@ -0,0 +1,100 @@
+/* av.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2005, 2006, 2007, 2008, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+struct xpvav {
+ union _xnvu xnv_u;
+ SSize_t xav_fill; /* Index of last element present */
+ SSize_t xav_max; /* max index for which array has space */
+ _XPVMG_HEAD;
+};
+
+/* SV** xav_alloc; */
+#define xav_alloc xiv_u.xivu_p1
+/* SV* xav_arylen; */
+
+/* SVpav_REAL is set for all AVs whose xav_array contents are refcounted.
+ * Some things like "@_" and the scratchpad list do not set this, to
+ * indicate that they are cheating (for efficiency) by not refcounting
+ * the AV's contents.
+ *
+ * SVpav_REIFY is only meaningful on such "fake" AVs (i.e. where SVpav_REAL
+ * is not set). It indicates that the fake AV is capable of becoming
+ * real if the array needs to be modified in some way. Functions that
+ * modify fake AVs check both flags to call av_reify() as appropriate.
+ *
+ * Note that the Perl stack and @DB::args have neither flag set. (Thus,
+ * items that go on the stack are never refcounted.)
+ *
+ * These internal details are subject to change any time. AV
+ * manipulations external to perl should not care about any of this.
+ * GSAR 1999-09-10
+ */
+
+/*
+=head1 Handy Values
+
+=for apidoc AmU||Nullav
+Null AV pointer.
+
+(deprecated - use C<(AV *)NULL> instead)
+
+=head1 Array Manipulation Functions
+
+=for apidoc Am|int|AvFILL|AV* av
+Same as C<av_len()>. Deprecated, use C<av_len()> instead.
+
+=cut
+*/
+
+#ifndef PERL_CORE
+# define Nullav Null(AV*)
+#endif
+
+#define AvARRAY(av) ((av)->sv_u.svu_array)
+#define AvALLOC(av) (*((SV***)&((XPVAV*) SvANY(av))->xav_alloc))
+#define AvMAX(av) ((XPVAV*) SvANY(av))->xav_max
+#define AvFILLp(av) ((XPVAV*) SvANY(av))->xav_fill
+#define AvARYLEN(av) (*Perl_av_arylen_p(aTHX_ MUTABLE_AV(av)))
+
+#define AvREAL(av) (SvFLAGS(av) & SVpav_REAL)
+#define AvREAL_on(av) (SvFLAGS(av) |= SVpav_REAL)
+#define AvREAL_off(av) (SvFLAGS(av) &= ~SVpav_REAL)
+#define AvREAL_only(av) (AvREIFY_off(av), SvFLAGS(av) |= SVpav_REAL)
+#define AvREIFY(av) (SvFLAGS(av) & SVpav_REIFY)
+#define AvREIFY_on(av) (SvFLAGS(av) |= SVpav_REIFY)
+#define AvREIFY_off(av) (SvFLAGS(av) &= ~SVpav_REIFY)
+#define AvREIFY_only(av) (AvREAL_off(av), SvFLAGS(av) |= SVpav_REIFY)
+
+#define AvREALISH(av) (SvFLAGS(av) & (SVpav_REAL|SVpav_REIFY))
+
+#define AvFILL(av) ((SvRMAGICAL((const SV *) (av))) \
+ ? mg_size(MUTABLE_SV(av)) : AvFILLp(av))
+
+#define NEGATIVE_INDICES_VAR "NEGATIVE_INDICES"
+
+/*
+=for apidoc newAV
+
+Creates a new AV. The reference count is set to 1.
+
+=cut
+*/
+
+#define newAV() MUTABLE_AV(newSV_type(SVt_PVAV))
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/bitcount.h b/Master/tlpkg/tlperl/lib/CORE/bitcount.h
new file mode 100644
index 00000000000..9f2be6152ae
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/bitcount.h
@@ -0,0 +1,18 @@
+{
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+}
diff --git a/Master/tlpkg/tlperl/lib/CORE/cc_runtime.h b/Master/tlpkg/tlperl/lib/CORE/cc_runtime.h
new file mode 100644
index 00000000000..90826dfb0e0
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/cc_runtime.h
@@ -0,0 +1,85 @@
+/* cc_runtime.h
+ *
+ * Copyright (C) 1999, 2000, 2001, 2004, 2006, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define DOOP(ppname) PUTBACK; PL_op = ppname(aTHX); SPAGAIN
+#define CCPP(s) OP * s(pTHX)
+
+#define PP_LIST(g) do { \
+ dMARK; \
+ if (g != G_ARRAY) { \
+ if (++MARK <= SP) \
+ *MARK = *SP; \
+ else \
+ *MARK = &PL_sv_undef; \
+ SP = MARK; \
+ } \
+ } while (0)
+
+#define MAYBE_TAINT_SASSIGN_SRC(sv) \
+ if (PL_tainting && PL_tainted && (!SvGMAGICAL(left) || !SvSMAGICAL(left) || \
+ !((mg=mg_find(left, PERL_MAGIC_taint)) && mg->mg_len & 1)))\
+ TAINT_NOT
+
+#define PP_PREINC(sv) do { \
+ if (SvIOK(sv)) { \
+ ++SvIVX(sv); \
+ SvFLAGS(sv) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK); \
+ } \
+ else \
+ sv_inc(sv); \
+ SvSETMAGIC(sv); \
+ } while (0)
+
+#define PP_UNSTACK do { \
+ TAINT_NOT; \
+ PL_stack_sp = PL_stack_base + cxstack[cxstack_ix].blk_oldsp; \
+ FREETMPS; \
+ oldsave = PL_scopestack[PL_scopestack_ix - 1]; \
+ LEAVE_SCOPE(oldsave); \
+ SPAGAIN; \
+ } while(0)
+
+/* Anyone using eval "" deserves this mess */
+#define PP_EVAL(ppaddr, nxt) do { \
+ dJMPENV; \
+ int ret; \
+ PUTBACK; \
+ JMPENV_PUSH(ret); \
+ switch (ret) { \
+ case 0: \
+ PL_op = ppaddr(aTHX); \
+ cxstack[cxstack_ix].blk_eval.retop = Nullop; \
+ if (PL_op != nxt) CALLRUNOPS(aTHX); \
+ JMPENV_POP; \
+ break; \
+ case 1: JMPENV_POP; JMPENV_JUMP(1); \
+ case 2: JMPENV_POP; JMPENV_JUMP(2); \
+ case 3: \
+ JMPENV_POP; \
+ if (PL_restartop && PL_restartop != nxt) \
+ JMPENV_JUMP(3); \
+ } \
+ PL_op = nxt; \
+ SPAGAIN; \
+ } while (0)
+
+#define PP_ENTERTRY(label) \
+ STMT_START { \
+ dJMPENV; \
+ int ret; \
+ JMPENV_PUSH(ret); \
+ switch (ret) { \
+ case 1: JMPENV_POP; JMPENV_JUMP(1);\
+ case 2: JMPENV_POP; JMPENV_JUMP(2);\
+ case 3: JMPENV_POP; SPAGAIN; goto label;\
+ } \
+ } STMT_END
+
+#define PP_LEAVETRY \
+ STMT_START{ PL_top_env=PL_top_env->je_prev; }STMT_END
diff --git a/Master/tlpkg/tlperl/lib/CORE/config.h b/Master/tlpkg/tlperl/lib/CORE/config.h
new file mode 100644
index 00000000000..0dd6de31bf0
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/config.h
@@ -0,0 +1,4647 @@
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from undef, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises. Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit undef and rerun config_h.SH.
+ *
+ * $Id: Config_h.U 1 2006-08-24 12:32:52Z rmanfredi $
+ */
+
+/*
+ * Package name : perl5
+ * Source directory :
+ * Configuration time: Thu Feb 10 14:38:06 2011
+ * Configured by : siepo
+ * Target system :
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* LOC_SED:
+ * This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED "" /**/
+
+/* HAS_ALARM:
+ * This symbol, if defined, indicates that the alarm routine is
+ * available.
+ */
+#define HAS_ALARM /**/
+
+/* HAS_BCMP:
+ * This symbol is defined if the bcmp() routine is available to
+ * compare blocks of memory.
+ */
+/*#define HAS_BCMP / **/
+
+/* HAS_BCOPY:
+ * This symbol is defined if the bcopy() routine is available to
+ * copy blocks of memory.
+ */
+/*#define HAS_BCOPY / **/
+
+/* HAS_BZERO:
+ * This symbol is defined if the bzero() routine is available to
+ * set a memory block to 0.
+ */
+/*#define HAS_BZERO / **/
+
+/* HAS_CHOWN:
+ * This symbol, if defined, indicates that the chown routine is
+ * available.
+ */
+/*#define HAS_CHOWN / **/
+
+/* HAS_CHROOT:
+ * This symbol, if defined, indicates that the chroot routine is
+ * available.
+ */
+/*#define HAS_CHROOT / **/
+
+/* HAS_CHSIZE:
+ * This symbol, if defined, indicates that the chsize routine is available
+ * to truncate files. You might need a -lx to get this routine.
+ */
+#define HAS_CHSIZE /**/
+
+/* HAS_CRYPT:
+ * This symbol, if defined, indicates that the crypt routine is available
+ * to encrypt passwords and the like.
+ */
+#define HAS_CRYPT /**/
+
+/* HAS_CTERMID:
+ * This symbol, if defined, indicates that the ctermid routine is
+ * available to generate filename for terminal.
+ */
+/*#define HAS_CTERMID / **/
+
+/* HAS_CUSERID:
+ * This symbol, if defined, indicates that the cuserid routine is
+ * available to get character login names.
+ */
+/*#define HAS_CUSERID / **/
+
+/* HAS_DBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol DBL_DIG, which is the number
+ * of significant digits in a double precision number. If this
+ * symbol is not defined, a guess of 15 is usually pretty good.
+ */
+#define HAS_DBL_DIG /**/
+
+/* HAS_DIFFTIME:
+ * This symbol, if defined, indicates that the difftime routine is
+ * available.
+ */
+#define HAS_DIFFTIME /**/
+
+/* HAS_DLERROR:
+ * This symbol, if defined, indicates that the dlerror routine is
+ * available to return a string describing the last error that
+ * occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+#define HAS_DLERROR /**/
+
+/* HAS_DUP2:
+ * This symbol, if defined, indicates that the dup2 routine is
+ * available to duplicate file descriptors.
+ */
+#define HAS_DUP2 /**/
+
+/* HAS_FCHMOD:
+ * This symbol, if defined, indicates that the fchmod routine is available
+ * to change mode of opened files. If unavailable, use chmod().
+ */
+/*#define HAS_FCHMOD / **/
+
+/* HAS_FCHOWN:
+ * This symbol, if defined, indicates that the fchown routine is available
+ * to change ownership of opened files. If unavailable, use chown().
+ */
+/*#define HAS_FCHOWN / **/
+
+/* HAS_FCNTL:
+ * This symbol, if defined, indicates to the C program that
+ * the fcntl() function exists.
+ */
+/*#define HAS_FCNTL / **/
+
+/* HAS_FGETPOS:
+ * This symbol, if defined, indicates that the fgetpos routine is
+ * available to get the file position indicator, similar to ftell().
+ */
+#define HAS_FGETPOS /**/
+
+/* HAS_FLOCK:
+ * This symbol, if defined, indicates that the flock routine is
+ * available to do file locking.
+ */
+#define HAS_FLOCK /**/
+
+/* HAS_FORK:
+ * This symbol, if defined, indicates that the fork routine is
+ * available.
+ */
+/*#define HAS_FORK / **/
+
+/* HAS_FSETPOS:
+ * This symbol, if defined, indicates that the fsetpos routine is
+ * available to set the file position indicator, similar to fseek().
+ */
+#define HAS_FSETPOS /**/
+
+/* HAS_GETTIMEOFDAY:
+ * This symbol, if defined, indicates that the gettimeofday() system
+ * call is available for a sub-second accuracy clock. Usually, the file
+ * <sys/resource.h> needs to be included (see I_SYS_RESOURCE).
+ * The type "Timeval" should be used to refer to "struct timeval".
+ */
+#define HAS_GETTIMEOFDAY /**/
+#ifdef HAS_GETTIMEOFDAY
+#define Timeval struct timeval /* Structure used by gettimeofday() */
+#endif
+
+/* HAS_GETGROUPS:
+ * This symbol, if defined, indicates that the getgroups() routine is
+ * available to get the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define HAS_GETGROUPS / **/
+
+/* HAS_GETLOGIN:
+ * This symbol, if defined, indicates that the getlogin routine is
+ * available to get the login name.
+ */
+#define HAS_GETLOGIN /**/
+
+/* HAS_GETPGID:
+ * This symbol, if defined, indicates to the C program that
+ * the getpgid(pid) function is available to get the
+ * process group id.
+ */
+/*#define HAS_GETPGID / **/
+
+/* HAS_GETPGRP2:
+ * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ * routine is available to get the current process group.
+ */
+/*#define HAS_GETPGRP2 / **/
+
+/* HAS_GETPPID:
+ * This symbol, if defined, indicates that the getppid routine is
+ * available to get the parent process ID.
+ */
+/*#define HAS_GETPPID / **/
+
+/* HAS_GETPRIORITY:
+ * This symbol, if defined, indicates that the getpriority routine is
+ * available to get a process's priority.
+ */
+/*#define HAS_GETPRIORITY / **/
+
+/* HAS_INET_ATON:
+ * This symbol, if defined, indicates to the C program that the
+ * inet_aton() function is available to parse IP address "dotted-quad"
+ * strings.
+ */
+/*#define HAS_INET_ATON / **/
+
+/* HAS_KILLPG:
+ * This symbol, if defined, indicates that the killpg routine is available
+ * to kill process groups. If unavailable, you probably should use kill
+ * with a negative process number.
+ */
+#define HAS_KILLPG /**/
+
+/* HAS_LINK:
+ * This symbol, if defined, indicates that the link routine is
+ * available to create hard links.
+ */
+#define HAS_LINK /**/
+
+/* HAS_LOCALECONV:
+ * This symbol, if defined, indicates that the localeconv routine is
+ * available for numeric and monetary formatting conventions.
+ */
+#define HAS_LOCALECONV /**/
+
+/* HAS_LOCKF:
+ * This symbol, if defined, indicates that the lockf routine is
+ * available to do file locking.
+ */
+/*#define HAS_LOCKF / **/
+
+/* HAS_LSTAT:
+ * This symbol, if defined, indicates that the lstat routine is
+ * available to do file stats on symbolic links.
+ */
+/*#define HAS_LSTAT / **/
+
+/* HAS_MBLEN:
+ * This symbol, if defined, indicates that the mblen routine is available
+ * to find the number of bytes in a multibye character.
+ */
+#define HAS_MBLEN /**/
+
+/* HAS_MBSTOWCS:
+ * This symbol, if defined, indicates that the mbstowcs routine is
+ * available to covert a multibyte string into a wide character string.
+ */
+#define HAS_MBSTOWCS /**/
+
+/* HAS_MBTOWC:
+ * This symbol, if defined, indicates that the mbtowc routine is available
+ * to covert a multibyte to a wide character.
+ */
+#define HAS_MBTOWC /**/
+
+/* HAS_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * to compare blocks of memory.
+ */
+#define HAS_MEMCMP /**/
+
+/* HAS_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy blocks of memory.
+ */
+#define HAS_MEMCPY /**/
+
+/* HAS_MEMMOVE:
+ * This symbol, if defined, indicates that the memmove routine is available
+ * to copy potentially overlapping blocks of memory. This should be used
+ * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ * own version.
+ */
+#define HAS_MEMMOVE /**/
+
+/* HAS_MEMSET:
+ * This symbol, if defined, indicates that the memset routine is available
+ * to set blocks of memory.
+ */
+#define HAS_MEMSET /**/
+
+/* HAS_MKDIR:
+ * This symbol, if defined, indicates that the mkdir routine is available
+ * to create directories. Otherwise you should fork off a new process to
+ * exec /bin/mkdir.
+ */
+#define HAS_MKDIR /**/
+
+/* HAS_MKFIFO:
+ * This symbol, if defined, indicates that the mkfifo routine is
+ * available to create FIFOs. Otherwise, mknod should be able to
+ * do it for you. However, if mkfifo is there, mknod might require
+ * super-user privileges which mkfifo will not.
+ */
+/*#define HAS_MKFIFO / **/
+
+/* HAS_MKTIME:
+ * This symbol, if defined, indicates that the mktime routine is
+ * available.
+ */
+#define HAS_MKTIME /**/
+
+/* HAS_MSYNC:
+ * This symbol, if defined, indicates that the msync system call is
+ * available to synchronize a mapped file.
+ */
+/*#define HAS_MSYNC / **/
+
+/* HAS_MUNMAP:
+ * This symbol, if defined, indicates that the munmap system call is
+ * available to unmap a region, usually mapped by mmap().
+ */
+/*#define HAS_MUNMAP / **/
+
+/* HAS_NICE:
+ * This symbol, if defined, indicates that the nice routine is
+ * available.
+ */
+/*#define HAS_NICE / **/
+
+/* HAS_PATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given filename.
+ */
+/* HAS_FPATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given open file descriptor.
+ */
+/*#define HAS_PATHCONF / **/
+/*#define HAS_FPATHCONF / **/
+
+/* HAS_PAUSE:
+ * This symbol, if defined, indicates that the pause routine is
+ * available to suspend a process until a signal is received.
+ */
+#define HAS_PAUSE /**/
+
+/* HAS_PIPE:
+ * This symbol, if defined, indicates that the pipe routine is
+ * available to create an inter-process channel.
+ */
+#define HAS_PIPE /**/
+
+/* HAS_POLL:
+ * This symbol, if defined, indicates that the poll routine is
+ * available to poll active file descriptors. Please check I_POLL and
+ * I_SYS_POLL to know which header should be included as well.
+ */
+/*#define HAS_POLL / **/
+
+/* HAS_READDIR:
+ * This symbol, if defined, indicates that the readdir routine is
+ * available to read directory entries. You may have to include
+ * <dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR /**/
+
+/* HAS_SEEKDIR:
+ * This symbol, if defined, indicates that the seekdir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_SEEKDIR /**/
+
+/* HAS_TELLDIR:
+ * This symbol, if defined, indicates that the telldir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_TELLDIR /**/
+
+/* HAS_REWINDDIR:
+ * This symbol, if defined, indicates that the rewinddir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+#define HAS_REWINDDIR /**/
+
+/* HAS_READLINK:
+ * This symbol, if defined, indicates that the readlink routine is
+ * available to read the value of a symbolic link.
+ */
+/*#define HAS_READLINK / **/
+
+/* HAS_RENAME:
+ * This symbol, if defined, indicates that the rename routine is available
+ * to rename files. Otherwise you should do the unlink(), link(), unlink()
+ * trick.
+ */
+#define HAS_RENAME /**/
+
+/* HAS_RMDIR:
+ * This symbol, if defined, indicates that the rmdir routine is
+ * available to remove directories. Otherwise you should fork off a
+ * new process to exec /bin/rmdir.
+ */
+#define HAS_RMDIR /**/
+
+/* HAS_SELECT:
+ * This symbol, if defined, indicates that the select routine is
+ * available to select active file descriptors. If the timeout field
+ * is used, <sys/time.h> may need to be included.
+ */
+#define HAS_SELECT /**/
+
+/* HAS_SETEGID:
+ * This symbol, if defined, indicates that the setegid routine is available
+ * to change the effective gid of the current program.
+ */
+/*#define HAS_SETEGID / **/
+
+/* HAS_SETEUID:
+ * This symbol, if defined, indicates that the seteuid routine is available
+ * to change the effective uid of the current program.
+ */
+/*#define HAS_SETEUID / **/
+
+/* HAS_SETGROUPS:
+ * This symbol, if defined, indicates that the setgroups() routine is
+ * available to set the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define HAS_SETGROUPS / **/
+
+/* HAS_SETLINEBUF:
+ * This symbol, if defined, indicates that the setlinebuf routine is
+ * available to change stderr or stdout from block-buffered or unbuffered
+ * to a line-buffered mode.
+ */
+/*#define HAS_SETLINEBUF / **/
+
+/* HAS_SETLOCALE:
+ * This symbol, if defined, indicates that the setlocale routine is
+ * available to handle locale-specific ctype implementations.
+ */
+#define HAS_SETLOCALE /**/
+
+/* HAS_SETPGID:
+ * This symbol, if defined, indicates that the setpgid(pid, gpid)
+ * routine is available to set process group ID.
+ */
+/*#define HAS_SETPGID / **/
+
+/* HAS_SETPGRP2:
+ * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ * routine is available to set the current process group.
+ */
+/*#define HAS_SETPGRP2 / **/
+
+/* HAS_SETPRIORITY:
+ * This symbol, if defined, indicates that the setpriority routine is
+ * available to set a process's priority.
+ */
+/*#define HAS_SETPRIORITY / **/
+
+/* HAS_SETREGID:
+ * This symbol, if defined, indicates that the setregid routine is
+ * available to change the real and effective gid of the current
+ * process.
+ */
+/* HAS_SETRESGID:
+ * This symbol, if defined, indicates that the setresgid routine is
+ * available to change the real, effective and saved gid of the current
+ * process.
+ */
+/*#define HAS_SETREGID / **/
+/*#define HAS_SETRESGID / **/
+
+/* HAS_SETREUID:
+ * This symbol, if defined, indicates that the setreuid routine is
+ * available to change the real and effective uid of the current
+ * process.
+ */
+/* HAS_SETRESUID:
+ * This symbol, if defined, indicates that the setresuid routine is
+ * available to change the real, effective and saved uid of the current
+ * process.
+ */
+/*#define HAS_SETREUID / **/
+/*#define HAS_SETRESUID / **/
+
+/* HAS_SETRGID:
+ * This symbol, if defined, indicates that the setrgid routine is available
+ * to change the real gid of the current program.
+ */
+/*#define HAS_SETRGID / **/
+
+/* HAS_SETRUID:
+ * This symbol, if defined, indicates that the setruid routine is available
+ * to change the real uid of the current program.
+ */
+/*#define HAS_SETRUID / **/
+
+/* HAS_SETSID:
+ * This symbol, if defined, indicates that the setsid routine is
+ * available to set the process group ID.
+ */
+/*#define HAS_SETSID / **/
+
+/* HAS_STRCHR:
+ * This symbol is defined to indicate that the strchr()/strrchr()
+ * functions are available for string searching. If not, try the
+ * index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ * This symbol is defined to indicate that the index()/rindex()
+ * functions are available for string searching.
+ */
+#define HAS_STRCHR /**/
+/*#define HAS_INDEX / **/
+
+/* HAS_STRCOLL:
+ * This symbol, if defined, indicates that the strcoll routine is
+ * available to compare strings using collating information.
+ */
+#define HAS_STRCOLL /**/
+
+/* HAS_STRTOD:
+ * This symbol, if defined, indicates that the strtod routine is
+ * available to provide better numeric string conversion than atof().
+ */
+#define HAS_STRTOD /**/
+
+/* HAS_STRTOL:
+ * This symbol, if defined, indicates that the strtol routine is available
+ * to provide better numeric string conversion than atoi() and friends.
+ */
+#define HAS_STRTOL /**/
+
+/* HAS_STRXFRM:
+ * This symbol, if defined, indicates that the strxfrm() routine is
+ * available to transform strings.
+ */
+#define HAS_STRXFRM /**/
+
+/* HAS_SYMLINK:
+ * This symbol, if defined, indicates that the symlink routine is available
+ * to create symbolic links.
+ */
+/*#define HAS_SYMLINK / **/
+
+/* HAS_SYSCALL:
+ * This symbol, if defined, indicates that the syscall routine is
+ * available to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define HAS_SYSCALL / **/
+
+/* HAS_SYSCONF:
+ * This symbol, if defined, indicates that sysconf() is available
+ * to determine system related limits and options.
+ */
+/*#define HAS_SYSCONF / **/
+
+/* HAS_SYSTEM:
+ * This symbol, if defined, indicates that the system routine is
+ * available to issue a shell command.
+ */
+#define HAS_SYSTEM /**/
+
+/* HAS_TCGETPGRP:
+ * This symbol, if defined, indicates that the tcgetpgrp routine is
+ * available to get foreground process group ID.
+ */
+/*#define HAS_TCGETPGRP / **/
+
+/* HAS_TCSETPGRP:
+ * This symbol, if defined, indicates that the tcsetpgrp routine is
+ * available to set foreground process group ID.
+ */
+/*#define HAS_TCSETPGRP / **/
+
+/* HAS_TRUNCATE:
+ * This symbol, if defined, indicates that the truncate routine is
+ * available to truncate files.
+ */
+/*#define HAS_TRUNCATE / **/
+
+/* HAS_TZNAME:
+ * This symbol, if defined, indicates that the tzname[] array is
+ * available to access timezone names.
+ */
+#define HAS_TZNAME /**/
+
+/* HAS_UMASK:
+ * This symbol, if defined, indicates that the umask routine is
+ * available to set and get the value of the file creation mask.
+ */
+#define HAS_UMASK /**/
+
+/* HAS_USLEEP:
+ * This symbol, if defined, indicates that the usleep routine is
+ * available to let the process sleep on a sub-second accuracy.
+ */
+/*#define HAS_USLEEP / **/
+
+/* HAS_WAIT4:
+ * This symbol, if defined, indicates that wait4() exists.
+ */
+/*#define HAS_WAIT4 / **/
+
+/* HAS_WAITPID:
+ * This symbol, if defined, indicates that the waitpid routine is
+ * available to wait for child process.
+ */
+#define HAS_WAITPID /**/
+
+/* HAS_WCSTOMBS:
+ * This symbol, if defined, indicates that the wcstombs routine is
+ * available to convert wide character strings to multibyte strings.
+ */
+#define HAS_WCSTOMBS /**/
+
+/* HAS_WCTOMB:
+ * This symbol, if defined, indicates that the wctomb routine is available
+ * to covert a wide character to a multibyte.
+ */
+#define HAS_WCTOMB /**/
+
+/* Groups_t:
+ * This symbol holds the type used for the second argument to
+ * getgroups() and setgroups(). Usually, this is the same as
+ * gidtype (gid_t) , but sometimes it isn't.
+ * It can be int, ushort, gid_t, etc...
+ * It may be necessary to include <sys/types.h> to get any
+ * typedef'ed information. This is only required if you have
+ * getgroups() or setgroups()..
+ */
+#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
+#define Groups_t gid_t /* Type for 2nd arg to [sg]etgroups() */
+#endif
+
+/* I_ARPA_INET:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <arpa/inet.h> to get inet_addr and friends declarations.
+ */
+#define I_ARPA_INET /**/
+
+/* I_DBM:
+ * This symbol, if defined, indicates that <dbm.h> exists and should
+ * be included.
+ */
+/* I_RPCSVC_DBM:
+ * This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ * should be included.
+ */
+/*#define I_DBM / **/
+#define I_RPCSVC_DBM /**/
+
+/* I_DLFCN:
+ * This symbol, if defined, indicates that <dlfcn.h> exists and should
+ * be included.
+ */
+#define I_DLFCN /**/
+
+/* I_FCNTL:
+ * This manifest constant tells the C program to include <fcntl.h>.
+ */
+#define I_FCNTL /**/
+
+/* I_FLOAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <float.h> to get definition of symbols like DBL_MAX or
+ * DBL_MIN, i.e. machine dependent floating point values.
+ */
+#define I_FLOAT /**/
+
+/* I_GDBM:
+ * This symbol, if defined, indicates that <gdbm.h> exists and should
+ * be included.
+ */
+/*#define I_GDBM / **/
+
+/* I_LIMITS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <limits.h> to get definition of symbols like WORD_BIT or
+ * LONG_MAX, i.e. machine dependant limitations.
+ */
+#define I_LIMITS /**/
+
+/* I_LOCALE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <locale.h>.
+ */
+#define I_LOCALE /**/
+
+/* I_MATH:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <math.h>.
+ */
+#define I_MATH /**/
+
+/* I_MEMORY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <memory.h>.
+ */
+/*#define I_MEMORY / **/
+
+/* I_NETINET_IN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+/*#define I_NETINET_IN / **/
+
+/* I_SFIO:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sfio.h>.
+ */
+/*#define I_SFIO / **/
+
+/* I_STDDEF:
+ * This symbol, if defined, indicates that <stddef.h> exists and should
+ * be included.
+ */
+#define I_STDDEF /**/
+
+/* I_STDLIB:
+ * This symbol, if defined, indicates that <stdlib.h> exists and should
+ * be included.
+ */
+#define I_STDLIB /**/
+
+/* I_STRING:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING /**/
+
+/* I_SYS_DIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/dir.h>.
+ */
+/*#define I_SYS_DIR / **/
+
+/* I_SYS_FILE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/file.h> to get definition of R_OK and friends.
+ */
+/*#define I_SYS_FILE / **/
+
+/* I_SYS_IOCTL:
+ * This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ * be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+/* I_SYS_SOCKIO:
+ * This symbol, if defined, indicates the <sys/sockio.h> should be included
+ * to get socket ioctl options, like SIOCATMARK.
+ */
+/*#define I_SYS_IOCTL / **/
+/*#define I_SYS_SOCKIO / **/
+
+/* I_SYS_NDIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/ndir.h>.
+ */
+/*#define I_SYS_NDIR / **/
+
+/* I_SYS_PARAM:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/param.h>.
+ */
+/*#define I_SYS_PARAM / **/
+
+/* I_SYS_POLL:
+ * This symbol, if defined, indicates that the program may include
+ * <sys/poll.h>. When I_POLL is also defined, it's probably safest
+ * to only include <poll.h>.
+ */
+/*#define I_SYS_POLL / **/
+
+/* I_SYS_RESOURCE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/resource.h>.
+ */
+/*#define I_SYS_RESOURCE / **/
+
+/* I_SYS_SELECT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/select.h> in order to get definition of struct timeval.
+ */
+/*#define I_SYS_SELECT / **/
+
+/* I_SYS_STAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/stat.h>.
+ */
+#define I_SYS_STAT /**/
+
+/* I_SYS_TIMES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/times.h>.
+ */
+/*#define I_SYS_TIMES / **/
+
+/* I_SYS_TYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/types.h>.
+ */
+#define I_SYS_TYPES /**/
+
+/* I_SYS_UN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/un.h> to get UNIX domain socket definitions.
+ */
+/*#define I_SYS_UN / **/
+
+/* I_SYS_WAIT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/wait.h>.
+ */
+/*#define I_SYS_WAIT / **/
+
+/* I_TERMIO:
+ * This symbol, if defined, indicates that the program should include
+ * <termio.h> rather than <sgtty.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ * This symbol, if defined, indicates that the program should include
+ * the POSIX termios.h rather than sgtty.h or termio.h.
+ * There are also differences in the ioctl() calls that depend on the
+ * value of this symbol.
+ */
+/* I_SGTTY:
+ * This symbol, if defined, indicates that the program should include
+ * <sgtty.h> rather than <termio.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/*#define I_TERMIO / **/
+/*#define I_TERMIOS / **/
+/*#define I_SGTTY / **/
+
+/* I_UNISTD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <unistd.h>.
+ */
+/*#define I_UNISTD / **/
+
+/* I_UTIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <utime.h>.
+ */
+#define I_UTIME /**/
+
+/* I_VALUES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <values.h> to get definition of symbols like MINFLOAT or
+ * MAXLONG, i.e. machine dependant limitations. Probably, you
+ * should use <limits.h> instead, if it is available.
+ */
+/*#define I_VALUES / **/
+
+/* I_VFORK:
+ * This symbol, if defined, indicates to the C program that it should
+ * include vfork.h.
+ */
+/*#define I_VFORK / **/
+
+/* CAN_VAPROTO:
+ * This variable is defined on systems supporting prototype declaration
+ * of functions with a variable number of arguments.
+ */
+/* _V:
+ * This macro is used to declare function parameters in prototypes for
+ * functions with a variable number of parameters. Use double parentheses.
+ * For example:
+ *
+ * int printf _V((char *fmt, ...));
+ *
+ * Remember to use the plain simple _() macro when declaring a function
+ * with no variable number of arguments, since it might be possible to
+ * have a non-effect _V() macro and still get prototypes via _().
+ */
+/*#define CAN_VAPROTO / **/
+#ifdef CAN_VAPROTO
+#define _V(args) args
+#else
+#define _V(args) ()
+#endif
+
+/* INTSIZE:
+ * This symbol contains the value of sizeof(int) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* LONGSIZE:
+ * This symbol contains the value of sizeof(long) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* SHORTSIZE:
+ * This symbol contains the value of sizeof(short) so that the C
+ * preprocessor can make decisions based on it.
+ */
+#define INTSIZE 4 /**/
+#define LONGSIZE 4 /**/
+#define SHORTSIZE 2 /**/
+
+/* MULTIARCH:
+ * This symbol, if defined, signifies that the build
+ * process will produce some binary files that are going to be
+ * used in a cross-platform environment. This is the case for
+ * example with the NeXT "fat" binaries that contain executables
+ * for several CPUs.
+ */
+/*#define MULTIARCH / **/
+
+/* HAS_QUAD:
+ * This symbol, if defined, tells that there's a 64-bit integer type,
+ * Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one
+ * of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T.
+ */
+#define HAS_QUAD /**/
+#ifdef HAS_QUAD
+# define Quad_t long long /**/
+# define Uquad_t unsigned long long /**/
+# define QUADKIND 3 /**/
+# define QUAD_IS_INT 1
+# define QUAD_IS_LONG 2
+# define QUAD_IS_LONG_LONG 3
+# define QUAD_IS_INT64_T 4
+#endif
+
+/* OSNAME:
+ * This symbol contains the name of the operating system, as determined
+ * by Configure. You shouldn't rely on it too much; the specific
+ * feature tests from Configure are generally more reliable.
+ */
+/* OSVERS:
+ * This symbol contains the version of the operating system, as determined
+ * by Configure. You shouldn't rely on it too much; the specific
+ * feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "MSWin32" /**/
+#define OSVERS "5.1" /**/
+
+/* ARCHLIB:
+ * This variable, if defined, holds the name of the directory in
+ * which the user wants to put architecture-dependent public
+ * library files for perl5. It is most often a local directory
+ * such as /usr/local/lib. Programs using this variable must be
+ * prepared to deal with filename expansion. If ARCHLIB is the
+ * same as PRIVLIB, it is not defined, since presumably the
+ * program already searches PRIVLIB.
+ */
+/* ARCHLIB_EXP:
+ * This symbol contains the ~name expanded version of ARCHLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define ARCHLIB "c:\\perl\\lib" /**/
+/*#define ARCHLIB_EXP "" / **/
+
+/* ARCHNAME:
+ * This symbol holds a string representing the architecture name.
+ * It may be used to construct an architecture-dependant pathname
+ * where library files may be held under a private library, for
+ * instance.
+ */
+#define ARCHNAME "MSWin32-x86-multi-thread" /**/
+
+/* BIN:
+ * This symbol holds the path of the bin directory where the package will
+ * be installed. Program must be prepared to deal with ~name substitution.
+ */
+/* BIN_EXP:
+ * This symbol is the filename expanded version of the BIN symbol, for
+ * programs that do not want to deal with that at run-time.
+ */
+/* PERL_RELOCATABLE_INC:
+ * This symbol, if defined, indicates that we'd like to relocate entries
+ * in @INC at run time based on the location of the perl binary.
+ */
+#define BIN "c:\\perl\\bin" /**/
+#define BIN_EXP "c:\\perl\\bin" /**/
+#define PERL_RELOCATABLE_INC "undef" /**/
+
+/* CAT2:
+ * This macro concatenates 2 tokens together.
+ */
+/* STRINGIFY:
+ * This macro surrounds its token with double quotes.
+ */
+#if 42 == 1
+#define CAT2(a,b) a/**/b
+#define STRINGIFY(a) "a"
+#endif
+#if 42 == 42
+#define PeRl_CaTiFy(a, b) a ## b
+#define PeRl_StGiFy(a) #a
+#define CAT2(a,b) PeRl_CaTiFy(a,b)
+#define StGiFy(a) PeRl_StGiFy(a)
+#define STRINGIFY(a) PeRl_StGiFy(a)
+#endif
+#if 42 != 1 && 42 != 42
+#include "Bletch: How does this C preprocessor concatenate tokens?"
+#endif
+
+/* CPPSTDIN:
+ * This symbol contains the first part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. Typical value of "cc -E" or "/lib/cpp", but it can also
+ * call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ * This symbol contains the second part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. This symbol will have the value "-" if CPPSTDIN needs a minus
+ * to specify standard input, otherwise the value is "".
+ */
+/* CPPRUN:
+ * This symbol contains the string which will invoke a C preprocessor on
+ * the standard input and produce to standard output. It needs to end
+ * with CPPLAST, after all other preprocessor flags have been specified.
+ * The main difference with CPPSTDIN is that this program will never be a
+ * pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
+ * available directly to the user. Note that it may well be different from
+ * the preprocessor used to compile the C program.
+ */
+/* CPPLAST:
+ * This symbol is intended to be used along with CPPRUN in the same manner
+ * symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
+ */
+#define CPPSTDIN "gcc -E"
+#define CPPMINUS "-"
+#define CPPRUN "gcc -E"
+#define CPPLAST ""
+
+/* HAS_ACCESS:
+ * This manifest constant lets the C program know that the access()
+ * system call is available to check for accessibility using real UID/GID.
+ * (always present on UNIX.)
+ */
+#define HAS_ACCESS /**/
+
+/* HAS_ACCESSX:
+ * This symbol, if defined, indicates that the accessx routine is
+ * available to do extended access checks.
+ */
+/*#define HAS_ACCESSX / **/
+
+/* HAS_ASCTIME_R:
+ * This symbol, if defined, indicates that the asctime_r routine
+ * is available to asctime re-entrantly.
+ */
+/* ASCTIME_R_PROTO:
+ * This symbol encodes the prototype of asctime_r.
+ * It is zero if d_asctime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_asctime_r
+ * is defined.
+ */
+/*#define HAS_ASCTIME_R / **/
+#define ASCTIME_R_PROTO 0 /**/
+
+/* HASATTRIBUTE_FORMAT:
+ * Can we handle GCC attribute for checking printf-style formats
+ */
+/* PRINTF_FORMAT_NULL_OK:
+ * Allows __printf__ format to be null when checking printf-style
+ */
+/* HASATTRIBUTE_MALLOC:
+ * Can we handle GCC attribute for malloc-style functions.
+ */
+/* HASATTRIBUTE_NONNULL:
+ * Can we handle GCC attribute for nonnull function parms.
+ */
+/* HASATTRIBUTE_NORETURN:
+ * Can we handle GCC attribute for functions that do not return
+ */
+/* HASATTRIBUTE_PURE:
+ * Can we handle GCC attribute for pure functions
+ */
+/* HASATTRIBUTE_UNUSED:
+ * Can we handle GCC attribute for unused variables and arguments
+ */
+/* HASATTRIBUTE_DEPRECATED:
+ * Can we handle GCC attribute for marking deprecated APIs
+ */
+/* HASATTRIBUTE_WARN_UNUSED_RESULT:
+ * Can we handle GCC attribute for warning on unused results
+ */
+/*#define HASATTRIBUTE_DEPRECATED / **/
+/*#define HASATTRIBUTE_FORMAT / **/
+/*#define PRINTF_FORMAT_NULL_OK / **/
+/*#define HASATTRIBUTE_NORETURN / **/
+/*#define HASATTRIBUTE_MALLOC / **/
+/*#define HASATTRIBUTE_NONNULL / **/
+/*#define HASATTRIBUTE_PURE / **/
+/*#define HASATTRIBUTE_UNUSED / **/
+/*#define HASATTRIBUTE_WARN_UNUSED_RESULT / **/
+
+/* HASCONST:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the const type. There is no need to actually test for that symbol
+ * within your programs. The mere use of the "const" keyword will
+ * trigger the necessary tests.
+ */
+#define HASCONST /**/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CRYPT_R:
+ * This symbol, if defined, indicates that the crypt_r routine
+ * is available to crypt re-entrantly.
+ */
+/* CRYPT_R_PROTO:
+ * This symbol encodes the prototype of crypt_r.
+ * It is zero if d_crypt_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_crypt_r
+ * is defined.
+ */
+/*#define HAS_CRYPT_R / **/
+#define CRYPT_R_PROTO 0 /**/
+
+/* HAS_CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
+ */
+/* CSH:
+ * This symbol, if defined, contains the full pathname of csh.
+ */
+/*#define HAS_CSH / **/
+#ifdef HAS_CSH
+#define CSH "" /**/
+#endif
+
+/* HAS_CTERMID_R:
+ * This symbol, if defined, indicates that the ctermid_r routine
+ * is available to ctermid re-entrantly.
+ */
+/* CTERMID_R_PROTO:
+ * This symbol encodes the prototype of ctermid_r.
+ * It is zero if d_ctermid_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctermid_r
+ * is defined.
+ */
+/*#define HAS_CTERMID_R / **/
+#define CTERMID_R_PROTO 0 /**/
+
+/* HAS_CTIME_R:
+ * This symbol, if defined, indicates that the ctime_r routine
+ * is available to ctime re-entrantly.
+ */
+/* CTIME_R_PROTO:
+ * This symbol encodes the prototype of ctime_r.
+ * It is zero if d_ctime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r
+ * is defined.
+ */
+/*#define HAS_CTIME_R / **/
+#define CTIME_R_PROTO 0 /**/
+
+/* HAS_DRAND48_R:
+ * This symbol, if defined, indicates that the drand48_r routine
+ * is available to drand48 re-entrantly.
+ */
+/* DRAND48_R_PROTO:
+ * This symbol encodes the prototype of drand48_r.
+ * It is zero if d_drand48_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_drand48_r
+ * is defined.
+ */
+/*#define HAS_DRAND48_R / **/
+#define DRAND48_R_PROTO 0 /**/
+
+/* HAS_DRAND48_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the drand48() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern double drand48(void);
+ */
+/*#define HAS_DRAND48_PROTO / **/
+
+/* HAS_EACCESS:
+ * This symbol, if defined, indicates that the eaccess routine is
+ * available to do extended access checks.
+ */
+/*#define HAS_EACCESS / **/
+
+/* HAS_ENDGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the group database.
+ */
+/*#define HAS_ENDGRENT / **/
+
+/* HAS_ENDGRENT_R:
+ * This symbol, if defined, indicates that the endgrent_r routine
+ * is available to endgrent re-entrantly.
+ */
+/* ENDGRENT_R_PROTO:
+ * This symbol encodes the prototype of endgrent_r.
+ * It is zero if d_endgrent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endgrent_r
+ * is defined.
+ */
+/*#define HAS_ENDGRENT_R / **/
+#define ENDGRENT_R_PROTO 0 /**/
+
+/* HAS_ENDHOSTENT:
+ * This symbol, if defined, indicates that the endhostent() routine is
+ * available to close whatever was being used for host queries.
+ */
+/*#define HAS_ENDHOSTENT / **/
+
+/* HAS_ENDHOSTENT_R:
+ * This symbol, if defined, indicates that the endhostent_r routine
+ * is available to endhostent re-entrantly.
+ */
+/* ENDHOSTENT_R_PROTO:
+ * This symbol encodes the prototype of endhostent_r.
+ * It is zero if d_endhostent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endhostent_r
+ * is defined.
+ */
+/*#define HAS_ENDHOSTENT_R / **/
+#define ENDHOSTENT_R_PROTO 0 /**/
+
+/* HAS_ENDNETENT:
+ * This symbol, if defined, indicates that the endnetent() routine is
+ * available to close whatever was being used for network queries.
+ */
+/*#define HAS_ENDNETENT / **/
+
+/* HAS_ENDNETENT_R:
+ * This symbol, if defined, indicates that the endnetent_r routine
+ * is available to endnetent re-entrantly.
+ */
+/* ENDNETENT_R_PROTO:
+ * This symbol encodes the prototype of endnetent_r.
+ * It is zero if d_endnetent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endnetent_r
+ * is defined.
+ */
+/*#define HAS_ENDNETENT_R / **/
+#define ENDNETENT_R_PROTO 0 /**/
+
+/* HAS_ENDPROTOENT:
+ * This symbol, if defined, indicates that the endprotoent() routine is
+ * available to close whatever was being used for protocol queries.
+ */
+/*#define HAS_ENDPROTOENT / **/
+
+/* HAS_ENDPROTOENT_R:
+ * This symbol, if defined, indicates that the endprotoent_r routine
+ * is available to endprotoent re-entrantly.
+ */
+/* ENDPROTOENT_R_PROTO:
+ * This symbol encodes the prototype of endprotoent_r.
+ * It is zero if d_endprotoent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endprotoent_r
+ * is defined.
+ */
+/*#define HAS_ENDPROTOENT_R / **/
+#define ENDPROTOENT_R_PROTO 0 /**/
+
+/* HAS_ENDPWENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the passwd database.
+ */
+/*#define HAS_ENDPWENT / **/
+
+/* HAS_ENDPWENT_R:
+ * This symbol, if defined, indicates that the endpwent_r routine
+ * is available to endpwent re-entrantly.
+ */
+/* ENDPWENT_R_PROTO:
+ * This symbol encodes the prototype of endpwent_r.
+ * It is zero if d_endpwent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endpwent_r
+ * is defined.
+ */
+/*#define HAS_ENDPWENT_R / **/
+#define ENDPWENT_R_PROTO 0 /**/
+
+/* HAS_ENDSERVENT:
+ * This symbol, if defined, indicates that the endservent() routine is
+ * available to close whatever was being used for service queries.
+ */
+/*#define HAS_ENDSERVENT / **/
+
+/* HAS_ENDSERVENT_R:
+ * This symbol, if defined, indicates that the endservent_r routine
+ * is available to endservent re-entrantly.
+ */
+/* ENDSERVENT_R_PROTO:
+ * This symbol encodes the prototype of endservent_r.
+ * It is zero if d_endservent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endservent_r
+ * is defined.
+ */
+/*#define HAS_ENDSERVENT_R / **/
+#define ENDSERVENT_R_PROTO 0 /**/
+
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
+ */
+#define FLEXFILENAMES /**/
+
+/* HAS_GETGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for sequential access of the group database.
+ */
+/*#define HAS_GETGRENT / **/
+
+/* HAS_GETGRENT_R:
+ * This symbol, if defined, indicates that the getgrent_r routine
+ * is available to getgrent re-entrantly.
+ */
+/* GETGRENT_R_PROTO:
+ * This symbol encodes the prototype of getgrent_r.
+ * It is zero if d_getgrent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrent_r
+ * is defined.
+ */
+/*#define HAS_GETGRENT_R / **/
+#define GETGRENT_R_PROTO 0 /**/
+
+/* HAS_GETGRGID_R:
+ * This symbol, if defined, indicates that the getgrgid_r routine
+ * is available to getgrgid re-entrantly.
+ */
+/* GETGRGID_R_PROTO:
+ * This symbol encodes the prototype of getgrgid_r.
+ * It is zero if d_getgrgid_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrgid_r
+ * is defined.
+ */
+/*#define HAS_GETGRGID_R / **/
+#define GETGRGID_R_PROTO 0 /**/
+
+/* HAS_GETGRNAM_R:
+ * This symbol, if defined, indicates that the getgrnam_r routine
+ * is available to getgrnam re-entrantly.
+ */
+/* GETGRNAM_R_PROTO:
+ * This symbol encodes the prototype of getgrnam_r.
+ * It is zero if d_getgrnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrnam_r
+ * is defined.
+ */
+/*#define HAS_GETGRNAM_R / **/
+#define GETGRNAM_R_PROTO 0 /**/
+
+/* HAS_GETHOSTBYADDR:
+ * This symbol, if defined, indicates that the gethostbyaddr() routine is
+ * available to look up hosts by their IP addresses.
+ */
+#define HAS_GETHOSTBYADDR /**/
+
+/* HAS_GETHOSTBYNAME:
+ * This symbol, if defined, indicates that the gethostbyname() routine is
+ * available to look up host names in some data base or other.
+ */
+#define HAS_GETHOSTBYNAME /**/
+
+/* HAS_GETHOSTENT:
+ * This symbol, if defined, indicates that the gethostent() routine is
+ * available to look up host names in some data base or another.
+ */
+/*#define HAS_GETHOSTENT / **/
+
+/* HAS_GETHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * gethostname() routine to derive the host name. See also HAS_UNAME
+ * and PHOSTNAME.
+ */
+/* HAS_UNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * uname() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and PHOSTNAME.
+ */
+/* PHOSTNAME:
+ * This symbol, if defined, indicates the command to feed to the
+ * popen() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and HAS_UNAME. Note that the command uses a fully qualified path,
+ * so that it is safe even if used by a process with super-user
+ * privileges.
+ */
+/* HAS_PHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * contents of PHOSTNAME as a command to feed to the popen() routine
+ * to derive the host name.
+ */
+#define HAS_GETHOSTNAME /**/
+#define HAS_UNAME /**/
+/*#define HAS_PHOSTNAME / **/
+#ifdef HAS_PHOSTNAME
+#define PHOSTNAME "" /* How to get the host name */
+#endif
+
+/* HAS_GETHOSTBYADDR_R:
+ * This symbol, if defined, indicates that the gethostbyaddr_r routine
+ * is available to gethostbyaddr re-entrantly.
+ */
+/* GETHOSTBYADDR_R_PROTO:
+ * This symbol encodes the prototype of gethostbyaddr_r.
+ * It is zero if d_gethostbyaddr_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyaddr_r
+ * is defined.
+ */
+/*#define HAS_GETHOSTBYADDR_R / **/
+#define GETHOSTBYADDR_R_PROTO 0 /**/
+
+/* HAS_GETHOSTBYNAME_R:
+ * This symbol, if defined, indicates that the gethostbyname_r routine
+ * is available to gethostbyname re-entrantly.
+ */
+/* GETHOSTBYNAME_R_PROTO:
+ * This symbol encodes the prototype of gethostbyname_r.
+ * It is zero if d_gethostbyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyname_r
+ * is defined.
+ */
+/*#define HAS_GETHOSTBYNAME_R / **/
+#define GETHOSTBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETHOSTENT_R:
+ * This symbol, if defined, indicates that the gethostent_r routine
+ * is available to gethostent re-entrantly.
+ */
+/* GETHOSTENT_R_PROTO:
+ * This symbol encodes the prototype of gethostent_r.
+ * It is zero if d_gethostent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostent_r
+ * is defined.
+ */
+/*#define HAS_GETHOSTENT_R / **/
+#define GETHOSTENT_R_PROTO 0 /**/
+
+/* HAS_GETHOST_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for gethostent(), gethostbyname(), and
+ * gethostbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETHOST_PROTOS /**/
+
+/* HAS_GETLOGIN_R:
+ * This symbol, if defined, indicates that the getlogin_r routine
+ * is available to getlogin re-entrantly.
+ */
+/* GETLOGIN_R_PROTO:
+ * This symbol encodes the prototype of getlogin_r.
+ * It is zero if d_getlogin_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getlogin_r
+ * is defined.
+ */
+/*#define HAS_GETLOGIN_R / **/
+#define GETLOGIN_R_PROTO 0 /**/
+
+/* HAS_GETNETBYADDR:
+ * This symbol, if defined, indicates that the getnetbyaddr() routine is
+ * available to look up networks by their IP addresses.
+ */
+/*#define HAS_GETNETBYADDR / **/
+
+/* HAS_GETNETBYNAME:
+ * This symbol, if defined, indicates that the getnetbyname() routine is
+ * available to look up networks by their names.
+ */
+/*#define HAS_GETNETBYNAME / **/
+
+/* HAS_GETNETENT:
+ * This symbol, if defined, indicates that the getnetent() routine is
+ * available to look up network names in some data base or another.
+ */
+/*#define HAS_GETNETENT / **/
+
+/* HAS_GETNETBYADDR_R:
+ * This symbol, if defined, indicates that the getnetbyaddr_r routine
+ * is available to getnetbyaddr re-entrantly.
+ */
+/* GETNETBYADDR_R_PROTO:
+ * This symbol encodes the prototype of getnetbyaddr_r.
+ * It is zero if d_getnetbyaddr_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyaddr_r
+ * is defined.
+ */
+/*#define HAS_GETNETBYADDR_R / **/
+#define GETNETBYADDR_R_PROTO 0 /**/
+
+/* HAS_GETNETBYNAME_R:
+ * This symbol, if defined, indicates that the getnetbyname_r routine
+ * is available to getnetbyname re-entrantly.
+ */
+/* GETNETBYNAME_R_PROTO:
+ * This symbol encodes the prototype of getnetbyname_r.
+ * It is zero if d_getnetbyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyname_r
+ * is defined.
+ */
+/*#define HAS_GETNETBYNAME_R / **/
+#define GETNETBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETNETENT_R:
+ * This symbol, if defined, indicates that the getnetent_r routine
+ * is available to getnetent re-entrantly.
+ */
+/* GETNETENT_R_PROTO:
+ * This symbol encodes the prototype of getnetent_r.
+ * It is zero if d_getnetent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetent_r
+ * is defined.
+ */
+/*#define HAS_GETNETENT_R / **/
+#define GETNETENT_R_PROTO 0 /**/
+
+/* HAS_GETNET_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getnetent(), getnetbyname(), and
+ * getnetbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define HAS_GETNET_PROTOS / **/
+
+/* HAS_GETPROTOENT:
+ * This symbol, if defined, indicates that the getprotoent() routine is
+ * available to look up protocols in some data base or another.
+ */
+/*#define HAS_GETPROTOENT / **/
+
+/* HAS_GETPGRP:
+ * This symbol, if defined, indicates that the getpgrp routine is
+ * available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ * This symbol, if defined, indicates that getpgrp needs one
+ * arguments whereas USG one needs none.
+ */
+/*#define HAS_GETPGRP / **/
+/*#define USE_BSD_GETPGRP / **/
+
+/* HAS_GETPROTOBYNAME:
+ * This symbol, if defined, indicates that the getprotobyname()
+ * routine is available to look up protocols by their name.
+ */
+/* HAS_GETPROTOBYNUMBER:
+ * This symbol, if defined, indicates that the getprotobynumber()
+ * routine is available to look up protocols by their number.
+ */
+#define HAS_GETPROTOBYNAME /**/
+#define HAS_GETPROTOBYNUMBER /**/
+
+/* HAS_GETPROTOBYNAME_R:
+ * This symbol, if defined, indicates that the getprotobyname_r routine
+ * is available to getprotobyname re-entrantly.
+ */
+/* GETPROTOBYNAME_R_PROTO:
+ * This symbol encodes the prototype of getprotobyname_r.
+ * It is zero if d_getprotobyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobyname_r
+ * is defined.
+ */
+/*#define HAS_GETPROTOBYNAME_R / **/
+#define GETPROTOBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETPROTOBYNUMBER_R:
+ * This symbol, if defined, indicates that the getprotobynumber_r routine
+ * is available to getprotobynumber re-entrantly.
+ */
+/* GETPROTOBYNUMBER_R_PROTO:
+ * This symbol encodes the prototype of getprotobynumber_r.
+ * It is zero if d_getprotobynumber_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobynumber_r
+ * is defined.
+ */
+/*#define HAS_GETPROTOBYNUMBER_R / **/
+#define GETPROTOBYNUMBER_R_PROTO 0 /**/
+
+/* HAS_GETPROTOENT_R:
+ * This symbol, if defined, indicates that the getprotoent_r routine
+ * is available to getprotoent re-entrantly.
+ */
+/* GETPROTOENT_R_PROTO:
+ * This symbol encodes the prototype of getprotoent_r.
+ * It is zero if d_getprotoent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotoent_r
+ * is defined.
+ */
+/*#define HAS_GETPROTOENT_R / **/
+#define GETPROTOENT_R_PROTO 0 /**/
+
+/* HAS_GETPROTO_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getprotoent(), getprotobyname(), and
+ * getprotobyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETPROTO_PROTOS /**/
+
+/* HAS_GETPWENT:
+ * This symbol, if defined, indicates that the getpwent routine is
+ * available for sequential access of the passwd database.
+ * If this is not available, the older getpw() function may be available.
+ */
+/*#define HAS_GETPWENT / **/
+
+/* HAS_GETPWENT_R:
+ * This symbol, if defined, indicates that the getpwent_r routine
+ * is available to getpwent re-entrantly.
+ */
+/* GETPWENT_R_PROTO:
+ * This symbol encodes the prototype of getpwent_r.
+ * It is zero if d_getpwent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwent_r
+ * is defined.
+ */
+/*#define HAS_GETPWENT_R / **/
+#define GETPWENT_R_PROTO 0 /**/
+
+/* HAS_GETPWNAM_R:
+ * This symbol, if defined, indicates that the getpwnam_r routine
+ * is available to getpwnam re-entrantly.
+ */
+/* GETPWNAM_R_PROTO:
+ * This symbol encodes the prototype of getpwnam_r.
+ * It is zero if d_getpwnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwnam_r
+ * is defined.
+ */
+/*#define HAS_GETPWNAM_R / **/
+#define GETPWNAM_R_PROTO 0 /**/
+
+/* HAS_GETPWUID_R:
+ * This symbol, if defined, indicates that the getpwuid_r routine
+ * is available to getpwuid re-entrantly.
+ */
+/* GETPWUID_R_PROTO:
+ * This symbol encodes the prototype of getpwuid_r.
+ * It is zero if d_getpwuid_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwuid_r
+ * is defined.
+ */
+/*#define HAS_GETPWUID_R / **/
+#define GETPWUID_R_PROTO 0 /**/
+
+/* HAS_GETSERVENT:
+ * This symbol, if defined, indicates that the getservent() routine is
+ * available to look up network services in some data base or another.
+ */
+/*#define HAS_GETSERVENT / **/
+
+/* HAS_GETSERVBYNAME_R:
+ * This symbol, if defined, indicates that the getservbyname_r routine
+ * is available to getservbyname re-entrantly.
+ */
+/* GETSERVBYNAME_R_PROTO:
+ * This symbol encodes the prototype of getservbyname_r.
+ * It is zero if d_getservbyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyname_r
+ * is defined.
+ */
+/*#define HAS_GETSERVBYNAME_R / **/
+#define GETSERVBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETSERVBYPORT_R:
+ * This symbol, if defined, indicates that the getservbyport_r routine
+ * is available to getservbyport re-entrantly.
+ */
+/* GETSERVBYPORT_R_PROTO:
+ * This symbol encodes the prototype of getservbyport_r.
+ * It is zero if d_getservbyport_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyport_r
+ * is defined.
+ */
+/*#define HAS_GETSERVBYPORT_R / **/
+#define GETSERVBYPORT_R_PROTO 0 /**/
+
+/* HAS_GETSERVENT_R:
+ * This symbol, if defined, indicates that the getservent_r routine
+ * is available to getservent re-entrantly.
+ */
+/* GETSERVENT_R_PROTO:
+ * This symbol encodes the prototype of getservent_r.
+ * It is zero if d_getservent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservent_r
+ * is defined.
+ */
+/*#define HAS_GETSERVENT_R / **/
+#define GETSERVENT_R_PROTO 0 /**/
+
+/* HAS_GETSERV_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getservent(), getservbyname(), and
+ * getservbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+#define HAS_GETSERV_PROTOS /**/
+
+/* HAS_GETSPNAM_R:
+ * This symbol, if defined, indicates that the getspnam_r routine
+ * is available to getspnam re-entrantly.
+ */
+/* GETSPNAM_R_PROTO:
+ * This symbol encodes the prototype of getspnam_r.
+ * It is zero if d_getspnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getspnam_r
+ * is defined.
+ */
+/*#define HAS_GETSPNAM_R / **/
+#define GETSPNAM_R_PROTO 0 /**/
+
+/* HAS_GETSERVBYNAME:
+ * This symbol, if defined, indicates that the getservbyname()
+ * routine is available to look up services by their name.
+ */
+/* HAS_GETSERVBYPORT:
+ * This symbol, if defined, indicates that the getservbyport()
+ * routine is available to look up services by their port.
+ */
+#define HAS_GETSERVBYNAME /**/
+#define HAS_GETSERVBYPORT /**/
+
+/* HAS_GMTIME_R:
+ * This symbol, if defined, indicates that the gmtime_r routine
+ * is available to gmtime re-entrantly.
+ */
+/* GMTIME_R_PROTO:
+ * This symbol encodes the prototype of gmtime_r.
+ * It is zero if d_gmtime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gmtime_r
+ * is defined.
+ */
+/*#define HAS_GMTIME_R / **/
+#define GMTIME_R_PROTO 0 /**/
+
+/* HAS_HTONL:
+ * This symbol, if defined, indicates that the htonl() routine (and
+ * friends htons() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_HTONS:
+ * This symbol, if defined, indicates that the htons() routine (and
+ * friends htonl() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHL:
+ * This symbol, if defined, indicates that the ntohl() routine (and
+ * friends htonl() htons() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHS:
+ * This symbol, if defined, indicates that the ntohs() routine (and
+ * friends htonl() htons() ntohl()) are available to do network
+ * order byte swapping.
+ */
+#define HAS_HTONL /**/
+#define HAS_HTONS /**/
+#define HAS_NTOHL /**/
+#define HAS_NTOHS /**/
+
+/* HAS_LOCALTIME_R:
+ * This symbol, if defined, indicates that the localtime_r routine
+ * is available to localtime re-entrantly.
+ */
+/* LOCALTIME_R_NEEDS_TZSET:
+ * Many libc's localtime_r implementations do not call tzset,
+ * making them differ from localtime(), and making timezone
+ * changes using \undef{TZ} without explicitly calling tzset
+ * impossible. This symbol makes us call tzset before localtime_r
+ */
+/*#define LOCALTIME_R_NEEDS_TZSET / **/
+#ifdef LOCALTIME_R_NEEDS_TZSET
+#define L_R_TZSET tzset(),
+#else
+#define L_R_TZSET
+#endif
+
+/* LOCALTIME_R_PROTO:
+ * This symbol encodes the prototype of localtime_r.
+ * It is zero if d_localtime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_localtime_r
+ * is defined.
+ */
+/*#define HAS_LOCALTIME_R / **/
+#define LOCALTIME_R_PROTO 0 /**/
+
+/* HAS_LONG_DOUBLE:
+ * This symbol will be defined if the C compiler supports long
+ * doubles.
+ */
+/* LONG_DOUBLESIZE:
+ * This symbol contains the size of a long double, so that the
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long doubles.
+ */
+#define HAS_LONG_DOUBLE /**/
+#ifdef HAS_LONG_DOUBLE
+#define LONG_DOUBLESIZE 12 /**/
+#endif
+
+/* HAS_LONG_LONG:
+ * This symbol will be defined if the C compiler supports long long.
+ */
+/* LONGLONGSIZE:
+ * This symbol contains the size of a long long, so that the
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long long.
+ */
+/*#define HAS_LONG_LONG / **/
+#ifdef HAS_LONG_LONG
+#define LONGLONGSIZE 8 /**/
+#endif
+
+/* HAS_LSEEK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the lseek() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern off_t lseek(int, off_t, int);
+ */
+#define HAS_LSEEK_PROTO /**/
+
+/* HAS_MEMCHR:
+ * This symbol, if defined, indicates that the memchr routine is available
+ * to locate characters within a C string.
+ */
+#define HAS_MEMCHR /**/
+
+/* HAS_MKSTEMP:
+ * This symbol, if defined, indicates that the mkstemp routine is
+ * available to exclusively create and open a uniquely named
+ * temporary file.
+ */
+/*#define HAS_MKSTEMP / **/
+
+/* HAS_MMAP:
+ * This symbol, if defined, indicates that the mmap system call is
+ * available to map a file into memory.
+ */
+/* Mmap_t:
+ * This symbol holds the return type of the mmap() system call
+ * (and simultaneously the type of the first argument).
+ * Usually set to 'void *' or 'caddr_t'.
+ */
+/*#define HAS_MMAP / **/
+#define Mmap_t void * /**/
+
+/* HAS_MSG:
+ * This symbol, if defined, indicates that the entire msg*(2) library is
+ * supported (IPC mechanism based on message queues).
+ */
+/*#define HAS_MSG / **/
+
+/* OLD_PTHREAD_CREATE_JOINABLE:
+ * This symbol, if defined, indicates how to create pthread
+ * in joinable (aka undetached) state. NOTE: not defined
+ * if pthread.h already has defined PTHREAD_CREATE_JOINABLE
+ * (the new version of the constant).
+ * If defined, known values are PTHREAD_CREATE_UNDETACHED
+ * and __UNDETACHED.
+ */
+/*#define OLD_PTHREAD_CREATE_JOINABLE / **/
+
+/* HAS_PTHREAD_ATFORK:
+ * This symbol, if defined, indicates that the pthread_atfork routine
+ * is available to setup fork handlers.
+ */
+/*#define HAS_PTHREAD_ATFORK / **/
+
+/* HAS_PTHREAD_YIELD:
+ * This symbol, if defined, indicates that the pthread_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/* SCHED_YIELD:
+ * This symbol defines the way to yield the execution of
+ * the current thread. Known ways are sched_yield,
+ * pthread_yield, and pthread_yield with NULL.
+ */
+/* HAS_SCHED_YIELD:
+ * This symbol, if defined, indicates that the sched_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/*#define HAS_PTHREAD_YIELD / **/
+#define SCHED_YIELD /**/
+/*#define HAS_SCHED_YIELD / **/
+
+/* HAS_RANDOM_R:
+ * This symbol, if defined, indicates that the random_r routine
+ * is available to random re-entrantly.
+ */
+/* RANDOM_R_PROTO:
+ * This symbol encodes the prototype of random_r.
+ * It is zero if d_random_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_random_r
+ * is defined.
+ */
+/*#define HAS_RANDOM_R / **/
+#define RANDOM_R_PROTO 0 /**/
+
+/* HAS_READDIR64_R:
+ * This symbol, if defined, indicates that the readdir64_r routine
+ * is available to readdir64 re-entrantly.
+ */
+/* READDIR64_R_PROTO:
+ * This symbol encodes the prototype of readdir64_r.
+ * It is zero if d_readdir64_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir64_r
+ * is defined.
+ */
+/*#define HAS_READDIR64_R / **/
+#define READDIR64_R_PROTO 0 /**/
+
+/* HAS_READDIR_R:
+ * This symbol, if defined, indicates that the readdir_r routine
+ * is available to readdir re-entrantly.
+ */
+/* READDIR_R_PROTO:
+ * This symbol encodes the prototype of readdir_r.
+ * It is zero if d_readdir_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir_r
+ * is defined.
+ */
+/*#define HAS_READDIR_R / **/
+#define READDIR_R_PROTO 0 /**/
+
+/* HAS_SEM:
+ * This symbol, if defined, indicates that the entire sem*(2) library is
+ * supported.
+ */
+/*#define HAS_SEM / **/
+
+/* HAS_SETGRENT:
+ * This symbol, if defined, indicates that the setgrent routine is
+ * available for initializing sequential access of the group database.
+ */
+/*#define HAS_SETGRENT / **/
+
+/* HAS_SETGRENT_R:
+ * This symbol, if defined, indicates that the setgrent_r routine
+ * is available to setgrent re-entrantly.
+ */
+/* SETGRENT_R_PROTO:
+ * This symbol encodes the prototype of setgrent_r.
+ * It is zero if d_setgrent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setgrent_r
+ * is defined.
+ */
+/*#define HAS_SETGRENT_R / **/
+#define SETGRENT_R_PROTO 0 /**/
+
+/* HAS_SETHOSTENT:
+ * This symbol, if defined, indicates that the sethostent() routine is
+ * available.
+ */
+/*#define HAS_SETHOSTENT / **/
+
+/* HAS_SETHOSTENT_R:
+ * This symbol, if defined, indicates that the sethostent_r routine
+ * is available to sethostent re-entrantly.
+ */
+/* SETHOSTENT_R_PROTO:
+ * This symbol encodes the prototype of sethostent_r.
+ * It is zero if d_sethostent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_sethostent_r
+ * is defined.
+ */
+/*#define HAS_SETHOSTENT_R / **/
+#define SETHOSTENT_R_PROTO 0 /**/
+
+/* HAS_SETLOCALE_R:
+ * This symbol, if defined, indicates that the setlocale_r routine
+ * is available to setlocale re-entrantly.
+ */
+/* SETLOCALE_R_PROTO:
+ * This symbol encodes the prototype of setlocale_r.
+ * It is zero if d_setlocale_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setlocale_r
+ * is defined.
+ */
+/*#define HAS_SETLOCALE_R / **/
+#define SETLOCALE_R_PROTO 0 /**/
+
+/* HAS_SETNETENT:
+ * This symbol, if defined, indicates that the setnetent() routine is
+ * available.
+ */
+/*#define HAS_SETNETENT / **/
+
+/* HAS_SETNETENT_R:
+ * This symbol, if defined, indicates that the setnetent_r routine
+ * is available to setnetent re-entrantly.
+ */
+/* SETNETENT_R_PROTO:
+ * This symbol encodes the prototype of setnetent_r.
+ * It is zero if d_setnetent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setnetent_r
+ * is defined.
+ */
+/*#define HAS_SETNETENT_R / **/
+#define SETNETENT_R_PROTO 0 /**/
+
+/* HAS_SETPROTOENT:
+ * This symbol, if defined, indicates that the setprotoent() routine is
+ * available.
+ */
+/*#define HAS_SETPROTOENT / **/
+
+/* HAS_SETPGRP:
+ * This symbol, if defined, indicates that the setpgrp routine is
+ * available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ * This symbol, if defined, indicates that setpgrp needs two
+ * arguments whereas USG one needs none. See also HAS_SETPGID
+ * for a POSIX interface.
+ */
+/*#define HAS_SETPGRP / **/
+/*#define USE_BSD_SETPGRP / **/
+
+/* HAS_SETPROTOENT_R:
+ * This symbol, if defined, indicates that the setprotoent_r routine
+ * is available to setprotoent re-entrantly.
+ */
+/* SETPROTOENT_R_PROTO:
+ * This symbol encodes the prototype of setprotoent_r.
+ * It is zero if d_setprotoent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setprotoent_r
+ * is defined.
+ */
+/*#define HAS_SETPROTOENT_R / **/
+#define SETPROTOENT_R_PROTO 0 /**/
+
+/* HAS_SETPWENT:
+ * This symbol, if defined, indicates that the setpwent routine is
+ * available for initializing sequential access of the passwd database.
+ */
+/*#define HAS_SETPWENT / **/
+
+/* HAS_SETPWENT_R:
+ * This symbol, if defined, indicates that the setpwent_r routine
+ * is available to setpwent re-entrantly.
+ */
+/* SETPWENT_R_PROTO:
+ * This symbol encodes the prototype of setpwent_r.
+ * It is zero if d_setpwent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setpwent_r
+ * is defined.
+ */
+/*#define HAS_SETPWENT_R / **/
+#define SETPWENT_R_PROTO 0 /**/
+
+/* HAS_SETSERVENT:
+ * This symbol, if defined, indicates that the setservent() routine is
+ * available.
+ */
+/*#define HAS_SETSERVENT / **/
+
+/* HAS_SETSERVENT_R:
+ * This symbol, if defined, indicates that the setservent_r routine
+ * is available to setservent re-entrantly.
+ */
+/* SETSERVENT_R_PROTO:
+ * This symbol encodes the prototype of setservent_r.
+ * It is zero if d_setservent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setservent_r
+ * is defined.
+ */
+/*#define HAS_SETSERVENT_R / **/
+#define SETSERVENT_R_PROTO 0 /**/
+
+/* HAS_SETVBUF:
+ * This symbol, if defined, indicates that the setvbuf routine is
+ * available to change buffering on an open stdio stream.
+ * to a line-buffered mode.
+ */
+#define HAS_SETVBUF /**/
+
+/* HAS_SHM:
+ * This symbol, if defined, indicates that the entire shm*(2) library is
+ * supported.
+ */
+/*#define HAS_SHM / **/
+
+/* Shmat_t:
+ * This symbol holds the return type of the shmat() system call.
+ * Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ * This symbol, if defined, indicates that the sys/shm.h includes
+ * a prototype for shmat(). Otherwise, it is up to the program to
+ * guess one. Shmat_t shmat(int, Shmat_t, int) is a good guess,
+ * but not always right so it should be emitted by the program only
+ * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#define Shmat_t void * /**/
+/*#define HAS_SHMAT_PROTOTYPE / **/
+
+/* HAS_SOCKET:
+ * This symbol, if defined, indicates that the BSD socket interface is
+ * supported.
+ */
+/* HAS_SOCKETPAIR:
+ * This symbol, if defined, indicates that the BSD socketpair() call is
+ * supported.
+ */
+/* HAS_MSG_CTRUNC:
+ * This symbol, if defined, indicates that the MSG_CTRUNC is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_DONTROUTE:
+ * This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_OOB:
+ * This symbol, if defined, indicates that the MSG_OOB is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PEEK:
+ * This symbol, if defined, indicates that the MSG_PEEK is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PROXY:
+ * This symbol, if defined, indicates that the MSG_PROXY is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_SCM_RIGHTS:
+ * This symbol, if defined, indicates that the SCM_RIGHTS is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+#define HAS_SOCKET /**/
+/*#define HAS_SOCKETPAIR / **/
+/*#define HAS_MSG_CTRUNC / **/
+/*#define HAS_MSG_DONTROUTE / **/
+/*#define HAS_MSG_OOB / **/
+/*#define HAS_MSG_PEEK / **/
+/*#define HAS_MSG_PROXY / **/
+/*#define HAS_SCM_RIGHTS / **/
+
+/* HAS_SRAND48_R:
+ * This symbol, if defined, indicates that the srand48_r routine
+ * is available to srand48 re-entrantly.
+ */
+/* SRAND48_R_PROTO:
+ * This symbol encodes the prototype of srand48_r.
+ * It is zero if d_srand48_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_srand48_r
+ * is defined.
+ */
+/*#define HAS_SRAND48_R / **/
+#define SRAND48_R_PROTO 0 /**/
+
+/* HAS_SRANDOM_R:
+ * This symbol, if defined, indicates that the srandom_r routine
+ * is available to srandom re-entrantly.
+ */
+/* SRANDOM_R_PROTO:
+ * This symbol encodes the prototype of srandom_r.
+ * It is zero if d_srandom_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_srandom_r
+ * is defined.
+ */
+/*#define HAS_SRANDOM_R / **/
+#define SRANDOM_R_PROTO 0 /**/
+
+/* USE_STAT_BLOCKS:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_blksize and st_blocks.
+ */
+#ifndef USE_STAT_BLOCKS
+/*#define USE_STAT_BLOCKS / **/
+#endif
+
+/* USE_STRUCT_COPY:
+ * This symbol, if defined, indicates that this C compiler knows how
+ * to copy structures. If undefined, you'll need to use a block copy
+ * routine of some sort instead.
+ */
+#define USE_STRUCT_COPY /**/
+
+/* HAS_STRERROR:
+ * This symbol, if defined, indicates that the strerror routine is
+ * available to translate error numbers to strings. See the writeup
+ * of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ * This symbol, if defined, indicates that the sys_errlist array is
+ * available to translate error numbers to strings. The extern int
+ * sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ * This preprocessor symbol is defined as a macro if strerror() is
+ * not available to translate error numbers to strings but sys_errlist[]
+ * array is there.
+ */
+#define HAS_STRERROR /**/
+#define HAS_SYS_ERRLIST /**/
+#define Strerror(e) strerror(e)
+
+/* HAS_STRERROR_R:
+ * This symbol, if defined, indicates that the strerror_r routine
+ * is available to strerror re-entrantly.
+ */
+/* STRERROR_R_PROTO:
+ * This symbol encodes the prototype of strerror_r.
+ * It is zero if d_strerror_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_strerror_r
+ * is defined.
+ */
+/*#define HAS_STRERROR_R / **/
+#define STRERROR_R_PROTO 0 /**/
+
+/* HAS_STRTOUL:
+ * This symbol, if defined, indicates that the strtoul routine is
+ * available to provide conversion of strings to unsigned long.
+ */
+#define HAS_STRTOUL /**/
+
+/* HAS_TIME:
+ * This symbol, if defined, indicates that the time() routine exists.
+ */
+/* Time_t:
+ * This symbol holds the type returned by time(). It can be long,
+ * or time_t on BSD sites (in which case <sys/types.h> should be
+ * included).
+ */
+#define HAS_TIME /**/
+#define Time_t time_t /* Time type */
+
+/* HAS_TIMES:
+ * This symbol, if defined, indicates that the times() routine exists.
+ * Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+#define HAS_TIMES /**/
+
+/* HAS_TMPNAM_R:
+ * This symbol, if defined, indicates that the tmpnam_r routine
+ * is available to tmpnam re-entrantly.
+ */
+/* TMPNAM_R_PROTO:
+ * This symbol encodes the prototype of tmpnam_r.
+ * It is zero if d_tmpnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_tmpnam_r
+ * is defined.
+ */
+/*#define HAS_TMPNAM_R / **/
+#define TMPNAM_R_PROTO 0 /**/
+
+/* HAS_TTYNAME_R:
+ * This symbol, if defined, indicates that the ttyname_r routine
+ * is available to ttyname re-entrantly.
+ */
+/* TTYNAME_R_PROTO:
+ * This symbol encodes the prototype of ttyname_r.
+ * It is zero if d_ttyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_ttyname_r
+ * is defined.
+ */
+/*#define HAS_TTYNAME_R / **/
+#define TTYNAME_R_PROTO 0 /**/
+
+/* HAS_UNION_SEMUN:
+ * This symbol, if defined, indicates that the union semun is
+ * defined by including <sys/sem.h>. If not, the user code
+ * probably needs to define it as:
+ * union semun {
+ * int val;
+ * struct semid_ds *buf;
+ * unsigned short *array;
+ * }
+ */
+/* USE_SEMCTL_SEMUN:
+ * This symbol, if defined, indicates that union semun is
+ * used for semctl IPC_STAT.
+ */
+/* USE_SEMCTL_SEMID_DS:
+ * This symbol, if defined, indicates that struct semid_ds * is
+ * used for semctl IPC_STAT.
+ */
+#define HAS_UNION_SEMUN /**/
+/*#define USE_SEMCTL_SEMUN / **/
+/*#define USE_SEMCTL_SEMID_DS / **/
+
+/* HAS_VFORK:
+ * This symbol, if defined, indicates that vfork() exists.
+ */
+/*#define HAS_VFORK / **/
+
+/* HAS_PSEUDOFORK:
+ * This symbol, if defined, indicates that an emulation of the
+ * fork routine is available.
+ */
+#define HAS_PSEUDOFORK /**/
+
+/* Signal_t:
+ * This symbol's value is either "void" or "int", corresponding to the
+ * appropriate return type of a signal handler. Thus, you can declare
+ * a signal handler using "Signal_t (*handler)()", and define the
+ * handler using "Signal_t handler(sig)".
+ */
+#define Signal_t void /* Signal handler's return type */
+
+/* HASVOLATILE:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the volatile declaration.
+ */
+#define HASVOLATILE /**/
+#ifndef HASVOLATILE
+#define volatile
+#endif
+
+/* Fpos_t:
+ * This symbol holds the type used to declare file positions in libc.
+ * It can be fpos_t, long, uint, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t fpos_t /* File position type */
+
+/* Gid_t_f:
+ * This symbol defines the format string used for printing a Gid_t.
+ */
+#define Gid_t_f "ld" /**/
+
+/* Gid_t_sign:
+ * This symbol holds the signedess of a Gid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Gid_t_sign -1 /* GID sign */
+
+/* Gid_t_size:
+ * This symbol holds the size of a Gid_t in bytes.
+ */
+#define Gid_t_size 4 /* GID size */
+
+/* Gid_t:
+ * This symbol holds the return type of getgid() and the type of
+ * argument to setrgid() and related functions. Typically,
+ * it is the type of group ids in the kernel. It can be int, ushort,
+ * gid_t, etc... It may be necessary to include <sys/types.h> to get
+ * any typedef'ed information.
+ */
+#define Gid_t gid_t /* Type for getgid(), etc... */
+
+/* I_DIRENT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <dirent.h>. Using this symbol also triggers the definition
+ * of the Direntry_t define which ends up being 'struct dirent' or
+ * 'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ * This symbol is set to 'struct direct' or 'struct dirent' depending on
+ * whether dirent is available or not. You should use this pseudo type to
+ * portably declare your directory entries.
+ */
+#define I_DIRENT /**/
+#define DIRNAMLEN /**/
+#define Direntry_t struct direct
+
+/* I_GRP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <grp.h>.
+ */
+/* GRPASSWD:
+ * This symbol, if defined, indicates to the C program that struct group
+ * in <grp.h> contains gr_passwd.
+ */
+/*#define I_GRP / **/
+/*#define GRPASSWD / **/
+
+/* I_MACH_CTHREADS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <mach/cthreads.h>.
+ */
+/*#define I_MACH_CTHREADS / **/
+
+/* I_NDBM:
+ * This symbol, if defined, indicates that <ndbm.h> exists and should
+ * be included.
+ */
+/* I_GDBMNDBM:
+ * This symbol, if defined, indicates that <gdbm/ndbm.h> exists and should
+ * be included. This was the location of the ndbm.h compatibility file
+ * in RedHat 7.1.
+ */
+/* I_GDBM_NDBM:
+ * This symbol, if defined, indicates that <gdbm-ndbm.h> exists and should
+ * be included. This is the location of the ndbm.h compatibility file
+ * in Debian 4.0.
+ */
+/* NDBM_H_USES_PROTOTYPES:
+ * This symbol, if defined, indicates that <ndbm.h> uses real ANSI C
+ * prototypes instead of K&R style function declarations without any
+ * parameter information. While ANSI C prototypes are supported in C++,
+ * K&R style function declarations will yield errors.
+ */
+/* GDBMNDBM_H_USES_PROTOTYPES:
+ * This symbol, if defined, indicates that <gdbm/ndbm.h> uses real ANSI C
+ * prototypes instead of K&R style function declarations without any
+ * parameter information. While ANSI C prototypes are supported in C++,
+ * K&R style function declarations will yield errors.
+ */
+/* GDBM_NDBM_H_USES_PROTOTYPES:
+ * This symbol, if defined, indicates that <gdbm-ndbm.h> uses real ANSI C
+ * prototypes instead of K&R style function declarations without any
+ * parameter information. While ANSI C prototypes are supported in C++,
+ * K&R style function declarations will yield errors.
+ */
+/*#define I_NDBM / **/
+/*#define I_GDBMNDBM / **/
+/*#define I_GDBM_NDBM / **/
+/*#define NDBM_H_USES_PROTOTYPES / **/
+/*#define GDBMNDBM_H_USES_PROTOTYPES / **/
+/*#define GDBM_NDBM_H_USES_PROTOTYPES / **/
+
+/* I_NETDB:
+ * This symbol, if defined, indicates that <netdb.h> exists and
+ * should be included.
+ */
+/*#define I_NETDB / **/
+
+/* I_NET_ERRNO:
+ * This symbol, if defined, indicates that <net/errno.h> exists and
+ * should be included.
+ */
+/*#define I_NET_ERRNO / **/
+
+/* I_PTHREAD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pthread.h>.
+ */
+/*#define I_PTHREAD / **/
+
+/* I_PWD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pwd.h>.
+ */
+/* PWQUOTA:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_quota.
+ */
+/* PWAGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_age.
+ */
+/* PWCHANGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_change.
+ */
+/* PWCLASS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_class.
+ */
+/* PWEXPIRE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_expire.
+ */
+/* PWCOMMENT:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_comment.
+ */
+/* PWGECOS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_gecos.
+ */
+/* PWPASSWD:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_passwd.
+ */
+/*#define I_PWD / **/
+/*#define PWQUOTA / **/
+/*#define PWAGE / **/
+/*#define PWCHANGE / **/
+/*#define PWCLASS / **/
+/*#define PWEXPIRE / **/
+/*#define PWCOMMENT / **/
+/*#define PWGECOS / **/
+/*#define PWPASSWD / **/
+
+/* I_SYS_ACCESS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/access.h>.
+ */
+/*#define I_SYS_ACCESS / **/
+
+/* I_SYS_SECURITY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/security.h>.
+ */
+/*#define I_SYS_SECURITY / **/
+
+/* I_SYSUIO:
+ * This symbol, if defined, indicates that <sys/uio.h> exists and
+ * should be included.
+ */
+/*#define I_SYSUIO / **/
+
+/* I_STDARG:
+ * This symbol, if defined, indicates that <stdarg.h> exists and should
+ * be included.
+ */
+/* I_VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <varargs.h>.
+ */
+#define I_STDARG /**/
+/*#define I_VARARGS / **/
+
+/* PERL_INC_VERSION_LIST:
+ * This variable specifies the list of subdirectories in over
+ * which perl.c:incpush() and lib/lib.pm will automatically
+ * search when adding directories to @INC, in a format suitable
+ * for a C initialization string. See the inc_version_list entry
+ * in Porting/Glossary for more details.
+ */
+/*#define PERL_INC_VERSION_LIST 0 / **/
+
+/* INSTALL_USR_BIN_PERL:
+ * This symbol, if defined, indicates that Perl is to be installed
+ * also as /usr/bin/perl.
+ */
+/*#define INSTALL_USR_BIN_PERL / **/
+
+/* Off_t:
+ * This symbol holds the type used to declare offsets in the kernel.
+ * It can be int, long, off_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+/* LSEEKSIZE:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+/* Off_t_size:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+#define Off_t long long /* <offset> type */
+#define LSEEKSIZE 8 /* <offset> size */
+#define Off_t_size 8 /* <offset> size */
+
+/* Free_t:
+ * This variable contains the return type of free(). It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ * This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void * /**/
+#define Free_t void /**/
+
+/* PERL_MALLOC_WRAP:
+ * This symbol, if defined, indicates that we'd like malloc wrap checks.
+ */
+#define PERL_MALLOC_WRAP /**/
+
+/* MYMALLOC:
+ * This symbol, if defined, indicates that we're using our own malloc.
+ */
+/*#define MYMALLOC / **/
+
+/* Mode_t:
+ * This symbol holds the type used to declare file modes
+ * for systems calls. It is usually mode_t, but may be
+ * int or unsigned short. It may be necessary to include <sys/types.h>
+ * to get any typedef'ed information.
+ */
+#define Mode_t mode_t /* file mode parameter for system calls */
+
+/* Netdb_host_t:
+ * This symbol holds the type used for the 1st argument
+ * to gethostbyaddr().
+ */
+/* Netdb_hlen_t:
+ * This symbol holds the type used for the 2nd argument
+ * to gethostbyaddr().
+ */
+/* Netdb_name_t:
+ * This symbol holds the type used for the argument to
+ * gethostbyname().
+ */
+/* Netdb_net_t:
+ * This symbol holds the type used for the 1st argument to
+ * getnetbyaddr().
+ */
+#define Netdb_host_t char * /**/
+#define Netdb_hlen_t int /**/
+#define Netdb_name_t char * /**/
+#define Netdb_net_t long /**/
+
+/* PERL_OTHERLIBDIRS:
+ * This variable contains a colon-separated set of paths for the perl
+ * binary to search for additional library files or modules.
+ * These directories will be tacked to the end of @INC.
+ * Perl will automatically search below each path for version-
+ * and architecture-specific directories. See PERL_INC_VERSION_LIST
+ * for more details.
+ */
+/*#define PERL_OTHERLIBDIRS "" / **/
+
+/* Pid_t:
+ * This symbol holds the type used to declare process ids in the kernel.
+ * It can be int, uint, pid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Pid_t int /* PID type */
+
+/* PRIVLIB:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ */
+/* PRIVLIB_EXP:
+ * This symbol contains the ~name expanded version of PRIVLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define PRIVLIB "c:\\perl\\lib" /**/
+#define PRIVLIB_EXP (win32_get_privlib(PERL_VERSION_STRING, NULL)) /**/
+
+/* CAN_PROTOTYPE:
+ * If defined, this macro indicates that the C compiler can handle
+ * function prototypes.
+ */
+/* _:
+ * This macro is used to declare function parameters for folks who want
+ * to make declarations with prototypes using a different style than
+ * the above macros. Use double parentheses. For example:
+ *
+ * int main _((int argc, char *argv[]));
+ */
+#define CAN_PROTOTYPE /**/
+#ifdef CAN_PROTOTYPE
+#define _(args) args
+#else
+#define _(args) ()
+#endif
+
+/* Select_fd_set_t:
+ * This symbol holds the type used for the 2nd, 3rd, and 4th
+ * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
+ * is defined, and 'int *' otherwise. This is only useful if you
+ * have select(), of course.
+ */
+#define Select_fd_set_t Perl_fd_set * /**/
+
+/* SH_PATH:
+ * This symbol contains the full pathname to the shell used on this
+ * on this system to execute Bourne shell scripts. Usually, this will be
+ * /bin/sh, though it's possible that some systems will have /bin/ksh,
+ * /bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ * D:/bin/sh.exe.
+ */
+#define SH_PATH "cmd /x /c" /**/
+
+/* SIG_NAME:
+ * This symbol contains a list of signal names in order of
+ * signal number. This is intended
+ * to be used as a static array initialization, like this:
+ * char *sig_name[] = { SIG_NAME };
+ * The signals in the list are separated with commas, and each signal
+ * is surrounded by double quotes. There is no leading SIG in the signal
+ * name, i.e. SIGQUIT is known as "QUIT".
+ * Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
+ * etc., where nn is the actual signal number (e.g. NUM37).
+ * The signal number for sig_name[i] is stored in sig_num[i].
+ * The last element is 0 to terminate the list with a NULL. This
+ * corresponds to the 0 at the end of the sig_name_init list.
+ * Note that this variable is initialized from the sig_name_init,
+ * not from sig_name (which is unused).
+ */
+/* SIG_NUM:
+ * This symbol contains a list of signal numbers, in the same order as the
+ * SIG_NAME list. It is suitable for static array initialization, as in:
+ * int sig_num[] = { SIG_NUM };
+ * The signals in the list are separated with commas, and the indices
+ * within that list and the SIG_NAME list match, so it's easy to compute
+ * the signal name from a number or vice versa at the price of a small
+ * dynamic linear lookup.
+ * Duplicates are allowed, but are moved to the end of the list.
+ * The signal number corresponding to sig_name[i] is sig_number[i].
+ * if (i < NSIG) then sig_number[i] == i.
+ * The last element is 0, corresponding to the 0 at the end of
+ * the sig_name_init list.
+ * Note that this variable is initialized from the sig_num_init,
+ * not from sig_num (which is unused).
+ */
+/* SIG_SIZE:
+ * This variable contains the number of elements of the SIG_NAME
+ * and SIG_NUM arrays, excluding the final NULL entry.
+ */
+#define SIG_NAME "ZERO", "HUP", "INT", "QUIT", "ILL", "NUM05", "NUM06", "NUM07", "FPE", "KILL", "NUM10", "SEGV", "NUM12", "PIPE", "ALRM", "TERM", "NUM16", "NUM17", "NUM18", "NUM19", "CHLD", "BREAK", "ABRT", "STOP", "NUM24", "CONT", "CLD", 0 /**/
+#define SIG_NUM 0, 1, 2, 21, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 20, 0 /**/
+#define SIG_SIZE 27 /**/
+
+/* SITEARCH:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ * The standard distribution will put nothing in this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-dependent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
+ */
+/* SITEARCH_EXP:
+ * This symbol contains the ~name expanded version of SITEARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define SITEARCH "c:\\perl\\site\\lib" /**/
+/*#define SITEARCH_EXP "" / **/
+
+/* SITELIB:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ * The standard distribution will put nothing in this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-independent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
+ */
+/* SITELIB_EXP:
+ * This symbol contains the ~name expanded version of SITELIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* SITELIB_STEM:
+ * This define is SITELIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
+ */
+#define SITELIB "c:\\perl\\site\\lib" /**/
+#define SITELIB_EXP (win32_get_sitelib(PERL_VERSION_STRING, NULL)) /**/
+#define SITELIB_STEM "" /**/
+
+/* Size_t_size:
+ * This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 4 /**/
+
+/* Size_t:
+ * This symbol holds the type used to declare length parameters
+ * for string functions. It is usually size_t, but may be
+ * unsigned long, int, etc. It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t size_t /* length paramater for string functions */
+
+/* Sock_size_t:
+ * This symbol holds the type used for the size argument of
+ * various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t int /**/
+
+/* STDCHAR:
+ * This symbol is defined to be the type of char used in stdio.h.
+ * It has the values "unsigned char" or "char".
+ */
+#define STDCHAR char /**/
+
+/* Uid_t_f:
+ * This symbol defines the format string used for printing a Uid_t.
+ */
+#define Uid_t_f "ld" /**/
+
+/* Uid_t_sign:
+ * This symbol holds the signedess of a Uid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Uid_t_sign -1 /* UID sign */
+
+/* Uid_t_size:
+ * This symbol holds the size of a Uid_t in bytes.
+ */
+#define Uid_t_size 4 /* UID size */
+
+/* Uid_t:
+ * This symbol holds the type used to declare user ids in the kernel.
+ * It can be int, ushort, uid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Uid_t uid_t /* UID type */
+
+/* USE_ITHREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the interpreter-based threading implementation.
+ */
+/* USE_5005THREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the 5.005-based threading implementation.
+ * Only valid up to 5.8.x.
+ */
+/* OLD_PTHREADS_API:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use the old draft POSIX threads API.
+ */
+/* USE_REENTRANT_API:
+ * This symbol, if defined, indicates that Perl should
+ * try to use the various _r versions of library functions.
+ * This is extremely experimental.
+ */
+/*#define USE_5005THREADS / **/
+#define USE_ITHREADS /**/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define USE_THREADS /* until src is revised*/
+#endif
+/*#define OLD_PTHREADS_API / **/
+/*#define USE_REENTRANT_API / **/
+
+/* PERL_VENDORARCH:
+ * If defined, this symbol contains the name of a private library.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world.
+ * It may have a ~ on the front.
+ * The standard distribution will put nothing in this directory.
+ * Vendors who distribute perl may wish to place their own
+ * architecture-dependent modules and extensions in this directory with
+ * MakeMaker Makefile.PL INSTALLDIRS=vendor
+ * or equivalent. See INSTALL for details.
+ */
+/* PERL_VENDORARCH_EXP:
+ * This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define PERL_VENDORARCH "" / **/
+/*#define PERL_VENDORARCH_EXP "" / **/
+
+/* PERL_VENDORLIB_EXP:
+ * This symbol contains the ~name expanded version of VENDORLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* PERL_VENDORLIB_STEM:
+ * This define is PERL_VENDORLIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
+ */
+/*#define PERL_VENDORLIB_EXP "" / **/
+/*#define PERL_VENDORLIB_STEM "" / **/
+
+/* VOIDFLAGS:
+ * This symbol indicates how much support of the void type is given by this
+ * compiler. What various bits mean:
+ *
+ * 1 = supports declaration of void
+ * 2 = supports arrays of pointers to functions returning void
+ * 4 = supports comparisons between pointers to void functions and
+ * addresses of void functions
+ * 8 = suports declaration of generic void pointers
+ *
+ * The package designer should define VOIDUSED to indicate the requirements
+ * of the package. This can be done either by #defining VOIDUSED before
+ * including config.h, or by defining defvoidused in Myinit.U. If the
+ * latter approach is taken, only those flags will be tested. If the
+ * level of void support necessary is not present, defines void to int.
+ */
+#ifndef VOIDUSED
+#define VOIDUSED 15
+#endif
+#define VOIDFLAGS 15
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int /* is void to be avoided? */
+#define M_VOID /* Xenix strikes again */
+#endif
+
+/* USE_CROSS_COMPILE:
+ * This symbol, if defined, indicates that Perl is being cross-compiled.
+ */
+/* PERL_TARGETARCH:
+ * This symbol, if defined, indicates the target architecture
+ * Perl has been cross-compiled to. Undefined if not a cross-compile.
+ */
+#ifndef USE_CROSS_COMPILE
+/*#define USE_CROSS_COMPILE / **/
+#define PERL_TARGETARCH "" /**/
+#endif
+
+/* MEM_ALIGNBYTES:
+ * This symbol contains the number of bytes required to align a
+ * double, or a long double when applicable. Usual values are 2,
+ * 4 and 8. The default is eight, for safety.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+# define MEM_ALIGNBYTES 8
+#else
+#define MEM_ALIGNBYTES 8
+#endif
+
+/* BYTEORDER:
+ * This symbol holds the hexadecimal constant defined in byteorder,
+ * in a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...
+ * If the compiler supports cross-compiling or multiple-architecture
+ * binaries (eg. on NeXT systems), use compiler-defined macros to
+ * determine the byte order.
+ * On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
+ * Binaries (MAB) on either big endian or little endian machines.
+ * The endian-ness is available at compile-time. This only matters
+ * for perl, where the config.h can be generated and installed on
+ * one system, and used by a different architecture to build an
+ * extension. Older versions of NeXT that might not have
+ * defined either *_ENDIAN__ were all on Motorola 680x0 series,
+ * so the default case (for NeXT) is big endian to catch them.
+ * This might matter for NeXT 3.0.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+# ifdef __LITTLE_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x1234
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x12345678
+# endif
+# endif
+# else
+# ifdef __BIG_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x4321
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x87654321
+# endif
+# endif
+# endif
+# endif
+# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
+# define BYTEORDER 0x4321
+# endif
+#else
+#define BYTEORDER 0x1234 /* large digits for MSB */
+#endif /* NeXT */
+
+/* CHARBITS:
+ * This symbol contains the size of a char, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define CHARBITS 8 /**/
+
+/* CASTI32:
+ * This symbol is defined if the C compiler can cast negative
+ * or large floating point numbers to 32-bit ints.
+ */
+#define CASTI32 /**/
+
+/* CASTNEGFLOAT:
+ * This symbol is defined if the C compiler can cast negative
+ * numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ * This symbol contains flags that say what difficulties the compiler
+ * has casting odd floating values to unsigned long:
+ * 0 = ok
+ * 1 = couldn't cast < 0
+ * 2 = couldn't cast >= 0x80000000
+ * 4 = couldn't cast in argument expression list
+ */
+#define CASTNEGFLOAT /**/
+#define CASTFLAGS 0 /**/
+
+/* VOID_CLOSEDIR:
+ * This symbol, if defined, indicates that the closedir() routine
+ * does not return a value.
+ */
+/*#define VOID_CLOSEDIR / **/
+
+/* HAS_FD_SET:
+ * This symbol, when defined, indicates presence of the fd_set typedef
+ * in <sys/types.h>
+ */
+#define HAS_FD_SET /**/
+
+/* Gconvert:
+ * This preprocessor macro is defined to convert a floating point
+ * number to a string without a trailing decimal point. This
+ * emulates the behavior of sprintf("%g"), but is sometimes much more
+ * efficient. If gconvert() is not available, but gcvt() drops the
+ * trailing decimal point, then gcvt() is used. If all else fails,
+ * a macro using sprintf("%g") is used. Arguments for the Gconvert
+ * macro are: value, number of digits, whether trailing zeros should
+ * be retained, and the output buffer.
+ * The usual values are:
+ * d_Gconvert='gconvert((x),(n),(t),(b))'
+ * d_Gconvert='gcvt((x),(n),(b))'
+ * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ * The last two assume trailing zeros should not be kept.
+ */
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+
+/* HAS_GETPAGESIZE:
+ * This symbol, if defined, indicates that the getpagesize system call
+ * is available to get system page size, which is the granularity of
+ * many memory management calls.
+ */
+/*#define HAS_GETPAGESIZE / **/
+
+/* HAS_GNULIBC:
+ * This symbol, if defined, indicates to the C program that
+ * the GNU C library is being used. A better check is to use
+ * the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc.
+ */
+/*#define HAS_GNULIBC / **/
+#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
+# define _GNU_SOURCE
+#endif
+
+/* HAS_ISASCII:
+ * This manifest constant lets the C program know that isascii
+ * is available.
+ */
+#define HAS_ISASCII /**/
+
+/* HAS_LCHOWN:
+ * This symbol, if defined, indicates that the lchown routine is
+ * available to operate on a symbolic link (instead of following the
+ * link).
+ */
+/*#define HAS_LCHOWN / **/
+
+/* HAS_OPEN3:
+ * This manifest constant lets the C program know that the three
+ * argument form of open(2) is available.
+ */
+/*#define HAS_OPEN3 / **/
+
+/* HAS_SAFE_BCOPY:
+ * This symbol, if defined, indicates that the bcopy routine is available
+ * to copy potentially overlapping memory blocks. Normally, you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+/*#define HAS_SAFE_BCOPY / **/
+
+/* HAS_SAFE_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy potentially overlapping memory blocks. If you need to
+ * copy overlapping memory blocks, you should check HAS_MEMMOVE and
+ * use memmove() instead, if available.
+ */
+/*#define HAS_SAFE_MEMCPY / **/
+
+/* HAS_SANE_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * and can be used to compare relative magnitudes of chars with their high
+ * bits set. If it is not defined, roll your own version.
+ */
+#define HAS_SANE_MEMCMP /**/
+
+/* HAS_SIGACTION:
+ * This symbol, if defined, indicates that Vr4's sigaction() routine
+ * is available.
+ */
+/*#define HAS_SIGACTION / **/
+
+/* HAS_SIGSETJMP:
+ * This variable indicates to the C program that the sigsetjmp()
+ * routine is available to save the calling process's registers
+ * and stack environment for later use by siglongjmp(), and
+ * to optionally save the process's signal mask. See
+ * Sigjmp_buf, Sigsetjmp, and Siglongjmp.
+ */
+/* Sigjmp_buf:
+ * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ * This macro is used in the same way as sigsetjmp(), but will invoke
+ * traditional setjmp() if sigsetjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+/* Siglongjmp:
+ * This macro is used in the same way as siglongjmp(), but will invoke
+ * traditional longjmp() if siglongjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+/*#define HAS_SIGSETJMP / **/
+#ifdef HAS_SIGSETJMP
+#define Sigjmp_buf sigjmp_buf
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
+#else
+#define Sigjmp_buf jmp_buf
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
+#endif
+
+/* USE_STDIO_PTR:
+ * This symbol is defined if the _ptr and _cnt fields (or similar)
+ * of the stdio FILE structure can be used to access the stdio buffer
+ * for a file handle. If this is defined, then the FILE_ptr(fp)
+ * and FILE_cnt(fp) macros will also be defined and should be used
+ * to access these fields.
+ */
+/* FILE_ptr:
+ * This macro is used to access the _ptr field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ * This symbol is defined if the FILE_ptr macro can be used as an
+ * lvalue.
+ */
+/* FILE_cnt:
+ * This macro is used to access the _cnt field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ * This symbol is defined if the FILE_cnt macro can be used as an
+ * lvalue.
+ */
+/* STDIO_PTR_LVAL_SETS_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n has the side effect of decreasing the
+ * value of File_cnt(fp) by n.
+ */
+/* STDIO_PTR_LVAL_NOCHANGE_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n leaves File_cnt(fp) unchanged.
+ */
+#define USE_STDIO_PTR /**/
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp) ((fp)->_ptr)
+#define STDIO_PTR_LVALUE /**/
+#define FILE_cnt(fp) ((fp)->_cnt)
+#define STDIO_CNT_LVALUE /**/
+/*#define STDIO_PTR_LVAL_SETS_CNT / **/
+#define STDIO_PTR_LVAL_NOCHANGE_CNT /**/
+#endif
+
+/* USE_STDIO_BASE:
+ * This symbol is defined if the _base field (or similar) of the
+ * stdio FILE structure can be used to access the stdio buffer for
+ * a file handle. If this is defined, then the FILE_base(fp) macro
+ * will also be defined and should be used to access this field.
+ * Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ * to determine the number of bytes in the buffer. USE_STDIO_BASE
+ * will never be defined unless USE_STDIO_PTR is.
+ */
+/* FILE_base:
+ * This macro is used to access the _base field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ * This macro is used to determine the number of bytes in the I/O
+ * buffer pointed to by _base field (or equivalent) of the FILE
+ * structure pointed to its argument. This macro will always be defined
+ * if USE_STDIO_BASE is defined.
+ */
+#define USE_STDIO_BASE /**/
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp) ((fp)->_base)
+#define FILE_bufsiz(fp) ((fp)->_cnt + (fp)->_ptr - (fp)->_base)
+#endif
+
+/* HAS_VPRINTF:
+ * This symbol, if defined, indicates that the vprintf routine is available
+ * to printf with a pointer to an argument list. If unavailable, you
+ * may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ * This symbol is defined if this system has vsprintf() returning type
+ * (char*). The trend seems to be to declare it as "int vsprintf()". It
+ * is up to the package author to declare vsprintf correctly based on the
+ * symbol.
+ */
+#define HAS_VPRINTF /**/
+/*#define USE_CHAR_VSPRINTF / **/
+
+/* DOUBLESIZE:
+ * This symbol contains the size of a double, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define DOUBLESIZE 8 /**/
+
+/* I_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <time.h>.
+ */
+/* I_SYS_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h> with KERNEL defined.
+ */
+/* HAS_TM_TM_ZONE:
+ * This symbol, if defined, indicates to the C program that
+ * the struct tm has a tm_zone field.
+ */
+/* HAS_TM_TM_GMTOFF:
+ * This symbol, if defined, indicates to the C program that
+ * the struct tm has a tm_gmtoff field.
+ */
+#define I_TIME /**/
+/*#define I_SYS_TIME / **/
+/*#define I_SYS_TIME_KERNEL / **/
+/*#define HAS_TM_TM_ZONE / **/
+/*#define HAS_TM_TM_GMTOFF / **/
+
+/* VAL_O_NONBLOCK:
+ * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ * non-blocking I/O for the file descriptor. Note that there is no way
+ * back, i.e. you cannot turn it blocking again this way. If you wish to
+ * alternatively switch between blocking and non-blocking, use the
+ * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
+ */
+/* VAL_EAGAIN:
+ * This symbol holds the errno error code set by read() when no data was
+ * present on the non-blocking file descriptor.
+ */
+/* RD_NODATA:
+ * This symbol holds the return code from read() when no data is present
+ * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ * not defined, then you can't distinguish between no data and EOF by
+ * issuing a read(). You'll have to find another way to tell for sure!
+ */
+/* EOF_NONBLOCK:
+ * This symbol, if defined, indicates to the C program that a read() on
+ * a non-blocking file descriptor will return 0 on EOF, and not the value
+ * held in RD_NODATA (-1 usually, in that case!).
+ */
+#define VAL_O_NONBLOCK O_NONBLOCK
+#define VAL_EAGAIN EAGAIN
+#define RD_NODATA -1
+#define EOF_NONBLOCK
+
+/* PTRSIZE:
+ * This symbol contains the size of a pointer, so that the C preprocessor
+ * can make decisions based on it. It will be sizeof(void *) if
+ * the compiler supports (void *); otherwise it will be
+ * sizeof(char *).
+ */
+#define PTRSIZE 4 /**/
+
+/* Drand01:
+ * This macro is to be used to generate uniformly distributed
+ * random numbers over the range [0., 1.[. You may have to supply
+ * an 'extern double drand48();' in your program since SunOS 4.1.3
+ * doesn't provide you with anything relevant in its headers.
+ * See HAS_DRAND48_PROTO.
+ */
+/* Rand_seed_t:
+ * This symbol defines the type of the argument of the
+ * random seed function.
+ */
+/* seedDrand01:
+ * This symbol defines the macro to be used in seeding the
+ * random number generator (see Drand01).
+ */
+/* RANDBITS:
+ * This symbol indicates how many bits are produced by the
+ * function used to generate normalized random numbers.
+ * Values include 15, 16, 31, and 48.
+ */
+#define Drand01() (rand()/(double)((unsigned)1<<RANDBITS)) /**/
+#define Rand_seed_t unsigned /**/
+#define seedDrand01(x) srand((Rand_seed_t)x) /**/
+#define RANDBITS 15 /**/
+
+/* SSize_t:
+ * This symbol holds the type used by functions that return
+ * a count of bytes or an error condition. It must be a signed type.
+ * It is usually ssize_t, but may be long or int, etc.
+ * It may be necessary to include <sys/types.h> or <unistd.h>
+ * to get any typedef'ed information.
+ * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t int /* signed count of bytes */
+
+/* EBCDIC:
+ * This symbol, if defined, indicates that this system uses
+ * EBCDIC encoding.
+ */
+/*#define EBCDIC / **/
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ * This symbol, if defined, indicates that the bug that prevents
+ * setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ * This symbol, if defined, indicates that the C program should
+ * check the script that it is executing for setuid/setgid bits, and
+ * attempt to emulate setuid/setgid on systems that have disabled
+ * setuid #! scripts because the kernel can't do it securely.
+ * It is up to the package designer to make sure that this emulation
+ * is done securely. Among other things, it should do an fstat on
+ * the script it just opened to make sure it really is a setuid/setgid
+ * script, it should make sure the arguments passed correspond exactly
+ * to the argument on the #! line, and it should not trust any
+ * subprocesses to which it must pass the filename rather than the
+ * file descriptor of the script to be executed.
+ */
+/*#define SETUID_SCRIPTS_ARE_SECURE_NOW / **/
+/*#define DOSUID / **/
+
+/* PERL_USE_DEVEL:
+ * This symbol, if defined, indicates that Perl was configured with
+ * -Dusedevel, to enable development features. This should not be
+ * done for production builds.
+ */
+/*#define PERL_USE_DEVEL / **/
+
+/* HAS_ATOLF:
+ * This symbol, if defined, indicates that the atolf routine is
+ * available to convert strings into long doubles.
+ */
+/*#define HAS_ATOLF / **/
+
+/* HAS_ATOLL:
+ * This symbol, if defined, indicates that the atoll routine is
+ * available to convert strings into long longs.
+ */
+/*#define HAS_ATOLL / **/
+
+/* HAS__FWALK:
+ * This symbol, if defined, indicates that the _fwalk system call is
+ * available to apply a function to all the file handles.
+ */
+/*#define HAS__FWALK / **/
+
+/* HAS_AINTL:
+ * This symbol, if defined, indicates that the aintl routine is
+ * available. If copysignl is also present we can emulate modfl.
+ */
+/*#define HAS_AINTL / **/
+
+/* HAS_BUILTIN_CHOOSE_EXPR:
+ * Can we handle GCC builtin for compile-time ternary-like expressions
+ */
+/* HAS_BUILTIN_EXPECT:
+ * Can we handle GCC builtin for telling that certain values are more
+ * likely
+ */
+/*#define HAS_BUILTIN_EXPECT / **/
+/*#define HAS_BUILTIN_CHOOSE_EXPR / **/
+
+/* HAS_C99_VARIADIC_MACROS:
+ * If defined, the compiler supports C99 variadic macros.
+ */
+/*#define HAS_C99_VARIADIC_MACROS / **/
+
+/* HAS_CLASS:
+ * This symbol, if defined, indicates that the class routine is
+ * available to classify doubles. Available for example in AIX.
+ * The returned values are defined in <float.h> and are:
+ *
+ * FP_PLUS_NORM Positive normalized, nonzero
+ * FP_MINUS_NORM Negative normalized, nonzero
+ * FP_PLUS_DENORM Positive denormalized, nonzero
+ * FP_MINUS_DENORM Negative denormalized, nonzero
+ * FP_PLUS_ZERO +0.0
+ * FP_MINUS_ZERO -0.0
+ * FP_PLUS_INF +INF
+ * FP_MINUS_INF -INF
+ * FP_NANS Signaling Not a Number (NaNS)
+ * FP_NANQ Quiet Not a Number (NaNQ)
+ */
+/*#define HAS_CLASS / **/
+
+/* HAS_CLEARENV:
+ * This symbol, if defined, indicates that the clearenv () routine is
+ * available for use.
+ */
+/*#define HAS_CLEARENV / **/
+
+/* HAS_STRUCT_CMSGHDR:
+ * This symbol, if defined, indicates that the struct cmsghdr
+ * is supported.
+ */
+/*#define HAS_STRUCT_CMSGHDR / **/
+
+/* HAS_COPYSIGNL:
+ * This symbol, if defined, indicates that the copysignl routine is
+ * available. If aintl is also present we can emulate modfl.
+ */
+/*#define HAS_COPYSIGNL / **/
+
+/* USE_CPLUSPLUS:
+ * This symbol, if defined, indicates that a C++ compiler was
+ * used to compiled Perl and will be used to compile extensions.
+ */
+/*#define USE_CPLUSPLUS / **/
+
+/* HAS_DBMINIT_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the dbminit() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int dbminit(char *);
+ */
+/*#define HAS_DBMINIT_PROTO / **/
+
+/* HAS_DIR_DD_FD:
+ * This symbol, if defined, indicates that the the DIR* dirstream
+ * structure contains a member variable named dd_fd.
+ */
+/*#define HAS_DIR_DD_FD / **/
+
+/* HAS_DIRFD:
+ * This manifest constant lets the C program know that dirfd
+ * is available.
+ */
+/*#define HAS_DIRFD / **/
+
+/* DLSYM_NEEDS_UNDERSCORE:
+ * This symbol, if defined, indicates that we need to prepend an
+ * underscore to the symbol name before calling dlsym(). This only
+ * makes sense if you *have* dlsym, which we will presume is the
+ * case if you're using dl_dlopen.xs.
+ */
+/*#define DLSYM_NEEDS_UNDERSCORE / **/
+
+/* HAS_FAST_STDIO:
+ * This symbol, if defined, indicates that the "fast stdio"
+ * is available to manipulate the stdio buffers directly.
+ */
+#define HAS_FAST_STDIO /**/
+
+/* HAS_FCHDIR:
+ * This symbol, if defined, indicates that the fchdir routine is
+ * available to change directory using a file descriptor.
+ */
+/*#define HAS_FCHDIR / **/
+
+/* FCNTL_CAN_LOCK:
+ * This symbol, if defined, indicates that fcntl() can be used
+ * for file locking. Normally on Unix systems this is defined.
+ * It may be undefined on VMS.
+ */
+/*#define FCNTL_CAN_LOCK / **/
+
+/* HAS_FINITE:
+ * This symbol, if defined, indicates that the finite routine is
+ * available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_FINITE / **/
+
+/* HAS_FINITEL:
+ * This symbol, if defined, indicates that the finitel routine is
+ * available to check whether a long double is finite
+ * (non-infinity non-NaN).
+ */
+/*#define HAS_FINITEL / **/
+
+/* HAS_FLOCK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the flock() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int flock(int, int);
+ */
+#define HAS_FLOCK_PROTO /**/
+
+/* HAS_FP_CLASS:
+ * This symbol, if defined, indicates that the fp_class routine is
+ * available to classify doubles. Available for example in Digital UNIX.
+ * The returned values are defined in <math.h> and are:
+ *
+ * FP_SNAN Signaling NaN (Not-a-Number)
+ * FP_QNAN Quiet NaN (Not-a-Number)
+ * FP_POS_INF +infinity
+ * FP_NEG_INF -infinity
+ * FP_POS_NORM Positive normalized
+ * FP_NEG_NORM Negative normalized
+ * FP_POS_DENORM Positive denormalized
+ * FP_NEG_DENORM Negative denormalized
+ * FP_POS_ZERO +0.0 (positive zero)
+ * FP_NEG_ZERO -0.0 (negative zero)
+ */
+/*#define HAS_FP_CLASS / **/
+
+/* HAS_FPCLASS:
+ * This symbol, if defined, indicates that the fpclass routine is
+ * available to classify doubles. Available for example in Solaris/SVR4.
+ * The returned values are defined in <ieeefp.h> and are:
+ *
+ * FP_SNAN signaling NaN
+ * FP_QNAN quiet NaN
+ * FP_NINF negative infinity
+ * FP_PINF positive infinity
+ * FP_NDENORM negative denormalized non-zero
+ * FP_PDENORM positive denormalized non-zero
+ * FP_NZERO negative zero
+ * FP_PZERO positive zero
+ * FP_NNORM negative normalized non-zero
+ * FP_PNORM positive normalized non-zero
+ */
+/*#define HAS_FPCLASS / **/
+
+/* HAS_FPCLASSIFY:
+ * This symbol, if defined, indicates that the fpclassify routine is
+ * available to classify doubles. Available for example in HP-UX.
+ * The returned values are defined in <math.h> and are
+ *
+ * FP_NORMAL Normalized
+ * FP_ZERO Zero
+ * FP_INFINITE Infinity
+ * FP_SUBNORMAL Denormalized
+ * FP_NAN NaN
+ *
+ */
+/*#define HAS_FPCLASSIFY / **/
+
+/* HAS_FPCLASSL:
+ * This symbol, if defined, indicates that the fpclassl routine is
+ * available to classify long doubles. Available for example in IRIX.
+ * The returned values are defined in <ieeefp.h> and are:
+ *
+ * FP_SNAN signaling NaN
+ * FP_QNAN quiet NaN
+ * FP_NINF negative infinity
+ * FP_PINF positive infinity
+ * FP_NDENORM negative denormalized non-zero
+ * FP_PDENORM positive denormalized non-zero
+ * FP_NZERO negative zero
+ * FP_PZERO positive zero
+ * FP_NNORM negative normalized non-zero
+ * FP_PNORM positive normalized non-zero
+ */
+/*#define HAS_FPCLASSL / **/
+
+/* HAS_FPOS64_T:
+ * This symbol will be defined if the C compiler supports fpos64_t.
+ */
+/*#define HAS_FPOS64_T / **/
+
+/* HAS_FREXPL:
+ * This symbol, if defined, indicates that the frexpl routine is
+ * available to break a long double floating-point number into
+ * a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL / **/
+
+/* HAS_STRUCT_FS_DATA:
+ * This symbol, if defined, indicates that the struct fs_data
+ * to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_FS_DATA / **/
+
+/* HAS_FSEEKO:
+ * This symbol, if defined, indicates that the fseeko routine is
+ * available to fseek beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FSEEKO / **/
+
+/* HAS_FSTATFS:
+ * This symbol, if defined, indicates that the fstatfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATFS / **/
+
+/* HAS_FSYNC:
+ * This symbol, if defined, indicates that the fsync routine is
+ * available to write a file's modified data and attributes to
+ * permanent storage.
+ */
+/*#define HAS_FSYNC / **/
+
+/* HAS_FTELLO:
+ * This symbol, if defined, indicates that the ftello routine is
+ * available to ftell beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FTELLO / **/
+
+/* HAS_FUTIMES:
+ * This symbol, if defined, indicates that the futimes routine is
+ * available to change file descriptor time stamps with struct timevals.
+ */
+/*#define HAS_FUTIMES / **/
+
+/* HAS_GETADDRINFO:
+ * This symbol, if defined, indicates that the getaddrinfo() function
+ * is available for use.
+ */
+/*#define HAS_GETADDRINFO / **/
+
+/* HAS_GETCWD:
+ * This symbol, if defined, indicates that the getcwd routine is
+ * available to get the current working directory.
+ */
+#define HAS_GETCWD /**/
+
+/* HAS_GETESPWNAM:
+ * This symbol, if defined, indicates that the getespwnam system call is
+ * available to retrieve enchanced (shadow) password entries by name.
+ */
+/*#define HAS_GETESPWNAM / **/
+
+/* HAS_GETFSSTAT:
+ * This symbol, if defined, indicates that the getfsstat routine is
+ * available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT / **/
+
+/* HAS_GETITIMER:
+ * This symbol, if defined, indicates that the getitimer routine is
+ * available to return interval timers.
+ */
+/*#define HAS_GETITIMER / **/
+
+/* HAS_GETMNT:
+ * This symbol, if defined, indicates that the getmnt routine is
+ * available to get filesystem mount info by filename.
+ */
+/*#define HAS_GETMNT / **/
+
+/* HAS_GETMNTENT:
+ * This symbol, if defined, indicates that the getmntent routine is
+ * available to iterate through mounted file systems to get their info.
+ */
+/*#define HAS_GETMNTENT / **/
+
+/* HAS_GETNAMEINFO:
+ * This symbol, if defined, indicates that the getnameinfo() function
+ * is available for use.
+ */
+/*#define HAS_GETNAMEINFO / **/
+
+/* HAS_GETPRPWNAM:
+ * This symbol, if defined, indicates that the getprpwnam system call is
+ * available to retrieve protected (shadow) password entries by name.
+ */
+/*#define HAS_GETPRPWNAM / **/
+
+/* HAS_GETSPNAM:
+ * This symbol, if defined, indicates that the getspnam system call is
+ * available to retrieve SysV shadow password entries by name.
+ */
+/*#define HAS_GETSPNAM / **/
+
+/* HAS_HASMNTOPT:
+ * This symbol, if defined, indicates that the hasmntopt routine is
+ * available to query the mount options of file systems.
+ */
+/*#define HAS_HASMNTOPT / **/
+
+/* HAS_ILOGBL:
+ * This symbol, if defined, indicates that the ilogbl routine is
+ * available. If scalbnl is also present we can emulate frexpl.
+ */
+/*#define HAS_ILOGBL / **/
+
+/* HAS_INETNTOP:
+ * This symbol, if defined, indicates that the inet_ntop() function
+ * is available to parse IPv4 and IPv6 strings.
+ */
+/*#define HAS_INETNTOP / **/
+
+/* HAS_INETPTON:
+ * This symbol, if defined, indicates that the inet_pton() function
+ * is available to parse IPv4 and IPv6 strings.
+ */
+/*#define HAS_INETPTON / **/
+
+/* HAS_INT64_T:
+ * This symbol will defined if the C compiler supports int64_t.
+ * Usually the <inttypes.h> needs to be included, but sometimes
+ * <sys/types.h> is enough.
+ */
+/*#define HAS_INT64_T / **/
+
+/* HAS_ISFINITE:
+ * This symbol, if defined, indicates that the isfinite routine is
+ * available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_ISFINITE / **/
+
+/* HAS_ISINF:
+ * This symbol, if defined, indicates that the isinf routine is
+ * available to check whether a double is an infinity.
+ */
+/*#define HAS_ISINF / **/
+
+/* HAS_ISNAN:
+ * This symbol, if defined, indicates that the isnan routine is
+ * available to check whether a double is a NaN.
+ */
+#define HAS_ISNAN /**/
+
+/* HAS_ISNANL:
+ * This symbol, if defined, indicates that the isnanl routine is
+ * available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL / **/
+
+/* HAS_LDBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol LDBL_DIG, which is the number
+ * of significant digits in a long double precision number. Unlike
+ * for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
+ */
+#define HAS_LDBL_DIG /**/
+
+/* LIBM_LIB_VERSION:
+ * This symbol, if defined, indicates that libm exports _LIB_VERSION
+ * and that math.h defines the enum to manipulate it.
+ */
+/*#define LIBM_LIB_VERSION / **/
+
+/* HAS_MADVISE:
+ * This symbol, if defined, indicates that the madvise system call is
+ * available to map a file into memory.
+ */
+/*#define HAS_MADVISE / **/
+
+/* HAS_MALLOC_SIZE:
+ * This symbol, if defined, indicates that the malloc_size
+ * routine is available for use.
+ */
+/*#define HAS_MALLOC_SIZE / **/
+
+/* HAS_MALLOC_GOOD_SIZE:
+ * This symbol, if defined, indicates that the malloc_good_size
+ * routine is available for use.
+ */
+/*#define HAS_MALLOC_GOOD_SIZE / **/
+
+/* HAS_MKDTEMP:
+ * This symbol, if defined, indicates that the mkdtemp routine is
+ * available to exclusively create a uniquely named temporary directory.
+ */
+/*#define HAS_MKDTEMP / **/
+
+/* HAS_MKSTEMPS:
+ * This symbol, if defined, indicates that the mkstemps routine is
+ * available to excluslvely create and open a uniquely named
+ * (with a suffix) temporary file.
+ */
+/*#define HAS_MKSTEMPS / **/
+
+/* HAS_MODFL:
+ * This symbol, if defined, indicates that the modfl routine is
+ * available to split a long double x into a fractional part f and
+ * an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/* HAS_MODFL_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the modfl() function. Otherwise, it is up
+ * to the program to supply one.
+ */
+/* HAS_MODFL_POW32_BUG:
+ * This symbol, if defined, indicates that the modfl routine is
+ * broken for long doubles >= pow(2, 32).
+ * For example from 4294967303.150000 one would get 4294967302.000000
+ * and 1.150000. The bug has been seen in certain versions of glibc,
+ * release 2.2.2 is known to be okay.
+ */
+/*#define HAS_MODFL / **/
+/*#define HAS_MODFL_PROTO / **/
+/*#define HAS_MODFL_POW32_BUG / **/
+
+/* HAS_MPROTECT:
+ * This symbol, if defined, indicates that the mprotect system call is
+ * available to modify the access protection of a memory mapped file.
+ */
+/*#define HAS_MPROTECT / **/
+
+/* HAS_STRUCT_MSGHDR:
+ * This symbol, if defined, indicates that the struct msghdr
+ * is supported.
+ */
+/*#define HAS_STRUCT_MSGHDR / **/
+
+/* HAS_NL_LANGINFO:
+ * This symbol, if defined, indicates that the nl_langinfo routine is
+ * available to return local data. You will also need <langinfo.h>
+ * and therefore I_LANGINFO.
+ */
+/*#define HAS_NL_LANGINFO / **/
+
+/* HAS_OFF64_T:
+ * This symbol will be defined if the C compiler supports off64_t.
+ */
+/*#define HAS_OFF64_T / **/
+
+/* HAS_PROCSELFEXE:
+ * This symbol is defined if PROCSELFEXE_PATH is a symlink
+ * to the absolute pathname of the executing program.
+ */
+/* PROCSELFEXE_PATH:
+ * If HAS_PROCSELFEXE is defined this symbol is the filename
+ * of the symbolic link pointing to the absolute pathname of
+ * the executing program.
+ */
+/*#define HAS_PROCSELFEXE / **/
+#if defined(HAS_PROCSELFEXE) && !defined(PROCSELFEXE_PATH)
+#define PROCSELFEXE_PATH /**/
+#endif
+
+/* HAS_PTHREAD_ATTR_SETSCOPE:
+ * This symbol, if defined, indicates that the pthread_attr_setscope
+ * system call is available to set the contention scope attribute of
+ * a thread attribute object.
+ */
+/*#define HAS_PTHREAD_ATTR_SETSCOPE / **/
+
+/* HAS_READV:
+ * This symbol, if defined, indicates that the readv routine is
+ * available to do gather reads. You will also need <sys/uio.h>
+ * and there I_SYSUIO.
+ */
+/*#define HAS_READV / **/
+
+/* HAS_RECVMSG:
+ * This symbol, if defined, indicates that the recvmsg routine is
+ * available to send structured socket messages.
+ */
+/*#define HAS_RECVMSG / **/
+
+/* HAS_SBRK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the sbrk() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern void* sbrk(int);
+ * extern void* sbrk(size_t);
+ */
+/*#define HAS_SBRK_PROTO / **/
+
+/* HAS_SCALBNL:
+ * This symbol, if defined, indicates that the scalbnl routine is
+ * available. If ilogbl is also present we can emulate frexpl.
+ */
+/*#define HAS_SCALBNL / **/
+
+/* HAS_SENDMSG:
+ * This symbol, if defined, indicates that the sendmsg routine is
+ * available to send structured socket messages.
+ */
+/*#define HAS_SENDMSG / **/
+
+/* HAS_SETITIMER:
+ * This symbol, if defined, indicates that the setitimer routine is
+ * available to set interval timers.
+ */
+/*#define HAS_SETITIMER / **/
+
+/* HAS_SETPROCTITLE:
+ * This symbol, if defined, indicates that the setproctitle routine is
+ * available to set process title.
+ */
+/*#define HAS_SETPROCTITLE / **/
+
+/* USE_SFIO:
+ * This symbol, if defined, indicates that sfio should
+ * be used.
+ */
+/*#define USE_SFIO / **/
+
+/* HAS_SIGNBIT:
+ * This symbol, if defined, indicates that the signbit routine is
+ * available to check if the given number has the sign bit set.
+ * This should include correct testing of -0.0. This will only be set
+ * if the signbit() routine is safe to use with the NV type used internally
+ * in perl. Users should call Perl_signbit(), which will be #defined to
+ * the system's signbit() function or macro if this symbol is defined.
+ */
+/*#define HAS_SIGNBIT / **/
+
+/* HAS_SIGPROCMASK:
+ * This symbol, if defined, indicates that the sigprocmask
+ * system call is available to examine or change the signal mask
+ * of the calling process.
+ */
+/*#define HAS_SIGPROCMASK / **/
+
+/* USE_SITECUSTOMIZE:
+ * This symbol, if defined, indicates that sitecustomize should
+ * be used.
+ */
+#ifndef USE_SITECUSTOMIZE
+/*#define USE_SITECUSTOMIZE / **/
+#endif
+
+/* HAS_SNPRINTF:
+ * This symbol, if defined, indicates that the snprintf () library
+ * function is available for use.
+ */
+/* HAS_VSNPRINTF:
+ * This symbol, if defined, indicates that the vsnprintf () library
+ * function is available for use.
+ */
+#define HAS_SNPRINTF /**/
+#define HAS_VSNPRINTF /**/
+
+/* HAS_SOCKATMARK:
+ * This symbol, if defined, indicates that the sockatmark routine is
+ * available to test whether a socket is at the out-of-band mark.
+ */
+/*#define HAS_SOCKATMARK / **/
+
+/* HAS_SOCKATMARK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the sockatmark() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int sockatmark(int);
+ */
+/*#define HAS_SOCKATMARK_PROTO / **/
+
+/* HAS_SOCKS5_INIT:
+ * This symbol, if defined, indicates that the socks5_init routine is
+ * available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT / **/
+
+/* SPRINTF_RETURNS_STRLEN:
+ * This variable defines whether sprintf returns the length of the string
+ * (as per the ANSI spec). Some C libraries retain compatibility with
+ * pre-ANSI C and return a pointer to the passed in buffer; for these
+ * this variable will be undef.
+ */
+#define SPRINTF_RETURNS_STRLEN /**/
+
+/* HAS_SQRTL:
+ * This symbol, if defined, indicates that the sqrtl routine is
+ * available to do long double square roots.
+ */
+/*#define HAS_SQRTL / **/
+
+/* HAS_SETRESGID_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the setresgid() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define HAS_SETRESGID_PROTO / **/
+
+/* HAS_SETRESUID_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the setresuid() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define HAS_SETRESUID_PROTO / **/
+
+/* HAS_STRUCT_STATFS_F_FLAGS:
+ * This symbol, if defined, indicates that the struct statfs
+ * does have the f_flags member containing the mount flags of
+ * the filesystem containing the file.
+ * This kind of struct statfs is coming from <sys/mount.h> (BSD 4.3),
+ * not from <sys/statfs.h> (SYSV). Older BSDs (like Ultrix) do not
+ * have statfs() and struct statfs, they have ustat() and getmnt()
+ * with struct ustat and struct fs_data.
+ */
+/*#define HAS_STRUCT_STATFS_F_FLAGS / **/
+
+/* HAS_STRUCT_STATFS:
+ * This symbol, if defined, indicates that the struct statfs
+ * to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_STATFS / **/
+
+/* HAS_FSTATVFS:
+ * This symbol, if defined, indicates that the fstatvfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATVFS / **/
+
+/* HAS_STRFTIME:
+ * This symbol, if defined, indicates that the strftime routine is
+ * available to do time formatting.
+ */
+#define HAS_STRFTIME /**/
+
+/* HAS_STRLCAT:
+ * This symbol, if defined, indicates that the strlcat () routine is
+ * available to do string concatenation.
+ */
+/*#define HAS_STRLCAT / **/
+
+/* HAS_STRLCPY:
+ * This symbol, if defined, indicates that the strlcpy () routine is
+ * available to do string copying.
+ */
+/*#define HAS_STRLCPY / **/
+
+/* HAS_STRTOLD:
+ * This symbol, if defined, indicates that the strtold routine is
+ * available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD / **/
+
+/* HAS_STRTOLL:
+ * This symbol, if defined, indicates that the strtoll routine is
+ * available to convert strings to long longs.
+ */
+/*#define HAS_STRTOLL / **/
+
+/* HAS_STRTOQ:
+ * This symbol, if defined, indicates that the strtoq routine is
+ * available to convert strings to long longs (quads).
+ */
+/*#define HAS_STRTOQ / **/
+
+/* HAS_STRTOULL:
+ * This symbol, if defined, indicates that the strtoull routine is
+ * available to convert strings to unsigned long longs.
+ */
+/*#define HAS_STRTOULL / **/
+
+/* HAS_STRTOUQ:
+ * This symbol, if defined, indicates that the strtouq routine is
+ * available to convert strings to unsigned long longs (quads).
+ */
+/*#define HAS_STRTOUQ / **/
+
+/* HAS_SYSCALL_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the syscall() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern int syscall(int, ...);
+ * extern int syscall(long, ...);
+ */
+/*#define HAS_SYSCALL_PROTO / **/
+
+/* HAS_TELLDIR_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the telldir() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern long telldir(DIR*);
+ */
+#define HAS_TELLDIR_PROTO /**/
+
+/* HAS_CTIME64:
+ * This symbol, if defined, indicates that the ctime64 () routine is
+ * available to do the 64bit variant of ctime ()
+ */
+/* HAS_LOCALTIME64:
+ * This symbol, if defined, indicates that the localtime64 () routine is
+ * available to do the 64bit variant of localtime ()
+ */
+/* HAS_GMTIME64:
+ * This symbol, if defined, indicates that the gmtime64 () routine is
+ * available to do the 64bit variant of gmtime ()
+ */
+/* HAS_MKTIME64:
+ * This symbol, if defined, indicates that the mktime64 () routine is
+ * available to do the 64bit variant of mktime ()
+ */
+/* HAS_DIFFTIME64:
+ * This symbol, if defined, indicates that the difftime64 () routine is
+ * available to do the 64bit variant of difftime ()
+ */
+/* HAS_ASCTIME64:
+ * This symbol, if defined, indicates that the asctime64 () routine is
+ * available to do the 64bit variant of asctime ()
+ */
+/*#define HAS_CTIME64 / **/
+/*#define HAS_LOCALTIME64 / **/
+/*#define HAS_GMTIME64 / **/
+/*#define HAS_MKTIME64 / **/
+/*#define HAS_DIFFTIME64 / **/
+/*#define HAS_ASCTIME64 / **/
+
+/* HAS_TIMEGM:
+ * This symbol, if defined, indicates that the timegm routine is
+ * available to do the opposite of gmtime ()
+ */
+/*#define HAS_TIMEGM / **/
+
+/* U32_ALIGNMENT_REQUIRED:
+ * This symbol, if defined, indicates that you must access
+ * character data through U32-aligned pointers.
+ */
+#ifndef U32_ALIGNMENT_REQUIRED
+#define U32_ALIGNMENT_REQUIRED /**/
+#endif
+
+/* HAS_UALARM:
+ * This symbol, if defined, indicates that the ualarm routine is
+ * available to do alarms with microsecond granularity.
+ */
+/*#define HAS_UALARM / **/
+
+/* HAS_UNORDERED:
+ * This symbol, if defined, indicates that the unordered routine is
+ * available to check whether two doubles are unordered
+ * (effectively: whether either of them is NaN)
+ */
+/*#define HAS_UNORDERED / **/
+
+/* HAS_UNSETENV:
+ * This symbol, if defined, indicates that the unsetenv () routine is
+ * available for use.
+ */
+/*#define HAS_UNSETENV / **/
+
+/* HAS_USLEEP_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the usleep() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int usleep(useconds_t);
+ */
+/*#define HAS_USLEEP_PROTO / **/
+
+/* HAS_USTAT:
+ * This symbol, if defined, indicates that the ustat system call is
+ * available to query file system statistics by dev_t.
+ */
+/*#define HAS_USTAT / **/
+
+/* HAS_WRITEV:
+ * This symbol, if defined, indicates that the writev routine is
+ * available to do scatter writes.
+ */
+/*#define HAS_WRITEV / **/
+
+/* USE_DYNAMIC_LOADING:
+ * This symbol, if defined, indicates that dynamic loading of
+ * some sort is available.
+ */
+#define USE_DYNAMIC_LOADING /**/
+
+/* FFLUSH_NULL:
+ * This symbol, if defined, tells that fflush(NULL) does flush
+ * all pending stdio output.
+ */
+/* FFLUSH_ALL:
+ * This symbol, if defined, tells that to flush
+ * all pending stdio output one must loop through all
+ * the stdio file handles stored in an array and fflush them.
+ * Note that if fflushNULL is defined, fflushall will not
+ * even be probed for and will be left undefined.
+ */
+#define FFLUSH_NULL /**/
+/*#define FFLUSH_ALL / **/
+
+/* I_ASSERT:
+ * This symbol, if defined, indicates that <assert.h> exists and
+ * could be included by the C program to get the assert() macro.
+ */
+#define I_ASSERT /**/
+
+/* I_CRYPT:
+ * This symbol, if defined, indicates that <crypt.h> exists and
+ * should be included.
+ */
+/*#define I_CRYPT / **/
+
+/* DB_Prefix_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is size_t.
+ */
+/* DB_VERSION_MAJOR_CFG:
+ * This symbol, if defined, defines the major version number of
+ * Berkeley DB found in the <db.h> header when Perl was configured.
+ */
+/* DB_VERSION_MINOR_CFG:
+ * This symbol, if defined, defines the minor version number of
+ * Berkeley DB found in the <db.h> header when Perl was configured.
+ * For DB version 1 this is always 0.
+ */
+/* DB_VERSION_PATCH_CFG:
+ * This symbol, if defined, defines the patch version number of
+ * Berkeley DB found in the <db.h> header when Perl was configured.
+ * For DB version 1 this is always 0.
+ */
+#define DB_Hash_t int /**/
+#define DB_Prefix_t int /**/
+#define DB_VERSION_MAJOR_CFG 0 /**/
+#define DB_VERSION_MINOR_CFG 0 /**/
+#define DB_VERSION_PATCH_CFG 0 /**/
+
+/* I_FP:
+ * This symbol, if defined, indicates that <fp.h> exists and
+ * should be included.
+ */
+/*#define I_FP / **/
+
+/* I_FP_CLASS:
+ * This symbol, if defined, indicates that <fp_class.h> exists and
+ * should be included.
+ */
+/*#define I_FP_CLASS / **/
+
+/* I_IEEEFP:
+ * This symbol, if defined, indicates that <ieeefp.h> exists and
+ * should be included.
+ */
+/*#define I_IEEEFP / **/
+
+/* I_INTTYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <inttypes.h>.
+ */
+/*#define I_INTTYPES / **/
+
+/* I_LANGINFO:
+ * This symbol, if defined, indicates that <langinfo.h> exists and
+ * should be included.
+ */
+/*#define I_LANGINFO / **/
+
+/* I_LIBUTIL:
+ * This symbol, if defined, indicates that <libutil.h> exists and
+ * should be included.
+ */
+/*#define I_LIBUTIL / **/
+
+/* I_MALLOCMALLOC:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <malloc/malloc.h>.
+ */
+/*#define I_MALLOCMALLOC / **/
+
+/* I_MNTENT:
+ * This symbol, if defined, indicates that <mntent.h> exists and
+ * should be included.
+ */
+/*#define I_MNTENT / **/
+
+/* I_NETINET_TCP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/tcp.h>.
+ */
+/*#define I_NETINET_TCP / **/
+
+/* I_POLL:
+ * This symbol, if defined, indicates that <poll.h> exists and
+ * should be included. (see also HAS_POLL)
+ */
+/*#define I_POLL / **/
+
+/* I_PROT:
+ * This symbol, if defined, indicates that <prot.h> exists and
+ * should be included.
+ */
+/*#define I_PROT / **/
+
+/* I_SHADOW:
+ * This symbol, if defined, indicates that <shadow.h> exists and
+ * should be included.
+ */
+/*#define I_SHADOW / **/
+
+/* I_SOCKS:
+ * This symbol, if defined, indicates that <socks.h> exists and
+ * should be included.
+ */
+/*#define I_SOCKS / **/
+
+/* I_SUNMATH:
+ * This symbol, if defined, indicates that <sunmath.h> exists and
+ * should be included.
+ */
+/*#define I_SUNMATH / **/
+
+/* I_SYSLOG:
+ * This symbol, if defined, indicates that <syslog.h> exists and
+ * should be included.
+ */
+/*#define I_SYSLOG / **/
+
+/* I_SYSMODE:
+ * This symbol, if defined, indicates that <sys/mode.h> exists and
+ * should be included.
+ */
+/*#define I_SYSMODE / **/
+
+/* I_SYS_MOUNT:
+ * This symbol, if defined, indicates that <sys/mount.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_MOUNT / **/
+
+/* I_SYS_STATFS:
+ * This symbol, if defined, indicates that <sys/statfs.h> exists.
+ */
+/*#define I_SYS_STATFS / **/
+
+/* I_SYS_STATVFS:
+ * This symbol, if defined, indicates that <sys/statvfs.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_STATVFS / **/
+
+/* I_SYSUTSNAME:
+ * This symbol, if defined, indicates that <sys/utsname.h> exists and
+ * should be included.
+ */
+/*#define I_SYSUTSNAME / **/
+
+/* I_SYS_VFS:
+ * This symbol, if defined, indicates that <sys/vfs.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_VFS / **/
+
+/* I_USTAT:
+ * This symbol, if defined, indicates that <ustat.h> exists and
+ * should be included.
+ */
+/*#define I_USTAT / **/
+
+/* PERL_PRIfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for output.
+ */
+/* PERL_PRIgldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'g') for output.
+ */
+/* PERL_PRIeldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for input.
+ */
+/*#define PERL_PRIfldbl "f" / **/
+/*#define PERL_PRIgldbl "g" / **/
+/*#define PERL_PRIeldbl "e" / **/
+/*#define PERL_SCNfldbl "f" / **/
+
+/* PERL_MAD:
+ * This symbol, if defined, indicates that the Misc Attribution
+ * Declaration code should be conditionally compiled.
+ */
+/*#define PERL_MAD / **/
+
+/* NEED_VA_COPY:
+ * This symbol, if defined, indicates that the system stores
+ * the variable argument list datatype, va_list, in a format
+ * that cannot be copied by simple assignment, so that some
+ * other means must be used when copying is required.
+ * As such systems vary in their provision (or non-provision)
+ * of copying mechanisms, handy.h defines a platform-
+ * independent macro, Perl_va_copy(src, dst), to do the job.
+ */
+/*#define NEED_VA_COPY / **/
+
+/* IVTYPE:
+ * This symbol defines the C type used for Perl's IV.
+ */
+/* UVTYPE:
+ * This symbol defines the C type used for Perl's UV.
+ */
+/* I8TYPE:
+ * This symbol defines the C type used for Perl's I8.
+ */
+/* U8TYPE:
+ * This symbol defines the C type used for Perl's U8.
+ */
+/* I16TYPE:
+ * This symbol defines the C type used for Perl's I16.
+ */
+/* U16TYPE:
+ * This symbol defines the C type used for Perl's U16.
+ */
+/* I32TYPE:
+ * This symbol defines the C type used for Perl's I32.
+ */
+/* U32TYPE:
+ * This symbol defines the C type used for Perl's U32.
+ */
+/* I64TYPE:
+ * This symbol defines the C type used for Perl's I64.
+ */
+/* U64TYPE:
+ * This symbol defines the C type used for Perl's U64.
+ */
+/* NVTYPE:
+ * This symbol defines the C type used for Perl's NV.
+ */
+/* IVSIZE:
+ * This symbol contains the sizeof(IV).
+ */
+/* UVSIZE:
+ * This symbol contains the sizeof(UV).
+ */
+/* I8SIZE:
+ * This symbol contains the sizeof(I8).
+ */
+/* U8SIZE:
+ * This symbol contains the sizeof(U8).
+ */
+/* I16SIZE:
+ * This symbol contains the sizeof(I16).
+ */
+/* U16SIZE:
+ * This symbol contains the sizeof(U16).
+ */
+/* I32SIZE:
+ * This symbol contains the sizeof(I32).
+ */
+/* U32SIZE:
+ * This symbol contains the sizeof(U32).
+ */
+/* I64SIZE:
+ * This symbol contains the sizeof(I64).
+ */
+/* U64SIZE:
+ * This symbol contains the sizeof(U64).
+ */
+/* NVSIZE:
+ * This symbol contains the sizeof(NV).
+ */
+/* NV_PRESERVES_UV:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * can preserve all the bits of a variable of type UVTYPE.
+ */
+/* NV_PRESERVES_UV_BITS:
+ * This symbol contains the number of bits a variable of type NVTYPE
+ * can preserve of a variable of type UVTYPE.
+ */
+/* NV_OVERFLOWS_INTEGERS_AT:
+ * This symbol gives the largest integer value that NVs can hold. This
+ * value + 1.0 cannot be stored accurately. It is expressed as constant
+ * floating point expression to reduce the chance of decimale/binary
+ * conversion issues. If it can not be determined, the value 0 is given.
+ */
+/* NV_ZERO_IS_ALLBITS_ZERO:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * stores 0.0 in memory as all bits zero.
+ */
+#define IVTYPE long /**/
+#define UVTYPE unsigned long /**/
+#define I8TYPE char /**/
+#define U8TYPE unsigned char /**/
+#define I16TYPE short /**/
+#define U16TYPE unsigned short /**/
+#define I32TYPE long /**/
+#define U32TYPE unsigned long /**/
+#ifdef HAS_QUAD
+#define I64TYPE long long /**/
+#define U64TYPE unsigned long long /**/
+#endif
+#define NVTYPE double /**/
+#define IVSIZE 4 /**/
+#define UVSIZE 4 /**/
+#define I8SIZE 1 /**/
+#define U8SIZE 1 /**/
+#define I16SIZE 2 /**/
+#define U16SIZE 2 /**/
+#define I32SIZE 4 /**/
+#define U32SIZE 4 /**/
+#ifdef HAS_QUAD
+#define I64SIZE 8 /**/
+#define U64SIZE 8 /**/
+#endif
+#define NVSIZE 8 /**/
+#define NV_PRESERVES_UV
+#define NV_PRESERVES_UV_BITS 32
+#define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0
+#define NV_ZERO_IS_ALLBITS_ZERO
+#if UVSIZE == 8
+# ifdef BYTEORDER
+# if BYTEORDER == 0x1234
+# undef BYTEORDER
+# define BYTEORDER 0x12345678
+# else
+# if BYTEORDER == 0x4321
+# undef BYTEORDER
+# define BYTEORDER 0x87654321
+# endif
+# endif
+# endif
+#endif
+
+/* IVdf:
+ * This symbol defines the format string used for printing a Perl IV
+ * as a signed decimal integer.
+ */
+/* UVuf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned decimal integer.
+ */
+/* UVof:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned octal integer.
+ */
+/* UVxf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* UVXf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+/* NVef:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %e-ish floating point format.
+ */
+/* NVff:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %f-ish floating point format.
+ */
+/* NVgf:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %g-ish floating point format.
+ */
+#define IVdf "ld" /**/
+#define UVuf "lu" /**/
+#define UVof "lo" /**/
+#define UVxf "lx" /**/
+#define UVXf "lX" /**/
+#define NVef "e" /**/
+#define NVff "f" /**/
+#define NVgf "g" /**/
+
+/* SELECT_MIN_BITS:
+ * This symbol holds the minimum number of bits operated by select.
+ * That is, if you do select(n, ...), how many bits at least will be
+ * cleared in the masks if some activity is detected. Usually this
+ * is either n or 32*ceil(n/32), especially many little-endians do
+ * the latter. This is only useful if you have select(), naturally.
+ */
+#define SELECT_MIN_BITS 32 /**/
+
+/* STARTPERL:
+ * This variable contains the string to put in front of a perl
+ * script to make sure (one hopes) that it runs with perl and not
+ * some shell.
+ */
+#define STARTPERL "#!perl" /**/
+
+/* HAS_STDIO_STREAM_ARRAY:
+ * This symbol, if defined, tells that there is an array
+ * holding the stdio streams.
+ */
+/* STDIO_STREAM_ARRAY:
+ * This symbol tells the name of the array holding the stdio streams.
+ * Usual values include _iob, __iob, and __sF.
+ */
+/*#define HAS_STDIO_STREAM_ARRAY / **/
+#ifdef HAS_STDIO_STREAM_ARRAY
+#define STDIO_STREAM_ARRAY
+#endif
+
+/* GMTIME_MAX:
+ * This symbol contains the maximum value for the time_t offset that
+ * the system function gmtime () accepts, and defaults to 0
+ */
+/* GMTIME_MIN:
+ * This symbol contains the minimum value for the time_t offset that
+ * the system function gmtime () accepts, and defaults to 0
+ */
+/* LOCALTIME_MAX:
+ * This symbol contains the maximum value for the time_t offset that
+ * the system function localtime () accepts, and defaults to 0
+ */
+/* LOCALTIME_MIN:
+ * This symbol contains the minimum value for the time_t offset that
+ * the system function localtime () accepts, and defaults to 0
+ */
+#define GMTIME_MAX 2147483647 /**/
+#define GMTIME_MIN 0 /**/
+#define LOCALTIME_MAX 2147483647 /**/
+#define LOCALTIME_MIN 0 /**/
+
+/* USE_64_BIT_INT:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be employed (be they 32 or 64 bits). The minimal possible
+ * 64-bitness is used, just enough to get 64-bit integers into Perl.
+ * This may mean using for example "long longs", while your memory
+ * may still be limited to 2 gigabytes.
+ */
+/* USE_64_BIT_ALL:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be used (be they 32 or 64 bits). The maximal possible
+ * 64-bitness is employed: LP64 or ILP64, meaning that you will
+ * be able to use more than 2 gigabytes of memory. This mode is
+ * even more binary incompatible than USE_64_BIT_INT. You may not
+ * be able to run the resulting executable in a 32-bit CPU at all or
+ * you may need at least to reboot your OS to 64-bit mode.
+ */
+#ifndef USE_64_BIT_INT
+/*#define USE_64_BIT_INT / **/
+#endif
+#ifndef USE_64_BIT_ALL
+/*#define USE_64_BIT_ALL / **/
+#endif
+
+/* USE_DTRACE:
+ * This symbol, if defined, indicates that Perl should
+ * be built with support for DTrace.
+ */
+/*#define USE_DTRACE / **/
+
+/* USE_FAST_STDIO:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use 'fast stdio'.
+ * Defaults to define in Perls 5.8 and earlier, to undef later.
+ */
+#ifndef USE_FAST_STDIO
+/*#define USE_FAST_STDIO / **/
+#endif
+
+/* USE_LARGE_FILES:
+ * This symbol, if defined, indicates that large file support
+ * should be used when available.
+ */
+#ifndef USE_LARGE_FILES
+#define USE_LARGE_FILES /**/
+#endif
+
+/* USE_LONG_DOUBLE:
+ * This symbol, if defined, indicates that long doubles should
+ * be used when available.
+ */
+#ifndef USE_LONG_DOUBLE
+/*#define USE_LONG_DOUBLE / **/
+#endif
+
+/* USE_MORE_BITS:
+ * This symbol, if defined, indicates that 64-bit interfaces and
+ * long doubles should be used when available.
+ */
+#ifndef USE_MORE_BITS
+/*#define USE_MORE_BITS / **/
+#endif
+
+/* MULTIPLICITY:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use multiplicity.
+ */
+#ifndef MULTIPLICITY
+#define MULTIPLICITY /**/
+#endif
+
+/* USE_PERLIO:
+ * This symbol, if defined, indicates that the PerlIO abstraction should
+ * be used throughout. If not defined, stdio should be
+ * used in a fully backward compatible manner.
+ */
+#ifndef USE_PERLIO
+#define USE_PERLIO /**/
+#endif
+
+/* USE_SOCKS:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use socks.
+ */
+#ifndef USE_SOCKS
+/*#define USE_SOCKS / **/
+#endif
+
+#endif
diff --git a/Master/tlpkg/tlperl/lib/CORE/cop.h b/Master/tlpkg/tlperl/lib/CORE/cop.h
new file mode 100644
index 00000000000..13ce794ce20
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/cop.h
@@ -0,0 +1,928 @@
+/* cop.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * Control ops (cops) are one of the two ops OP_NEXTSTATE and OP_DBSTATE,
+ * that (loosely speaking) are separate statements.
+ * They hold information important for lexical state and error reporting.
+ * At run time, PL_curcop is set to point to the most recently executed cop,
+ * and thus can be used to determine our current state.
+ */
+
+/* A jmpenv packages the state required to perform a proper non-local jump.
+ * Note that there is a start_env initialized when perl starts, and top_env
+ * points to this initially, so top_env should always be non-null.
+ *
+ * Existence of a non-null top_env->je_prev implies it is valid to call
+ * longjmp() at that runlevel (we make sure start_env.je_prev is always
+ * null to ensure this).
+ *
+ * je_mustcatch, when set at any runlevel to TRUE, means eval ops must
+ * establish a local jmpenv to handle exception traps. Care must be taken
+ * to restore the previous value of je_mustcatch before exiting the
+ * stack frame iff JMPENV_PUSH was not called in that stack frame.
+ * GSAR 97-03-27
+ */
+
+struct jmpenv {
+ struct jmpenv * je_prev;
+ Sigjmp_buf je_buf; /* only for use if !je_throw */
+ int je_ret; /* last exception thrown */
+ bool je_mustcatch; /* need to call longjmp()? */
+};
+
+typedef struct jmpenv JMPENV;
+
+#ifdef OP_IN_REGISTER
+#define OP_REG_TO_MEM PL_opsave = op
+#define OP_MEM_TO_REG op = PL_opsave
+#else
+#define OP_REG_TO_MEM NOOP
+#define OP_MEM_TO_REG NOOP
+#endif
+
+/*
+ * How to build the first jmpenv.
+ *
+ * top_env needs to be non-zero. It points to an area
+ * in which longjmp() stuff is stored, as C callstack
+ * info there at least is thread specific this has to
+ * be per-thread. Otherwise a 'die' in a thread gives
+ * that thread the C stack of last thread to do an eval {}!
+ */
+
+#define JMPENV_BOOTSTRAP \
+ STMT_START { \
+ Zero(&PL_start_env, 1, JMPENV); \
+ PL_start_env.je_ret = -1; \
+ PL_start_env.je_mustcatch = TRUE; \
+ PL_top_env = &PL_start_env; \
+ } STMT_END
+
+/*
+ * PERL_FLEXIBLE_EXCEPTIONS
+ *
+ * All the flexible exceptions code has been removed.
+ * See the following threads for details:
+ *
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2004-07/msg00378.html
+ *
+ * Joshua's original patches (which weren't applied) and discussion:
+ *
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01396.html
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01489.html
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01491.html
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg01608.html
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg02144.html
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1998-02/msg02998.html
+ *
+ * Chip's reworked patch and discussion:
+ *
+ * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/1999-03/msg00520.html
+ *
+ * The flaw in these patches (which went unnoticed at the time) was
+ * that they moved some code that could potentially die() out of the
+ * region protected by the setjmp()s. This caused exceptions within
+ * END blocks and such to not be handled by the correct setjmp().
+ *
+ * The original patches that introduces flexible exceptions were:
+ *
+ * http://public.activestate.com/cgi-bin/perlbrowse?patch=3386
+ * http://public.activestate.com/cgi-bin/perlbrowse?patch=5162
+ */
+
+#define dJMPENV JMPENV cur_env
+
+#define JMPENV_PUSH(v) \
+ STMT_START { \
+ DEBUG_l(Perl_deb(aTHX_ "Setting up jumplevel %p, was %p at %s:%d\n", \
+ (void*)&cur_env, (void*)PL_top_env, \
+ __FILE__, __LINE__)); \
+ cur_env.je_prev = PL_top_env; \
+ OP_REG_TO_MEM; \
+ cur_env.je_ret = PerlProc_setjmp(cur_env.je_buf, SCOPE_SAVES_SIGNAL_MASK); \
+ OP_MEM_TO_REG; \
+ PL_top_env = &cur_env; \
+ cur_env.je_mustcatch = FALSE; \
+ (v) = cur_env.je_ret; \
+ } STMT_END
+
+#define JMPENV_POP \
+ STMT_START { \
+ DEBUG_l(Perl_deb(aTHX_ "popping jumplevel was %p, now %p at %s:%d\n", \
+ (void*)PL_top_env, (void*)cur_env.je_prev, \
+ __FILE__, __LINE__)); \
+ assert(PL_top_env == &cur_env); \
+ PL_top_env = cur_env.je_prev; \
+ } STMT_END
+
+#define JMPENV_JUMP(v) \
+ STMT_START { \
+ OP_REG_TO_MEM; \
+ if (PL_top_env->je_prev) \
+ PerlProc_longjmp(PL_top_env->je_buf, (v)); \
+ if ((v) == 2) \
+ PerlProc_exit(STATUS_EXIT); \
+ PerlIO_printf(PerlIO_stderr(), "panic: top_env\n"); \
+ PerlProc_exit(1); \
+ } STMT_END
+
+#define CATCH_GET (PL_top_env->je_mustcatch)
+#define CATCH_SET(v) (PL_top_env->je_mustcatch = (v))
+
+
+#include "mydtrace.h"
+
+struct cop {
+ BASEOP
+ /* On LP64 putting this here takes advantage of the fact that BASEOP isn't
+ an exact multiple of 8 bytes to save structure padding. */
+ line_t cop_line; /* line # of this command */
+ /* label for this construct is now stored in cop_hints_hash */
+#ifdef USE_ITHREADS
+ char * cop_stashpv; /* package line was compiled in */
+ char * cop_file; /* file name the following line # is from */
+#else
+ HV * cop_stash; /* package line was compiled in */
+ GV * cop_filegv; /* file the following line # is from */
+#endif
+ U32 cop_hints; /* hints bits from pragmata */
+ U32 cop_seq; /* parse sequence number */
+ /* Beware. mg.c and warnings.pl assume the type of this is STRLEN *: */
+ STRLEN * cop_warnings; /* lexical warnings bitmask */
+ /* compile time state of %^H. See the comment in op.c for how this is
+ used to recreate a hash to return from caller. */
+ struct refcounted_he * cop_hints_hash;
+};
+
+#ifdef USE_ITHREADS
+# define CopFILE(c) ((c)->cop_file)
+# define CopFILEGV(c) (CopFILE(c) \
+ ? gv_fetchfile(CopFILE(c)) : NULL)
+
+# ifdef NETWARE
+# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
+# define CopFILE_setn(c,pv,l) ((c)->cop_file = savepv((pv),(l)))
+# else
+# define CopFILE_set(c,pv) ((c)->cop_file = savesharedpv(pv))
+# define CopFILE_setn(c,pv,l) ((c)->cop_file = savesharedpvn((pv),(l)))
+# endif
+
+# define CopFILESV(c) (CopFILE(c) \
+ ? GvSV(gv_fetchfile(CopFILE(c))) : NULL)
+# define CopFILEAV(c) (CopFILE(c) \
+ ? GvAV(gv_fetchfile(CopFILE(c))) : NULL)
+# ifdef DEBUGGING
+# define CopFILEAVx(c) (assert(CopFILE(c)), \
+ GvAV(gv_fetchfile(CopFILE(c))))
+# else
+# define CopFILEAVx(c) (GvAV(gv_fetchfile(CopFILE(c))))
+# endif
+# define CopSTASHPV(c) ((c)->cop_stashpv)
+
+# ifdef NETWARE
+# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : NULL))
+# else
+# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = savesharedpv(pv))
+# endif
+
+# define CopSTASH(c) (CopSTASHPV(c) \
+ ? gv_stashpv(CopSTASHPV(c),GV_ADD) : NULL)
+# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : NULL)
+# define CopSTASH_eq(c,hv) ((hv) && stashpv_hvname_match(c,hv))
+# ifdef NETWARE
+# define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
+# define CopFILE_free(c) SAVECOPFILE_FREE(c)
+# else
+# define CopSTASH_free(c) PerlMemShared_free(CopSTASHPV(c))
+# define CopFILE_free(c) (PerlMemShared_free(CopFILE(c)),(CopFILE(c) = NULL))
+# endif
+#else
+# define CopFILEGV(c) ((c)->cop_filegv)
+# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
+# define CopFILE_setn(c,pv,l) CopFILEGV_set((c), gv_fetchfile_flags((pv),(l),0))
+# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : NULL)
+# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : NULL)
+# ifdef DEBUGGING
+# define CopFILEAVx(c) (assert(CopFILEGV(c)), GvAV(CopFILEGV(c)))
+# else
+# define CopFILEAVx(c) (GvAV(CopFILEGV(c)))
+# endif
+# define CopFILE(c) (CopFILEGV(c) && GvSV(CopFILEGV(c)) \
+ ? SvPVX(GvSV(CopFILEGV(c))) : NULL)
+# define CopSTASH(c) ((c)->cop_stash)
+# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
+# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME_get(CopSTASH(c)) : NULL)
+ /* cop_stash is not refcounted */
+# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
+# define CopSTASH_free(c)
+# define CopFILE_free(c) (SvREFCNT_dec(CopFILEGV(c)),(CopFILEGV(c) = NULL))
+
+#endif /* USE_ITHREADS */
+#define CopLABEL(c) Perl_fetch_cop_label(aTHX_ (c)->cop_hints_hash, NULL, NULL)
+#define CopLABEL_alloc(pv) ((pv)?savepv(pv):NULL)
+
+#define CopSTASH_ne(c,hv) (!CopSTASH_eq(c,hv))
+#define CopLINE(c) ((c)->cop_line)
+#define CopLINE_inc(c) (++CopLINE(c))
+#define CopLINE_dec(c) (--CopLINE(c))
+#define CopLINE_set(c,l) (CopLINE(c) = (l))
+
+/* OutCopFILE() is CopFILE for output (caller, die, warn, etc.) */
+#define OutCopFILE(c) CopFILE(c)
+
+/* If $[ is non-zero, it's stored in cop_hints under the key "$[", and
+ HINT_ARYBASE is set to indicate this.
+ Setting it is ineficient due to the need to create 2 mortal SVs, but as
+ using $[ is highly discouraged, no sane Perl code will be using it. */
+#define CopARYBASE_get(c) \
+ ((CopHINTS_get(c) & HINT_ARYBASE) \
+ ? SvIV(Perl_refcounted_he_fetch(aTHX_ (c)->cop_hints_hash, 0, \
+ "$[", 2, 0, 0)) \
+ : 0)
+#define CopARYBASE_set(c, b) STMT_START { \
+ if (b || ((c)->cop_hints & HINT_ARYBASE)) { \
+ (c)->cop_hints |= HINT_ARYBASE; \
+ if ((c) == &PL_compiling) { \
+ SV *val = newSViv(b); \
+ (void)hv_stores(GvHV(PL_hintgv), "$[", val); \
+ mg_set(val); \
+ PL_hints |= HINT_ARYBASE; \
+ } else { \
+ (c)->cop_hints_hash \
+ = Perl_refcounted_he_new(aTHX_ (c)->cop_hints_hash, \
+ newSVpvs_flags("$[", SVs_TEMP), \
+ sv_2mortal(newSViv(b))); \
+ } \
+ } \
+ } STMT_END
+
+/* FIXME NATIVE_HINTS if this is changed from op_private (see perl.h) */
+#define CopHINTS_get(c) ((c)->cop_hints + 0)
+#define CopHINTS_set(c, h) STMT_START { \
+ (c)->cop_hints = (h); \
+ } STMT_END
+
+/*
+ * Here we have some enormously heavy (or at least ponderous) wizardry.
+ */
+
+/* subroutine context */
+struct block_sub {
+ OP * retop; /* op to execute on exit from sub */
+ /* Above here is the same for sub, format and eval. */
+ CV * cv;
+ /* Above here is the same for sub and format. */
+ AV * savearray;
+ AV * argarray;
+ I32 olddepth;
+ PAD *oldcomppad;
+};
+
+
+/* format context */
+struct block_format {
+ OP * retop; /* op to execute on exit from sub */
+ /* Above here is the same for sub, format and eval. */
+ CV * cv;
+ /* Above here is the same for sub and format. */
+ GV * gv;
+ GV * dfoutgv;
+};
+
+/* base for the next two macros. Don't use directly.
+ * Note that the refcnt of the cv is incremented twice; The CX one is
+ * decremented by LEAVESUB, the other by LEAVE. */
+
+#define PUSHSUB_BASE(cx) \
+ ENTRY_PROBE(GvENAME(CvGV(cv)), \
+ CopFILE((const COP *)CvSTART(cv)), \
+ CopLINE((const COP *)CvSTART(cv))); \
+ \
+ cx->blk_sub.cv = cv; \
+ cx->blk_sub.olddepth = CvDEPTH(cv); \
+ cx->cx_type |= (hasargs) ? CXp_HASARGS : 0; \
+ cx->blk_sub.retop = NULL; \
+ if (!CvDEPTH(cv)) { \
+ SvREFCNT_inc_simple_void_NN(cv); \
+ SvREFCNT_inc_simple_void_NN(cv); \
+ SAVEFREESV(cv); \
+ }
+
+
+#define PUSHSUB(cx) \
+ PUSHSUB_BASE(cx) \
+ cx->blk_u16 = PL_op->op_private & \
+ (OPpLVAL_INTRO|OPpENTERSUB_INARGS);
+
+/* variant for use by OP_DBSTATE, where op_private holds hint bits */
+#define PUSHSUB_DB(cx) \
+ PUSHSUB_BASE(cx) \
+ cx->blk_u16 = 0;
+
+
+#define PUSHFORMAT(cx, retop) \
+ cx->blk_format.cv = cv; \
+ cx->blk_format.gv = gv; \
+ cx->blk_format.retop = (retop); \
+ cx->blk_format.dfoutgv = PL_defoutgv; \
+ SvREFCNT_inc_void(cx->blk_format.dfoutgv)
+
+#define POP_SAVEARRAY() \
+ STMT_START { \
+ SvREFCNT_dec(GvAV(PL_defgv)); \
+ GvAV(PL_defgv) = cx->blk_sub.savearray; \
+ } STMT_END
+
+/* junk in @_ spells trouble when cloning CVs and in pp_caller(), so don't
+ * leave any (a fast av_clear(ary), basically) */
+#define CLEAR_ARGARRAY(ary) \
+ STMT_START { \
+ AvMAX(ary) += AvARRAY(ary) - AvALLOC(ary); \
+ AvARRAY(ary) = AvALLOC(ary); \
+ AvFILLp(ary) = -1; \
+ } STMT_END
+
+#define POPSUB(cx,sv) \
+ STMT_START { \
+ RETURN_PROBE(GvENAME(CvGV((const CV*)cx->blk_sub.cv)), \
+ CopFILE((COP*)CvSTART((const CV*)cx->blk_sub.cv)), \
+ CopLINE((COP*)CvSTART((const CV*)cx->blk_sub.cv))); \
+ \
+ if (CxHASARGS(cx)) { \
+ POP_SAVEARRAY(); \
+ /* abandon @_ if it got reified */ \
+ if (AvREAL(cx->blk_sub.argarray)) { \
+ const SSize_t fill = AvFILLp(cx->blk_sub.argarray); \
+ SvREFCNT_dec(cx->blk_sub.argarray); \
+ cx->blk_sub.argarray = newAV(); \
+ av_extend(cx->blk_sub.argarray, fill); \
+ AvREIFY_only(cx->blk_sub.argarray); \
+ CX_CURPAD_SV(cx->blk_sub, 0) = MUTABLE_SV(cx->blk_sub.argarray); \
+ } \
+ else { \
+ CLEAR_ARGARRAY(cx->blk_sub.argarray); \
+ } \
+ } \
+ sv = MUTABLE_SV(cx->blk_sub.cv); \
+ if (sv && (CvDEPTH((const CV*)sv) = cx->blk_sub.olddepth)) \
+ sv = NULL; \
+ } STMT_END
+
+#define LEAVESUB(sv) \
+ STMT_START { \
+ if (sv) \
+ SvREFCNT_dec(sv); \
+ } STMT_END
+
+#define POPFORMAT(cx) \
+ setdefout(cx->blk_format.dfoutgv); \
+ SvREFCNT_dec(cx->blk_format.dfoutgv);
+
+/* eval context */
+struct block_eval {
+ OP * retop; /* op to execute on exit from eval */
+ /* Above here is the same for sub, format and eval. */
+ SV * old_namesv;
+ OP * old_eval_root;
+ SV * cur_text;
+ CV * cv;
+ JMPENV * cur_top_env; /* value of PL_top_env when eval CX created */
+};
+
+/* If we ever need more than 512 op types, change the shift from 7.
+ blku_gimme is actually also only 2 bits, so could be merged with something.
+*/
+
+#define CxOLD_IN_EVAL(cx) (((cx)->blk_u16) & 0x7F)
+#define CxOLD_OP_TYPE(cx) (((cx)->blk_u16) >> 7)
+
+#define PUSHEVAL(cx,n) \
+ STMT_START { \
+ assert(!(PL_in_eval & ~0x7F)); \
+ assert(!(PL_op->op_type & ~0x1FF)); \
+ cx->blk_u16 = (PL_in_eval & 0x7F) | ((U16)PL_op->op_type << 7); \
+ cx->blk_eval.old_namesv = (n ? newSVpv(n,0) : NULL); \
+ cx->blk_eval.old_eval_root = PL_eval_root; \
+ cx->blk_eval.cur_text = PL_parser ? PL_parser->linestr : NULL; \
+ cx->blk_eval.cv = NULL; /* set by doeval(), as applicable */ \
+ cx->blk_eval.retop = NULL; \
+ cx->blk_eval.cur_top_env = PL_top_env; \
+ } STMT_END
+
+#define POPEVAL(cx) \
+ STMT_START { \
+ PL_in_eval = CxOLD_IN_EVAL(cx); \
+ optype = CxOLD_OP_TYPE(cx); \
+ PL_eval_root = cx->blk_eval.old_eval_root; \
+ if (cx->blk_eval.old_namesv) \
+ sv_2mortal(cx->blk_eval.old_namesv); \
+ } STMT_END
+
+/* loop context */
+struct block_loop {
+ I32 resetsp;
+ LOOP * my_op; /* My op, that contains redo, next and last ops. */
+ /* (except for non_ithreads we need to modify next_op in pp_ctl.c, hence
+ why next_op is conditionally defined below.) */
+#ifdef USE_ITHREADS
+ PAD *oldcomppad; /* Also used for the GV, if targoffset is 0 */
+ /* This is also accesible via cx->blk_loop.my_op->op_targ */
+ PADOFFSET targoffset;
+#else
+ OP * next_op;
+ SV ** itervar;
+#endif
+ union {
+ struct { /* valid if type is LOOP_FOR or LOOP_PLAIN (but {NULL,0})*/
+ AV * ary; /* use the stack if this is NULL */
+ IV ix;
+ } ary;
+ struct { /* valid if type is LOOP_LAZYIV */
+ IV cur;
+ IV end;
+ } lazyiv;
+ struct { /* valid if type if LOOP_LAZYSV */
+ SV * cur;
+ SV * end; /* maxiumum value (or minimum in reverse) */
+ } lazysv;
+ } state_u;
+};
+
+#ifdef USE_ITHREADS
+# define CxITERVAR(c) \
+ ((c)->blk_loop.oldcomppad \
+ ? (CxPADLOOP(c) \
+ ? &CX_CURPAD_SV( (c)->blk_loop, (c)->blk_loop.targoffset ) \
+ : &GvSV((GV*)(c)->blk_loop.oldcomppad)) \
+ : (SV**)NULL)
+# define CX_ITERDATA_SET(cx,idata,o) \
+ if ((cx->blk_loop.targoffset = (o))) \
+ CX_CURPAD_SAVE(cx->blk_loop); \
+ else \
+ cx->blk_loop.oldcomppad = (idata);
+#else
+# define CxITERVAR(c) ((c)->blk_loop.itervar)
+# define CX_ITERDATA_SET(cx,ivar,o) \
+ cx->blk_loop.itervar = (SV**)(ivar);
+#endif
+#define CxLABEL(c) (0 + CopLABEL((c)->blk_oldcop))
+#define CxHASARGS(c) (((c)->cx_type & CXp_HASARGS) == CXp_HASARGS)
+#define CxLVAL(c) (0 + (c)->blk_u16)
+
+#ifdef USE_ITHREADS
+# define PUSHLOOP_OP_NEXT /* No need to do anything. */
+# define CX_LOOP_NEXTOP_GET(cx) ((cx)->blk_loop.my_op->op_nextop + 0)
+#else
+# define PUSHLOOP_OP_NEXT cx->blk_loop.next_op = cLOOP->op_nextop
+# define CX_LOOP_NEXTOP_GET(cx) ((cx)->blk_loop.next_op + 0)
+#endif
+
+#define PUSHLOOP_PLAIN(cx, s) \
+ cx->blk_loop.resetsp = s - PL_stack_base; \
+ cx->blk_loop.my_op = cLOOP; \
+ PUSHLOOP_OP_NEXT; \
+ cx->blk_loop.state_u.ary.ary = NULL; \
+ cx->blk_loop.state_u.ary.ix = 0; \
+ CX_ITERDATA_SET(cx, NULL, 0);
+
+#define PUSHLOOP_FOR(cx, dat, s, offset) \
+ cx->blk_loop.resetsp = s - PL_stack_base; \
+ cx->blk_loop.my_op = cLOOP; \
+ PUSHLOOP_OP_NEXT; \
+ cx->blk_loop.state_u.ary.ary = NULL; \
+ cx->blk_loop.state_u.ary.ix = 0; \
+ CX_ITERDATA_SET(cx, dat, offset);
+
+#define POPLOOP(cx) \
+ if (CxTYPE(cx) == CXt_LOOP_LAZYSV) { \
+ SvREFCNT_dec(cx->blk_loop.state_u.lazysv.cur); \
+ SvREFCNT_dec(cx->blk_loop.state_u.lazysv.end); \
+ } \
+ if (CxTYPE(cx) == CXt_LOOP_FOR) \
+ SvREFCNT_dec(cx->blk_loop.state_u.ary.ary);
+
+/* given/when context */
+struct block_givwhen {
+ OP *leave_op;
+};
+
+#define PUSHGIVEN(cx) \
+ cx->blk_givwhen.leave_op = cLOGOP->op_other;
+
+#define PUSHWHEN PUSHGIVEN
+
+/* context common to subroutines, evals and loops */
+struct block {
+ U8 blku_type; /* what kind of context this is */
+ U8 blku_gimme; /* is this block running in list context? */
+ U16 blku_u16; /* used by block_sub and block_eval (so far) */
+ I32 blku_oldsp; /* stack pointer to copy stuff down to */
+ COP * blku_oldcop; /* old curcop pointer */
+ I32 blku_oldmarksp; /* mark stack index */
+ I32 blku_oldscopesp; /* scope stack index */
+ PMOP * blku_oldpm; /* values of pattern match vars */
+
+ union {
+ struct block_sub blku_sub;
+ struct block_format blku_format;
+ struct block_eval blku_eval;
+ struct block_loop blku_loop;
+ struct block_givwhen blku_givwhen;
+ } blk_u;
+};
+#define blk_oldsp cx_u.cx_blk.blku_oldsp
+#define blk_oldcop cx_u.cx_blk.blku_oldcop
+#define blk_oldmarksp cx_u.cx_blk.blku_oldmarksp
+#define blk_oldscopesp cx_u.cx_blk.blku_oldscopesp
+#define blk_oldpm cx_u.cx_blk.blku_oldpm
+#define blk_gimme cx_u.cx_blk.blku_gimme
+#define blk_u16 cx_u.cx_blk.blku_u16
+#define blk_sub cx_u.cx_blk.blk_u.blku_sub
+#define blk_format cx_u.cx_blk.blk_u.blku_format
+#define blk_eval cx_u.cx_blk.blk_u.blku_eval
+#define blk_loop cx_u.cx_blk.blk_u.blku_loop
+#define blk_givwhen cx_u.cx_blk.blk_u.blku_givwhen
+
+/* Enter a block. */
+#define PUSHBLOCK(cx,t,sp) CXINC, cx = &cxstack[cxstack_ix], \
+ cx->cx_type = t, \
+ cx->blk_oldsp = sp - PL_stack_base, \
+ cx->blk_oldcop = PL_curcop, \
+ cx->blk_oldmarksp = PL_markstack_ptr - PL_markstack, \
+ cx->blk_oldscopesp = PL_scopestack_ix, \
+ cx->blk_oldpm = PL_curpm, \
+ cx->blk_gimme = (U8)gimme; \
+ DEBUG_l( PerlIO_printf(Perl_debug_log, "Entering block %ld, type %s\n", \
+ (long)cxstack_ix, PL_block_type[CxTYPE(cx)]); )
+
+/* Exit a block (RETURN and LAST). */
+#define POPBLOCK(cx,pm) cx = &cxstack[cxstack_ix--], \
+ newsp = PL_stack_base + cx->blk_oldsp, \
+ PL_curcop = cx->blk_oldcop, \
+ PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \
+ PL_scopestack_ix = cx->blk_oldscopesp, \
+ pm = cx->blk_oldpm, \
+ gimme = cx->blk_gimme; \
+ DEBUG_SCOPE("POPBLOCK"); \
+ DEBUG_l( PerlIO_printf(Perl_debug_log, "Leaving block %ld, type %s\n", \
+ (long)cxstack_ix+1,PL_block_type[CxTYPE(cx)]); )
+
+/* Continue a block elsewhere (NEXT and REDO). */
+#define TOPBLOCK(cx) cx = &cxstack[cxstack_ix], \
+ PL_stack_sp = PL_stack_base + cx->blk_oldsp, \
+ PL_markstack_ptr = PL_markstack + cx->blk_oldmarksp, \
+ PL_scopestack_ix = cx->blk_oldscopesp, \
+ PL_curpm = cx->blk_oldpm; \
+ DEBUG_SCOPE("TOPBLOCK");
+
+/* substitution context */
+struct subst {
+ U8 sbu_type; /* what kind of context this is */
+ U8 sbu_rflags;
+ U16 sbu_rxtainted; /* matches struct block */
+ I32 sbu_iters;
+ I32 sbu_maxiters;
+ I32 sbu_oldsave;
+ char * sbu_orig;
+ SV * sbu_dstr;
+ SV * sbu_targ;
+ char * sbu_s;
+ char * sbu_m;
+ char * sbu_strend;
+ void * sbu_rxres;
+ REGEXP * sbu_rx;
+};
+#define sb_iters cx_u.cx_subst.sbu_iters
+#define sb_maxiters cx_u.cx_subst.sbu_maxiters
+#define sb_rflags cx_u.cx_subst.sbu_rflags
+#define sb_oldsave cx_u.cx_subst.sbu_oldsave
+#define sb_once cx_u.cx_subst.sbu_once
+#define sb_rxtainted cx_u.cx_subst.sbu_rxtainted
+#define sb_orig cx_u.cx_subst.sbu_orig
+#define sb_dstr cx_u.cx_subst.sbu_dstr
+#define sb_targ cx_u.cx_subst.sbu_targ
+#define sb_s cx_u.cx_subst.sbu_s
+#define sb_m cx_u.cx_subst.sbu_m
+#define sb_strend cx_u.cx_subst.sbu_strend
+#define sb_rxres cx_u.cx_subst.sbu_rxres
+#define sb_rx cx_u.cx_subst.sbu_rx
+
+#ifdef PERL_CORE
+# define PUSHSUBST(cx) CXINC, cx = &cxstack[cxstack_ix], \
+ cx->sb_iters = iters, \
+ cx->sb_maxiters = maxiters, \
+ cx->sb_rflags = r_flags, \
+ cx->sb_oldsave = oldsave, \
+ cx->sb_rxtainted = rxtainted, \
+ cx->sb_orig = orig, \
+ cx->sb_dstr = dstr, \
+ cx->sb_targ = targ, \
+ cx->sb_s = s, \
+ cx->sb_m = m, \
+ cx->sb_strend = strend, \
+ cx->sb_rxres = NULL, \
+ cx->sb_rx = rx, \
+ cx->cx_type = CXt_SUBST | (once ? CXp_ONCE : 0); \
+ rxres_save(&cx->sb_rxres, rx); \
+ (void)ReREFCNT_inc(rx)
+
+# define POPSUBST(cx) cx = &cxstack[cxstack_ix--]; \
+ rxres_free(&cx->sb_rxres); \
+ ReREFCNT_dec(cx->sb_rx)
+#endif
+
+#define CxONCE(cx) ((cx)->cx_type & CXp_ONCE)
+
+struct context {
+ union {
+ struct block cx_blk;
+ struct subst cx_subst;
+ } cx_u;
+};
+#define cx_type cx_u.cx_subst.sbu_type
+
+/* If you re-order these, there is also an array of uppercase names in perl.h
+ and a static array of context names in pp_ctl.c */
+#define CXTYPEMASK 0xf
+#define CXt_NULL 0
+#define CXt_WHEN 1
+#define CXt_BLOCK 2
+/* When micro-optimising :-) keep GIVEN next to the LOOPs, as these 5 share a
+ jump table in pp_ctl.c
+ The first 4 don't have a 'case' in at least one switch statement in pp_ctl.c
+*/
+#define CXt_GIVEN 3
+/* This is first so that CXt_LOOP_FOR|CXt_LOOP_LAZYIV is CXt_LOOP_LAZYIV */
+#define CXt_LOOP_FOR 4
+#define CXt_LOOP_PLAIN 5
+#define CXt_LOOP_LAZYSV 6
+#define CXt_LOOP_LAZYIV 7
+#define CXt_SUB 8
+#define CXt_FORMAT 9
+#define CXt_EVAL 10
+#define CXt_SUBST 11
+/* SUBST doesn't feature in all switch statements. */
+
+/* private flags for CXt_SUB and CXt_NULL
+ However, this is checked in many places which do not check the type, so
+ this bit needs to be kept clear for most everything else. For reasons I
+ haven't investigated, it can coexist with CXp_FOR_DEF */
+#define CXp_MULTICALL 0x10 /* part of a multicall (so don't
+ tear down context on exit). */
+
+/* private flags for CXt_SUB and CXt_FORMAT */
+#define CXp_HASARGS 0x20
+
+/* private flags for CXt_EVAL */
+#define CXp_REAL 0x20 /* truly eval'', not a lookalike */
+#define CXp_TRYBLOCK 0x40 /* eval{}, not eval'' or similar */
+
+/* private flags for CXt_LOOP */
+#define CXp_FOR_DEF 0x10 /* foreach using $_ */
+#ifdef USE_ITHREADS
+# define CxPADLOOP(c) ((c)->blk_loop.targoffset)
+#endif
+
+/* private flags for CXt_SUBST */
+#define CXp_ONCE 0x10 /* What was sbu_once in struct subst */
+
+#define CxTYPE(c) ((c)->cx_type & CXTYPEMASK)
+#define CxTYPE_is_LOOP(c) (((c)->cx_type & 0xC) == 0x4)
+#define CxMULTICALL(c) (((c)->cx_type & CXp_MULTICALL) \
+ == CXp_MULTICALL)
+#define CxREALEVAL(c) (((c)->cx_type & (CXTYPEMASK|CXp_REAL)) \
+ == (CXt_EVAL|CXp_REAL))
+#define CxTRYBLOCK(c) (((c)->cx_type & (CXTYPEMASK|CXp_TRYBLOCK)) \
+ == (CXt_EVAL|CXp_TRYBLOCK))
+#define CxFOREACH(c) (CxTYPE_is_LOOP(c) && CxTYPE(c) != CXt_LOOP_PLAIN)
+#define CxFOREACHDEF(c) ((CxTYPE_is_LOOP(c) && CxTYPE(c) != CXt_LOOP_PLAIN) \
+ && ((c)->cx_type & CXp_FOR_DEF))
+
+#define CXINC (cxstack_ix < cxstack_max ? ++cxstack_ix : (cxstack_ix = cxinc()))
+
+/*
+=head1 "Gimme" Values
+*/
+
+/*
+=for apidoc AmU||G_SCALAR
+Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
+L<perlcall>.
+
+=for apidoc AmU||G_ARRAY
+Used to indicate list context. See C<GIMME_V>, C<GIMME> and
+L<perlcall>.
+
+=for apidoc AmU||G_VOID
+Used to indicate void context. See C<GIMME_V> and L<perlcall>.
+
+=for apidoc AmU||G_DISCARD
+Indicates that arguments returned from a callback should be discarded. See
+L<perlcall>.
+
+=for apidoc AmU||G_EVAL
+
+Used to force a Perl C<eval> wrapper around a callback. See
+L<perlcall>.
+
+=for apidoc AmU||G_NOARGS
+
+Indicates that no arguments are being sent to a callback. See
+L<perlcall>.
+
+=cut
+*/
+
+#define G_SCALAR 2
+#define G_ARRAY 3
+#define G_VOID 1
+#define G_WANT 3
+
+/* extra flags for Perl_call_* routines */
+#define G_DISCARD 4 /* Call FREETMPS.
+ Don't change this without consulting the
+ hash actions codes defined in hv.h */
+#define G_EVAL 8 /* Assume eval {} around subroutine call. */
+#define G_NOARGS 16 /* Don't construct a @_ array. */
+#define G_KEEPERR 32 /* Append errors to $@, don't overwrite it */
+#define G_NODEBUG 64 /* Disable debugging at toplevel. */
+#define G_METHOD 128 /* Calling method. */
+#define G_FAKINGEVAL 256 /* Faking an eval context for call_sv or
+ fold_constants. */
+
+/* flag bits for PL_in_eval */
+#define EVAL_NULL 0 /* not in an eval */
+#define EVAL_INEVAL 1 /* some enclosing scope is an eval */
+#define EVAL_WARNONLY 2 /* used by yywarn() when calling yyerror() */
+#define EVAL_KEEPERR 4 /* set by Perl_call_sv if G_KEEPERR */
+#define EVAL_INREQUIRE 8 /* The code is being required. */
+
+/* Support for switching (stack and block) contexts.
+ * This ensures magic doesn't invalidate local stack and cx pointers.
+ */
+
+#define PERLSI_UNKNOWN -1
+#define PERLSI_UNDEF 0
+#define PERLSI_MAIN 1
+#define PERLSI_MAGIC 2
+#define PERLSI_SORT 3
+#define PERLSI_SIGNAL 4
+#define PERLSI_OVERLOAD 5
+#define PERLSI_DESTROY 6
+#define PERLSI_WARNHOOK 7
+#define PERLSI_DIEHOOK 8
+#define PERLSI_REQUIRE 9
+
+struct stackinfo {
+ AV * si_stack; /* stack for current runlevel */
+ PERL_CONTEXT * si_cxstack; /* context stack for runlevel */
+ struct stackinfo * si_prev;
+ struct stackinfo * si_next;
+ I32 si_cxix; /* current context index */
+ I32 si_cxmax; /* maximum allocated index */
+ I32 si_type; /* type of runlevel */
+ I32 si_markoff; /* offset where markstack begins for us.
+ * currently used only with DEBUGGING,
+ * but not #ifdef-ed for bincompat */
+};
+
+typedef struct stackinfo PERL_SI;
+
+#define cxstack (PL_curstackinfo->si_cxstack)
+#define cxstack_ix (PL_curstackinfo->si_cxix)
+#define cxstack_max (PL_curstackinfo->si_cxmax)
+
+#ifdef DEBUGGING
+# define SET_MARK_OFFSET \
+ PL_curstackinfo->si_markoff = PL_markstack_ptr - PL_markstack
+#else
+# define SET_MARK_OFFSET NOOP
+#endif
+
+#define PUSHSTACKi(type) \
+ STMT_START { \
+ PERL_SI *next = PL_curstackinfo->si_next; \
+ if (!next) { \
+ next = new_stackinfo(32, 2048/sizeof(PERL_CONTEXT) - 1); \
+ next->si_prev = PL_curstackinfo; \
+ PL_curstackinfo->si_next = next; \
+ } \
+ next->si_type = type; \
+ next->si_cxix = -1; \
+ AvFILLp(next->si_stack) = 0; \
+ SWITCHSTACK(PL_curstack,next->si_stack); \
+ PL_curstackinfo = next; \
+ SET_MARK_OFFSET; \
+ } STMT_END
+
+#define PUSHSTACK PUSHSTACKi(PERLSI_UNKNOWN)
+
+/* POPSTACK works with PL_stack_sp, so it may need to be bracketed by
+ * PUTBACK/SPAGAIN to flush/refresh any local SP that may be active */
+#define POPSTACK \
+ STMT_START { \
+ dSP; \
+ PERL_SI * const prev = PL_curstackinfo->si_prev; \
+ if (!prev) { \
+ PerlIO_printf(Perl_error_log, "panic: POPSTACK\n"); \
+ my_exit(1); \
+ } \
+ SWITCHSTACK(PL_curstack,prev->si_stack); \
+ /* don't free prev here, free them all at the END{} */ \
+ PL_curstackinfo = prev; \
+ } STMT_END
+
+#define POPSTACK_TO(s) \
+ STMT_START { \
+ while (PL_curstack != s) { \
+ dounwind(-1); \
+ POPSTACK; \
+ } \
+ } STMT_END
+
+#define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
+#define IN_PERL_RUNTIME (PL_curcop != &PL_compiling)
+
+/*
+=head1 Multicall Functions
+
+=for apidoc Ams||dMULTICALL
+Declare local variables for a multicall. See L<perlcall/Lightweight Callbacks>.
+
+=for apidoc Ams||PUSH_MULTICALL
+Opening bracket for a lightweight callback.
+See L<perlcall/Lightweight Callbacks>.
+
+=for apidoc Ams||MULTICALL
+Make a lightweight callback. See L<perlcall/Lightweight Callbacks>.
+
+=for apidoc Ams||POP_MULTICALL
+Closing bracket for a lightweight callback.
+See L<perlcall/Lightweight Callbacks>.
+
+=cut
+*/
+
+#define dMULTICALL \
+ SV **newsp; /* set by POPBLOCK */ \
+ PERL_CONTEXT *cx; \
+ CV *multicall_cv; \
+ OP *multicall_cop; \
+ bool multicall_oldcatch; \
+ U8 hasargs = 0 /* used by PUSHSUB */
+
+#define PUSH_MULTICALL(the_cv) \
+ STMT_START { \
+ CV * const _nOnclAshIngNamE_ = the_cv; \
+ CV * const cv = _nOnclAshIngNamE_; \
+ AV * const padlist = CvPADLIST(cv); \
+ ENTER; \
+ multicall_oldcatch = CATCH_GET; \
+ SAVETMPS; SAVEVPTR(PL_op); \
+ CATCH_SET(TRUE); \
+ PUSHSTACKi(PERLSI_SORT); \
+ PUSHBLOCK(cx, CXt_SUB|CXp_MULTICALL, PL_stack_sp); \
+ PUSHSUB(cx); \
+ if (++CvDEPTH(cv) >= 2) { \
+ PERL_STACK_OVERFLOW_CHECK(); \
+ Perl_pad_push(aTHX_ padlist, CvDEPTH(cv)); \
+ } \
+ SAVECOMPPAD(); \
+ PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); \
+ multicall_cv = cv; \
+ multicall_cop = CvSTART(cv); \
+ } STMT_END
+
+#define MULTICALL \
+ STMT_START { \
+ PL_op = multicall_cop; \
+ CALLRUNOPS(aTHX); \
+ } STMT_END
+
+#define POP_MULTICALL \
+ STMT_START { \
+ LEAVESUB(multicall_cv); \
+ CvDEPTH(multicall_cv)--; \
+ POPBLOCK(cx,PL_curpm); \
+ POPSTACK; \
+ CATCH_SET(multicall_oldcatch); \
+ LEAVE; \
+ SPAGAIN; \
+ } STMT_END
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/cv.h b/Master/tlpkg/tlperl/lib/CORE/cv.h
new file mode 100644
index 00000000000..290019d9add
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/cv.h
@@ -0,0 +1,197 @@
+/* cv.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+ * 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* This structure must the beginning of XPVFM in sv.h */
+
+struct xpvcv {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+ _XPVCV_COMMON;
+};
+
+/*
+=head1 Handy Values
+
+=for apidoc AmU||Nullcv
+Null CV pointer.
+
+(deprecated - use C<(CV *)NULL> instead)
+
+=head1 CV Manipulation Functions
+
+=for apidoc Am|HV*|CvSTASH|CV* cv
+Returns the stash of the CV.
+
+=cut
+*/
+
+#ifndef PERL_CORE
+# define Nullcv Null(CV*)
+#endif
+
+#define CvSTASH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_stash
+#define CvSTART(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_start
+#define CvROOT(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_root
+#define CvXSUB(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_root_u.xcv_xsub
+#define CvXSUBANY(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_start_u.xcv_xsubany
+#define CvGV(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_gv
+#define CvFILE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_file
+#ifdef USE_ITHREADS
+# define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = savepv(CopFILE(cop)))
+#else
+# define CvFILE_set_from_cop(sv, cop) (CvFILE(sv) = CopFILE(cop))
+#endif
+#define CvFILEGV(sv) (gv_fetchfile(CvFILE(sv)))
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define CvDEPTH(sv) (*({const CV *const _cvdepth = (const CV *)sv; \
+ assert(SvTYPE(_cvdepth) == SVt_PVCV); \
+ &((XPVCV*)SvANY(_cvdepth))->xiv_u.xivu_i32; \
+ }))
+#else
+# define CvDEPTH(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xiv_u.xivu_i32
+#endif
+#define CvPADLIST(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_padlist
+#define CvOUTSIDE(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside
+#define CvFLAGS(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_flags
+#define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq
+
+#define CVf_METHOD 0x0001 /* CV is explicitly marked as a method */
+#define CVf_LVALUE 0x0004 /* CV return value can be used as lvalue */
+
+#define CVf_WEAKOUTSIDE 0x0010 /* CvOUTSIDE isn't ref counted */
+#define CVf_CLONE 0x0020 /* anon CV uses external lexicals */
+#define CVf_CLONED 0x0040 /* a clone of one of those */
+#define CVf_ANON 0x0080 /* CvGV() can't be trusted */
+#define CVf_UNIQUE 0x0100 /* sub is only called once (eg PL_main_cv,
+ * require, eval). */
+#define CVf_NODEBUG 0x0200 /* no DB::sub indirection for this CV
+ (esp. useful for special XSUBs) */
+#define CVf_CONST 0x0400 /* inlinable sub */
+#define CVf_ISXSUB 0x0800 /* CV is an XSUB, not pure perl. */
+
+/* This symbol for optimised communication between toke.c and op.c: */
+#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE)
+
+#define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE)
+#define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE)
+#define CvCLONE_off(cv) (CvFLAGS(cv) &= ~CVf_CLONE)
+
+#define CvCLONED(cv) (CvFLAGS(cv) & CVf_CLONED)
+#define CvCLONED_on(cv) (CvFLAGS(cv) |= CVf_CLONED)
+#define CvCLONED_off(cv) (CvFLAGS(cv) &= ~CVf_CLONED)
+
+#define CvANON(cv) (CvFLAGS(cv) & CVf_ANON)
+#define CvANON_on(cv) (CvFLAGS(cv) |= CVf_ANON)
+#define CvANON_off(cv) (CvFLAGS(cv) &= ~CVf_ANON)
+
+#define CvUNIQUE(cv) (CvFLAGS(cv) & CVf_UNIQUE)
+#define CvUNIQUE_on(cv) (CvFLAGS(cv) |= CVf_UNIQUE)
+#define CvUNIQUE_off(cv) (CvFLAGS(cv) &= ~CVf_UNIQUE)
+
+#define CvNODEBUG(cv) (CvFLAGS(cv) & CVf_NODEBUG)
+#define CvNODEBUG_on(cv) (CvFLAGS(cv) |= CVf_NODEBUG)
+#define CvNODEBUG_off(cv) (CvFLAGS(cv) &= ~CVf_NODEBUG)
+
+#define CvMETHOD(cv) (CvFLAGS(cv) & CVf_METHOD)
+#define CvMETHOD_on(cv) (CvFLAGS(cv) |= CVf_METHOD)
+#define CvMETHOD_off(cv) (CvFLAGS(cv) &= ~CVf_METHOD)
+
+#define CvLVALUE(cv) (CvFLAGS(cv) & CVf_LVALUE)
+#define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE)
+#define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE)
+
+#define CvEVAL(cv) (CvUNIQUE(cv) && !SvFAKE(cv))
+#define CvEVAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_off(cv))
+#define CvEVAL_off(cv) CvUNIQUE_off(cv)
+
+/* BEGIN|CHECK|INIT|UNITCHECK|END */
+#define CvSPECIAL(cv) (CvUNIQUE(cv) && SvFAKE(cv))
+#define CvSPECIAL_on(cv) (CvUNIQUE_on(cv),SvFAKE_on(cv))
+#define CvSPECIAL_off(cv) (CvUNIQUE_off(cv),SvFAKE_off(cv))
+
+#define CvCONST(cv) (CvFLAGS(cv) & CVf_CONST)
+#define CvCONST_on(cv) (CvFLAGS(cv) |= CVf_CONST)
+#define CvCONST_off(cv) (CvFLAGS(cv) &= ~CVf_CONST)
+
+#define CvWEAKOUTSIDE(cv) (CvFLAGS(cv) & CVf_WEAKOUTSIDE)
+#define CvWEAKOUTSIDE_on(cv) (CvFLAGS(cv) |= CVf_WEAKOUTSIDE)
+#define CvWEAKOUTSIDE_off(cv) (CvFLAGS(cv) &= ~CVf_WEAKOUTSIDE)
+
+#define CvISXSUB(cv) (CvFLAGS(cv) & CVf_ISXSUB)
+#define CvISXSUB_on(cv) (CvFLAGS(cv) |= CVf_ISXSUB)
+#define CvISXSUB_off(cv) (CvFLAGS(cv) &= ~CVf_ISXSUB)
+
+/* Flags for newXS_flags */
+#define XS_DYNAMIC_FILENAME 0x01 /* The filename isn't static */
+
+/*
+=head1 CV reference counts and CvOUTSIDE
+
+=for apidoc m|bool|CvWEAKOUTSIDE|CV *cv
+
+Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing
+CV (if any). Because pointers to anonymous sub prototypes are
+stored in C<&> pad slots, it is a possible to get a circular reference,
+with the parent pointing to the child and vice-versa. To avoid the
+ensuing memory leak, we do not increment the reference count of the CV
+pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent
+has a C<&> pad slot pointing back to us. In this case, we set the
+C<CvWEAKOUTSIDE> flag in the child. This allows us to determine under what
+circumstances we should decrement the refcount of the parent when freeing
+the child.
+
+There is a further complication with non-closure anonymous subs (i.e. those
+that do not refer to any lexicals outside that sub). In this case, the
+anonymous prototype is shared rather than being cloned. This has the
+consequence that the parent may be freed while there are still active
+children, eg
+
+ BEGIN { $a = sub { eval '$x' } }
+
+In this case, the BEGIN is freed immediately after execution since there
+are no active references to it: the anon sub prototype has
+C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same
+CV, so it doesn't contribute to BEGIN's refcount either. When $a is
+executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed,
+and the freed BEGIN is accessed.
+
+To avoid this, whenever a CV and its associated pad is freed, any
+C<&> entries in the pad are explicitly removed from the pad, and if the
+refcount of the pointed-to anon sub is still positive, then that
+child's C<CvOUTSIDE> is set to point to its grandparent. This will only
+occur in the single specific case of a non-closure anon prototype
+having one or more active references (such as C<$a> above).
+
+One other thing to consider is that a CV may be merely undefined
+rather than freed, eg C<undef &foo>. In this case, its refcount may
+not have reached zero, but we still delete its pad and its C<CvROOT> etc.
+Since various children may still have their C<CvOUTSIDE> pointing at this
+undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that
+the chain of lexical scopes is unbroken. For example, the following
+should print 123:
+
+ my $x = 123;
+ sub tmp { sub { eval '$x' } }
+ my $a = tmp();
+ undef &tmp;
+ print $a->();
+
+=cut
+*/
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/dirent.h b/Master/tlpkg/tlperl/lib/CORE/dirent.h
new file mode 100644
index 00000000000..50378254257
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/dirent.h
@@ -0,0 +1,53 @@
+/* dirent.h */
+
+/* djl
+ * Provide UNIX compatibility
+ */
+
+#ifndef _INC_DIRENT
+#define _INC_DIRENT
+
+/*
+ * NT versions of readdir(), etc
+ * From the MSDOS implementation
+ */
+
+/* Directory entry size */
+#ifdef DIRSIZ
+#undef DIRSIZ
+#endif
+#define DIRSIZ(rp) (sizeof(struct direct))
+
+/* needed to compile directory stuff */
+#define DIRENT direct
+
+/* structure of a directory entry */
+typedef struct direct
+{
+ long d_ino; /* inode number (not used by MS-DOS) */
+ long d_namlen; /* name length */
+ char d_name[257]; /* file name */
+} _DIRECT;
+
+/* structure for dir operations */
+typedef struct _dir_struc
+{
+ char *start; /* starting position */
+ char *curr; /* current position */
+ long size; /* allocated size of string table */
+ long nfiles; /* number of filenames in table */
+ struct direct dirstr; /* directory structure to return */
+ void* handle; /* system handle */
+ char *end; /* position after last filename */
+} DIR;
+
+#if 0 /* these have moved to win32iop.h */
+DIR * win32_opendir(const char *filename);
+struct direct * win32_readdir(DIR *dirp);
+long win32_telldir(DIR *dirp);
+void win32_seekdir(DIR *dirp,long loc);
+void win32_rewinddir(DIR *dirp);
+int win32_closedir(DIR *dirp);
+#endif
+
+#endif /* _INC_DIRENT */
diff --git a/Master/tlpkg/tlperl/lib/CORE/dosish.h b/Master/tlpkg/tlperl/lib/CORE/dosish.h
new file mode 100644
index 00000000000..59bf122859b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/dosish.h
@@ -0,0 +1,214 @@
+/* dosish.h
+ *
+ * Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+#define ABORT() abort();
+
+#ifndef SH_PATH
+#define SH_PATH "/bin/sh"
+#endif
+
+#ifdef DJGPP
+# define BIT_BUCKET "nul"
+# define OP_BINARY O_BINARY
+# define PERL_SYS_INIT_BODY(c,v) \
+ MALLOC_CHECK_TAINT2(*c,*v) Perl_DJGPP_init(c,v); PERLIO_INIT
+# define init_os_extras Perl_init_os_extras
+# define HAS_UTIME
+# define HAS_KILL
+ char *djgpp_pathexp (const char*);
+ void Perl_DJGPP_init (int *argcp,char ***argvp);
+# if (DJGPP==2 && DJGPP_MINOR < 2)
+# define NO_LOCALECONV_MON_THOUSANDS_SEP
+# endif
+# ifndef PERL_CORE
+# define PERL_FS_VER_FMT "%d_%d_%d"
+# endif
+# define PERL_FS_VERSION STRINGIFY(PERL_REVISION) "_" \
+ STRINGIFY(PERL_VERSION) "_" \
+ STRINGIFY(PERL_SUBVERSION)
+#else /* DJGPP */
+# ifdef WIN32
+# define PERL_SYS_INIT_BODY(c,v) \
+ MALLOC_CHECK_TAINT2(*c,*v) Perl_win32_init(c,v); PERLIO_INIT
+# define PERL_SYS_TERM_BODY() Perl_win32_term()
+# define BIT_BUCKET "nul"
+# else
+# ifdef NETWARE
+# define PERL_SYS_INIT_BODY(c,v) \
+ MALLOC_CHECK_TAINT2(*c,*v) Perl_nw5_init(c,v); PERLIO_INIT
+# define BIT_BUCKET "nwnul"
+# else
+# define PERL_SYS_INIT_BODY(c,v) \
+ MALLOC_CHECK_TAINT2(*c,*v); PERLIO_INIT
+# define BIT_BUCKET "\\dev\\nul" /* "wanna be like, umm, Newlined, or somethin?" */
+# endif /* NETWARE */
+# endif
+#endif /* DJGPP */
+
+#ifndef PERL_SYS_TERM_BODY
+# define PERL_SYS_TERM_BODY() HINTS_REFCNT_TERM; OP_REFCNT_TERM; PERLIO_TERM; MALLOC_TERM
+#endif
+#define dXSUB_SYS
+
+/*
+ * 5.003_07 and earlier keyed on #ifdef MSDOS for determining if we were
+ * running on DOS, *and* if we had to cope with 16 bit memory addressing
+ * constraints, *and* we need to have memory allocated as unsigned long.
+ *
+ * with the advent of *real* compilers for DOS, they are not locked together.
+ * MSDOS means "I am running on MSDOS". HAS_64K_LIMIT means "I have
+ * 16 bit memory addressing constraints".
+ *
+ * if you need the last, try #DEFINE MEM_SIZE unsigned long.
+ */
+#ifdef MSDOS
+# ifndef DJGPP
+# define HAS_64K_LIMIT
+# endif
+#endif
+
+/* USEMYBINMODE
+ * This symbol, if defined, indicates that the program should
+ * use the routine my_binmode(FILE *fp, char iotype, int mode) to insure
+ * that a file is in "binary" mode -- that is, that no translation
+ * of bytes occurs on read or write operations.
+ */
+#undef USEMYBINMODE
+
+/* Stat_t:
+ * This symbol holds the type used to declare buffers for information
+ * returned by stat(). It's usually just struct stat. It may be necessary
+ * to include <sys/stat.h> and <sys/types.h> to get any typedef'ed
+ * information.
+ */
+#if defined(WIN64) || defined(USE_LARGE_FILES)
+# if defined(__BORLANDC__) /* buk */
+# include <sys\stat.h>
+# define Stat_t struct stati64
+# else
+#define Stat_t struct _stati64
+# endif
+#else
+#if defined(UNDER_CE)
+#define Stat_t struct xcestat
+#else
+#define Stat_t struct stat
+#endif
+#endif
+
+/* USE_STAT_RDEV:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_rdev
+ */
+#define USE_STAT_RDEV /**/
+
+/* ACME_MESS:
+ * This symbol, if defined, indicates that error messages should be
+ * should be generated in a format that allows the use of the Acme
+ * GUI/editor's autofind feature.
+ */
+#undef ACME_MESS /**/
+
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if it finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
+#include <signal.h>
+
+/*
+ * fwrite1() should be a routine with the same calling sequence as fwrite(),
+ * but which outputs all of the bytes requested as a single stream (unlike
+ * fwrite() itself, which on some systems outputs several distinct records
+ * if the number_of_items parameter is >1).
+ */
+#define fwrite1 fwrite
+
+#define Fstat(fd,bufptr) fstat((fd),(bufptr))
+#ifdef DJGPP
+# define Fflush(fp) djgpp_fflush(fp)
+#else
+# define Fflush(fp) fflush(fp)
+#endif
+#define Mkdir(path,mode) mkdir((path),(mode))
+
+#ifndef WIN32
+# define Stat(fname,bufptr) stat((fname),(bufptr))
+#else
+# define HAS_IOCTL
+# define HAS_UTIME
+# define HAS_KILL
+# define HAS_WAIT
+# define HAS_CHOWN
+#endif /* WIN32 */
+
+/*
+ * <rich@phekda.freeserve.co.uk>: The DJGPP port has code that converts
+ * the return code of system() into the form that Unixy wait usually
+ * returns:
+ *
+ * - signal number in bits 0-6;
+ * - core dump flag in bit 7;
+ * - exit code in bits 8-15.
+ *
+ * Bits 0-7 are always zero for DJGPP, because it uses system().
+ * See djgpp.c.
+ *
+ * POSIX::W* use the W* macros from <sys/wait.h> to decode
+ * the return code. Unfortunately the W* macros for DJGPP use
+ * a different format than Unixy wait does. So there's a mismatch
+ * and, say, WEXITSTATUS($?) will return bogus values.
+ *
+ * So here we add hack to redefine the W* macros from DJGPP's <sys/wait.h>
+ * to work with our return-code conversion.
+ */
+
+#ifdef DJGPP
+
+#include <sys/wait.h>
+
+#undef WEXITSTATUS
+#undef WIFEXITED
+#undef WIFSIGNALED
+#undef WIFSTOPPED
+#undef WNOHANG
+#undef WSTOPSIG
+#undef WTERMSIG
+#undef WUNTRACED
+
+#define WEXITSTATUS(stat_val) ((stat_val) >> 8)
+#define WIFEXITED(stat_val) 0
+#define WIFSIGNALED(stat_val) 0
+#define WIFSTOPPED(stat_val) 0
+#define WNOHANG 0
+#define WSTOPSIG(stat_val) 0
+#define WTERMSIG(stat_val) 0
+#define WUNTRACED 0
+
+#endif
+
+/* Don't go reading from /dev/urandom */
+#define PERL_NO_DEV_RANDOM
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/embed.h b/Master/tlpkg/tlperl/lib/CORE/embed.h
new file mode 100644
index 00000000000..2b80af0458a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/embed.h
@@ -0,0 +1,4956 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * embed.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, and perlvars.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+/* (Doing namespace management portably in C is really gross.) */
+
+/* By defining PERL_NO_SHORT_NAMES (not done by default) the short forms
+ * (like warn instead of Perl_warn) for the API are not defined.
+ * Not defining the short forms is a good thing for cleaner embedding. */
+
+#ifndef PERL_NO_SHORT_NAMES
+
+/* Hide global symbols */
+
+#if !defined(PERL_IMPLICIT_CONTEXT)
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#define doing_taint Perl_doing_taint
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#ifdef PERL_CORE
+#define malloced_size Perl_malloced_size
+#define malloc_good_size Perl_malloc_good_size
+#endif
+#endif
+#define get_context Perl_get_context
+#define set_context Perl_set_context
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regcurly Perl_regcurly
+#endif
+#define amagic_call Perl_amagic_call
+#define Gv_AMupdate Perl_Gv_AMupdate
+#define gv_handler Perl_gv_handler
+#ifdef PERL_CORE
+#define append_elem Perl_append_elem
+#define append_list Perl_append_list
+#define apply Perl_apply
+#endif
+#define apply_attrs_string Perl_apply_attrs_string
+#define av_clear Perl_av_clear
+#define av_delete Perl_av_delete
+#define av_exists Perl_av_exists
+#define av_extend Perl_av_extend
+#define av_fetch Perl_av_fetch
+#define av_fill Perl_av_fill
+#define av_len Perl_av_len
+#define av_make Perl_av_make
+#define av_pop Perl_av_pop
+#define av_push Perl_av_push
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define av_reify Perl_av_reify
+#endif
+#define av_shift Perl_av_shift
+#define av_store Perl_av_store
+#define av_undef Perl_av_undef
+#define av_unshift Perl_av_unshift
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define get_aux_mg S_get_aux_mg
+#endif
+#endif
+#ifdef PERL_CORE
+#define bind_match Perl_bind_match
+#define block_end Perl_block_end
+#endif
+#define block_gimme Perl_block_gimme
+#ifdef PERL_CORE
+#define block_start Perl_block_start
+#define boot_core_UNIVERSAL Perl_boot_core_UNIVERSAL
+#define boot_core_PerlIO Perl_boot_core_PerlIO
+#endif
+#define call_list Perl_call_list
+#ifdef PERL_CORE
+#define cando Perl_cando
+#endif
+#define cast_ulong Perl_cast_ulong
+#define cast_i32 Perl_cast_i32
+#define cast_iv Perl_cast_iv
+#define cast_uv Perl_cast_uv
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define my_chsize Perl_my_chsize
+#endif
+#ifdef PERL_CORE
+#define convert Perl_convert
+#define create_eval_scope Perl_create_eval_scope
+#endif
+#define croak Perl_croak
+#define vcroak Perl_vcroak
+#define croak_xs_usage Perl_croak_xs_usage
+#if defined(PERL_IMPLICIT_CONTEXT)
+#define croak_nocontext Perl_croak_nocontext
+#define die_nocontext Perl_die_nocontext
+#define deb_nocontext Perl_deb_nocontext
+#define form_nocontext Perl_form_nocontext
+#define load_module_nocontext Perl_load_module_nocontext
+#define mess_nocontext Perl_mess_nocontext
+#define warn_nocontext Perl_warn_nocontext
+#define warner_nocontext Perl_warner_nocontext
+#define newSVpvf_nocontext Perl_newSVpvf_nocontext
+#define sv_catpvf_nocontext Perl_sv_catpvf_nocontext
+#define sv_setpvf_nocontext Perl_sv_setpvf_nocontext
+#define sv_catpvf_mg_nocontext Perl_sv_catpvf_mg_nocontext
+#define sv_setpvf_mg_nocontext Perl_sv_setpvf_mg_nocontext
+#define fprintf_nocontext Perl_fprintf_nocontext
+#define printf_nocontext Perl_printf_nocontext
+#endif
+#ifdef PERL_CORE
+#define cv_ckproto_len Perl_cv_ckproto_len
+#define cv_clone Perl_cv_clone
+#endif
+#define gv_const_sv Perl_gv_const_sv
+#define cv_const_sv Perl_cv_const_sv
+#ifdef PERL_CORE
+#define op_const_sv Perl_op_const_sv
+#endif
+#define cv_undef Perl_cv_undef
+#define cx_dump Perl_cx_dump
+#define filter_add Perl_filter_add
+#define filter_del Perl_filter_del
+#define filter_read Perl_filter_read
+#define get_op_descs Perl_get_op_descs
+#define get_op_names Perl_get_op_names
+#ifdef PERL_CORE
+#define get_no_modify Perl_get_no_modify
+#define get_opargs Perl_get_opargs
+#endif
+#define get_ppaddr Perl_get_ppaddr
+#define cxinc Perl_cxinc
+#define deb Perl_deb
+#define vdeb Perl_vdeb
+#define debprofdump Perl_debprofdump
+#define debop Perl_debop
+#define debstack Perl_debstack
+#define debstackptrs Perl_debstackptrs
+#define delimcpy Perl_delimcpy
+#ifdef PERL_CORE
+#define delete_eval_scope Perl_delete_eval_scope
+#endif
+#define die Perl_die
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define vdie S_vdie
+#endif
+#endif
+#ifdef PERL_CORE
+#define die_where Perl_die_where
+#endif
+#define dounwind Perl_dounwind
+#ifdef PERL_CORE
+#define do_aexec5 Perl_do_aexec5
+#endif
+#define do_binmode Perl_do_binmode
+#ifdef PERL_CORE
+#define do_chop Perl_do_chop
+#endif
+#define do_close Perl_do_close
+#ifdef PERL_CORE
+#define do_eof Perl_do_eof
+#endif
+#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
+#else
+#ifdef PERL_CORE
+#define do_exec Perl_do_exec
+#endif
+#endif
+#if defined(WIN32) || defined(__SYMBIAN32__) || defined(VMS)
+#define do_aspawn Perl_do_aspawn
+#define do_spawn Perl_do_spawn
+#define do_spawn_nowait Perl_do_spawn_nowait
+#endif
+#if !defined(WIN32)
+#ifdef PERL_CORE
+#define do_exec3 Perl_do_exec3
+#endif
+#endif
+#ifdef PERL_CORE
+#define do_execfree Perl_do_execfree
+#endif
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define exec_failed S_exec_failed
+#endif
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#ifdef PERL_CORE
+#define do_ipcctl Perl_do_ipcctl
+#define do_ipcget Perl_do_ipcget
+#define do_msgrcv Perl_do_msgrcv
+#define do_msgsnd Perl_do_msgsnd
+#define do_semop Perl_do_semop
+#define do_shmio Perl_do_shmio
+#endif
+#endif
+#define do_join Perl_do_join
+#ifdef PERL_CORE
+#define do_kv Perl_do_kv
+#endif
+#define do_open9 Perl_do_open9
+#define do_openn Perl_do_openn
+#ifdef PERL_CORE
+#define do_print Perl_do_print
+#define do_readline Perl_do_readline
+#define do_chomp Perl_do_chomp
+#define do_seek Perl_do_seek
+#endif
+#define do_sprintf Perl_do_sprintf
+#ifdef PERL_CORE
+#define do_sysseek Perl_do_sysseek
+#define do_tell Perl_do_tell
+#define do_trans Perl_do_trans
+#define do_vecget Perl_do_vecget
+#define do_vecset Perl_do_vecset
+#define do_vop Perl_do_vop
+#define dofile Perl_dofile
+#endif
+#define dowantarray Perl_dowantarray
+#define dump_all Perl_dump_all
+#ifdef PERL_CORE
+#define dump_all_perl Perl_dump_all_perl
+#endif
+#define dump_eval Perl_dump_eval
+#if defined(DUMP_FDS)
+#define dump_fds Perl_dump_fds
+#endif
+#define dump_form Perl_dump_form
+#define gv_dump Perl_gv_dump
+#define op_dump Perl_op_dump
+#define pmop_dump Perl_pmop_dump
+#define dump_packsubs Perl_dump_packsubs
+#ifdef PERL_CORE
+#define dump_packsubs_perl Perl_dump_packsubs_perl
+#endif
+#define dump_sub Perl_dump_sub
+#ifdef PERL_CORE
+#define dump_sub_perl Perl_dump_sub_perl
+#endif
+#define fbm_compile Perl_fbm_compile
+#define fbm_instr Perl_fbm_instr
+#ifdef PERL_CORE
+#define find_script Perl_find_script
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define force_list S_force_list
+#define fold_constants S_fold_constants
+#endif
+#endif
+#define form Perl_form
+#define vform Perl_vform
+#define free_tmps Perl_free_tmps
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define gen_constant_list S_gen_constant_list
+#endif
+#endif
+#if !defined(HAS_GETENV_LEN)
+#ifdef PERL_CORE
+#define getenv_len Perl_getenv_len
+#endif
+#endif
+#define gp_free Perl_gp_free
+#define gp_ref Perl_gp_ref
+#define gv_add_by_type Perl_gv_add_by_type
+#define gv_autoload4 Perl_gv_autoload4
+#define gv_check Perl_gv_check
+#define gv_efullname Perl_gv_efullname
+#define gv_efullname4 Perl_gv_efullname4
+#define gv_fetchfile Perl_gv_fetchfile
+#define gv_fetchfile_flags Perl_gv_fetchfile_flags
+#define gv_fetchmeth Perl_gv_fetchmeth
+#define gv_fetchmeth_autoload Perl_gv_fetchmeth_autoload
+#define gv_fetchmethod_autoload Perl_gv_fetchmethod_autoload
+#define gv_fetchmethod_flags Perl_gv_fetchmethod_flags
+#define gv_fetchpv Perl_gv_fetchpv
+#define gv_fullname Perl_gv_fullname
+#define gv_fullname4 Perl_gv_fullname4
+#define gv_init Perl_gv_init
+#define gv_name_set Perl_gv_name_set
+#ifdef PERL_CORE
+#define gv_try_downgrade Perl_gv_try_downgrade
+#endif
+#define gv_stashpv Perl_gv_stashpv
+#define gv_stashpvn Perl_gv_stashpvn
+#define gv_stashsv Perl_gv_stashsv
+#define hv_clear Perl_hv_clear
+#define hv_delayfree_ent Perl_hv_delayfree_ent
+#define hv_common Perl_hv_common
+#define hv_common_key_len Perl_hv_common_key_len
+#define hv_free_ent Perl_hv_free_ent
+#define hv_iterinit Perl_hv_iterinit
+#define hv_iterkey Perl_hv_iterkey
+#define hv_iterkeysv Perl_hv_iterkeysv
+#define hv_iternextsv Perl_hv_iternextsv
+#define hv_iternext_flags Perl_hv_iternext_flags
+#define hv_iterval Perl_hv_iterval
+#define hv_ksplit Perl_hv_ksplit
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define refcounted_he_new_common S_refcounted_he_new_common
+#endif
+#endif
+#define hv_undef Perl_hv_undef
+#define ibcmp Perl_ibcmp
+#define ibcmp_locale Perl_ibcmp_locale
+#define ibcmp_utf8 Perl_ibcmp_utf8
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define ingroup S_ingroup
+#endif
+#endif
+#ifdef PERL_CORE
+#define init_argv_symbols Perl_init_argv_symbols
+#endif
+#ifdef PERL_CORE
+#define init_debugger Perl_init_debugger
+#endif
+#define init_stacks Perl_init_stacks
+#define init_tm Perl_init_tm
+#ifdef PERL_CORE
+#define intro_my Perl_intro_my
+#endif
+#define instr Perl_instr
+#ifdef PERL_CORE
+#define io_close Perl_io_close
+#define invert Perl_invert
+#endif
+#define is_lvalue_sub Perl_is_lvalue_sub
+#define to_uni_upper_lc Perl_to_uni_upper_lc
+#define to_uni_title_lc Perl_to_uni_title_lc
+#define to_uni_lower_lc Perl_to_uni_lower_lc
+#define is_uni_alnum Perl_is_uni_alnum
+#define is_uni_idfirst Perl_is_uni_idfirst
+#define is_uni_alpha Perl_is_uni_alpha
+#define is_uni_ascii Perl_is_uni_ascii
+#define is_uni_space Perl_is_uni_space
+#define is_uni_cntrl Perl_is_uni_cntrl
+#define is_uni_graph Perl_is_uni_graph
+#define is_uni_digit Perl_is_uni_digit
+#define is_uni_upper Perl_is_uni_upper
+#define is_uni_lower Perl_is_uni_lower
+#define is_uni_print Perl_is_uni_print
+#define is_uni_punct Perl_is_uni_punct
+#define is_uni_xdigit Perl_is_uni_xdigit
+#define to_uni_upper Perl_to_uni_upper
+#define to_uni_title Perl_to_uni_title
+#define to_uni_lower Perl_to_uni_lower
+#define to_uni_fold Perl_to_uni_fold
+#define is_uni_alnum_lc Perl_is_uni_alnum_lc
+#define is_uni_idfirst_lc Perl_is_uni_idfirst_lc
+#define is_uni_alpha_lc Perl_is_uni_alpha_lc
+#define is_uni_ascii_lc Perl_is_uni_ascii_lc
+#define is_uni_space_lc Perl_is_uni_space_lc
+#define is_uni_cntrl_lc Perl_is_uni_cntrl_lc
+#define is_uni_graph_lc Perl_is_uni_graph_lc
+#define is_uni_digit_lc Perl_is_uni_digit_lc
+#define is_uni_upper_lc Perl_is_uni_upper_lc
+#define is_uni_lower_lc Perl_is_uni_lower_lc
+#define is_uni_print_lc Perl_is_uni_print_lc
+#define is_uni_punct_lc Perl_is_uni_punct_lc
+#define is_uni_xdigit_lc Perl_is_uni_xdigit_lc
+#define is_ascii_string Perl_is_ascii_string
+#define is_utf8_char Perl_is_utf8_char
+#define is_utf8_string Perl_is_utf8_string
+#define is_utf8_string_loclen Perl_is_utf8_string_loclen
+#define is_utf8_alnum Perl_is_utf8_alnum
+#define is_utf8_idfirst Perl_is_utf8_idfirst
+#define is_utf8_idcont Perl_is_utf8_idcont
+#define is_utf8_alpha Perl_is_utf8_alpha
+#define is_utf8_ascii Perl_is_utf8_ascii
+#define is_utf8_space Perl_is_utf8_space
+#define is_utf8_perl_space Perl_is_utf8_perl_space
+#define is_utf8_perl_word Perl_is_utf8_perl_word
+#define is_utf8_cntrl Perl_is_utf8_cntrl
+#define is_utf8_digit Perl_is_utf8_digit
+#define is_utf8_posix_digit Perl_is_utf8_posix_digit
+#define is_utf8_graph Perl_is_utf8_graph
+#define is_utf8_upper Perl_is_utf8_upper
+#define is_utf8_lower Perl_is_utf8_lower
+#define is_utf8_print Perl_is_utf8_print
+#define is_utf8_punct Perl_is_utf8_punct
+#define is_utf8_xdigit Perl_is_utf8_xdigit
+#define is_utf8_mark Perl_is_utf8_mark
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define is_utf8_X_begin Perl_is_utf8_X_begin
+#define is_utf8_X_extend Perl_is_utf8_X_extend
+#define is_utf8_X_prepend Perl_is_utf8_X_prepend
+#define is_utf8_X_non_hangul Perl_is_utf8_X_non_hangul
+#define is_utf8_X_L Perl_is_utf8_X_L
+#define is_utf8_X_LV Perl_is_utf8_X_LV
+#define is_utf8_X_LVT Perl_is_utf8_X_LVT
+#define is_utf8_X_LV_LVT_V Perl_is_utf8_X_LV_LVT_V
+#define is_utf8_X_T Perl_is_utf8_X_T
+#define is_utf8_X_V Perl_is_utf8_X_V
+#endif
+#ifdef PERL_CORE
+#define jmaybe Perl_jmaybe
+#define keyword Perl_keyword
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define opt_scalarhv S_opt_scalarhv
+#define is_inplace_av S_is_inplace_av
+#endif
+#endif
+#define leave_scope Perl_leave_scope
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define lex_end Perl_lex_end
+#endif
+#ifdef PERL_CORE
+#define lex_start Perl_lex_start
+#endif
+#define lex_bufutf8 Perl_lex_bufutf8
+#define lex_grow_linestr Perl_lex_grow_linestr
+#define lex_stuff_pvn Perl_lex_stuff_pvn
+#define lex_stuff_sv Perl_lex_stuff_sv
+#define lex_unstuff Perl_lex_unstuff
+#define lex_read_to Perl_lex_read_to
+#define lex_discard_to Perl_lex_discard_to
+#define lex_next_chunk Perl_lex_next_chunk
+#define lex_peek_unichar Perl_lex_peek_unichar
+#define lex_read_unichar Perl_lex_read_unichar
+#define lex_read_space Perl_lex_read_space
+#define op_null Perl_op_null
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define op_clear Perl_op_clear
+#endif
+#define op_refcnt_lock Perl_op_refcnt_lock
+#define op_refcnt_unlock Perl_op_refcnt_unlock
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define linklist S_linklist
+#define listkids S_listkids
+#endif
+#endif
+#ifdef PERL_CORE
+#define list Perl_list
+#endif
+#define load_module Perl_load_module
+#define vload_module Perl_vload_module
+#ifdef PERL_CORE
+#define localize Perl_localize
+#endif
+#define looks_like_number Perl_looks_like_number
+#define grok_bin Perl_grok_bin
+#define grok_hex Perl_grok_hex
+#define grok_number Perl_grok_number
+#define grok_numeric_radix Perl_grok_numeric_radix
+#define grok_oct Perl_grok_oct
+#ifdef PERL_CORE
+#define magic_clearenv Perl_magic_clearenv
+#define magic_clear_all_env Perl_magic_clear_all_env
+#define magic_clearhint Perl_magic_clearhint
+#define magic_clearhints Perl_magic_clearhints
+#define magic_clearisa Perl_magic_clearisa
+#define magic_clearpack Perl_magic_clearpack
+#define magic_clearsig Perl_magic_clearsig
+#define magic_existspack Perl_magic_existspack
+#define magic_freeovrld Perl_magic_freeovrld
+#define magic_get Perl_magic_get
+#define magic_getarylen Perl_magic_getarylen
+#define magic_getdefelem Perl_magic_getdefelem
+#define magic_getnkeys Perl_magic_getnkeys
+#define magic_getpack Perl_magic_getpack
+#define magic_getpos Perl_magic_getpos
+#define magic_getsig Perl_magic_getsig
+#define magic_getsubstr Perl_magic_getsubstr
+#define magic_gettaint Perl_magic_gettaint
+#define magic_getuvar Perl_magic_getuvar
+#define magic_getvec Perl_magic_getvec
+#define magic_len Perl_magic_len
+#define magic_nextpack Perl_magic_nextpack
+#define magic_regdata_cnt Perl_magic_regdata_cnt
+#define magic_regdatum_get Perl_magic_regdatum_get
+#define magic_regdatum_set Perl_magic_regdatum_set
+#define magic_set Perl_magic_set
+#define magic_setamagic Perl_magic_setamagic
+#define magic_setarylen Perl_magic_setarylen
+#define magic_freearylen_p Perl_magic_freearylen_p
+#define magic_setdbline Perl_magic_setdbline
+#define magic_setdefelem Perl_magic_setdefelem
+#define magic_setenv Perl_magic_setenv
+#define magic_sethint Perl_magic_sethint
+#define magic_setisa Perl_magic_setisa
+#define magic_setmglob Perl_magic_setmglob
+#define magic_setnkeys Perl_magic_setnkeys
+#define magic_setpack Perl_magic_setpack
+#define magic_setpos Perl_magic_setpos
+#define magic_setregexp Perl_magic_setregexp
+#define magic_setsig Perl_magic_setsig
+#define magic_setsubstr Perl_magic_setsubstr
+#define magic_settaint Perl_magic_settaint
+#define magic_setuvar Perl_magic_setuvar
+#define magic_setvec Perl_magic_setvec
+#define magic_setutf8 Perl_magic_setutf8
+#define magic_set_all_env Perl_magic_set_all_env
+#define magic_sizepack Perl_magic_sizepack
+#define magic_wipepack Perl_magic_wipepack
+#endif
+#define markstack_grow Perl_markstack_grow
+#if defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define magic_setcollxfrm Perl_magic_setcollxfrm
+#define mem_collxfrm Perl_mem_collxfrm
+#endif
+#endif
+#define mess Perl_mess
+#define vmess Perl_vmess
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define qerror Perl_qerror
+#endif
+#define sortsv Perl_sortsv
+#define sortsv_flags Perl_sortsv_flags
+#define mg_clear Perl_mg_clear
+#define mg_copy Perl_mg_copy
+#ifdef PERL_CORE
+#define mg_localize Perl_mg_localize
+#endif
+#define mg_find Perl_mg_find
+#define mg_free Perl_mg_free
+#define mg_get Perl_mg_get
+#define mg_length Perl_mg_length
+#define mg_magical Perl_mg_magical
+#define mg_set Perl_mg_set
+#define mg_size Perl_mg_size
+#define mini_mktime Perl_mini_mktime
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define mod Perl_mod
+#endif
+#ifdef PERL_CORE
+#define mode_from_discipline Perl_mode_from_discipline
+#endif
+#define moreswitches Perl_moreswitches
+#define my_atof Perl_my_atof
+#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
+#define my_bcopy Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#define my_bzero Perl_my_bzero
+#endif
+#define my_exit Perl_my_exit
+#define my_failure_exit Perl_my_failure_exit
+#define my_fflush_all Perl_my_fflush_all
+#define my_fork Perl_my_fork
+#define atfork_lock Perl_atfork_lock
+#define atfork_unlock Perl_atfork_unlock
+#define my_lstat Perl_my_lstat
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#define my_memcmp Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#define my_memset Perl_my_memset
+#endif
+#define my_pclose Perl_my_pclose
+#define my_popen Perl_my_popen
+#define my_popen_list Perl_my_popen_list
+#define my_setenv Perl_my_setenv
+#define my_stat Perl_my_stat
+#define my_strftime Perl_my_strftime
+#if defined(MYSWAP)
+#define my_swap Perl_my_swap
+#define my_htonl Perl_my_htonl
+#define my_ntohl Perl_my_ntohl
+#endif
+#ifdef PERL_CORE
+#define my_unexec Perl_my_unexec
+#endif
+#define newANONLIST Perl_newANONLIST
+#define newANONHASH Perl_newANONHASH
+#define newANONSUB Perl_newANONSUB
+#define newASSIGNOP Perl_newASSIGNOP
+#define newCONDOP Perl_newCONDOP
+#define newCONSTSUB Perl_newCONSTSUB
+#ifdef PERL_MAD
+#define newFORM Perl_newFORM
+#else
+#define newFORM Perl_newFORM
+#endif
+#define newFOROP Perl_newFOROP
+#define newGIVENOP Perl_newGIVENOP
+#define newLOGOP Perl_newLOGOP
+#define newLOOPEX Perl_newLOOPEX
+#define newLOOPOP Perl_newLOOPOP
+#define newNULLLIST Perl_newNULLLIST
+#define newOP Perl_newOP
+#define newPROG Perl_newPROG
+#define newRANGE Perl_newRANGE
+#define newSLICEOP Perl_newSLICEOP
+#define newSTATEOP Perl_newSTATEOP
+#define newSUB Perl_newSUB
+#define newXS_flags Perl_newXS_flags
+#define newXS Perl_newXS
+#define newAVREF Perl_newAVREF
+#define newBINOP Perl_newBINOP
+#define newCVREF Perl_newCVREF
+#define newGVOP Perl_newGVOP
+#define newGVgen Perl_newGVgen
+#define newGVREF Perl_newGVREF
+#define newHVREF Perl_newHVREF
+#define newHVhv Perl_newHVhv
+#define newLISTOP Perl_newLISTOP
+#ifdef USE_ITHREADS
+#define newPADOP Perl_newPADOP
+#endif
+#define newPMOP Perl_newPMOP
+#define newPVOP Perl_newPVOP
+#define newRV Perl_newRV
+#define newRV_noinc Perl_newRV_noinc
+#define newSV Perl_newSV
+#define newSVREF Perl_newSVREF
+#define newSVOP Perl_newSVOP
+#define newSViv Perl_newSViv
+#define newSVuv Perl_newSVuv
+#define newSVnv Perl_newSVnv
+#define newSVpv Perl_newSVpv
+#define newSVpvn Perl_newSVpvn
+#define newSVpvn_flags Perl_newSVpvn_flags
+#define newSVhek Perl_newSVhek
+#define newSVpvn_share Perl_newSVpvn_share
+#define newSVpvf Perl_newSVpvf
+#define vnewSVpvf Perl_vnewSVpvf
+#define newSVrv Perl_newSVrv
+#define newSVsv Perl_newSVsv
+#define newSV_type Perl_newSV_type
+#define newUNOP Perl_newUNOP
+#define newWHENOP Perl_newWHENOP
+#define newWHILEOP Perl_newWHILEOP
+#define new_stackinfo Perl_new_stackinfo
+#define scan_vstring Perl_scan_vstring
+#define scan_version Perl_scan_version
+#define prescan_version Perl_prescan_version
+#define new_version Perl_new_version
+#define upg_version Perl_upg_version
+#define vverify Perl_vverify
+#define vnumify Perl_vnumify
+#define vnormal Perl_vnormal
+#define vstringify Perl_vstringify
+#define vcmp Perl_vcmp
+#ifdef PERL_CORE
+#define nextargv Perl_nextargv
+#endif
+#define ninstr Perl_ninstr
+#define op_free Perl_op_free
+#ifdef PERL_MAD
+#ifdef PERL_CORE
+#define package Perl_package
+#endif
+#else
+#ifdef PERL_CORE
+#define package Perl_package
+#endif
+#endif
+#ifdef PERL_CORE
+#define package_version Perl_package_version
+#define pad_alloc Perl_pad_alloc
+#define allocmy Perl_allocmy
+#endif
+#define pad_findmy Perl_pad_findmy
+#define find_rundefsvoffset Perl_find_rundefsvoffset
+#ifdef PERL_CORE
+#define oopsAV Perl_oopsAV
+#define oopsHV Perl_oopsHV
+#define pad_leavemy Perl_pad_leavemy
+#endif
+#ifdef DEBUGGING
+#define pad_sv Perl_pad_sv
+#endif
+#ifdef PERL_CORE
+#define pad_free Perl_pad_free
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_reset S_pad_reset
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_swipe Perl_pad_swipe
+#define peep Perl_peep
+#endif
+#if defined(USE_REENTRANT_API)
+#define reentrant_size Perl_reentrant_size
+#define reentrant_init Perl_reentrant_init
+#define reentrant_free Perl_reentrant_free
+#define reentrant_retry Perl_reentrant_retry
+#endif
+#define call_atexit Perl_call_atexit
+#define call_argv Perl_call_argv
+#define call_method Perl_call_method
+#define call_pv Perl_call_pv
+#define call_sv Perl_call_sv
+#define despatch_signals Perl_despatch_signals
+#define doref Perl_doref
+#define eval_pv Perl_eval_pv
+#define eval_sv Perl_eval_sv
+#define get_sv Perl_get_sv
+#define get_av Perl_get_av
+#define get_hv Perl_get_hv
+#define get_cv Perl_get_cv
+#define get_cvn_flags Perl_get_cvn_flags
+#define init_i18nl10n Perl_init_i18nl10n
+#define init_i18nl14n Perl_init_i18nl14n
+#define new_collate Perl_new_collate
+#define new_ctype Perl_new_ctype
+#define new_numeric Perl_new_numeric
+#define set_numeric_local Perl_set_numeric_local
+#define set_numeric_radix Perl_set_numeric_radix
+#define set_numeric_standard Perl_set_numeric_standard
+#define require_pv Perl_require_pv
+#define pack_cat Perl_pack_cat
+#define packlist Perl_packlist
+#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
+#ifdef PERL_CORE
+#define pidgone S_pidgone
+#endif
+#endif
+#ifdef PERL_CORE
+#define pmruntime Perl_pmruntime
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pmtrans S_pmtrans
+#endif
+#endif
+#define pop_scope Perl_pop_scope
+#ifdef PERL_CORE
+#define prepend_elem Perl_prepend_elem
+#endif
+#define push_scope Perl_push_scope
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define refkids S_refkids
+#endif
+#endif
+#define regdump Perl_regdump
+#define regdump Perl_regdump
+#define regclass_swash Perl_regclass_swash
+#define pregexec Perl_pregexec
+#define pregfree Perl_pregfree
+#define pregfree2 Perl_pregfree2
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_temp_copy Perl_reg_temp_copy
+#endif
+#define regfree_internal Perl_regfree_internal
+#if defined(USE_ITHREADS)
+#define regdupe_internal Perl_regdupe_internal
+#endif
+#define pregcomp Perl_pregcomp
+#define re_compile Perl_re_compile
+#define re_intuit_start Perl_re_intuit_start
+#define re_intuit_string Perl_re_intuit_string
+#define regexec_flags Perl_regexec_flags
+#define regnext Perl_regnext
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_named_buff Perl_reg_named_buff
+#define reg_named_buff_iter Perl_reg_named_buff_iter
+#endif
+#define reg_named_buff_fetch Perl_reg_named_buff_fetch
+#define reg_named_buff_exists Perl_reg_named_buff_exists
+#define reg_named_buff_firstkey Perl_reg_named_buff_firstkey
+#define reg_named_buff_nextkey Perl_reg_named_buff_nextkey
+#define reg_named_buff_scalar Perl_reg_named_buff_scalar
+#define reg_named_buff_all Perl_reg_named_buff_all
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_numbered_buff_fetch Perl_reg_numbered_buff_fetch
+#define reg_numbered_buff_store Perl_reg_numbered_buff_store
+#define reg_numbered_buff_length Perl_reg_numbered_buff_length
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_qr_package Perl_reg_qr_package
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regprop Perl_regprop
+#endif
+#define repeatcpy Perl_repeatcpy
+#define rninstr Perl_rninstr
+#define rsignal Perl_rsignal
+#ifdef PERL_CORE
+#define rsignal_restore Perl_rsignal_restore
+#define rsignal_save Perl_rsignal_save
+#endif
+#define rsignal_state Perl_rsignal_state
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define rxres_free S_rxres_free
+#define rxres_restore S_rxres_restore
+#endif
+#endif
+#ifdef PERL_CORE
+#define rxres_save Perl_rxres_save
+#endif
+#if !defined(HAS_RENAME)
+#ifdef PERL_CORE
+#define same_dirent Perl_same_dirent
+#endif
+#endif
+#define savepv Perl_savepv
+#define savepvn Perl_savepvn
+#define savesharedpv Perl_savesharedpv
+#define savesharedpvn Perl_savesharedpvn
+#define savesvpv Perl_savesvpv
+#define savestack_grow Perl_savestack_grow
+#define savestack_grow_cnt Perl_savestack_grow_cnt
+#define save_aelem_flags Perl_save_aelem_flags
+#define save_alloc Perl_save_alloc
+#define save_aptr Perl_save_aptr
+#define save_ary Perl_save_ary
+#define save_bool Perl_save_bool
+#define save_clearsv Perl_save_clearsv
+#define save_delete Perl_save_delete
+#define save_hdelete Perl_save_hdelete
+#define save_adelete Perl_save_adelete
+#define save_destructor Perl_save_destructor
+#define save_destructor_x Perl_save_destructor_x
+#define save_generic_svref Perl_save_generic_svref
+#define save_generic_pvref Perl_save_generic_pvref
+#define save_shared_pvref Perl_save_shared_pvref
+#define save_gp Perl_save_gp
+#define save_hash Perl_save_hash
+#ifdef PERL_CORE
+#define save_hints Perl_save_hints
+#endif
+#define save_helem_flags Perl_save_helem_flags
+#define save_hptr Perl_save_hptr
+#define save_I16 Perl_save_I16
+#define save_I32 Perl_save_I32
+#define save_I8 Perl_save_I8
+#define save_int Perl_save_int
+#define save_item Perl_save_item
+#define save_iv Perl_save_iv
+#define save_list Perl_save_list
+#define save_long Perl_save_long
+#define save_nogv Perl_save_nogv
+#define save_scalar Perl_save_scalar
+#define save_pptr Perl_save_pptr
+#define save_vptr Perl_save_vptr
+#define save_re_context Perl_save_re_context
+#define save_padsv_and_mortalize Perl_save_padsv_and_mortalize
+#define save_sptr Perl_save_sptr
+#define save_svref Perl_save_svref
+#define save_pushptr Perl_save_pushptr
+#ifdef PERL_CORE
+#define save_pushi32ptr Perl_save_pushi32ptr
+#define save_pushptrptr Perl_save_pushptrptr
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_pushptri32ptr S_save_pushptri32ptr
+#endif
+#endif
+#ifdef PERL_CORE
+#define sawparens Perl_sawparens
+#define scalar Perl_scalar
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define scalarkids S_scalarkids
+#define scalarseq S_scalarseq
+#endif
+#endif
+#ifdef PERL_CORE
+#define scalarvoid Perl_scalarvoid
+#endif
+#define scan_bin Perl_scan_bin
+#define scan_hex Perl_scan_hex
+#define scan_num Perl_scan_num
+#define scan_oct Perl_scan_oct
+#ifdef PERL_CORE
+#define scope Perl_scope
+#endif
+#define screaminstr Perl_screaminstr
+#define setdefout Perl_setdefout
+#define share_hek Perl_share_hek
+#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_CORE
+#define sighandler Perl_sighandler
+#endif
+#define csighandler Perl_csighandler
+#else
+#ifdef PERL_CORE
+#define sighandler Perl_sighandler
+#endif
+#define csighandler Perl_csighandler
+#endif
+#define stack_grow Perl_stack_grow
+#define start_subparse Perl_start_subparse
+#ifdef PERL_CORE
+#define sub_crush_depth Perl_sub_crush_depth
+#endif
+#define sv_2bool Perl_sv_2bool
+#define sv_2cv Perl_sv_2cv
+#define sv_2io Perl_sv_2io
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define glob_2number S_glob_2number
+#endif
+#endif
+#define sv_2iv_flags Perl_sv_2iv_flags
+#define sv_2mortal Perl_sv_2mortal
+#define sv_2nv Perl_sv_2nv
+#ifdef PERL_CORE
+#define sv_2num Perl_sv_2num
+#endif
+#define sv_2pv_flags Perl_sv_2pv_flags
+#define sv_2pvutf8 Perl_sv_2pvutf8
+#define sv_2pvbyte Perl_sv_2pvbyte
+#define sv_pvn_nomg Perl_sv_pvn_nomg
+#define sv_2uv_flags Perl_sv_2uv_flags
+#define sv_iv Perl_sv_iv
+#define sv_uv Perl_sv_uv
+#define sv_nv Perl_sv_nv
+#define sv_pvn Perl_sv_pvn
+#define sv_pvutf8n Perl_sv_pvutf8n
+#define sv_pvbyten Perl_sv_pvbyten
+#define sv_true Perl_sv_true
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define sv_add_arena S_sv_add_arena
+#endif
+#endif
+#define sv_backoff Perl_sv_backoff
+#define sv_bless Perl_sv_bless
+#define sv_catpvf Perl_sv_catpvf
+#define sv_vcatpvf Perl_sv_vcatpvf
+#define sv_catpv Perl_sv_catpv
+#define sv_chop Perl_sv_chop
+#ifdef PERL_CORE
+#define sv_clean_all Perl_sv_clean_all
+#define sv_clean_objs Perl_sv_clean_objs
+#endif
+#define sv_clear Perl_sv_clear
+#define sv_cmp Perl_sv_cmp
+#define sv_cmp_locale Perl_sv_cmp_locale
+#if defined(USE_LOCALE_COLLATE)
+#define sv_collxfrm Perl_sv_collxfrm
+#endif
+#define sv_compile_2op Perl_sv_compile_2op
+#define getcwd_sv Perl_getcwd_sv
+#define sv_dec Perl_sv_dec
+#define sv_dump Perl_sv_dump
+#define sv_derived_from Perl_sv_derived_from
+#define sv_does Perl_sv_does
+#define sv_eq Perl_sv_eq
+#define sv_free Perl_sv_free
+#ifdef PERL_CORE
+#define sv_free_arenas Perl_sv_free_arenas
+#endif
+#define sv_gets Perl_sv_gets
+#define sv_grow Perl_sv_grow
+#define sv_inc Perl_sv_inc
+#define sv_insert_flags Perl_sv_insert_flags
+#define sv_isa Perl_sv_isa
+#define sv_isobject Perl_sv_isobject
+#define sv_len Perl_sv_len
+#define sv_len_utf8 Perl_sv_len_utf8
+#define sv_magic Perl_sv_magic
+#define sv_magicext Perl_sv_magicext
+#define sv_mortalcopy Perl_sv_mortalcopy
+#define sv_newmortal Perl_sv_newmortal
+#define sv_newref Perl_sv_newref
+#define sv_peek Perl_sv_peek
+#define sv_pos_u2b Perl_sv_pos_u2b
+#define sv_pos_u2b_flags Perl_sv_pos_u2b_flags
+#define sv_pos_b2u Perl_sv_pos_b2u
+#define sv_pvutf8n_force Perl_sv_pvutf8n_force
+#define sv_pvbyten_force Perl_sv_pvbyten_force
+#define sv_recode_to_utf8 Perl_sv_recode_to_utf8
+#define sv_cat_decode Perl_sv_cat_decode
+#define sv_reftype Perl_sv_reftype
+#define sv_replace Perl_sv_replace
+#define sv_report_used Perl_sv_report_used
+#define sv_reset Perl_sv_reset
+#define sv_setpvf Perl_sv_setpvf
+#define sv_vsetpvf Perl_sv_vsetpvf
+#define sv_setiv Perl_sv_setiv
+#define sv_setpviv Perl_sv_setpviv
+#define sv_setuv Perl_sv_setuv
+#define sv_setnv Perl_sv_setnv
+#define sv_setref_iv Perl_sv_setref_iv
+#define sv_setref_uv Perl_sv_setref_uv
+#define sv_setref_nv Perl_sv_setref_nv
+#define sv_setref_pv Perl_sv_setref_pv
+#define sv_setref_pvn Perl_sv_setref_pvn
+#define sv_setpv Perl_sv_setpv
+#define sv_setpvn Perl_sv_setpvn
+#define sv_tainted Perl_sv_tainted
+#define sv_unmagic Perl_sv_unmagic
+#define sv_unref_flags Perl_sv_unref_flags
+#define sv_untaint Perl_sv_untaint
+#define sv_upgrade Perl_sv_upgrade
+#define sv_usepvn_flags Perl_sv_usepvn_flags
+#define sv_vcatpvfn Perl_sv_vcatpvfn
+#define sv_vsetpvfn Perl_sv_vsetpvfn
+#define str_to_version Perl_str_to_version
+#define swash_init Perl_swash_init
+#define swash_fetch Perl_swash_fetch
+#define taint_env Perl_taint_env
+#define taint_proper Perl_taint_proper
+#define to_utf8_case Perl_to_utf8_case
+#define to_utf8_lower Perl_to_utf8_lower
+#define to_utf8_upper Perl_to_utf8_upper
+#define to_utf8_title Perl_to_utf8_title
+#define to_utf8_fold Perl_to_utf8_fold
+#if defined(UNLINK_ALL_VERSIONS)
+#define unlnk Perl_unlnk
+#endif
+#define unpack_str Perl_unpack_str
+#define unpackstring Perl_unpackstring
+#define unsharepvn Perl_unsharepvn
+#ifdef PERL_CORE
+#define unshare_hek Perl_unshare_hek
+#endif
+#ifdef PERL_MAD
+#ifdef PERL_CORE
+#define utilize Perl_utilize
+#endif
+#else
+#ifdef PERL_CORE
+#define utilize Perl_utilize
+#endif
+#endif
+#define utf16_to_utf8 Perl_utf16_to_utf8
+#define utf16_to_utf8_reversed Perl_utf16_to_utf8_reversed
+#define utf8_length Perl_utf8_length
+#define utf8_distance Perl_utf8_distance
+#define utf8_hop Perl_utf8_hop
+#define utf8_to_bytes Perl_utf8_to_bytes
+#define bytes_from_utf8 Perl_bytes_from_utf8
+#define bytes_to_utf8 Perl_bytes_to_utf8
+#define utf8_to_uvchr Perl_utf8_to_uvchr
+#define utf8_to_uvuni Perl_utf8_to_uvuni
+#ifdef EBCDIC
+#define utf8n_to_uvchr Perl_utf8n_to_uvchr
+#else
+#endif
+#define utf8n_to_uvuni Perl_utf8n_to_uvuni
+#ifdef EBCDIC
+#define uvchr_to_utf8 Perl_uvchr_to_utf8
+#else
+#endif
+#define uvchr_to_utf8_flags Perl_uvchr_to_utf8_flags
+#define uvuni_to_utf8_flags Perl_uvuni_to_utf8_flags
+#define pv_uni_display Perl_pv_uni_display
+#define sv_uni_display Perl_sv_uni_display
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define vivify_defelem Perl_vivify_defelem
+#endif
+#ifdef PERL_CORE
+#define vivify_ref Perl_vivify_ref
+#define wait4pid Perl_wait4pid
+#define parse_unicode_opts Perl_parse_unicode_opts
+#endif
+#define seed Perl_seed
+#ifdef PERL_CORE
+#define get_hash_seed Perl_get_hash_seed
+#define report_evil_fh Perl_report_evil_fh
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define report_uninit Perl_report_uninit
+#endif
+#define warn Perl_warn
+#define vwarn Perl_vwarn
+#define warner Perl_warner
+#define ck_warner Perl_ck_warner
+#define ck_warner_d Perl_ck_warner_d
+#define vwarner Perl_vwarner
+#ifdef PERL_CORE
+#define watch Perl_watch
+#endif
+#define whichsig Perl_whichsig
+#ifdef PERL_CORE
+#define write_to_stderr Perl_write_to_stderr
+#define yyerror Perl_yyerror
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define yylex Perl_yylex
+#endif
+#ifdef PERL_CORE
+#define yyparse Perl_yyparse
+#define parser_free Perl_parser_free
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define yywarn S_yywarn
+#endif
+#endif
+#if defined(MYMALLOC)
+#define dump_mstats Perl_dump_mstats
+#define get_mstats Perl_get_mstats
+#endif
+#define safesysmalloc Perl_safesysmalloc
+#define safesyscalloc Perl_safesyscalloc
+#define safesysrealloc Perl_safesysrealloc
+#define safesysfree Perl_safesysfree
+#if defined(PERL_GLOBAL_STRUCT)
+#define GetVars Perl_GetVars
+#define init_global_struct Perl_init_global_struct
+#define free_global_struct Perl_free_global_struct
+#endif
+#define runops_standard Perl_runops_standard
+#define runops_debug Perl_runops_debug
+#define sv_catpvf_mg Perl_sv_catpvf_mg
+#define sv_vcatpvf_mg Perl_sv_vcatpvf_mg
+#define sv_catpv_mg Perl_sv_catpv_mg
+#define sv_setpvf_mg Perl_sv_setpvf_mg
+#define sv_vsetpvf_mg Perl_sv_vsetpvf_mg
+#define sv_setiv_mg Perl_sv_setiv_mg
+#define sv_setpviv_mg Perl_sv_setpviv_mg
+#define sv_setuv_mg Perl_sv_setuv_mg
+#define sv_setnv_mg Perl_sv_setnv_mg
+#define sv_setpv_mg Perl_sv_setpv_mg
+#define sv_setpvn_mg Perl_sv_setpvn_mg
+#define sv_setsv_mg Perl_sv_setsv_mg
+#define get_vtbl Perl_get_vtbl
+#define pv_display Perl_pv_display
+#define pv_escape Perl_pv_escape
+#define pv_pretty Perl_pv_pretty
+#define dump_indent Perl_dump_indent
+#define dump_vindent Perl_dump_vindent
+#define do_gv_dump Perl_do_gv_dump
+#define do_gvgv_dump Perl_do_gvgv_dump
+#define do_hv_dump Perl_do_hv_dump
+#define do_magic_dump Perl_do_magic_dump
+#define do_op_dump Perl_do_op_dump
+#define do_pmop_dump Perl_do_pmop_dump
+#define do_sv_dump Perl_do_sv_dump
+#define magic_dump Perl_magic_dump
+#define reginitcolors Perl_reginitcolors
+#define sv_utf8_downgrade Perl_sv_utf8_downgrade
+#define sv_utf8_encode Perl_sv_utf8_encode
+#define sv_utf8_decode Perl_sv_utf8_decode
+#define sv_force_normal_flags Perl_sv_force_normal_flags
+#define tmps_grow Perl_tmps_grow
+#define sv_rvweaken Perl_sv_rvweaken
+#ifdef PERL_CORE
+#define magic_killbackrefs Perl_magic_killbackrefs
+#endif
+#define newANONATTRSUB Perl_newANONATTRSUB
+#define newATTRSUB Perl_newATTRSUB
+#ifdef PERL_MAD
+#define newMYSUB Perl_newMYSUB
+#else
+#define newMYSUB Perl_newMYSUB
+#endif
+#ifdef PERL_CORE
+#define my_attrs Perl_my_attrs
+#endif
+#if defined(USE_ITHREADS)
+#define cx_dup Perl_cx_dup
+#define si_dup Perl_si_dup
+#define ss_dup Perl_ss_dup
+#define any_dup Perl_any_dup
+#define he_dup Perl_he_dup
+#define hek_dup Perl_hek_dup
+#define re_dup_guts Perl_re_dup_guts
+#define fp_dup Perl_fp_dup
+#define dirp_dup Perl_dirp_dup
+#define gp_dup Perl_gp_dup
+#define mg_dup Perl_mg_dup
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define sv_dup_inc_multiple S_sv_dup_inc_multiple
+#endif
+#endif
+#define sv_dup Perl_sv_dup
+#define rvpv_dup Perl_rvpv_dup
+#define parser_dup Perl_parser_dup
+#endif
+#define ptr_table_new Perl_ptr_table_new
+#define ptr_table_fetch Perl_ptr_table_fetch
+#define ptr_table_store Perl_ptr_table_store
+#define ptr_table_split Perl_ptr_table_split
+#define ptr_table_clear Perl_ptr_table_clear
+#define ptr_table_free Perl_ptr_table_free
+#if defined(USE_ITHREADS)
+# if defined(HAVE_INTERP_INTERN)
+#define sys_intern_dup Perl_sys_intern_dup
+# endif
+#endif
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_clear Perl_sys_intern_clear
+#define sys_intern_init Perl_sys_intern_init
+#endif
+#define custom_op_name Perl_custom_op_name
+#define custom_op_desc Perl_custom_op_desc
+#define sv_nosharing Perl_sv_nosharing
+#define sv_destroyable Perl_sv_destroyable
+#ifdef NO_MATHOMS
+#else
+#define sv_nounlocking Perl_sv_nounlocking
+#endif
+#define nothreadhook Perl_nothreadhook
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_trans_simple S_do_trans_simple
+#define do_trans_count S_do_trans_count
+#define do_trans_complex S_do_trans_complex
+#define do_trans_simple_utf8 S_do_trans_simple_utf8
+#define do_trans_count_utf8 S_do_trans_count_utf8
+#define do_trans_complex_utf8 S_do_trans_complex_utf8
+#endif
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define gv_init_sv S_gv_init_sv
+#define gv_get_super_pkg S_gv_get_super_pkg
+#define require_tie_mod S_require_tie_mod
+#endif
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define hsplit S_hsplit
+#define hfreeentries S_hfreeentries
+#define anonymise_cv S_anonymise_cv
+#define new_he S_new_he
+#define save_hek_flags S_save_hek_flags
+#define hv_magic_check S_hv_magic_check
+#define unshare_hek_or_pvn S_unshare_hek_or_pvn
+#define share_hek_flags S_share_hek_flags
+#define hv_notallowed S_hv_notallowed
+#define hv_auxinit S_hv_auxinit
+#define hv_delete_common S_hv_delete_common
+#define clear_placeholders S_clear_placeholders
+#define refcounted_he_value S_refcounted_he_value
+#endif
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_magic S_save_magic
+#define magic_methpack S_magic_methpack
+#define magic_methcall S_magic_methcall
+#define restore_magic S_restore_magic
+#define unwind_handler_stack S_unwind_handler_stack
+#endif
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define ck_anoncode Perl_ck_anoncode
+#define ck_bitop Perl_ck_bitop
+#define ck_concat Perl_ck_concat
+#define ck_defined Perl_ck_defined
+#define ck_delete Perl_ck_delete
+#define ck_die Perl_ck_die
+#define ck_eof Perl_ck_eof
+#define ck_eval Perl_ck_eval
+#define ck_exec Perl_ck_exec
+#define ck_exists Perl_ck_exists
+#define ck_exit Perl_ck_exit
+#define ck_ftst Perl_ck_ftst
+#define ck_fun Perl_ck_fun
+#define ck_glob Perl_ck_glob
+#define ck_grep Perl_ck_grep
+#define ck_index Perl_ck_index
+#define ck_join Perl_ck_join
+#define ck_lfun Perl_ck_lfun
+#define ck_listiob Perl_ck_listiob
+#define ck_match Perl_ck_match
+#define ck_method Perl_ck_method
+#define ck_null Perl_ck_null
+#define ck_open Perl_ck_open
+#define ck_readline Perl_ck_readline
+#define ck_repeat Perl_ck_repeat
+#define ck_require Perl_ck_require
+#define ck_return Perl_ck_return
+#define ck_rfun Perl_ck_rfun
+#define ck_rvconst Perl_ck_rvconst
+#define ck_sassign Perl_ck_sassign
+#define ck_select Perl_ck_select
+#define ck_shift Perl_ck_shift
+#define ck_sort Perl_ck_sort
+#define ck_spair Perl_ck_spair
+#define ck_split Perl_ck_split
+#define ck_subr Perl_ck_subr
+#define ck_substr Perl_ck_substr
+#define ck_svconst Perl_ck_svconst
+#define ck_trunc Perl_ck_trunc
+#define ck_unpack Perl_ck_unpack
+#define ck_each Perl_ck_each
+#define is_handle_constructor S_is_handle_constructor
+#define is_list_assignment S_is_list_assignment
+#endif
+# ifdef USE_ITHREADS
+# else
+# endif
+#ifdef PERL_CORE
+#define find_and_forget_pmops S_find_and_forget_pmops
+#define cop_free S_cop_free
+#define modkids S_modkids
+#define scalarboolean S_scalarboolean
+#define newDEFSVOP S_newDEFSVOP
+#define search_const S_search_const
+#define new_logop S_new_logop
+#define simplify_sort S_simplify_sort
+#define gv_ename S_gv_ename
+#define scalar_mod_type S_scalar_mod_type
+#define my_kid S_my_kid
+#define dup_attrlist S_dup_attrlist
+#define apply_attrs S_apply_attrs
+#define apply_attrs_my S_apply_attrs_my
+#define bad_type S_bad_type
+#define no_bareword_allowed S_no_bareword_allowed
+#define no_fh_allowed S_no_fh_allowed
+#define too_few_arguments S_too_few_arguments
+#define too_many_arguments S_too_many_arguments
+#define looks_like_bool S_looks_like_bool
+#define newGIVWHENOP S_newGIVWHENOP
+#define ref_array_or_hash S_ref_array_or_hash
+#define process_special_blocks S_process_special_blocks
+#endif
+#endif
+#if defined(PL_OP_SLAB_ALLOC)
+#define Slab_Alloc Perl_Slab_Alloc
+#define Slab_Free Perl_Slab_Free
+# if defined(PERL_DEBUG_READONLY_OPS)
+# if defined(PERL_IN_OP_C)
+#ifdef PERL_CORE
+#define Slab_to_rw S_Slab_to_rw
+#endif
+# endif
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define find_beginning S_find_beginning
+#define forbid_setid S_forbid_setid
+#define incpush S_incpush
+#define incpush_use_sep S_incpush_use_sep
+#define init_interp S_init_interp
+#define init_ids S_init_ids
+#define init_main_stash S_init_main_stash
+#define init_perllib S_init_perllib
+#define init_postdump_symbols S_init_postdump_symbols
+#define init_predump_symbols S_init_predump_symbols
+#define my_exit_jump S_my_exit_jump
+#define nuke_stacks S_nuke_stacks
+#define open_script S_open_script
+#define usage S_usage
+#endif
+#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
+#endif
+#ifdef PERL_CORE
+#define parse_body S_parse_body
+#define run_body S_run_body
+#define incpush_if_exists S_incpush_if_exists
+#endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_delete_local S_do_delete_local
+#define refto S_refto
+#endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define unpack_rec S_unpack_rec
+#define pack_rec S_pack_rec
+#define mul128 S_mul128
+#define measure_struct S_measure_struct
+#define next_symbol S_next_symbol
+#define is_an_int S_is_an_int
+#define div128 S_div128
+#define group_end S_group_end
+#define get_num S_get_num
+#define need_utf8 S_need_utf8
+#define first_symbol S_first_symbol
+#define sv_exp_grow S_sv_exp_grow
+#define bytes_to_uni S_bytes_to_uni
+#endif
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define docatch S_docatch
+#define dofindlabel S_dofindlabel
+#define doparseform S_doparseform
+#define num_overflow S_num_overflow
+#define dopoptoeval S_dopoptoeval
+#define dopoptogiven S_dopoptogiven
+#define dopoptolabel S_dopoptolabel
+#define dopoptoloop S_dopoptoloop
+#define dopoptosub_at S_dopoptosub_at
+#define dopoptowhen S_dopoptowhen
+#define save_lines S_save_lines
+#define doeval S_doeval
+#define check_type_and_open S_check_type_and_open
+#endif
+#ifndef PERL_DISABLE_PMC
+#ifdef PERL_CORE
+#define doopen_pm S_doopen_pm
+#endif
+#endif
+#ifdef PERL_CORE
+#define path_is_absolute S_path_is_absolute
+#define run_user_filter S_run_user_filter
+#define make_matcher S_make_matcher
+#define matcher_matches_sv S_matcher_matches_sv
+#define destroy_matcher S_destroy_matcher
+#define do_smartmatch S_do_smartmatch
+#endif
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_oddball S_do_oddball
+#define method_common S_method_common
+#endif
+#endif
+#if defined(PERL_IN_PP_SORT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define sv_ncmp S_sv_ncmp
+#define sv_i_ncmp S_sv_i_ncmp
+#define amagic_ncmp S_amagic_ncmp
+#define amagic_i_ncmp S_amagic_i_ncmp
+#define amagic_cmp S_amagic_cmp
+#define amagic_cmp_locale S_amagic_cmp_locale
+#define sortcv S_sortcv
+#define sortcv_xsub S_sortcv_xsub
+#define sortcv_stacked S_sortcv_stacked
+#define qsortsvu S_qsortsvu
+#endif
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define doform S_doform
+#endif
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#ifdef PERL_CORE
+#define dooneliner S_dooneliner
+#endif
+# endif
+#ifdef PERL_CORE
+#define space_join_names_mortal S_space_join_names_mortal
+#endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg S_reg
+#define reganode S_reganode
+#define regatom S_regatom
+#define regbranch S_regbranch
+#define reguni S_reguni
+#define regclass S_regclass
+#define reg_node S_reg_node
+#define reg_recode S_reg_recode
+#define regpiece S_regpiece
+#define reg_namedseq S_reg_namedseq
+#define reginsert S_reginsert
+#define regtail S_regtail
+#define reg_scan_name S_reg_scan_name
+#define join_exact S_join_exact
+#define regwhite S_regwhite
+#define nextchar S_nextchar
+#define reg_skipcomment S_reg_skipcomment
+#define scan_commit S_scan_commit
+#define cl_anything S_cl_anything
+#define cl_is_anything S_cl_is_anything
+#define cl_init S_cl_init
+#define cl_init_zero S_cl_init_zero
+#define cl_and S_cl_and
+#define cl_or S_cl_or
+#define study_chunk S_study_chunk
+#define add_data S_add_data
+#endif
+#ifdef PERL_CORE
+#define re_croak2 S_re_croak2
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regpposixcc S_regpposixcc
+#define checkposixcc S_checkposixcc
+#define make_trie S_make_trie
+#define make_trie_failtable S_make_trie_failtable
+#endif
+# ifdef DEBUGGING
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regdump_extflags S_regdump_extflags
+#define dumpuntil S_dumpuntil
+#define put_byte S_put_byte
+#define dump_trie S_dump_trie
+#define dump_trie_interim_list S_dump_trie_interim_list
+#define dump_trie_interim_table S_dump_trie_interim_table
+#define regtail_study S_regtail_study
+#endif
+# endif
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regmatch S_regmatch
+#define regrepeat S_regrepeat
+#define regtry S_regtry
+#define reginclass S_reginclass
+#define regcppush S_regcppush
+#define regcppop S_regcppop
+#define reghop3 S_reghop3
+#endif
+#ifdef XXX_dmq
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reghop4 S_reghop4
+#endif
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reghopmaybe3 S_reghopmaybe3
+#define find_byclass S_find_byclass
+#define to_utf8_substr S_to_utf8_substr
+#define to_byte_substr S_to_byte_substr
+#define reg_check_named_buff_matched S_reg_check_named_buff_matched
+#endif
+# ifdef DEBUGGING
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define dump_exec_pos S_dump_exec_pos
+#define debug_start_match S_debug_start_match
+#endif
+# endif
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define deb_curcv S_deb_curcv
+#define debprof S_debprof
+#define sequence S_sequence
+#define sequence_tail S_sequence_tail
+#define sequence_num S_sequence_num
+#define pm_description S_pm_description
+#endif
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_scalar_at S_save_scalar_at
+#endif
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define uiv_2buf S_uiv_2buf
+#define sv_unglob S_sv_unglob
+#define not_a_number S_not_a_number
+#define visit S_visit
+#define sv_del_backref S_sv_del_backref
+#define varname S_varname
+#endif
+# ifdef DEBUGGING
+#ifdef PERL_CORE
+#define del_sv S_del_sv
+#endif
+# endif
+# if !defined(NV_PRESERVES_UV)
+# ifdef DEBUGGING
+#ifdef PERL_CORE
+#define sv_2iuv_non_preserve S_sv_2iuv_non_preserve
+#endif
+# else
+#ifdef PERL_CORE
+#define sv_2iuv_non_preserve S_sv_2iuv_non_preserve
+#endif
+# endif
+# endif
+#ifdef PERL_CORE
+#define expect_number S_expect_number
+#endif
+#ifdef PERL_CORE
+#define sv_pos_u2b_forwards S_sv_pos_u2b_forwards
+#define sv_pos_u2b_midway S_sv_pos_u2b_midway
+#define sv_pos_u2b_cached S_sv_pos_u2b_cached
+#define utf8_mg_pos_cache_update S_utf8_mg_pos_cache_update
+#define sv_pos_b2u_midway S_sv_pos_b2u_midway
+#define F0convert S_F0convert
+#endif
+# if defined(PERL_OLD_COPY_ON_WRITE)
+#ifdef PERL_CORE
+#define sv_release_COW S_sv_release_COW
+#endif
+# endif
+#ifdef PERL_CORE
+#define more_sv S_more_sv
+#define more_bodies S_more_bodies
+#define sv_2iuv_common S_sv_2iuv_common
+#define glob_assign_glob S_glob_assign_glob
+#define glob_assign_ref S_glob_assign_ref
+#define ptr_table_find S_ptr_table_find
+#endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define check_uni S_check_uni
+#define force_next S_force_next
+#define force_version S_force_version
+#define force_strict_version S_force_strict_version
+#define force_word S_force_word
+#define tokeq S_tokeq
+#define readpipe_override S_readpipe_override
+#define scan_const S_scan_const
+#define scan_formline S_scan_formline
+#define scan_heredoc S_scan_heredoc
+#define scan_ident S_scan_ident
+#define scan_inputsymbol S_scan_inputsymbol
+#define scan_pat S_scan_pat
+#define scan_str S_scan_str
+#define scan_subst S_scan_subst
+#define scan_trans S_scan_trans
+#define scan_word S_scan_word
+#define update_debugger_info S_update_debugger_info
+#define skipspace S_skipspace
+#define swallow_bom S_swallow_bom
+#endif
+#ifndef PERL_NO_UTF16_FILTER
+#ifdef PERL_CORE
+#define utf16_textfilter S_utf16_textfilter
+#define add_utf16_textfilter S_add_utf16_textfilter
+#endif
+#endif
+#ifdef PERL_CORE
+#define checkcomma S_checkcomma
+#define feature_is_enabled S_feature_is_enabled
+#define force_ident S_force_ident
+#define incline S_incline
+#define intuit_method S_intuit_method
+#define intuit_more S_intuit_more
+#define lop S_lop
+#define missingterm S_missingterm
+#define no_op S_no_op
+#define sublex_done S_sublex_done
+#define sublex_push S_sublex_push
+#define sublex_start S_sublex_start
+#define filter_gets S_filter_gets
+#define find_in_my_stash S_find_in_my_stash
+#define tokenize_use S_tokenize_use
+#endif
+#ifdef PERL_CORE
+#define deprecate_commaless_var_list S_deprecate_commaless_var_list
+#define ao S_ao
+#endif
+# if defined(PERL_CR_FILTER)
+#ifdef PERL_CORE
+#define cr_textfilter S_cr_textfilter
+#define strip_return S_strip_return
+#endif
+# endif
+# if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define tokereport S_tokereport
+#define printbuf S_printbuf
+#endif
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define isa_lookup S_isa_lookup
+#endif
+#endif
+#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+#if defined(USE_LOCALE_NUMERIC) || defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define stdize_locale S_stdize_locale
+#endif
+#endif
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define closest_cop S_closest_cop
+#define mess_alloc S_mess_alloc
+#define vdie_croak_common S_vdie_croak_common
+#define vdie_common S_vdie_common
+#define write_no_mem S_write_no_mem
+#endif
+#if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+#ifdef PERL_CORE
+#define mem_log_common S_mem_log_common
+#endif
+#endif
+#endif
+#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define mulexp10 S_mulexp10
+#endif
+#endif
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define is_utf8_char_slow S_is_utf8_char_slow
+#define is_utf8_common S_is_utf8_common
+#define swash_get S_swash_get
+#endif
+#endif
+#define sv_setsv_flags Perl_sv_setsv_flags
+#define sv_catpvn_flags Perl_sv_catpvn_flags
+#define sv_catsv_flags Perl_sv_catsv_flags
+#define sv_utf8_upgrade_flags_grow Perl_sv_utf8_upgrade_flags_grow
+#define sv_pvn_force_flags Perl_sv_pvn_force_flags
+#define sv_copypv Perl_sv_copypv
+#define my_atof2 Perl_my_atof2
+#define my_socketpair Perl_my_socketpair
+#define my_dirfd Perl_my_dirfd
+#ifdef PERL_OLD_COPY_ON_WRITE
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define sv_setsv_cow Perl_sv_setsv_cow
+#endif
+#endif
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
+#define PerlIO_close Perl_PerlIO_close
+#define PerlIO_fill Perl_PerlIO_fill
+#define PerlIO_fileno Perl_PerlIO_fileno
+#define PerlIO_eof Perl_PerlIO_eof
+#define PerlIO_error Perl_PerlIO_error
+#define PerlIO_flush Perl_PerlIO_flush
+#define PerlIO_clearerr Perl_PerlIO_clearerr
+#define PerlIO_set_cnt Perl_PerlIO_set_cnt
+#define PerlIO_set_ptrcnt Perl_PerlIO_set_ptrcnt
+#define PerlIO_setlinebuf Perl_PerlIO_setlinebuf
+#define PerlIO_read Perl_PerlIO_read
+#define PerlIO_write Perl_PerlIO_write
+#define PerlIO_unread Perl_PerlIO_unread
+#define PerlIO_tell Perl_PerlIO_tell
+#define PerlIO_seek Perl_PerlIO_seek
+#define PerlIO_get_base Perl_PerlIO_get_base
+#define PerlIO_get_ptr Perl_PerlIO_get_ptr
+#define PerlIO_get_bufsiz Perl_PerlIO_get_bufsiz
+#define PerlIO_get_cnt Perl_PerlIO_get_cnt
+#define PerlIO_stdin Perl_PerlIO_stdin
+#define PerlIO_stdout Perl_PerlIO_stdout
+#define PerlIO_stderr Perl_PerlIO_stderr
+#endif /* PERLIO_LAYERS */
+#ifdef PERL_CORE
+#define deb_stack_all Perl_deb_stack_all
+#endif
+#if defined(PERL_IN_DEB_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define deb_stack_n S_deb_stack_n
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_new Perl_pad_new
+#define pad_undef Perl_pad_undef
+#define pad_add_name Perl_pad_add_name
+#define pad_add_anon Perl_pad_add_anon
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_check_dup S_pad_check_dup
+#endif
+#endif
+#ifdef DEBUGGING
+#ifdef PERL_CORE
+#define pad_setsv Perl_pad_setsv
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_block_start Perl_pad_block_start
+#define pad_tidy Perl_pad_tidy
+#define do_dump_pad Perl_do_dump_pad
+#define pad_fixup_inner_anons Perl_pad_fixup_inner_anons
+#endif
+#ifdef PERL_CORE
+#define pad_push Perl_pad_push
+#define pad_compname_type Perl_pad_compname_type
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_findlex S_pad_findlex
+#define pad_add_name_sv S_pad_add_name_sv
+#endif
+# if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define cv_dump S_cv_dump
+#endif
+# endif
+#endif
+#define find_runcv Perl_find_runcv
+#ifdef PERL_CORE
+#define free_tied_hv_pool Perl_free_tied_hv_pool
+#endif
+#if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define get_debug_opts Perl_get_debug_opts
+#endif
+#endif
+#define save_set_svflags Perl_save_set_svflags
+#ifdef DEBUGGING
+#endif
+#define hv_scalar Perl_hv_scalar
+#define hv_name_set Perl_hv_name_set
+#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#endif
+#define hv_clear_placeholders Perl_hv_clear_placeholders
+#ifdef PERL_CORE
+#define magic_scalarpack Perl_magic_scalarpack
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define find_hash_subscript S_find_hash_subscript
+#define find_array_subscript S_find_array_subscript
+#define find_uninit_var S_find_uninit_var
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE16
+#ifdef PERL_CORE
+#define my_htole16 Perl_my_htole16
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH16
+#ifdef PERL_CORE
+#define my_letoh16 Perl_my_letoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE16
+#ifdef PERL_CORE
+#define my_htobe16 Perl_my_htobe16
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH16
+#ifdef PERL_CORE
+#define my_betoh16 Perl_my_betoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE32
+#ifdef PERL_CORE
+#define my_htole32 Perl_my_htole32
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH32
+#ifdef PERL_CORE
+#define my_letoh32 Perl_my_letoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE32
+#ifdef PERL_CORE
+#define my_htobe32 Perl_my_htobe32
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH32
+#ifdef PERL_CORE
+#define my_betoh32 Perl_my_betoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE64
+#ifdef PERL_CORE
+#define my_htole64 Perl_my_htole64
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH64
+#ifdef PERL_CORE
+#define my_letoh64 Perl_my_letoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE64
+#ifdef PERL_CORE
+#define my_htobe64 Perl_my_htobe64
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH64
+#ifdef PERL_CORE
+#define my_betoh64 Perl_my_betoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLES
+#ifdef PERL_CORE
+#define my_htoles Perl_my_htoles
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHS
+#ifdef PERL_CORE
+#define my_letohs Perl_my_letohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBES
+#ifdef PERL_CORE
+#define my_htobes Perl_my_htobes
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHS
+#ifdef PERL_CORE
+#define my_betohs Perl_my_betohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEI
+#ifdef PERL_CORE
+#define my_htolei Perl_my_htolei
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHI
+#ifdef PERL_CORE
+#define my_letohi Perl_my_letohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEI
+#ifdef PERL_CORE
+#define my_htobei Perl_my_htobei
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHI
+#ifdef PERL_CORE
+#define my_betohi Perl_my_betohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEL
+#ifdef PERL_CORE
+#define my_htolel Perl_my_htolel
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHL
+#ifdef PERL_CORE
+#define my_letohl Perl_my_letohl
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEL
+#ifdef PERL_CORE
+#define my_htobel Perl_my_htobel
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHL
+#ifdef PERL_CORE
+#define my_betohl Perl_my_betohl
+#endif
+#endif
+#ifdef PERL_CORE
+#define my_swabn Perl_my_swabn
+#endif
+#define gv_fetchpvn_flags Perl_gv_fetchpvn_flags
+#define gv_fetchsv Perl_gv_fetchsv
+#ifdef PERL_CORE
+#define is_gv_magical_sv Perl_is_gv_magical_sv
+#endif
+#define stashpv_hvname_match Perl_stashpv_hvname_match
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+#ifdef PERL_CORE
+#define dump_sv_child Perl_dump_sv_child
+#endif
+#endif
+#ifdef PERL_DONT_CREATE_GVSV
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define ckwarn_common S_ckwarn_common
+#endif
+#endif
+#ifdef PERL_CORE
+#define offer_nice_chunk Perl_offer_nice_chunk
+#endif
+#ifndef SPRINTF_RETURNS_STRLEN
+#endif
+#ifdef PERL_CORE
+#define my_clearenv Perl_my_clearenv
+#endif
+#ifdef PERL_IMPLICIT_CONTEXT
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+#else
+#endif
+#endif
+#ifndef HAS_STRLCAT
+#endif
+#ifndef HAS_STRLCPY
+#endif
+#ifdef PERL_MAD
+#ifdef PERL_CORE
+#define pad_peg Perl_pad_peg
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define xmldump_attr S_xmldump_attr
+#endif
+#endif
+#ifdef PERL_CORE
+#define xmldump_indent Perl_xmldump_indent
+#define xmldump_vindent Perl_xmldump_vindent
+#define xmldump_all Perl_xmldump_all
+#define xmldump_all_perl Perl_xmldump_all_perl
+#define xmldump_packsubs Perl_xmldump_packsubs
+#define xmldump_packsubs_perl Perl_xmldump_packsubs_perl
+#define xmldump_sub Perl_xmldump_sub
+#define xmldump_sub_perl Perl_xmldump_sub_perl
+#define xmldump_form Perl_xmldump_form
+#define xmldump_eval Perl_xmldump_eval
+#define sv_catxmlsv Perl_sv_catxmlsv
+#define sv_catxmlpvn Perl_sv_catxmlpvn
+#define sv_xmlpeek Perl_sv_xmlpeek
+#define do_pmop_xmldump Perl_do_pmop_xmldump
+#define pmop_xmldump Perl_pmop_xmldump
+#define do_op_xmldump Perl_do_op_xmldump
+#define op_xmldump Perl_op_xmldump
+#endif
+#ifdef PERL_CORE
+#define newTOKEN Perl_newTOKEN
+#define token_free Perl_token_free
+#define token_getmad Perl_token_getmad
+#define op_getmad_weak Perl_op_getmad_weak
+#define op_getmad Perl_op_getmad
+#define prepend_madprops Perl_prepend_madprops
+#define append_madprops Perl_append_madprops
+#define addmad Perl_addmad
+#define newMADsv Perl_newMADsv
+#define newMADPROP Perl_newMADPROP
+#define mad_free Perl_mad_free
+#endif
+# if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define skipspace0 S_skipspace0
+#define skipspace1 S_skipspace1
+#define skipspace2 S_skipspace2
+#define start_force S_start_force
+#define curmad S_curmad
+#endif
+# endif
+#ifdef PERL_CORE
+#define madlex Perl_madlex
+#define madparse Perl_madparse
+#endif
+#endif
+#if !defined(HAS_SIGNBIT)
+#endif
+#if defined(USE_ITHREADS)
+#ifdef PERL_CORE
+#define mro_meta_dup Perl_mro_meta_dup
+#endif
+#endif
+#define mro_get_linear_isa Perl_mro_get_linear_isa
+#if defined(PERL_IN_MRO_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define mro_get_linear_isa_dfs S_mro_get_linear_isa_dfs
+#endif
+#endif
+#ifdef PERL_CORE
+#define mro_isa_changed_in Perl_mro_isa_changed_in
+#endif
+#define mro_method_changed_in Perl_mro_method_changed_in
+#ifdef PERL_CORE
+#define boot_core_mro Perl_boot_core_mro
+#endif
+#define ck_anoncode Perl_ck_anoncode
+#define ck_bitop Perl_ck_bitop
+#define ck_chdir Perl_ck_chdir
+#define ck_concat Perl_ck_concat
+#define ck_defined Perl_ck_defined
+#define ck_delete Perl_ck_delete
+#define ck_die Perl_ck_die
+#define ck_each Perl_ck_each
+#define ck_eof Perl_ck_eof
+#define ck_eval Perl_ck_eval
+#define ck_exec Perl_ck_exec
+#define ck_exists Perl_ck_exists
+#define ck_exit Perl_ck_exit
+#define ck_ftst Perl_ck_ftst
+#define ck_fun Perl_ck_fun
+#define ck_glob Perl_ck_glob
+#define ck_grep Perl_ck_grep
+#define ck_index Perl_ck_index
+#define ck_join Perl_ck_join
+#define ck_lfun Perl_ck_lfun
+#define ck_listiob Perl_ck_listiob
+#define ck_match Perl_ck_match
+#define ck_method Perl_ck_method
+#define ck_null Perl_ck_null
+#define ck_open Perl_ck_open
+#define ck_readline Perl_ck_readline
+#define ck_repeat Perl_ck_repeat
+#define ck_require Perl_ck_require
+#define ck_return Perl_ck_return
+#define ck_rfun Perl_ck_rfun
+#define ck_rvconst Perl_ck_rvconst
+#define ck_sassign Perl_ck_sassign
+#define ck_select Perl_ck_select
+#define ck_shift Perl_ck_shift
+#define ck_smartmatch Perl_ck_smartmatch
+#define ck_sort Perl_ck_sort
+#define ck_spair Perl_ck_spair
+#define ck_split Perl_ck_split
+#define ck_subr Perl_ck_subr
+#define ck_substr Perl_ck_substr
+#define ck_svconst Perl_ck_svconst
+#define ck_trunc Perl_ck_trunc
+#define ck_unpack Perl_ck_unpack
+#define pp_aassign Perl_pp_aassign
+#define pp_abs Perl_pp_abs
+#define pp_accept Perl_pp_accept
+#define pp_add Perl_pp_add
+#define pp_aeach Perl_pp_aeach
+#define pp_aelem Perl_pp_aelem
+#define pp_aelemfast Perl_pp_aelemfast
+#define pp_akeys Perl_pp_akeys
+#define pp_alarm Perl_pp_alarm
+#define pp_and Perl_pp_and
+#define pp_andassign Perl_pp_andassign
+#define pp_anoncode Perl_pp_anoncode
+#define pp_anonhash Perl_pp_anonhash
+#define pp_anonlist Perl_pp_anonlist
+#define pp_aslice Perl_pp_aslice
+#define pp_atan2 Perl_pp_atan2
+#define pp_av2arylen Perl_pp_av2arylen
+#define pp_avalues Perl_pp_avalues
+#define pp_backtick Perl_pp_backtick
+#define pp_bind Perl_pp_bind
+#define pp_binmode Perl_pp_binmode
+#define pp_bit_and Perl_pp_bit_and
+#define pp_bit_or Perl_pp_bit_or
+#define pp_bit_xor Perl_pp_bit_xor
+#define pp_bless Perl_pp_bless
+#define pp_boolkeys Perl_pp_boolkeys
+#define pp_break Perl_pp_break
+#define pp_caller Perl_pp_caller
+#define pp_chdir Perl_pp_chdir
+#define pp_chmod Perl_pp_chmod
+#define pp_chomp Perl_pp_chomp
+#define pp_chop Perl_pp_chop
+#define pp_chown Perl_pp_chown
+#define pp_chr Perl_pp_chr
+#define pp_chroot Perl_pp_chroot
+#define pp_close Perl_pp_close
+#define pp_closedir Perl_pp_closedir
+#define pp_complement Perl_pp_complement
+#define pp_concat Perl_pp_concat
+#define pp_cond_expr Perl_pp_cond_expr
+#define pp_connect Perl_pp_connect
+#define pp_const Perl_pp_const
+#define pp_continue Perl_pp_continue
+#define pp_cos Perl_pp_cos
+#define pp_crypt Perl_pp_crypt
+#define pp_dbmclose Perl_pp_dbmclose
+#define pp_dbmopen Perl_pp_dbmopen
+#define pp_dbstate Perl_pp_dbstate
+#define pp_defined Perl_pp_defined
+#define pp_delete Perl_pp_delete
+#define pp_die Perl_pp_die
+#define pp_divide Perl_pp_divide
+#define pp_dofile Perl_pp_dofile
+#define pp_dor Perl_pp_dor
+#define pp_dorassign Perl_pp_dorassign
+#define pp_dump Perl_pp_dump
+#define pp_each Perl_pp_each
+#define pp_egrent Perl_pp_egrent
+#define pp_ehostent Perl_pp_ehostent
+#define pp_enetent Perl_pp_enetent
+#define pp_enter Perl_pp_enter
+#define pp_entereval Perl_pp_entereval
+#define pp_entergiven Perl_pp_entergiven
+#define pp_enteriter Perl_pp_enteriter
+#define pp_enterloop Perl_pp_enterloop
+#define pp_entersub Perl_pp_entersub
+#define pp_entertry Perl_pp_entertry
+#define pp_enterwhen Perl_pp_enterwhen
+#define pp_enterwrite Perl_pp_enterwrite
+#define pp_eof Perl_pp_eof
+#define pp_eprotoent Perl_pp_eprotoent
+#define pp_epwent Perl_pp_epwent
+#define pp_eq Perl_pp_eq
+#define pp_eservent Perl_pp_eservent
+#define pp_exec Perl_pp_exec
+#define pp_exists Perl_pp_exists
+#define pp_exit Perl_pp_exit
+#define pp_exp Perl_pp_exp
+#define pp_fcntl Perl_pp_fcntl
+#define pp_fileno Perl_pp_fileno
+#define pp_flip Perl_pp_flip
+#define pp_flock Perl_pp_flock
+#define pp_flop Perl_pp_flop
+#define pp_fork Perl_pp_fork
+#define pp_formline Perl_pp_formline
+#define pp_ftatime Perl_pp_ftatime
+#define pp_ftbinary Perl_pp_ftbinary
+#define pp_ftblk Perl_pp_ftblk
+#define pp_ftchr Perl_pp_ftchr
+#define pp_ftctime Perl_pp_ftctime
+#define pp_ftdir Perl_pp_ftdir
+#define pp_fteexec Perl_pp_fteexec
+#define pp_fteowned Perl_pp_fteowned
+#define pp_fteread Perl_pp_fteread
+#define pp_ftewrite Perl_pp_ftewrite
+#define pp_ftfile Perl_pp_ftfile
+#define pp_ftis Perl_pp_ftis
+#define pp_ftlink Perl_pp_ftlink
+#define pp_ftmtime Perl_pp_ftmtime
+#define pp_ftpipe Perl_pp_ftpipe
+#define pp_ftrexec Perl_pp_ftrexec
+#define pp_ftrowned Perl_pp_ftrowned
+#define pp_ftrread Perl_pp_ftrread
+#define pp_ftrwrite Perl_pp_ftrwrite
+#define pp_ftsgid Perl_pp_ftsgid
+#define pp_ftsize Perl_pp_ftsize
+#define pp_ftsock Perl_pp_ftsock
+#define pp_ftsuid Perl_pp_ftsuid
+#define pp_ftsvtx Perl_pp_ftsvtx
+#define pp_fttext Perl_pp_fttext
+#define pp_fttty Perl_pp_fttty
+#define pp_ftzero Perl_pp_ftzero
+#define pp_ge Perl_pp_ge
+#define pp_gelem Perl_pp_gelem
+#define pp_getc Perl_pp_getc
+#define pp_getlogin Perl_pp_getlogin
+#define pp_getpeername Perl_pp_getpeername
+#define pp_getpgrp Perl_pp_getpgrp
+#define pp_getppid Perl_pp_getppid
+#define pp_getpriority Perl_pp_getpriority
+#define pp_getsockname Perl_pp_getsockname
+#define pp_ggrent Perl_pp_ggrent
+#define pp_ggrgid Perl_pp_ggrgid
+#define pp_ggrnam Perl_pp_ggrnam
+#define pp_ghbyaddr Perl_pp_ghbyaddr
+#define pp_ghbyname Perl_pp_ghbyname
+#define pp_ghostent Perl_pp_ghostent
+#define pp_glob Perl_pp_glob
+#define pp_gmtime Perl_pp_gmtime
+#define pp_gnbyaddr Perl_pp_gnbyaddr
+#define pp_gnbyname Perl_pp_gnbyname
+#define pp_gnetent Perl_pp_gnetent
+#define pp_goto Perl_pp_goto
+#define pp_gpbyname Perl_pp_gpbyname
+#define pp_gpbynumber Perl_pp_gpbynumber
+#define pp_gprotoent Perl_pp_gprotoent
+#define pp_gpwent Perl_pp_gpwent
+#define pp_gpwnam Perl_pp_gpwnam
+#define pp_gpwuid Perl_pp_gpwuid
+#define pp_grepstart Perl_pp_grepstart
+#define pp_grepwhile Perl_pp_grepwhile
+#define pp_gsbyname Perl_pp_gsbyname
+#define pp_gsbyport Perl_pp_gsbyport
+#define pp_gservent Perl_pp_gservent
+#define pp_gsockopt Perl_pp_gsockopt
+#define pp_gt Perl_pp_gt
+#define pp_gv Perl_pp_gv
+#define pp_gvsv Perl_pp_gvsv
+#define pp_helem Perl_pp_helem
+#define pp_hex Perl_pp_hex
+#define pp_hintseval Perl_pp_hintseval
+#define pp_hslice Perl_pp_hslice
+#define pp_i_add Perl_pp_i_add
+#define pp_i_divide Perl_pp_i_divide
+#define pp_i_eq Perl_pp_i_eq
+#define pp_i_ge Perl_pp_i_ge
+#define pp_i_gt Perl_pp_i_gt
+#define pp_i_le Perl_pp_i_le
+#define pp_i_lt Perl_pp_i_lt
+#define pp_i_modulo Perl_pp_i_modulo
+#define pp_i_multiply Perl_pp_i_multiply
+#define pp_i_ncmp Perl_pp_i_ncmp
+#define pp_i_ne Perl_pp_i_ne
+#define pp_i_negate Perl_pp_i_negate
+#define pp_i_subtract Perl_pp_i_subtract
+#define pp_index Perl_pp_index
+#define pp_int Perl_pp_int
+#define pp_ioctl Perl_pp_ioctl
+#define pp_iter Perl_pp_iter
+#define pp_join Perl_pp_join
+#define pp_keys Perl_pp_keys
+#define pp_kill Perl_pp_kill
+#define pp_last Perl_pp_last
+#define pp_lc Perl_pp_lc
+#define pp_lcfirst Perl_pp_lcfirst
+#define pp_le Perl_pp_le
+#define pp_leave Perl_pp_leave
+#define pp_leaveeval Perl_pp_leaveeval
+#define pp_leavegiven Perl_pp_leavegiven
+#define pp_leaveloop Perl_pp_leaveloop
+#define pp_leavesub Perl_pp_leavesub
+#define pp_leavesublv Perl_pp_leavesublv
+#define pp_leavetry Perl_pp_leavetry
+#define pp_leavewhen Perl_pp_leavewhen
+#define pp_leavewrite Perl_pp_leavewrite
+#define pp_left_shift Perl_pp_left_shift
+#define pp_length Perl_pp_length
+#define pp_lineseq Perl_pp_lineseq
+#define pp_link Perl_pp_link
+#define pp_list Perl_pp_list
+#define pp_listen Perl_pp_listen
+#define pp_localtime Perl_pp_localtime
+#define pp_lock Perl_pp_lock
+#define pp_log Perl_pp_log
+#define pp_lslice Perl_pp_lslice
+#define pp_lstat Perl_pp_lstat
+#define pp_lt Perl_pp_lt
+#define pp_mapstart Perl_pp_mapstart
+#define pp_mapwhile Perl_pp_mapwhile
+#define pp_match Perl_pp_match
+#define pp_method Perl_pp_method
+#define pp_method_named Perl_pp_method_named
+#define pp_mkdir Perl_pp_mkdir
+#define pp_modulo Perl_pp_modulo
+#define pp_msgctl Perl_pp_msgctl
+#define pp_msgget Perl_pp_msgget
+#define pp_msgrcv Perl_pp_msgrcv
+#define pp_msgsnd Perl_pp_msgsnd
+#define pp_multiply Perl_pp_multiply
+#define pp_ncmp Perl_pp_ncmp
+#define pp_ne Perl_pp_ne
+#define pp_negate Perl_pp_negate
+#define pp_next Perl_pp_next
+#define pp_nextstate Perl_pp_nextstate
+#define pp_not Perl_pp_not
+#define pp_null Perl_pp_null
+#define pp_oct Perl_pp_oct
+#define pp_once Perl_pp_once
+#define pp_open Perl_pp_open
+#define pp_open_dir Perl_pp_open_dir
+#define pp_or Perl_pp_or
+#define pp_orassign Perl_pp_orassign
+#define pp_ord Perl_pp_ord
+#define pp_pack Perl_pp_pack
+#define pp_padany Perl_pp_padany
+#define pp_padav Perl_pp_padav
+#define pp_padhv Perl_pp_padhv
+#define pp_padsv Perl_pp_padsv
+#define pp_pipe_op Perl_pp_pipe_op
+#define pp_pop Perl_pp_pop
+#define pp_pos Perl_pp_pos
+#define pp_postdec Perl_pp_postdec
+#define pp_postinc Perl_pp_postinc
+#define pp_pow Perl_pp_pow
+#define pp_predec Perl_pp_predec
+#define pp_preinc Perl_pp_preinc
+#define pp_print Perl_pp_print
+#define pp_prototype Perl_pp_prototype
+#define pp_prtf Perl_pp_prtf
+#define pp_push Perl_pp_push
+#define pp_pushmark Perl_pp_pushmark
+#define pp_pushre Perl_pp_pushre
+#define pp_qr Perl_pp_qr
+#define pp_quotemeta Perl_pp_quotemeta
+#define pp_rand Perl_pp_rand
+#define pp_range Perl_pp_range
+#define pp_rcatline Perl_pp_rcatline
+#define pp_read Perl_pp_read
+#define pp_readdir Perl_pp_readdir
+#define pp_readline Perl_pp_readline
+#define pp_readlink Perl_pp_readlink
+#define pp_recv Perl_pp_recv
+#define pp_redo Perl_pp_redo
+#define pp_ref Perl_pp_ref
+#define pp_refgen Perl_pp_refgen
+#define pp_regcmaybe Perl_pp_regcmaybe
+#define pp_regcomp Perl_pp_regcomp
+#define pp_regcreset Perl_pp_regcreset
+#define pp_rename Perl_pp_rename
+#define pp_repeat Perl_pp_repeat
+#define pp_require Perl_pp_require
+#define pp_reset Perl_pp_reset
+#define pp_return Perl_pp_return
+#define pp_reverse Perl_pp_reverse
+#define pp_rewinddir Perl_pp_rewinddir
+#define pp_right_shift Perl_pp_right_shift
+#define pp_rindex Perl_pp_rindex
+#define pp_rmdir Perl_pp_rmdir
+#define pp_rv2av Perl_pp_rv2av
+#define pp_rv2cv Perl_pp_rv2cv
+#define pp_rv2gv Perl_pp_rv2gv
+#define pp_rv2hv Perl_pp_rv2hv
+#define pp_rv2sv Perl_pp_rv2sv
+#define pp_sassign Perl_pp_sassign
+#define pp_say Perl_pp_say
+#define pp_scalar Perl_pp_scalar
+#define pp_schomp Perl_pp_schomp
+#define pp_schop Perl_pp_schop
+#define pp_scmp Perl_pp_scmp
+#define pp_scope Perl_pp_scope
+#define pp_seek Perl_pp_seek
+#define pp_seekdir Perl_pp_seekdir
+#define pp_select Perl_pp_select
+#define pp_semctl Perl_pp_semctl
+#define pp_semget Perl_pp_semget
+#define pp_semop Perl_pp_semop
+#define pp_send Perl_pp_send
+#define pp_seq Perl_pp_seq
+#define pp_setpgrp Perl_pp_setpgrp
+#define pp_setpriority Perl_pp_setpriority
+#define pp_sge Perl_pp_sge
+#define pp_sgrent Perl_pp_sgrent
+#define pp_sgt Perl_pp_sgt
+#define pp_shift Perl_pp_shift
+#define pp_shmctl Perl_pp_shmctl
+#define pp_shmget Perl_pp_shmget
+#define pp_shmread Perl_pp_shmread
+#define pp_shmwrite Perl_pp_shmwrite
+#define pp_shostent Perl_pp_shostent
+#define pp_shutdown Perl_pp_shutdown
+#define pp_sin Perl_pp_sin
+#define pp_sle Perl_pp_sle
+#define pp_sleep Perl_pp_sleep
+#define pp_slt Perl_pp_slt
+#define pp_smartmatch Perl_pp_smartmatch
+#define pp_sne Perl_pp_sne
+#define pp_snetent Perl_pp_snetent
+#define pp_socket Perl_pp_socket
+#define pp_sockpair Perl_pp_sockpair
+#define pp_sort Perl_pp_sort
+#define pp_splice Perl_pp_splice
+#define pp_split Perl_pp_split
+#define pp_sprintf Perl_pp_sprintf
+#define pp_sprotoent Perl_pp_sprotoent
+#define pp_spwent Perl_pp_spwent
+#define pp_sqrt Perl_pp_sqrt
+#define pp_srand Perl_pp_srand
+#define pp_srefgen Perl_pp_srefgen
+#define pp_sselect Perl_pp_sselect
+#define pp_sservent Perl_pp_sservent
+#define pp_ssockopt Perl_pp_ssockopt
+#define pp_stat Perl_pp_stat
+#define pp_stringify Perl_pp_stringify
+#define pp_stub Perl_pp_stub
+#define pp_study Perl_pp_study
+#define pp_subst Perl_pp_subst
+#define pp_substcont Perl_pp_substcont
+#define pp_substr Perl_pp_substr
+#define pp_subtract Perl_pp_subtract
+#define pp_symlink Perl_pp_symlink
+#define pp_syscall Perl_pp_syscall
+#define pp_sysopen Perl_pp_sysopen
+#define pp_sysread Perl_pp_sysread
+#define pp_sysseek Perl_pp_sysseek
+#define pp_system Perl_pp_system
+#define pp_syswrite Perl_pp_syswrite
+#define pp_tell Perl_pp_tell
+#define pp_telldir Perl_pp_telldir
+#define pp_tie Perl_pp_tie
+#define pp_tied Perl_pp_tied
+#define pp_time Perl_pp_time
+#define pp_tms Perl_pp_tms
+#define pp_trans Perl_pp_trans
+#define pp_truncate Perl_pp_truncate
+#define pp_uc Perl_pp_uc
+#define pp_ucfirst Perl_pp_ucfirst
+#define pp_umask Perl_pp_umask
+#define pp_undef Perl_pp_undef
+#define pp_unlink Perl_pp_unlink
+#define pp_unpack Perl_pp_unpack
+#define pp_unshift Perl_pp_unshift
+#define pp_unstack Perl_pp_unstack
+#define pp_untie Perl_pp_untie
+#define pp_utime Perl_pp_utime
+#define pp_values Perl_pp_values
+#define pp_vec Perl_pp_vec
+#define pp_wait Perl_pp_wait
+#define pp_waitpid Perl_pp_waitpid
+#define pp_wantarray Perl_pp_wantarray
+#define pp_warn Perl_pp_warn
+#define pp_xor Perl_pp_xor
+
+#else /* PERL_IMPLICIT_CONTEXT */
+
+#if defined(PERL_IMPLICIT_SYS)
+#endif
+#define doing_taint Perl_doing_taint
+#if defined(USE_ITHREADS)
+# if defined(PERL_IMPLICIT_SYS)
+# endif
+#endif
+#if defined(MYMALLOC)
+#ifdef PERL_CORE
+#define malloced_size Perl_malloced_size
+#define malloc_good_size Perl_malloc_good_size
+#endif
+#endif
+#define get_context Perl_get_context
+#define set_context Perl_set_context
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regcurly Perl_regcurly
+#endif
+#define amagic_call(a,b,c,d) Perl_amagic_call(aTHX_ a,b,c,d)
+#define Gv_AMupdate(a,b) Perl_Gv_AMupdate(aTHX_ a,b)
+#define gv_handler(a,b) Perl_gv_handler(aTHX_ a,b)
+#ifdef PERL_CORE
+#define append_elem(a,b,c) Perl_append_elem(aTHX_ a,b,c)
+#define append_list(a,b,c) Perl_append_list(aTHX_ a,b,c)
+#define apply(a,b,c) Perl_apply(aTHX_ a,b,c)
+#endif
+#define apply_attrs_string(a,b,c,d) Perl_apply_attrs_string(aTHX_ a,b,c,d)
+#define av_clear(a) Perl_av_clear(aTHX_ a)
+#define av_delete(a,b,c) Perl_av_delete(aTHX_ a,b,c)
+#define av_exists(a,b) Perl_av_exists(aTHX_ a,b)
+#define av_extend(a,b) Perl_av_extend(aTHX_ a,b)
+#define av_fetch(a,b,c) Perl_av_fetch(aTHX_ a,b,c)
+#define av_fill(a,b) Perl_av_fill(aTHX_ a,b)
+#define av_len(a) Perl_av_len(aTHX_ a)
+#define av_make(a,b) Perl_av_make(aTHX_ a,b)
+#define av_pop(a) Perl_av_pop(aTHX_ a)
+#define av_push(a,b) Perl_av_push(aTHX_ a,b)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define av_reify(a) Perl_av_reify(aTHX_ a)
+#endif
+#define av_shift(a) Perl_av_shift(aTHX_ a)
+#define av_store(a,b,c) Perl_av_store(aTHX_ a,b,c)
+#define av_undef(a) Perl_av_undef(aTHX_ a)
+#define av_unshift(a,b) Perl_av_unshift(aTHX_ a,b)
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define get_aux_mg(a) S_get_aux_mg(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define bind_match(a,b,c) Perl_bind_match(aTHX_ a,b,c)
+#define block_end(a,b) Perl_block_end(aTHX_ a,b)
+#endif
+#define block_gimme() Perl_block_gimme(aTHX)
+#ifdef PERL_CORE
+#define block_start(a) Perl_block_start(aTHX_ a)
+#define boot_core_UNIVERSAL() Perl_boot_core_UNIVERSAL(aTHX)
+#define boot_core_PerlIO() Perl_boot_core_PerlIO(aTHX)
+#endif
+#define call_list(a,b) Perl_call_list(aTHX_ a,b)
+#ifdef PERL_CORE
+#define cando(a,b,c) Perl_cando(aTHX_ a,b,c)
+#endif
+#define cast_ulong(a) Perl_cast_ulong(aTHX_ a)
+#define cast_i32(a) Perl_cast_i32(aTHX_ a)
+#define cast_iv(a) Perl_cast_iv(aTHX_ a)
+#define cast_uv(a) Perl_cast_uv(aTHX_ a)
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+#define my_chsize(a,b) Perl_my_chsize(aTHX_ a,b)
+#endif
+#ifdef PERL_CORE
+#define convert(a,b,c) Perl_convert(aTHX_ a,b,c)
+#define create_eval_scope(a) Perl_create_eval_scope(aTHX_ a)
+#endif
+#define vcroak(a,b) Perl_vcroak(aTHX_ a,b)
+#define croak_xs_usage(a,b) Perl_croak_xs_usage(aTHX_ a,b)
+#if defined(PERL_IMPLICIT_CONTEXT)
+#endif
+#ifdef PERL_CORE
+#define cv_ckproto_len(a,b,c,d) Perl_cv_ckproto_len(aTHX_ a,b,c,d)
+#define cv_clone(a) Perl_cv_clone(aTHX_ a)
+#endif
+#define gv_const_sv(a) Perl_gv_const_sv(aTHX_ a)
+#define cv_const_sv(a) Perl_cv_const_sv(aTHX_ a)
+#ifdef PERL_CORE
+#define op_const_sv(a,b) Perl_op_const_sv(aTHX_ a,b)
+#endif
+#define cv_undef(a) Perl_cv_undef(aTHX_ a)
+#define cx_dump(a) Perl_cx_dump(aTHX_ a)
+#define filter_add(a,b) Perl_filter_add(aTHX_ a,b)
+#define filter_del(a) Perl_filter_del(aTHX_ a)
+#define filter_read(a,b,c) Perl_filter_read(aTHX_ a,b,c)
+#define get_op_descs() Perl_get_op_descs(aTHX)
+#define get_op_names() Perl_get_op_names(aTHX)
+#ifdef PERL_CORE
+#define get_no_modify() Perl_get_no_modify(aTHX)
+#define get_opargs() Perl_get_opargs(aTHX)
+#endif
+#define get_ppaddr() Perl_get_ppaddr(aTHX)
+#define cxinc() Perl_cxinc(aTHX)
+#define vdeb(a,b) Perl_vdeb(aTHX_ a,b)
+#define debprofdump() Perl_debprofdump(aTHX)
+#define debop(a) Perl_debop(aTHX_ a)
+#define debstack() Perl_debstack(aTHX)
+#define debstackptrs() Perl_debstackptrs(aTHX)
+#define delimcpy Perl_delimcpy
+#ifdef PERL_CORE
+#define delete_eval_scope() Perl_delete_eval_scope(aTHX)
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define vdie(a,b) S_vdie(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define die_where(a) Perl_die_where(aTHX_ a)
+#endif
+#define dounwind(a) Perl_dounwind(aTHX_ a)
+#ifdef PERL_CORE
+#define do_aexec5(a,b,c,d,e) Perl_do_aexec5(aTHX_ a,b,c,d,e)
+#endif
+#define do_binmode(a,b,c) Perl_do_binmode(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define do_chop(a,b) Perl_do_chop(aTHX_ a,b)
+#endif
+#define do_close(a,b) Perl_do_close(aTHX_ a,b)
+#ifdef PERL_CORE
+#define do_eof(a) Perl_do_eof(aTHX_ a)
+#endif
+#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
+#ifdef PERL_CORE
+#endif
+#else
+#ifdef PERL_CORE
+#define do_exec(a) Perl_do_exec(aTHX_ a)
+#endif
+#endif
+#if defined(WIN32) || defined(__SYMBIAN32__) || defined(VMS)
+#define do_aspawn(a,b,c) Perl_do_aspawn(aTHX_ a,b,c)
+#define do_spawn(a) Perl_do_spawn(aTHX_ a)
+#define do_spawn_nowait(a) Perl_do_spawn_nowait(aTHX_ a)
+#endif
+#if !defined(WIN32)
+#ifdef PERL_CORE
+#define do_exec3(a,b,c) Perl_do_exec3(aTHX_ a,b,c)
+#endif
+#endif
+#ifdef PERL_CORE
+#define do_execfree() Perl_do_execfree(aTHX)
+#endif
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define exec_failed(a,b,c) S_exec_failed(aTHX_ a,b,c)
+#endif
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+#ifdef PERL_CORE
+#define do_ipcctl(a,b,c) Perl_do_ipcctl(aTHX_ a,b,c)
+#define do_ipcget(a,b,c) Perl_do_ipcget(aTHX_ a,b,c)
+#define do_msgrcv(a,b) Perl_do_msgrcv(aTHX_ a,b)
+#define do_msgsnd(a,b) Perl_do_msgsnd(aTHX_ a,b)
+#define do_semop(a,b) Perl_do_semop(aTHX_ a,b)
+#define do_shmio(a,b,c) Perl_do_shmio(aTHX_ a,b,c)
+#endif
+#endif
+#define do_join(a,b,c,d) Perl_do_join(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define do_kv() Perl_do_kv(aTHX)
+#endif
+#define do_open9(a,b,c,d,e,f,g,h,i) Perl_do_open9(aTHX_ a,b,c,d,e,f,g,h,i)
+#define do_openn(a,b,c,d,e,f,g,h,i) Perl_do_openn(aTHX_ a,b,c,d,e,f,g,h,i)
+#ifdef PERL_CORE
+#define do_print(a,b) Perl_do_print(aTHX_ a,b)
+#define do_readline() Perl_do_readline(aTHX)
+#define do_chomp(a) Perl_do_chomp(aTHX_ a)
+#define do_seek(a,b,c) Perl_do_seek(aTHX_ a,b,c)
+#endif
+#define do_sprintf(a,b,c) Perl_do_sprintf(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define do_sysseek(a,b,c) Perl_do_sysseek(aTHX_ a,b,c)
+#define do_tell(a) Perl_do_tell(aTHX_ a)
+#define do_trans(a) Perl_do_trans(aTHX_ a)
+#define do_vecget(a,b,c) Perl_do_vecget(aTHX_ a,b,c)
+#define do_vecset(a) Perl_do_vecset(aTHX_ a)
+#define do_vop(a,b,c,d) Perl_do_vop(aTHX_ a,b,c,d)
+#define dofile(a,b) Perl_dofile(aTHX_ a,b)
+#endif
+#define dowantarray() Perl_dowantarray(aTHX)
+#define dump_all() Perl_dump_all(aTHX)
+#ifdef PERL_CORE
+#define dump_all_perl(a) Perl_dump_all_perl(aTHX_ a)
+#endif
+#define dump_eval() Perl_dump_eval(aTHX)
+#if defined(DUMP_FDS)
+#define dump_fds(a) Perl_dump_fds(aTHX_ a)
+#endif
+#define dump_form(a) Perl_dump_form(aTHX_ a)
+#define gv_dump(a) Perl_gv_dump(aTHX_ a)
+#define op_dump(a) Perl_op_dump(aTHX_ a)
+#define pmop_dump(a) Perl_pmop_dump(aTHX_ a)
+#define dump_packsubs(a) Perl_dump_packsubs(aTHX_ a)
+#ifdef PERL_CORE
+#define dump_packsubs_perl(a,b) Perl_dump_packsubs_perl(aTHX_ a,b)
+#endif
+#define dump_sub(a) Perl_dump_sub(aTHX_ a)
+#ifdef PERL_CORE
+#define dump_sub_perl(a,b) Perl_dump_sub_perl(aTHX_ a,b)
+#endif
+#define fbm_compile(a,b) Perl_fbm_compile(aTHX_ a,b)
+#define fbm_instr(a,b,c,d) Perl_fbm_instr(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define find_script(a,b,c,d) Perl_find_script(aTHX_ a,b,c,d)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define force_list(a) S_force_list(aTHX_ a)
+#define fold_constants(a) S_fold_constants(aTHX_ a)
+#endif
+#endif
+#define vform(a,b) Perl_vform(aTHX_ a,b)
+#define free_tmps() Perl_free_tmps(aTHX)
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define gen_constant_list(a) S_gen_constant_list(aTHX_ a)
+#endif
+#endif
+#if !defined(HAS_GETENV_LEN)
+#ifdef PERL_CORE
+#define getenv_len(a,b) Perl_getenv_len(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#endif
+#define gp_free(a) Perl_gp_free(aTHX_ a)
+#define gp_ref(a) Perl_gp_ref(aTHX_ a)
+#define gv_add_by_type(a,b) Perl_gv_add_by_type(aTHX_ a,b)
+#define gv_autoload4(a,b,c,d) Perl_gv_autoload4(aTHX_ a,b,c,d)
+#define gv_check(a) Perl_gv_check(aTHX_ a)
+#define gv_efullname(a,b) Perl_gv_efullname(aTHX_ a,b)
+#define gv_efullname4(a,b,c,d) Perl_gv_efullname4(aTHX_ a,b,c,d)
+#define gv_fetchfile(a) Perl_gv_fetchfile(aTHX_ a)
+#define gv_fetchfile_flags(a,b,c) Perl_gv_fetchfile_flags(aTHX_ a,b,c)
+#define gv_fetchmeth(a,b,c,d) Perl_gv_fetchmeth(aTHX_ a,b,c,d)
+#define gv_fetchmeth_autoload(a,b,c,d) Perl_gv_fetchmeth_autoload(aTHX_ a,b,c,d)
+#define gv_fetchmethod_autoload(a,b,c) Perl_gv_fetchmethod_autoload(aTHX_ a,b,c)
+#define gv_fetchmethod_flags(a,b,c) Perl_gv_fetchmethod_flags(aTHX_ a,b,c)
+#define gv_fetchpv(a,b,c) Perl_gv_fetchpv(aTHX_ a,b,c)
+#define gv_fullname(a,b) Perl_gv_fullname(aTHX_ a,b)
+#define gv_fullname4(a,b,c,d) Perl_gv_fullname4(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#endif
+#define gv_init(a,b,c,d,e) Perl_gv_init(aTHX_ a,b,c,d,e)
+#define gv_name_set(a,b,c,d) Perl_gv_name_set(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define gv_try_downgrade(a) Perl_gv_try_downgrade(aTHX_ a)
+#endif
+#define gv_stashpv(a,b) Perl_gv_stashpv(aTHX_ a,b)
+#define gv_stashpvn(a,b,c) Perl_gv_stashpvn(aTHX_ a,b,c)
+#define gv_stashsv(a,b) Perl_gv_stashsv(aTHX_ a,b)
+#define hv_clear(a) Perl_hv_clear(aTHX_ a)
+#ifdef PERL_CORE
+#endif
+#define hv_delayfree_ent(a,b) Perl_hv_delayfree_ent(aTHX_ a,b)
+#define hv_common(a,b,c,d,e,f,g,h) Perl_hv_common(aTHX_ a,b,c,d,e,f,g,h)
+#define hv_common_key_len(a,b,c,d,e,f) Perl_hv_common_key_len(aTHX_ a,b,c,d,e,f)
+#define hv_free_ent(a,b) Perl_hv_free_ent(aTHX_ a,b)
+#define hv_iterinit(a) Perl_hv_iterinit(aTHX_ a)
+#define hv_iterkey(a,b) Perl_hv_iterkey(aTHX_ a,b)
+#define hv_iterkeysv(a) Perl_hv_iterkeysv(aTHX_ a)
+#define hv_iternextsv(a,b,c) Perl_hv_iternextsv(aTHX_ a,b,c)
+#define hv_iternext_flags(a,b) Perl_hv_iternext_flags(aTHX_ a,b)
+#define hv_iterval(a,b) Perl_hv_iterval(aTHX_ a,b)
+#define hv_ksplit(a,b) Perl_hv_ksplit(aTHX_ a,b)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#endif
+#ifdef PERL_CORE
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define refcounted_he_new_common(a,b,c,d,e,f,g) S_refcounted_he_new_common(aTHX_ a,b,c,d,e,f,g)
+#endif
+#endif
+#define hv_undef(a) Perl_hv_undef(aTHX_ a)
+#define ibcmp Perl_ibcmp
+#define ibcmp_locale Perl_ibcmp_locale
+#define ibcmp_utf8(a,b,c,d,e,f,g,h) Perl_ibcmp_utf8(aTHX_ a,b,c,d,e,f,g,h)
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define ingroup(a,b) S_ingroup(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define init_argv_symbols(a,b) Perl_init_argv_symbols(aTHX_ a,b)
+#define init_debugger() Perl_init_debugger(aTHX)
+#endif
+#define init_stacks() Perl_init_stacks(aTHX)
+#define init_tm(a) Perl_init_tm(aTHX_ a)
+#ifdef PERL_CORE
+#define intro_my() Perl_intro_my(aTHX)
+#endif
+#define instr Perl_instr
+#ifdef PERL_CORE
+#define io_close(a,b) Perl_io_close(aTHX_ a,b)
+#define invert(a) Perl_invert(aTHX_ a)
+#endif
+#define is_lvalue_sub() Perl_is_lvalue_sub(aTHX)
+#define to_uni_upper_lc(a) Perl_to_uni_upper_lc(aTHX_ a)
+#define to_uni_title_lc(a) Perl_to_uni_title_lc(aTHX_ a)
+#define to_uni_lower_lc(a) Perl_to_uni_lower_lc(aTHX_ a)
+#define is_uni_alnum(a) Perl_is_uni_alnum(aTHX_ a)
+#define is_uni_idfirst(a) Perl_is_uni_idfirst(aTHX_ a)
+#define is_uni_alpha(a) Perl_is_uni_alpha(aTHX_ a)
+#define is_uni_ascii(a) Perl_is_uni_ascii(aTHX_ a)
+#define is_uni_space(a) Perl_is_uni_space(aTHX_ a)
+#define is_uni_cntrl(a) Perl_is_uni_cntrl(aTHX_ a)
+#define is_uni_graph(a) Perl_is_uni_graph(aTHX_ a)
+#define is_uni_digit(a) Perl_is_uni_digit(aTHX_ a)
+#define is_uni_upper(a) Perl_is_uni_upper(aTHX_ a)
+#define is_uni_lower(a) Perl_is_uni_lower(aTHX_ a)
+#define is_uni_print(a) Perl_is_uni_print(aTHX_ a)
+#define is_uni_punct(a) Perl_is_uni_punct(aTHX_ a)
+#define is_uni_xdigit(a) Perl_is_uni_xdigit(aTHX_ a)
+#define to_uni_upper(a,b,c) Perl_to_uni_upper(aTHX_ a,b,c)
+#define to_uni_title(a,b,c) Perl_to_uni_title(aTHX_ a,b,c)
+#define to_uni_lower(a,b,c) Perl_to_uni_lower(aTHX_ a,b,c)
+#define to_uni_fold(a,b,c) Perl_to_uni_fold(aTHX_ a,b,c)
+#define is_uni_alnum_lc(a) Perl_is_uni_alnum_lc(aTHX_ a)
+#define is_uni_idfirst_lc(a) Perl_is_uni_idfirst_lc(aTHX_ a)
+#define is_uni_alpha_lc(a) Perl_is_uni_alpha_lc(aTHX_ a)
+#define is_uni_ascii_lc(a) Perl_is_uni_ascii_lc(aTHX_ a)
+#define is_uni_space_lc(a) Perl_is_uni_space_lc(aTHX_ a)
+#define is_uni_cntrl_lc(a) Perl_is_uni_cntrl_lc(aTHX_ a)
+#define is_uni_graph_lc(a) Perl_is_uni_graph_lc(aTHX_ a)
+#define is_uni_digit_lc(a) Perl_is_uni_digit_lc(aTHX_ a)
+#define is_uni_upper_lc(a) Perl_is_uni_upper_lc(aTHX_ a)
+#define is_uni_lower_lc(a) Perl_is_uni_lower_lc(aTHX_ a)
+#define is_uni_print_lc(a) Perl_is_uni_print_lc(aTHX_ a)
+#define is_uni_punct_lc(a) Perl_is_uni_punct_lc(aTHX_ a)
+#define is_uni_xdigit_lc(a) Perl_is_uni_xdigit_lc(aTHX_ a)
+#define is_ascii_string Perl_is_ascii_string
+#define is_utf8_char Perl_is_utf8_char
+#define is_utf8_string Perl_is_utf8_string
+#define is_utf8_string_loclen Perl_is_utf8_string_loclen
+#define is_utf8_alnum(a) Perl_is_utf8_alnum(aTHX_ a)
+#define is_utf8_idfirst(a) Perl_is_utf8_idfirst(aTHX_ a)
+#define is_utf8_idcont(a) Perl_is_utf8_idcont(aTHX_ a)
+#define is_utf8_alpha(a) Perl_is_utf8_alpha(aTHX_ a)
+#define is_utf8_ascii(a) Perl_is_utf8_ascii(aTHX_ a)
+#define is_utf8_space(a) Perl_is_utf8_space(aTHX_ a)
+#define is_utf8_perl_space(a) Perl_is_utf8_perl_space(aTHX_ a)
+#define is_utf8_perl_word(a) Perl_is_utf8_perl_word(aTHX_ a)
+#define is_utf8_cntrl(a) Perl_is_utf8_cntrl(aTHX_ a)
+#define is_utf8_digit(a) Perl_is_utf8_digit(aTHX_ a)
+#define is_utf8_posix_digit(a) Perl_is_utf8_posix_digit(aTHX_ a)
+#define is_utf8_graph(a) Perl_is_utf8_graph(aTHX_ a)
+#define is_utf8_upper(a) Perl_is_utf8_upper(aTHX_ a)
+#define is_utf8_lower(a) Perl_is_utf8_lower(aTHX_ a)
+#define is_utf8_print(a) Perl_is_utf8_print(aTHX_ a)
+#define is_utf8_punct(a) Perl_is_utf8_punct(aTHX_ a)
+#define is_utf8_xdigit(a) Perl_is_utf8_xdigit(aTHX_ a)
+#define is_utf8_mark(a) Perl_is_utf8_mark(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define is_utf8_X_begin(a) Perl_is_utf8_X_begin(aTHX_ a)
+#define is_utf8_X_extend(a) Perl_is_utf8_X_extend(aTHX_ a)
+#define is_utf8_X_prepend(a) Perl_is_utf8_X_prepend(aTHX_ a)
+#define is_utf8_X_non_hangul(a) Perl_is_utf8_X_non_hangul(aTHX_ a)
+#define is_utf8_X_L(a) Perl_is_utf8_X_L(aTHX_ a)
+#define is_utf8_X_LV(a) Perl_is_utf8_X_LV(aTHX_ a)
+#define is_utf8_X_LVT(a) Perl_is_utf8_X_LVT(aTHX_ a)
+#define is_utf8_X_LV_LVT_V(a) Perl_is_utf8_X_LV_LVT_V(aTHX_ a)
+#define is_utf8_X_T(a) Perl_is_utf8_X_T(aTHX_ a)
+#define is_utf8_X_V(a) Perl_is_utf8_X_V(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define jmaybe(a) Perl_jmaybe(aTHX_ a)
+#define keyword(a,b,c) Perl_keyword(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define opt_scalarhv(a) S_opt_scalarhv(aTHX_ a)
+#define is_inplace_av(a,b) S_is_inplace_av(aTHX_ a,b)
+#endif
+#endif
+#define leave_scope(a) Perl_leave_scope(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define lex_end() Perl_lex_end(aTHX)
+#endif
+#ifdef PERL_CORE
+#define lex_start(a,b,c) Perl_lex_start(aTHX_ a,b,c)
+#endif
+#define lex_bufutf8() Perl_lex_bufutf8(aTHX)
+#define lex_grow_linestr(a) Perl_lex_grow_linestr(aTHX_ a)
+#define lex_stuff_pvn(a,b,c) Perl_lex_stuff_pvn(aTHX_ a,b,c)
+#define lex_stuff_sv(a,b) Perl_lex_stuff_sv(aTHX_ a,b)
+#define lex_unstuff(a) Perl_lex_unstuff(aTHX_ a)
+#define lex_read_to(a) Perl_lex_read_to(aTHX_ a)
+#define lex_discard_to(a) Perl_lex_discard_to(aTHX_ a)
+#define lex_next_chunk(a) Perl_lex_next_chunk(aTHX_ a)
+#define lex_peek_unichar(a) Perl_lex_peek_unichar(aTHX_ a)
+#define lex_read_unichar(a) Perl_lex_read_unichar(aTHX_ a)
+#define lex_read_space(a) Perl_lex_read_space(aTHX_ a)
+#define op_null(a) Perl_op_null(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define op_clear(a) Perl_op_clear(aTHX_ a)
+#endif
+#define op_refcnt_lock() Perl_op_refcnt_lock(aTHX)
+#define op_refcnt_unlock() Perl_op_refcnt_unlock(aTHX)
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define linklist(a) S_linklist(aTHX_ a)
+#define listkids(a) S_listkids(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define list(a) Perl_list(aTHX_ a)
+#endif
+#define vload_module(a,b,c,d) Perl_vload_module(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define localize(a,b) Perl_localize(aTHX_ a,b)
+#endif
+#define looks_like_number(a) Perl_looks_like_number(aTHX_ a)
+#define grok_bin(a,b,c,d) Perl_grok_bin(aTHX_ a,b,c,d)
+#define grok_hex(a,b,c,d) Perl_grok_hex(aTHX_ a,b,c,d)
+#define grok_number(a,b,c) Perl_grok_number(aTHX_ a,b,c)
+#define grok_numeric_radix(a,b) Perl_grok_numeric_radix(aTHX_ a,b)
+#define grok_oct(a,b,c,d) Perl_grok_oct(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define magic_clearenv(a,b) Perl_magic_clearenv(aTHX_ a,b)
+#define magic_clear_all_env(a,b) Perl_magic_clear_all_env(aTHX_ a,b)
+#define magic_clearhint(a,b) Perl_magic_clearhint(aTHX_ a,b)
+#define magic_clearhints(a,b) Perl_magic_clearhints(aTHX_ a,b)
+#define magic_clearisa(a,b) Perl_magic_clearisa(aTHX_ a,b)
+#define magic_clearpack(a,b) Perl_magic_clearpack(aTHX_ a,b)
+#define magic_clearsig(a,b) Perl_magic_clearsig(aTHX_ a,b)
+#define magic_existspack(a,b) Perl_magic_existspack(aTHX_ a,b)
+#define magic_freeovrld(a,b) Perl_magic_freeovrld(aTHX_ a,b)
+#define magic_get(a,b) Perl_magic_get(aTHX_ a,b)
+#define magic_getarylen(a,b) Perl_magic_getarylen(aTHX_ a,b)
+#define magic_getdefelem(a,b) Perl_magic_getdefelem(aTHX_ a,b)
+#define magic_getnkeys(a,b) Perl_magic_getnkeys(aTHX_ a,b)
+#define magic_getpack(a,b) Perl_magic_getpack(aTHX_ a,b)
+#define magic_getpos(a,b) Perl_magic_getpos(aTHX_ a,b)
+#define magic_getsig(a,b) Perl_magic_getsig(aTHX_ a,b)
+#define magic_getsubstr(a,b) Perl_magic_getsubstr(aTHX_ a,b)
+#define magic_gettaint(a,b) Perl_magic_gettaint(aTHX_ a,b)
+#define magic_getuvar(a,b) Perl_magic_getuvar(aTHX_ a,b)
+#define magic_getvec(a,b) Perl_magic_getvec(aTHX_ a,b)
+#define magic_len(a,b) Perl_magic_len(aTHX_ a,b)
+#define magic_nextpack(a,b,c) Perl_magic_nextpack(aTHX_ a,b,c)
+#define magic_regdata_cnt(a,b) Perl_magic_regdata_cnt(aTHX_ a,b)
+#define magic_regdatum_get(a,b) Perl_magic_regdatum_get(aTHX_ a,b)
+#define magic_regdatum_set(a,b) Perl_magic_regdatum_set(aTHX_ a,b)
+#define magic_set(a,b) Perl_magic_set(aTHX_ a,b)
+#define magic_setamagic(a,b) Perl_magic_setamagic(aTHX_ a,b)
+#define magic_setarylen(a,b) Perl_magic_setarylen(aTHX_ a,b)
+#define magic_freearylen_p(a,b) Perl_magic_freearylen_p(aTHX_ a,b)
+#define magic_setdbline(a,b) Perl_magic_setdbline(aTHX_ a,b)
+#define magic_setdefelem(a,b) Perl_magic_setdefelem(aTHX_ a,b)
+#define magic_setenv(a,b) Perl_magic_setenv(aTHX_ a,b)
+#define magic_sethint(a,b) Perl_magic_sethint(aTHX_ a,b)
+#define magic_setisa(a,b) Perl_magic_setisa(aTHX_ a,b)
+#define magic_setmglob(a,b) Perl_magic_setmglob(aTHX_ a,b)
+#define magic_setnkeys(a,b) Perl_magic_setnkeys(aTHX_ a,b)
+#define magic_setpack(a,b) Perl_magic_setpack(aTHX_ a,b)
+#define magic_setpos(a,b) Perl_magic_setpos(aTHX_ a,b)
+#define magic_setregexp(a,b) Perl_magic_setregexp(aTHX_ a,b)
+#define magic_setsig(a,b) Perl_magic_setsig(aTHX_ a,b)
+#define magic_setsubstr(a,b) Perl_magic_setsubstr(aTHX_ a,b)
+#define magic_settaint(a,b) Perl_magic_settaint(aTHX_ a,b)
+#define magic_setuvar(a,b) Perl_magic_setuvar(aTHX_ a,b)
+#define magic_setvec(a,b) Perl_magic_setvec(aTHX_ a,b)
+#define magic_setutf8(a,b) Perl_magic_setutf8(aTHX_ a,b)
+#define magic_set_all_env(a,b) Perl_magic_set_all_env(aTHX_ a,b)
+#define magic_sizepack(a,b) Perl_magic_sizepack(aTHX_ a,b)
+#define magic_wipepack(a,b) Perl_magic_wipepack(aTHX_ a,b)
+#endif
+#define markstack_grow() Perl_markstack_grow(aTHX)
+#if defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define magic_setcollxfrm(a,b) Perl_magic_setcollxfrm(aTHX_ a,b)
+#define mem_collxfrm(a,b,c) Perl_mem_collxfrm(aTHX_ a,b,c)
+#endif
+#endif
+#define vmess(a,b) Perl_vmess(aTHX_ a,b)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define qerror(a) Perl_qerror(aTHX_ a)
+#endif
+#define sortsv(a,b,c) Perl_sortsv(aTHX_ a,b,c)
+#define sortsv_flags(a,b,c,d) Perl_sortsv_flags(aTHX_ a,b,c,d)
+#define mg_clear(a) Perl_mg_clear(aTHX_ a)
+#define mg_copy(a,b,c,d) Perl_mg_copy(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#define mg_localize(a,b,c) Perl_mg_localize(aTHX_ a,b,c)
+#endif
+#define mg_find(a,b) Perl_mg_find(aTHX_ a,b)
+#define mg_free(a) Perl_mg_free(aTHX_ a)
+#define mg_get(a) Perl_mg_get(aTHX_ a)
+#define mg_length(a) Perl_mg_length(aTHX_ a)
+#define mg_magical(a) Perl_mg_magical(aTHX_ a)
+#define mg_set(a) Perl_mg_set(aTHX_ a)
+#define mg_size(a) Perl_mg_size(aTHX_ a)
+#define mini_mktime(a) Perl_mini_mktime(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define mod(a,b) Perl_mod(aTHX_ a,b)
+#endif
+#ifdef PERL_CORE
+#define mode_from_discipline(a,b) Perl_mode_from_discipline(aTHX_ a,b)
+#endif
+#define moreswitches(a) Perl_moreswitches(aTHX_ a)
+#define my_atof(a) Perl_my_atof(aTHX_ a)
+#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
+#define my_bcopy Perl_my_bcopy
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+#define my_bzero Perl_my_bzero
+#endif
+#define my_exit(a) Perl_my_exit(aTHX_ a)
+#define my_failure_exit() Perl_my_failure_exit(aTHX)
+#define my_fflush_all() Perl_my_fflush_all(aTHX)
+#define my_fork Perl_my_fork
+#define atfork_lock Perl_atfork_lock
+#define atfork_unlock Perl_atfork_unlock
+#define my_lstat() Perl_my_lstat(aTHX)
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+#define my_memcmp Perl_my_memcmp
+#endif
+#if !defined(HAS_MEMSET)
+#define my_memset Perl_my_memset
+#endif
+#define my_pclose(a) Perl_my_pclose(aTHX_ a)
+#define my_popen(a,b) Perl_my_popen(aTHX_ a,b)
+#define my_popen_list(a,b,c) Perl_my_popen_list(aTHX_ a,b,c)
+#define my_setenv(a,b) Perl_my_setenv(aTHX_ a,b)
+#define my_stat() Perl_my_stat(aTHX)
+#define my_strftime(a,b,c,d,e,f,g,h,i,j) Perl_my_strftime(aTHX_ a,b,c,d,e,f,g,h,i,j)
+#if defined(MYSWAP)
+#define my_swap(a) Perl_my_swap(aTHX_ a)
+#define my_htonl(a) Perl_my_htonl(aTHX_ a)
+#define my_ntohl(a) Perl_my_ntohl(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define my_unexec() Perl_my_unexec(aTHX)
+#endif
+#define newANONLIST(a) Perl_newANONLIST(aTHX_ a)
+#define newANONHASH(a) Perl_newANONHASH(aTHX_ a)
+#define newANONSUB(a,b,c) Perl_newANONSUB(aTHX_ a,b,c)
+#define newASSIGNOP(a,b,c,d) Perl_newASSIGNOP(aTHX_ a,b,c,d)
+#define newCONDOP(a,b,c,d) Perl_newCONDOP(aTHX_ a,b,c,d)
+#define newCONSTSUB(a,b,c) Perl_newCONSTSUB(aTHX_ a,b,c)
+#ifdef PERL_MAD
+#define newFORM(a,b,c) Perl_newFORM(aTHX_ a,b,c)
+#else
+#define newFORM(a,b,c) Perl_newFORM(aTHX_ a,b,c)
+#endif
+#define newFOROP(a,b,c,d,e,f,g) Perl_newFOROP(aTHX_ a,b,c,d,e,f,g)
+#define newGIVENOP(a,b,c) Perl_newGIVENOP(aTHX_ a,b,c)
+#define newLOGOP(a,b,c,d) Perl_newLOGOP(aTHX_ a,b,c,d)
+#define newLOOPEX(a,b) Perl_newLOOPEX(aTHX_ a,b)
+#define newLOOPOP(a,b,c,d) Perl_newLOOPOP(aTHX_ a,b,c,d)
+#define newNULLLIST() Perl_newNULLLIST(aTHX)
+#define newOP(a,b) Perl_newOP(aTHX_ a,b)
+#define newPROG(a) Perl_newPROG(aTHX_ a)
+#define newRANGE(a,b,c) Perl_newRANGE(aTHX_ a,b,c)
+#define newSLICEOP(a,b,c) Perl_newSLICEOP(aTHX_ a,b,c)
+#define newSTATEOP(a,b,c) Perl_newSTATEOP(aTHX_ a,b,c)
+#define newSUB(a,b,c,d) Perl_newSUB(aTHX_ a,b,c,d)
+#define newXS_flags(a,b,c,d,e) Perl_newXS_flags(aTHX_ a,b,c,d,e)
+#define newXS(a,b,c) Perl_newXS(aTHX_ a,b,c)
+#define newAVREF(a) Perl_newAVREF(aTHX_ a)
+#define newBINOP(a,b,c,d) Perl_newBINOP(aTHX_ a,b,c,d)
+#define newCVREF(a,b) Perl_newCVREF(aTHX_ a,b)
+#define newGVOP(a,b,c) Perl_newGVOP(aTHX_ a,b,c)
+#define newGVgen(a) Perl_newGVgen(aTHX_ a)
+#define newGVREF(a,b) Perl_newGVREF(aTHX_ a,b)
+#define newHVREF(a) Perl_newHVREF(aTHX_ a)
+#define newHVhv(a) Perl_newHVhv(aTHX_ a)
+#define newLISTOP(a,b,c,d) Perl_newLISTOP(aTHX_ a,b,c,d)
+#ifdef USE_ITHREADS
+#define newPADOP(a,b,c) Perl_newPADOP(aTHX_ a,b,c)
+#endif
+#define newPMOP(a,b) Perl_newPMOP(aTHX_ a,b)
+#define newPVOP(a,b,c) Perl_newPVOP(aTHX_ a,b,c)
+#define newRV(a) Perl_newRV(aTHX_ a)
+#define newRV_noinc(a) Perl_newRV_noinc(aTHX_ a)
+#define newSV(a) Perl_newSV(aTHX_ a)
+#define newSVREF(a) Perl_newSVREF(aTHX_ a)
+#define newSVOP(a,b,c) Perl_newSVOP(aTHX_ a,b,c)
+#define newSViv(a) Perl_newSViv(aTHX_ a)
+#define newSVuv(a) Perl_newSVuv(aTHX_ a)
+#define newSVnv(a) Perl_newSVnv(aTHX_ a)
+#define newSVpv(a,b) Perl_newSVpv(aTHX_ a,b)
+#define newSVpvn(a,b) Perl_newSVpvn(aTHX_ a,b)
+#define newSVpvn_flags(a,b,c) Perl_newSVpvn_flags(aTHX_ a,b,c)
+#define newSVhek(a) Perl_newSVhek(aTHX_ a)
+#define newSVpvn_share(a,b,c) Perl_newSVpvn_share(aTHX_ a,b,c)
+#define vnewSVpvf(a,b) Perl_vnewSVpvf(aTHX_ a,b)
+#define newSVrv(a,b) Perl_newSVrv(aTHX_ a,b)
+#define newSVsv(a) Perl_newSVsv(aTHX_ a)
+#define newSV_type(a) Perl_newSV_type(aTHX_ a)
+#define newUNOP(a,b,c) Perl_newUNOP(aTHX_ a,b,c)
+#define newWHENOP(a,b) Perl_newWHENOP(aTHX_ a,b)
+#define newWHILEOP(a,b,c,d,e,f,g,h) Perl_newWHILEOP(aTHX_ a,b,c,d,e,f,g,h)
+#define new_stackinfo(a,b) Perl_new_stackinfo(aTHX_ a,b)
+#define scan_vstring(a,b,c) Perl_scan_vstring(aTHX_ a,b,c)
+#define scan_version(a,b,c) Perl_scan_version(aTHX_ a,b,c)
+#define prescan_version(a,b,c,d,e,f,g) Perl_prescan_version(aTHX_ a,b,c,d,e,f,g)
+#define new_version(a) Perl_new_version(aTHX_ a)
+#define upg_version(a,b) Perl_upg_version(aTHX_ a,b)
+#define vverify(a) Perl_vverify(aTHX_ a)
+#define vnumify(a) Perl_vnumify(aTHX_ a)
+#define vnormal(a) Perl_vnormal(aTHX_ a)
+#define vstringify(a) Perl_vstringify(aTHX_ a)
+#define vcmp(a,b) Perl_vcmp(aTHX_ a,b)
+#ifdef PERL_CORE
+#define nextargv(a) Perl_nextargv(aTHX_ a)
+#endif
+#define ninstr Perl_ninstr
+#define op_free(a) Perl_op_free(aTHX_ a)
+#ifdef PERL_MAD
+#ifdef PERL_CORE
+#define package(a) Perl_package(aTHX_ a)
+#endif
+#else
+#ifdef PERL_CORE
+#define package(a) Perl_package(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define package_version(a) Perl_package_version(aTHX_ a)
+#define pad_alloc(a,b) Perl_pad_alloc(aTHX_ a,b)
+#define allocmy(a,b,c) Perl_allocmy(aTHX_ a,b,c)
+#endif
+#define pad_findmy(a,b,c) Perl_pad_findmy(aTHX_ a,b,c)
+#define find_rundefsvoffset() Perl_find_rundefsvoffset(aTHX)
+#ifdef PERL_CORE
+#define oopsAV(a) Perl_oopsAV(aTHX_ a)
+#define oopsHV(a) Perl_oopsHV(aTHX_ a)
+#define pad_leavemy() Perl_pad_leavemy(aTHX)
+#endif
+#ifdef DEBUGGING
+#define pad_sv(a) Perl_pad_sv(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define pad_free(a) Perl_pad_free(aTHX_ a)
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_reset() S_pad_reset(aTHX)
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_swipe(a,b) Perl_pad_swipe(aTHX_ a,b)
+#define peep(a) Perl_peep(aTHX_ a)
+#endif
+#if defined(USE_REENTRANT_API)
+#define reentrant_size() Perl_reentrant_size(aTHX)
+#define reentrant_init() Perl_reentrant_init(aTHX)
+#define reentrant_free() Perl_reentrant_free(aTHX)
+#endif
+#define call_atexit(a,b) Perl_call_atexit(aTHX_ a,b)
+#define call_argv(a,b,c) Perl_call_argv(aTHX_ a,b,c)
+#define call_method(a,b) Perl_call_method(aTHX_ a,b)
+#define call_pv(a,b) Perl_call_pv(aTHX_ a,b)
+#define call_sv(a,b) Perl_call_sv(aTHX_ a,b)
+#define despatch_signals() Perl_despatch_signals(aTHX)
+#define doref(a,b,c) Perl_doref(aTHX_ a,b,c)
+#define eval_pv(a,b) Perl_eval_pv(aTHX_ a,b)
+#define eval_sv(a,b) Perl_eval_sv(aTHX_ a,b)
+#define get_sv(a,b) Perl_get_sv(aTHX_ a,b)
+#define get_av(a,b) Perl_get_av(aTHX_ a,b)
+#define get_hv(a,b) Perl_get_hv(aTHX_ a,b)
+#define get_cv(a,b) Perl_get_cv(aTHX_ a,b)
+#define get_cvn_flags(a,b,c) Perl_get_cvn_flags(aTHX_ a,b,c)
+#define init_i18nl10n(a) Perl_init_i18nl10n(aTHX_ a)
+#define init_i18nl14n(a) Perl_init_i18nl14n(aTHX_ a)
+#define new_collate(a) Perl_new_collate(aTHX_ a)
+#define new_ctype(a) Perl_new_ctype(aTHX_ a)
+#define new_numeric(a) Perl_new_numeric(aTHX_ a)
+#define set_numeric_local() Perl_set_numeric_local(aTHX)
+#define set_numeric_radix() Perl_set_numeric_radix(aTHX)
+#define set_numeric_standard() Perl_set_numeric_standard(aTHX)
+#define require_pv(a) Perl_require_pv(aTHX_ a)
+#define pack_cat(a,b,c,d,e,f,g) Perl_pack_cat(aTHX_ a,b,c,d,e,f,g)
+#define packlist(a,b,c,d,e) Perl_packlist(aTHX_ a,b,c,d,e)
+#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
+#ifdef PERL_CORE
+#define pidgone(a,b) S_pidgone(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define pmruntime(a,b,c) Perl_pmruntime(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pmtrans(a,b,c) S_pmtrans(aTHX_ a,b,c)
+#endif
+#endif
+#define pop_scope() Perl_pop_scope(aTHX)
+#ifdef PERL_CORE
+#define prepend_elem(a,b,c) Perl_prepend_elem(aTHX_ a,b,c)
+#endif
+#define push_scope() Perl_push_scope(aTHX)
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define refkids(a,b) S_refkids(aTHX_ a,b)
+#endif
+#endif
+#define regdump(a) Perl_regdump(aTHX_ a)
+#define regdump(a) Perl_regdump(aTHX_ a)
+#define regclass_swash(a,b,c,d,e) Perl_regclass_swash(aTHX_ a,b,c,d,e)
+#define pregexec(a,b,c,d,e,f,g) Perl_pregexec(aTHX_ a,b,c,d,e,f,g)
+#define pregfree(a) Perl_pregfree(aTHX_ a)
+#define pregfree2(a) Perl_pregfree2(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_temp_copy(a,b) Perl_reg_temp_copy(aTHX_ a,b)
+#endif
+#define regfree_internal(a) Perl_regfree_internal(aTHX_ a)
+#if defined(USE_ITHREADS)
+#define regdupe_internal(a,b) Perl_regdupe_internal(aTHX_ a,b)
+#endif
+#define pregcomp(a,b) Perl_pregcomp(aTHX_ a,b)
+#define re_compile(a,b) Perl_re_compile(aTHX_ a,b)
+#define re_intuit_start(a,b,c,d,e,f) Perl_re_intuit_start(aTHX_ a,b,c,d,e,f)
+#define re_intuit_string(a) Perl_re_intuit_string(aTHX_ a)
+#define regexec_flags(a,b,c,d,e,f,g,h) Perl_regexec_flags(aTHX_ a,b,c,d,e,f,g,h)
+#define regnext(a) Perl_regnext(aTHX_ a)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_named_buff(a,b,c,d) Perl_reg_named_buff(aTHX_ a,b,c,d)
+#define reg_named_buff_iter(a,b,c) Perl_reg_named_buff_iter(aTHX_ a,b,c)
+#endif
+#define reg_named_buff_fetch(a,b,c) Perl_reg_named_buff_fetch(aTHX_ a,b,c)
+#define reg_named_buff_exists(a,b,c) Perl_reg_named_buff_exists(aTHX_ a,b,c)
+#define reg_named_buff_firstkey(a,b) Perl_reg_named_buff_firstkey(aTHX_ a,b)
+#define reg_named_buff_nextkey(a,b) Perl_reg_named_buff_nextkey(aTHX_ a,b)
+#define reg_named_buff_scalar(a,b) Perl_reg_named_buff_scalar(aTHX_ a,b)
+#define reg_named_buff_all(a,b) Perl_reg_named_buff_all(aTHX_ a,b)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_numbered_buff_fetch(a,b,c) Perl_reg_numbered_buff_fetch(aTHX_ a,b,c)
+#define reg_numbered_buff_store(a,b,c) Perl_reg_numbered_buff_store(aTHX_ a,b,c)
+#define reg_numbered_buff_length(a,b,c) Perl_reg_numbered_buff_length(aTHX_ a,b,c)
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg_qr_package(a) Perl_reg_qr_package(aTHX_ a)
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regprop(a,b,c) Perl_regprop(aTHX_ a,b,c)
+#endif
+#define repeatcpy Perl_repeatcpy
+#define rninstr Perl_rninstr
+#define rsignal(a,b) Perl_rsignal(aTHX_ a,b)
+#ifdef PERL_CORE
+#define rsignal_restore(a,b) Perl_rsignal_restore(aTHX_ a,b)
+#define rsignal_save(a,b,c) Perl_rsignal_save(aTHX_ a,b,c)
+#endif
+#define rsignal_state(a) Perl_rsignal_state(aTHX_ a)
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define rxres_free(a) S_rxres_free(aTHX_ a)
+#define rxres_restore(a,b) S_rxres_restore(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define rxres_save(a,b) Perl_rxres_save(aTHX_ a,b)
+#endif
+#if !defined(HAS_RENAME)
+#ifdef PERL_CORE
+#define same_dirent(a,b) Perl_same_dirent(aTHX_ a,b)
+#endif
+#endif
+#define savepv(a) Perl_savepv(aTHX_ a)
+#define savepvn(a,b) Perl_savepvn(aTHX_ a,b)
+#define savesharedpv(a) Perl_savesharedpv(aTHX_ a)
+#define savesharedpvn(a,b) Perl_savesharedpvn(aTHX_ a,b)
+#define savesvpv(a) Perl_savesvpv(aTHX_ a)
+#define savestack_grow() Perl_savestack_grow(aTHX)
+#define savestack_grow_cnt(a) Perl_savestack_grow_cnt(aTHX_ a)
+#define save_aelem_flags(a,b,c,d) Perl_save_aelem_flags(aTHX_ a,b,c,d)
+#define save_alloc(a,b) Perl_save_alloc(aTHX_ a,b)
+#define save_aptr(a) Perl_save_aptr(aTHX_ a)
+#define save_ary(a) Perl_save_ary(aTHX_ a)
+#define save_bool(a) Perl_save_bool(aTHX_ a)
+#define save_clearsv(a) Perl_save_clearsv(aTHX_ a)
+#define save_delete(a,b,c) Perl_save_delete(aTHX_ a,b,c)
+#define save_hdelete(a,b) Perl_save_hdelete(aTHX_ a,b)
+#define save_adelete(a,b) Perl_save_adelete(aTHX_ a,b)
+#define save_destructor(a,b) Perl_save_destructor(aTHX_ a,b)
+#define save_destructor_x(a,b) Perl_save_destructor_x(aTHX_ a,b)
+#ifdef PERL_CORE
+#endif
+#define save_generic_svref(a) Perl_save_generic_svref(aTHX_ a)
+#define save_generic_pvref(a) Perl_save_generic_pvref(aTHX_ a)
+#define save_shared_pvref(a) Perl_save_shared_pvref(aTHX_ a)
+#define save_gp(a,b) Perl_save_gp(aTHX_ a,b)
+#define save_hash(a) Perl_save_hash(aTHX_ a)
+#ifdef PERL_CORE
+#define save_hints() Perl_save_hints(aTHX)
+#endif
+#define save_helem_flags(a,b,c,d) Perl_save_helem_flags(aTHX_ a,b,c,d)
+#define save_hptr(a) Perl_save_hptr(aTHX_ a)
+#define save_I16(a) Perl_save_I16(aTHX_ a)
+#define save_I32(a) Perl_save_I32(aTHX_ a)
+#define save_I8(a) Perl_save_I8(aTHX_ a)
+#define save_int(a) Perl_save_int(aTHX_ a)
+#define save_item(a) Perl_save_item(aTHX_ a)
+#define save_iv(a) Perl_save_iv(aTHX_ a)
+#define save_list(a,b) Perl_save_list(aTHX_ a,b)
+#define save_long(a) Perl_save_long(aTHX_ a)
+#define save_nogv(a) Perl_save_nogv(aTHX_ a)
+#ifdef PERL_CORE
+#endif
+#define save_scalar(a) Perl_save_scalar(aTHX_ a)
+#define save_pptr(a) Perl_save_pptr(aTHX_ a)
+#define save_vptr(a) Perl_save_vptr(aTHX_ a)
+#define save_re_context() Perl_save_re_context(aTHX)
+#define save_padsv_and_mortalize(a) Perl_save_padsv_and_mortalize(aTHX_ a)
+#define save_sptr(a) Perl_save_sptr(aTHX_ a)
+#define save_svref(a) Perl_save_svref(aTHX_ a)
+#define save_pushptr(a,b) Perl_save_pushptr(aTHX_ a,b)
+#ifdef PERL_CORE
+#define save_pushi32ptr(a,b,c) Perl_save_pushi32ptr(aTHX_ a,b,c)
+#define save_pushptrptr(a,b,c) Perl_save_pushptrptr(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_pushptri32ptr(a,b,c,d) S_save_pushptri32ptr(aTHX_ a,b,c,d)
+#endif
+#endif
+#ifdef PERL_CORE
+#define sawparens(a) Perl_sawparens(aTHX_ a)
+#define scalar(a) Perl_scalar(aTHX_ a)
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define scalarkids(a) S_scalarkids(aTHX_ a)
+#define scalarseq(a) S_scalarseq(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_CORE
+#define scalarvoid(a) Perl_scalarvoid(aTHX_ a)
+#endif
+#define scan_bin(a,b,c) Perl_scan_bin(aTHX_ a,b,c)
+#define scan_hex(a,b,c) Perl_scan_hex(aTHX_ a,b,c)
+#define scan_num(a,b) Perl_scan_num(aTHX_ a,b)
+#define scan_oct(a,b,c) Perl_scan_oct(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define scope(a) Perl_scope(aTHX_ a)
+#endif
+#define screaminstr(a,b,c,d,e,f) Perl_screaminstr(aTHX_ a,b,c,d,e,f)
+#define setdefout(a) Perl_setdefout(aTHX_ a)
+#define share_hek(a,b,c) Perl_share_hek(aTHX_ a,b,c)
+#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+#ifdef PERL_CORE
+#define sighandler Perl_sighandler
+#endif
+#define csighandler Perl_csighandler
+#else
+#ifdef PERL_CORE
+#define sighandler Perl_sighandler
+#endif
+#define csighandler Perl_csighandler
+#endif
+#define stack_grow(a,b,c) Perl_stack_grow(aTHX_ a,b,c)
+#define start_subparse(a,b) Perl_start_subparse(aTHX_ a,b)
+#ifdef PERL_CORE
+#define sub_crush_depth(a) Perl_sub_crush_depth(aTHX_ a)
+#endif
+#define sv_2bool(a) Perl_sv_2bool(aTHX_ a)
+#define sv_2cv(a,b,c,d) Perl_sv_2cv(aTHX_ a,b,c,d)
+#define sv_2io(a) Perl_sv_2io(aTHX_ a)
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define glob_2number(a) S_glob_2number(aTHX_ a)
+#endif
+#endif
+#define sv_2iv_flags(a,b) Perl_sv_2iv_flags(aTHX_ a,b)
+#define sv_2mortal(a) Perl_sv_2mortal(aTHX_ a)
+#define sv_2nv(a) Perl_sv_2nv(aTHX_ a)
+#ifdef PERL_CORE
+#define sv_2num(a) Perl_sv_2num(aTHX_ a)
+#endif
+#define sv_2pv_flags(a,b,c) Perl_sv_2pv_flags(aTHX_ a,b,c)
+#define sv_2pvutf8(a,b) Perl_sv_2pvutf8(aTHX_ a,b)
+#define sv_2pvbyte(a,b) Perl_sv_2pvbyte(aTHX_ a,b)
+#define sv_pvn_nomg(a,b) Perl_sv_pvn_nomg(aTHX_ a,b)
+#define sv_2uv_flags(a,b) Perl_sv_2uv_flags(aTHX_ a,b)
+#define sv_iv(a) Perl_sv_iv(aTHX_ a)
+#define sv_uv(a) Perl_sv_uv(aTHX_ a)
+#define sv_nv(a) Perl_sv_nv(aTHX_ a)
+#define sv_pvn(a,b) Perl_sv_pvn(aTHX_ a,b)
+#define sv_pvutf8n(a,b) Perl_sv_pvutf8n(aTHX_ a,b)
+#define sv_pvbyten(a,b) Perl_sv_pvbyten(aTHX_ a,b)
+#define sv_true(a) Perl_sv_true(aTHX_ a)
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define sv_add_arena(a,b,c) S_sv_add_arena(aTHX_ a,b,c)
+#endif
+#endif
+#define sv_backoff(a) Perl_sv_backoff(aTHX_ a)
+#define sv_bless(a,b) Perl_sv_bless(aTHX_ a,b)
+#define sv_vcatpvf(a,b,c) Perl_sv_vcatpvf(aTHX_ a,b,c)
+#define sv_catpv(a,b) Perl_sv_catpv(aTHX_ a,b)
+#define sv_chop(a,b) Perl_sv_chop(aTHX_ a,b)
+#ifdef PERL_CORE
+#define sv_clean_all() Perl_sv_clean_all(aTHX)
+#define sv_clean_objs() Perl_sv_clean_objs(aTHX)
+#endif
+#define sv_clear(a) Perl_sv_clear(aTHX_ a)
+#define sv_cmp(a,b) Perl_sv_cmp(aTHX_ a,b)
+#define sv_cmp_locale(a,b) Perl_sv_cmp_locale(aTHX_ a,b)
+#if defined(USE_LOCALE_COLLATE)
+#define sv_collxfrm(a,b) Perl_sv_collxfrm(aTHX_ a,b)
+#endif
+#define sv_compile_2op(a,b,c,d) Perl_sv_compile_2op(aTHX_ a,b,c,d)
+#define getcwd_sv(a) Perl_getcwd_sv(aTHX_ a)
+#define sv_dec(a) Perl_sv_dec(aTHX_ a)
+#define sv_dump(a) Perl_sv_dump(aTHX_ a)
+#define sv_derived_from(a,b) Perl_sv_derived_from(aTHX_ a,b)
+#define sv_does(a,b) Perl_sv_does(aTHX_ a,b)
+#define sv_eq(a,b) Perl_sv_eq(aTHX_ a,b)
+#define sv_free(a) Perl_sv_free(aTHX_ a)
+#ifdef PERL_CORE
+#define sv_free_arenas() Perl_sv_free_arenas(aTHX)
+#endif
+#define sv_gets(a,b,c) Perl_sv_gets(aTHX_ a,b,c)
+#define sv_grow(a,b) Perl_sv_grow(aTHX_ a,b)
+#define sv_inc(a) Perl_sv_inc(aTHX_ a)
+#define sv_insert_flags(a,b,c,d,e,f) Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f)
+#define sv_isa(a,b) Perl_sv_isa(aTHX_ a,b)
+#define sv_isobject(a) Perl_sv_isobject(aTHX_ a)
+#define sv_len(a) Perl_sv_len(aTHX_ a)
+#define sv_len_utf8(a) Perl_sv_len_utf8(aTHX_ a)
+#define sv_magic(a,b,c,d,e) Perl_sv_magic(aTHX_ a,b,c,d,e)
+#define sv_magicext(a,b,c,d,e,f) Perl_sv_magicext(aTHX_ a,b,c,d,e,f)
+#define sv_mortalcopy(a) Perl_sv_mortalcopy(aTHX_ a)
+#define sv_newmortal() Perl_sv_newmortal(aTHX)
+#define sv_newref(a) Perl_sv_newref(aTHX_ a)
+#define sv_peek(a) Perl_sv_peek(aTHX_ a)
+#define sv_pos_u2b(a,b,c) Perl_sv_pos_u2b(aTHX_ a,b,c)
+#define sv_pos_u2b_flags(a,b,c,d) Perl_sv_pos_u2b_flags(aTHX_ a,b,c,d)
+#define sv_pos_b2u(a,b) Perl_sv_pos_b2u(aTHX_ a,b)
+#define sv_pvutf8n_force(a,b) Perl_sv_pvutf8n_force(aTHX_ a,b)
+#define sv_pvbyten_force(a,b) Perl_sv_pvbyten_force(aTHX_ a,b)
+#define sv_recode_to_utf8(a,b) Perl_sv_recode_to_utf8(aTHX_ a,b)
+#define sv_cat_decode(a,b,c,d,e,f) Perl_sv_cat_decode(aTHX_ a,b,c,d,e,f)
+#define sv_reftype(a,b) Perl_sv_reftype(aTHX_ a,b)
+#define sv_replace(a,b) Perl_sv_replace(aTHX_ a,b)
+#define sv_report_used() Perl_sv_report_used(aTHX)
+#define sv_reset(a,b) Perl_sv_reset(aTHX_ a,b)
+#define sv_vsetpvf(a,b,c) Perl_sv_vsetpvf(aTHX_ a,b,c)
+#define sv_setiv(a,b) Perl_sv_setiv(aTHX_ a,b)
+#define sv_setpviv(a,b) Perl_sv_setpviv(aTHX_ a,b)
+#define sv_setuv(a,b) Perl_sv_setuv(aTHX_ a,b)
+#define sv_setnv(a,b) Perl_sv_setnv(aTHX_ a,b)
+#define sv_setref_iv(a,b,c) Perl_sv_setref_iv(aTHX_ a,b,c)
+#define sv_setref_uv(a,b,c) Perl_sv_setref_uv(aTHX_ a,b,c)
+#define sv_setref_nv(a,b,c) Perl_sv_setref_nv(aTHX_ a,b,c)
+#define sv_setref_pv(a,b,c) Perl_sv_setref_pv(aTHX_ a,b,c)
+#define sv_setref_pvn(a,b,c,d) Perl_sv_setref_pvn(aTHX_ a,b,c,d)
+#define sv_setpv(a,b) Perl_sv_setpv(aTHX_ a,b)
+#define sv_setpvn(a,b,c) Perl_sv_setpvn(aTHX_ a,b,c)
+#define sv_tainted(a) Perl_sv_tainted(aTHX_ a)
+#define sv_unmagic(a,b) Perl_sv_unmagic(aTHX_ a,b)
+#define sv_unref_flags(a,b) Perl_sv_unref_flags(aTHX_ a,b)
+#define sv_untaint(a) Perl_sv_untaint(aTHX_ a)
+#define sv_upgrade(a,b) Perl_sv_upgrade(aTHX_ a,b)
+#define sv_usepvn_flags(a,b,c,d) Perl_sv_usepvn_flags(aTHX_ a,b,c,d)
+#define sv_vcatpvfn(a,b,c,d,e,f,g) Perl_sv_vcatpvfn(aTHX_ a,b,c,d,e,f,g)
+#define sv_vsetpvfn(a,b,c,d,e,f,g) Perl_sv_vsetpvfn(aTHX_ a,b,c,d,e,f,g)
+#define str_to_version(a) Perl_str_to_version(aTHX_ a)
+#define swash_init(a,b,c,d,e) Perl_swash_init(aTHX_ a,b,c,d,e)
+#define swash_fetch(a,b,c) Perl_swash_fetch(aTHX_ a,b,c)
+#define taint_env() Perl_taint_env(aTHX)
+#define taint_proper(a,b) Perl_taint_proper(aTHX_ a,b)
+#define to_utf8_case(a,b,c,d,e,f) Perl_to_utf8_case(aTHX_ a,b,c,d,e,f)
+#define to_utf8_lower(a,b,c) Perl_to_utf8_lower(aTHX_ a,b,c)
+#define to_utf8_upper(a,b,c) Perl_to_utf8_upper(aTHX_ a,b,c)
+#define to_utf8_title(a,b,c) Perl_to_utf8_title(aTHX_ a,b,c)
+#define to_utf8_fold(a,b,c) Perl_to_utf8_fold(aTHX_ a,b,c)
+#if defined(UNLINK_ALL_VERSIONS)
+#define unlnk(a) Perl_unlnk(aTHX_ a)
+#endif
+#define unpack_str(a,b,c,d,e,f,g,h) Perl_unpack_str(aTHX_ a,b,c,d,e,f,g,h)
+#define unpackstring(a,b,c,d,e) Perl_unpackstring(aTHX_ a,b,c,d,e)
+#define unsharepvn(a,b,c) Perl_unsharepvn(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define unshare_hek(a) Perl_unshare_hek(aTHX_ a)
+#endif
+#ifdef PERL_MAD
+#ifdef PERL_CORE
+#define utilize(a,b,c,d,e) Perl_utilize(aTHX_ a,b,c,d,e)
+#endif
+#else
+#ifdef PERL_CORE
+#define utilize(a,b,c,d,e) Perl_utilize(aTHX_ a,b,c,d,e)
+#endif
+#endif
+#define utf16_to_utf8(a,b,c,d) Perl_utf16_to_utf8(aTHX_ a,b,c,d)
+#define utf16_to_utf8_reversed(a,b,c,d) Perl_utf16_to_utf8_reversed(aTHX_ a,b,c,d)
+#define utf8_length(a,b) Perl_utf8_length(aTHX_ a,b)
+#define utf8_distance(a,b) Perl_utf8_distance(aTHX_ a,b)
+#define utf8_hop(a,b) Perl_utf8_hop(aTHX_ a,b)
+#define utf8_to_bytes(a,b) Perl_utf8_to_bytes(aTHX_ a,b)
+#define bytes_from_utf8(a,b,c) Perl_bytes_from_utf8(aTHX_ a,b,c)
+#define bytes_to_utf8(a,b) Perl_bytes_to_utf8(aTHX_ a,b)
+#define utf8_to_uvchr(a,b) Perl_utf8_to_uvchr(aTHX_ a,b)
+#define utf8_to_uvuni(a,b) Perl_utf8_to_uvuni(aTHX_ a,b)
+#ifdef EBCDIC
+#define utf8n_to_uvchr(a,b,c,d) Perl_utf8n_to_uvchr(aTHX_ a,b,c,d)
+#else
+#endif
+#define utf8n_to_uvuni(a,b,c,d) Perl_utf8n_to_uvuni(aTHX_ a,b,c,d)
+#ifdef EBCDIC
+#define uvchr_to_utf8(a,b) Perl_uvchr_to_utf8(aTHX_ a,b)
+#else
+#endif
+#define uvchr_to_utf8_flags(a,b,c) Perl_uvchr_to_utf8_flags(aTHX_ a,b,c)
+#define uvuni_to_utf8_flags(a,b,c) Perl_uvuni_to_utf8_flags(aTHX_ a,b,c)
+#define pv_uni_display(a,b,c,d,e) Perl_pv_uni_display(aTHX_ a,b,c,d,e)
+#define sv_uni_display(a,b,c,d) Perl_sv_uni_display(aTHX_ a,b,c,d)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define vivify_defelem(a) Perl_vivify_defelem(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define vivify_ref(a,b) Perl_vivify_ref(aTHX_ a,b)
+#define wait4pid(a,b,c) Perl_wait4pid(aTHX_ a,b,c)
+#define parse_unicode_opts(a) Perl_parse_unicode_opts(aTHX_ a)
+#endif
+#define seed() Perl_seed(aTHX)
+#ifdef PERL_CORE
+#define get_hash_seed() Perl_get_hash_seed(aTHX)
+#define report_evil_fh(a,b,c) Perl_report_evil_fh(aTHX_ a,b,c)
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define report_uninit(a) Perl_report_uninit(aTHX_ a)
+#endif
+#define vwarn(a,b) Perl_vwarn(aTHX_ a,b)
+#define vwarner(a,b,c) Perl_vwarner(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define watch(a) Perl_watch(aTHX_ a)
+#endif
+#define whichsig(a) Perl_whichsig(aTHX_ a)
+#ifdef PERL_CORE
+#define write_to_stderr(a) Perl_write_to_stderr(aTHX_ a)
+#define yyerror(a) Perl_yyerror(aTHX_ a)
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define yylex() Perl_yylex(aTHX)
+#endif
+#ifdef PERL_CORE
+#define yyparse() Perl_yyparse(aTHX)
+#define parser_free(a) Perl_parser_free(aTHX_ a)
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define yywarn(a) S_yywarn(aTHX_ a)
+#endif
+#endif
+#if defined(MYMALLOC)
+#define dump_mstats(a) Perl_dump_mstats(aTHX_ a)
+#define get_mstats(a,b,c) Perl_get_mstats(aTHX_ a,b,c)
+#endif
+#define safesysmalloc Perl_safesysmalloc
+#define safesyscalloc Perl_safesyscalloc
+#define safesysrealloc Perl_safesysrealloc
+#define safesysfree Perl_safesysfree
+#if defined(PERL_GLOBAL_STRUCT)
+#define GetVars() Perl_GetVars(aTHX)
+#define init_global_struct() Perl_init_global_struct(aTHX)
+#define free_global_struct(a) Perl_free_global_struct(aTHX_ a)
+#endif
+#define runops_standard() Perl_runops_standard(aTHX)
+#define runops_debug() Perl_runops_debug(aTHX)
+#define sv_vcatpvf_mg(a,b,c) Perl_sv_vcatpvf_mg(aTHX_ a,b,c)
+#define sv_catpv_mg(a,b) Perl_sv_catpv_mg(aTHX_ a,b)
+#define sv_vsetpvf_mg(a,b,c) Perl_sv_vsetpvf_mg(aTHX_ a,b,c)
+#define sv_setiv_mg(a,b) Perl_sv_setiv_mg(aTHX_ a,b)
+#define sv_setpviv_mg(a,b) Perl_sv_setpviv_mg(aTHX_ a,b)
+#define sv_setuv_mg(a,b) Perl_sv_setuv_mg(aTHX_ a,b)
+#define sv_setnv_mg(a,b) Perl_sv_setnv_mg(aTHX_ a,b)
+#define sv_setpv_mg(a,b) Perl_sv_setpv_mg(aTHX_ a,b)
+#define sv_setpvn_mg(a,b,c) Perl_sv_setpvn_mg(aTHX_ a,b,c)
+#define sv_setsv_mg(a,b) Perl_sv_setsv_mg(aTHX_ a,b)
+#define get_vtbl(a) Perl_get_vtbl(aTHX_ a)
+#define pv_display(a,b,c,d,e) Perl_pv_display(aTHX_ a,b,c,d,e)
+#define pv_escape(a,b,c,d,e,f) Perl_pv_escape(aTHX_ a,b,c,d,e,f)
+#define pv_pretty(a,b,c,d,e,f,g) Perl_pv_pretty(aTHX_ a,b,c,d,e,f,g)
+#define dump_vindent(a,b,c,d) Perl_dump_vindent(aTHX_ a,b,c,d)
+#define do_gv_dump(a,b,c,d) Perl_do_gv_dump(aTHX_ a,b,c,d)
+#define do_gvgv_dump(a,b,c,d) Perl_do_gvgv_dump(aTHX_ a,b,c,d)
+#define do_hv_dump(a,b,c,d) Perl_do_hv_dump(aTHX_ a,b,c,d)
+#define do_magic_dump(a,b,c,d,e,f,g) Perl_do_magic_dump(aTHX_ a,b,c,d,e,f,g)
+#define do_op_dump(a,b,c) Perl_do_op_dump(aTHX_ a,b,c)
+#define do_pmop_dump(a,b,c) Perl_do_pmop_dump(aTHX_ a,b,c)
+#define do_sv_dump(a,b,c,d,e,f,g) Perl_do_sv_dump(aTHX_ a,b,c,d,e,f,g)
+#define magic_dump(a) Perl_magic_dump(aTHX_ a)
+#define reginitcolors() Perl_reginitcolors(aTHX)
+#define sv_utf8_downgrade(a,b) Perl_sv_utf8_downgrade(aTHX_ a,b)
+#define sv_utf8_encode(a) Perl_sv_utf8_encode(aTHX_ a)
+#define sv_utf8_decode(a) Perl_sv_utf8_decode(aTHX_ a)
+#define sv_force_normal_flags(a,b) Perl_sv_force_normal_flags(aTHX_ a,b)
+#define tmps_grow(a) Perl_tmps_grow(aTHX_ a)
+#define sv_rvweaken(a) Perl_sv_rvweaken(aTHX_ a)
+#ifdef PERL_CORE
+#define magic_killbackrefs(a,b) Perl_magic_killbackrefs(aTHX_ a,b)
+#endif
+#define newANONATTRSUB(a,b,c,d) Perl_newANONATTRSUB(aTHX_ a,b,c,d)
+#define newATTRSUB(a,b,c,d,e) Perl_newATTRSUB(aTHX_ a,b,c,d,e)
+#ifdef PERL_MAD
+#define newMYSUB(a,b,c,d,e) Perl_newMYSUB(aTHX_ a,b,c,d,e)
+#else
+#define newMYSUB(a,b,c,d,e) Perl_newMYSUB(aTHX_ a,b,c,d,e)
+#endif
+#ifdef PERL_CORE
+#define my_attrs(a,b) Perl_my_attrs(aTHX_ a,b)
+#endif
+#if defined(USE_ITHREADS)
+#define cx_dup(a,b,c,d) Perl_cx_dup(aTHX_ a,b,c,d)
+#define si_dup(a,b) Perl_si_dup(aTHX_ a,b)
+#define ss_dup(a,b) Perl_ss_dup(aTHX_ a,b)
+#define any_dup(a,b) Perl_any_dup(aTHX_ a,b)
+#define he_dup(a,b,c) Perl_he_dup(aTHX_ a,b,c)
+#define hek_dup(a,b) Perl_hek_dup(aTHX_ a,b)
+#define re_dup_guts(a,b,c) Perl_re_dup_guts(aTHX_ a,b,c)
+#define fp_dup(a,b,c) Perl_fp_dup(aTHX_ a,b,c)
+#define dirp_dup(a) Perl_dirp_dup(aTHX_ a)
+#define gp_dup(a,b) Perl_gp_dup(aTHX_ a,b)
+#define mg_dup(a,b) Perl_mg_dup(aTHX_ a,b)
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define sv_dup_inc_multiple(a,b,c,d) S_sv_dup_inc_multiple(aTHX_ a,b,c,d)
+#endif
+#endif
+#define sv_dup(a,b) Perl_sv_dup(aTHX_ a,b)
+#define rvpv_dup(a,b,c) Perl_rvpv_dup(aTHX_ a,b,c)
+#define parser_dup(a,b) Perl_parser_dup(aTHX_ a,b)
+#endif
+#define ptr_table_new() Perl_ptr_table_new(aTHX)
+#define ptr_table_fetch(a,b) Perl_ptr_table_fetch(aTHX_ a,b)
+#define ptr_table_store(a,b,c) Perl_ptr_table_store(aTHX_ a,b,c)
+#define ptr_table_split(a) Perl_ptr_table_split(aTHX_ a)
+#define ptr_table_clear(a) Perl_ptr_table_clear(aTHX_ a)
+#define ptr_table_free(a) Perl_ptr_table_free(aTHX_ a)
+#if defined(USE_ITHREADS)
+# if defined(HAVE_INTERP_INTERN)
+#define sys_intern_dup(a,b) Perl_sys_intern_dup(aTHX_ a,b)
+# endif
+#endif
+#if defined(HAVE_INTERP_INTERN)
+#define sys_intern_clear() Perl_sys_intern_clear(aTHX)
+#define sys_intern_init() Perl_sys_intern_init(aTHX)
+#endif
+#define custom_op_name(a) Perl_custom_op_name(aTHX_ a)
+#define custom_op_desc(a) Perl_custom_op_desc(aTHX_ a)
+#define sv_nosharing(a) Perl_sv_nosharing(aTHX_ a)
+#define sv_destroyable(a) Perl_sv_destroyable(aTHX_ a)
+#ifdef NO_MATHOMS
+#else
+#define sv_nounlocking(a) Perl_sv_nounlocking(aTHX_ a)
+#endif
+#define nothreadhook() Perl_nothreadhook(aTHX)
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_trans_simple(a) S_do_trans_simple(aTHX_ a)
+#define do_trans_count(a) S_do_trans_count(aTHX_ a)
+#define do_trans_complex(a) S_do_trans_complex(aTHX_ a)
+#define do_trans_simple_utf8(a) S_do_trans_simple_utf8(aTHX_ a)
+#define do_trans_count_utf8(a) S_do_trans_count_utf8(aTHX_ a)
+#define do_trans_complex_utf8(a) S_do_trans_complex_utf8(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define gv_init_sv(a,b) S_gv_init_sv(aTHX_ a,b)
+#define gv_get_super_pkg(a,b) S_gv_get_super_pkg(aTHX_ a,b)
+#define require_tie_mod(a,b,c,d,e) S_require_tie_mod(aTHX_ a,b,c,d,e)
+#endif
+#endif
+#ifdef PERL_CORE
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define hsplit(a) S_hsplit(aTHX_ a)
+#define hfreeentries(a) S_hfreeentries(aTHX_ a)
+#define anonymise_cv(a,b) S_anonymise_cv(aTHX_ a,b)
+#define new_he() S_new_he(aTHX)
+#define save_hek_flags S_save_hek_flags
+#define hv_magic_check S_hv_magic_check
+#define unshare_hek_or_pvn(a,b,c,d) S_unshare_hek_or_pvn(aTHX_ a,b,c,d)
+#define share_hek_flags(a,b,c,d) S_share_hek_flags(aTHX_ a,b,c,d)
+#define hv_notallowed(a,b,c,d) S_hv_notallowed(aTHX_ a,b,c,d)
+#define hv_auxinit S_hv_auxinit
+#define hv_delete_common(a,b,c,d,e,f,g) S_hv_delete_common(aTHX_ a,b,c,d,e,f,g)
+#define clear_placeholders(a,b) S_clear_placeholders(aTHX_ a,b)
+#define refcounted_he_value(a) S_refcounted_he_value(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_magic(a,b) S_save_magic(aTHX_ a,b)
+#define magic_methpack(a,b,c) S_magic_methpack(aTHX_ a,b,c)
+#define magic_methcall(a,b,c,d,e,f) S_magic_methcall(aTHX_ a,b,c,d,e,f)
+#define restore_magic(a) S_restore_magic(aTHX_ a)
+#define unwind_handler_stack(a) S_unwind_handler_stack(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define ck_anoncode(a) Perl_ck_anoncode(aTHX_ a)
+#define ck_bitop(a) Perl_ck_bitop(aTHX_ a)
+#define ck_concat(a) Perl_ck_concat(aTHX_ a)
+#define ck_defined(a) Perl_ck_defined(aTHX_ a)
+#define ck_delete(a) Perl_ck_delete(aTHX_ a)
+#define ck_die(a) Perl_ck_die(aTHX_ a)
+#define ck_eof(a) Perl_ck_eof(aTHX_ a)
+#define ck_eval(a) Perl_ck_eval(aTHX_ a)
+#define ck_exec(a) Perl_ck_exec(aTHX_ a)
+#define ck_exists(a) Perl_ck_exists(aTHX_ a)
+#define ck_exit(a) Perl_ck_exit(aTHX_ a)
+#define ck_ftst(a) Perl_ck_ftst(aTHX_ a)
+#define ck_fun(a) Perl_ck_fun(aTHX_ a)
+#define ck_glob(a) Perl_ck_glob(aTHX_ a)
+#define ck_grep(a) Perl_ck_grep(aTHX_ a)
+#define ck_index(a) Perl_ck_index(aTHX_ a)
+#define ck_join(a) Perl_ck_join(aTHX_ a)
+#define ck_lfun(a) Perl_ck_lfun(aTHX_ a)
+#define ck_listiob(a) Perl_ck_listiob(aTHX_ a)
+#define ck_match(a) Perl_ck_match(aTHX_ a)
+#define ck_method(a) Perl_ck_method(aTHX_ a)
+#define ck_null(a) Perl_ck_null(aTHX_ a)
+#define ck_open(a) Perl_ck_open(aTHX_ a)
+#define ck_readline(a) Perl_ck_readline(aTHX_ a)
+#define ck_repeat(a) Perl_ck_repeat(aTHX_ a)
+#define ck_require(a) Perl_ck_require(aTHX_ a)
+#define ck_return(a) Perl_ck_return(aTHX_ a)
+#define ck_rfun(a) Perl_ck_rfun(aTHX_ a)
+#define ck_rvconst(a) Perl_ck_rvconst(aTHX_ a)
+#define ck_sassign(a) Perl_ck_sassign(aTHX_ a)
+#define ck_select(a) Perl_ck_select(aTHX_ a)
+#define ck_shift(a) Perl_ck_shift(aTHX_ a)
+#define ck_sort(a) Perl_ck_sort(aTHX_ a)
+#define ck_spair(a) Perl_ck_spair(aTHX_ a)
+#define ck_split(a) Perl_ck_split(aTHX_ a)
+#define ck_subr(a) Perl_ck_subr(aTHX_ a)
+#define ck_substr(a) Perl_ck_substr(aTHX_ a)
+#define ck_svconst(a) Perl_ck_svconst(aTHX_ a)
+#define ck_trunc(a) Perl_ck_trunc(aTHX_ a)
+#define ck_unpack(a) Perl_ck_unpack(aTHX_ a)
+#define ck_each(a) Perl_ck_each(aTHX_ a)
+#define is_handle_constructor S_is_handle_constructor
+#define is_list_assignment(a) S_is_list_assignment(aTHX_ a)
+#endif
+# ifdef USE_ITHREADS
+#ifdef PERL_CORE
+#endif
+# else
+#ifdef PERL_CORE
+#endif
+# endif
+#ifdef PERL_CORE
+#define find_and_forget_pmops(a) S_find_and_forget_pmops(aTHX_ a)
+#define cop_free(a) S_cop_free(aTHX_ a)
+#define modkids(a,b) S_modkids(aTHX_ a,b)
+#define scalarboolean(a) S_scalarboolean(aTHX_ a)
+#define newDEFSVOP() S_newDEFSVOP(aTHX)
+#define search_const(a) S_search_const(aTHX_ a)
+#define new_logop(a,b,c,d) S_new_logop(aTHX_ a,b,c,d)
+#define simplify_sort(a) S_simplify_sort(aTHX_ a)
+#define gv_ename(a) S_gv_ename(aTHX_ a)
+#define scalar_mod_type S_scalar_mod_type
+#define my_kid(a,b,c) S_my_kid(aTHX_ a,b,c)
+#define dup_attrlist(a) S_dup_attrlist(aTHX_ a)
+#define apply_attrs(a,b,c,d) S_apply_attrs(aTHX_ a,b,c,d)
+#define apply_attrs_my(a,b,c,d) S_apply_attrs_my(aTHX_ a,b,c,d)
+#define bad_type(a,b,c,d) S_bad_type(aTHX_ a,b,c,d)
+#define no_bareword_allowed(a) S_no_bareword_allowed(aTHX_ a)
+#define no_fh_allowed(a) S_no_fh_allowed(aTHX_ a)
+#define too_few_arguments(a,b) S_too_few_arguments(aTHX_ a,b)
+#define too_many_arguments(a,b) S_too_many_arguments(aTHX_ a,b)
+#define looks_like_bool(a) S_looks_like_bool(aTHX_ a)
+#define newGIVWHENOP(a,b,c,d,e) S_newGIVWHENOP(aTHX_ a,b,c,d,e)
+#define ref_array_or_hash(a) S_ref_array_or_hash(aTHX_ a)
+#define process_special_blocks(a,b,c) S_process_special_blocks(aTHX_ a,b,c)
+#endif
+#endif
+#if defined(PL_OP_SLAB_ALLOC)
+#define Slab_Alloc(a) Perl_Slab_Alloc(aTHX_ a)
+#define Slab_Free(a) Perl_Slab_Free(aTHX_ a)
+# if defined(PERL_DEBUG_READONLY_OPS)
+#ifdef PERL_CORE
+#endif
+# if defined(PERL_IN_OP_C)
+#ifdef PERL_CORE
+#define Slab_to_rw(a) S_Slab_to_rw(aTHX_ a)
+#endif
+# endif
+# endif
+#endif
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define find_beginning(a,b) S_find_beginning(aTHX_ a,b)
+#define forbid_setid(a,b) S_forbid_setid(aTHX_ a,b)
+#define incpush(a,b,c) S_incpush(aTHX_ a,b,c)
+#define incpush_use_sep(a,b,c) S_incpush_use_sep(aTHX_ a,b,c)
+#define init_interp() S_init_interp(aTHX)
+#define init_ids() S_init_ids(aTHX)
+#define init_main_stash() S_init_main_stash(aTHX)
+#define init_perllib() S_init_perllib(aTHX)
+#define init_postdump_symbols(a,b,c) S_init_postdump_symbols(aTHX_ a,b,c)
+#define init_predump_symbols() S_init_predump_symbols(aTHX)
+#define my_exit_jump() S_my_exit_jump(aTHX)
+#define nuke_stacks() S_nuke_stacks(aTHX)
+#define open_script(a,b,c,d) S_open_script(aTHX_ a,b,c,d)
+#define usage(a) S_usage(aTHX_ a)
+#endif
+#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
+#ifdef PERL_CORE
+#endif
+#endif
+#ifdef PERL_CORE
+#define parse_body(a,b) S_parse_body(aTHX_ a,b)
+#define run_body(a) S_run_body(aTHX_ a)
+#define incpush_if_exists(a,b,c) S_incpush_if_exists(aTHX_ a,b,c)
+#endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_delete_local() S_do_delete_local(aTHX)
+#define refto(a) S_refto(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#endif
+#endif
+#if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define unpack_rec(a,b,c,d,e) S_unpack_rec(aTHX_ a,b,c,d,e)
+#define pack_rec(a,b,c,d) S_pack_rec(aTHX_ a,b,c,d)
+#define mul128(a,b) S_mul128(aTHX_ a,b)
+#define measure_struct(a) S_measure_struct(aTHX_ a)
+#define next_symbol(a) S_next_symbol(aTHX_ a)
+#define is_an_int(a,b) S_is_an_int(aTHX_ a,b)
+#define div128(a,b) S_div128(aTHX_ a,b)
+#define group_end(a,b,c) S_group_end(aTHX_ a,b,c)
+#define get_num(a,b) S_get_num(aTHX_ a,b)
+#define need_utf8 S_need_utf8
+#define first_symbol S_first_symbol
+#define sv_exp_grow(a,b) S_sv_exp_grow(aTHX_ a,b)
+#define bytes_to_uni S_bytes_to_uni
+#endif
+#endif
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define docatch(a) S_docatch(aTHX_ a)
+#define dofindlabel(a,b,c,d) S_dofindlabel(aTHX_ a,b,c,d)
+#define doparseform(a) S_doparseform(aTHX_ a)
+#define num_overflow S_num_overflow
+#define dopoptoeval(a) S_dopoptoeval(aTHX_ a)
+#define dopoptogiven(a) S_dopoptogiven(aTHX_ a)
+#define dopoptolabel(a) S_dopoptolabel(aTHX_ a)
+#define dopoptoloop(a) S_dopoptoloop(aTHX_ a)
+#define dopoptosub_at(a,b) S_dopoptosub_at(aTHX_ a,b)
+#define dopoptowhen(a) S_dopoptowhen(aTHX_ a)
+#define save_lines(a,b) S_save_lines(aTHX_ a,b)
+#define doeval(a,b,c,d) S_doeval(aTHX_ a,b,c,d)
+#define check_type_and_open(a) S_check_type_and_open(aTHX_ a)
+#endif
+#ifndef PERL_DISABLE_PMC
+#ifdef PERL_CORE
+#define doopen_pm(a,b) S_doopen_pm(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define path_is_absolute S_path_is_absolute
+#define run_user_filter(a,b,c) S_run_user_filter(aTHX_ a,b,c)
+#define make_matcher(a) S_make_matcher(aTHX_ a)
+#define matcher_matches_sv(a,b) S_matcher_matches_sv(aTHX_ a,b)
+#define destroy_matcher(a) S_destroy_matcher(aTHX_ a)
+#define do_smartmatch(a,b) S_do_smartmatch(aTHX_ a,b)
+#endif
+#endif
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define do_oddball(a,b,c) S_do_oddball(aTHX_ a,b,c)
+#define method_common(a,b) S_method_common(aTHX_ a,b)
+#endif
+#endif
+#if defined(PERL_IN_PP_SORT_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define sv_ncmp(a,b) S_sv_ncmp(aTHX_ a,b)
+#define sv_i_ncmp(a,b) S_sv_i_ncmp(aTHX_ a,b)
+#define amagic_ncmp(a,b) S_amagic_ncmp(aTHX_ a,b)
+#define amagic_i_ncmp(a,b) S_amagic_i_ncmp(aTHX_ a,b)
+#define amagic_cmp(a,b) S_amagic_cmp(aTHX_ a,b)
+#define amagic_cmp_locale(a,b) S_amagic_cmp_locale(aTHX_ a,b)
+#define sortcv(a,b) S_sortcv(aTHX_ a,b)
+#define sortcv_xsub(a,b) S_sortcv_xsub(aTHX_ a,b)
+#define sortcv_stacked(a,b) S_sortcv_stacked(aTHX_ a,b)
+#define qsortsvu(a,b,c) S_qsortsvu(aTHX_ a,b,c)
+#endif
+#endif
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define doform(a,b,c) S_doform(aTHX_ a,b,c)
+#endif
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+#ifdef PERL_CORE
+#define dooneliner(a,b) S_dooneliner(aTHX_ a,b)
+#endif
+# endif
+#ifdef PERL_CORE
+#define space_join_names_mortal(a) S_space_join_names_mortal(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reg(a,b,c,d) S_reg(aTHX_ a,b,c,d)
+#define reganode(a,b,c) S_reganode(aTHX_ a,b,c)
+#define regatom(a,b,c) S_regatom(aTHX_ a,b,c)
+#define regbranch(a,b,c,d) S_regbranch(aTHX_ a,b,c,d)
+#define reguni(a,b,c) S_reguni(aTHX_ a,b,c)
+#define regclass(a,b) S_regclass(aTHX_ a,b)
+#define reg_node(a,b) S_reg_node(aTHX_ a,b)
+#define reg_recode(a,b) S_reg_recode(aTHX_ a,b)
+#define regpiece(a,b,c) S_regpiece(aTHX_ a,b,c)
+#define reg_namedseq(a,b,c) S_reg_namedseq(aTHX_ a,b,c)
+#define reginsert(a,b,c,d) S_reginsert(aTHX_ a,b,c,d)
+#define regtail(a,b,c,d) S_regtail(aTHX_ a,b,c,d)
+#define reg_scan_name(a,b) S_reg_scan_name(aTHX_ a,b)
+#define join_exact(a,b,c,d,e,f) S_join_exact(aTHX_ a,b,c,d,e,f)
+#define regwhite S_regwhite
+#define nextchar(a) S_nextchar(aTHX_ a)
+#define reg_skipcomment(a) S_reg_skipcomment(aTHX_ a)
+#define scan_commit(a,b,c,d) S_scan_commit(aTHX_ a,b,c,d)
+#define cl_anything S_cl_anything
+#define cl_is_anything S_cl_is_anything
+#define cl_init S_cl_init
+#define cl_init_zero S_cl_init_zero
+#define cl_and S_cl_and
+#define cl_or S_cl_or
+#define study_chunk(a,b,c,d,e,f,g,h,i,j,k) S_study_chunk(aTHX_ a,b,c,d,e,f,g,h,i,j,k)
+#define add_data S_add_data
+#endif
+#ifdef PERL_CORE
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regpposixcc(a,b) S_regpposixcc(aTHX_ a,b)
+#define checkposixcc(a) S_checkposixcc(aTHX_ a)
+#define make_trie(a,b,c,d,e,f,g,h) S_make_trie(aTHX_ a,b,c,d,e,f,g,h)
+#define make_trie_failtable(a,b,c,d) S_make_trie_failtable(aTHX_ a,b,c,d)
+#endif
+# ifdef DEBUGGING
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regdump_extflags(a,b) S_regdump_extflags(aTHX_ a,b)
+#define dumpuntil(a,b,c,d,e,f,g,h) S_dumpuntil(aTHX_ a,b,c,d,e,f,g,h)
+#define put_byte(a,b) S_put_byte(aTHX_ a,b)
+#define dump_trie(a,b,c,d) S_dump_trie(aTHX_ a,b,c,d)
+#define dump_trie_interim_list(a,b,c,d,e) S_dump_trie_interim_list(aTHX_ a,b,c,d,e)
+#define dump_trie_interim_table(a,b,c,d,e) S_dump_trie_interim_table(aTHX_ a,b,c,d,e)
+#define regtail_study(a,b,c,d) S_regtail_study(aTHX_ a,b,c,d)
+#endif
+# endif
+#endif
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define regmatch(a,b) S_regmatch(aTHX_ a,b)
+#define regrepeat(a,b,c,d) S_regrepeat(aTHX_ a,b,c,d)
+#define regtry(a,b) S_regtry(aTHX_ a,b)
+#define reginclass(a,b,c,d,e) S_reginclass(aTHX_ a,b,c,d,e)
+#define regcppush(a) S_regcppush(aTHX_ a)
+#define regcppop(a) S_regcppop(aTHX_ a)
+#define reghop3 S_reghop3
+#endif
+#ifdef XXX_dmq
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reghop4 S_reghop4
+#endif
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define reghopmaybe3 S_reghopmaybe3
+#define find_byclass(a,b,c,d,e) S_find_byclass(aTHX_ a,b,c,d,e)
+#define to_utf8_substr(a) S_to_utf8_substr(aTHX_ a)
+#define to_byte_substr(a) S_to_byte_substr(aTHX_ a)
+#define reg_check_named_buff_matched(a,b) S_reg_check_named_buff_matched(aTHX_ a,b)
+#endif
+# ifdef DEBUGGING
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define dump_exec_pos(a,b,c,d,e,f) S_dump_exec_pos(aTHX_ a,b,c,d,e,f)
+#define debug_start_match(a,b,c,d,e) S_debug_start_match(aTHX_ a,b,c,d,e)
+#endif
+# endif
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define deb_curcv(a) S_deb_curcv(aTHX_ a)
+#define debprof(a) S_debprof(aTHX_ a)
+#define sequence(a) S_sequence(aTHX_ a)
+#define sequence_tail(a) S_sequence_tail(aTHX_ a)
+#define sequence_num(a) S_sequence_num(aTHX_ a)
+#define pm_description(a) S_pm_description(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_scalar_at(a,b) S_save_scalar_at(aTHX_ a,b)
+#endif
+#endif
+#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#endif
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#endif
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define uiv_2buf S_uiv_2buf
+#define sv_unglob(a) S_sv_unglob(aTHX_ a)
+#define not_a_number(a) S_not_a_number(aTHX_ a)
+#define visit(a,b,c) S_visit(aTHX_ a,b,c)
+#define sv_del_backref(a,b) S_sv_del_backref(aTHX_ a,b)
+#define varname(a,b,c,d,e,f) S_varname(aTHX_ a,b,c,d,e,f)
+#endif
+# ifdef DEBUGGING
+#ifdef PERL_CORE
+#define del_sv(a) S_del_sv(aTHX_ a)
+#endif
+# endif
+# if !defined(NV_PRESERVES_UV)
+# ifdef DEBUGGING
+#ifdef PERL_CORE
+#define sv_2iuv_non_preserve(a,b) S_sv_2iuv_non_preserve(aTHX_ a,b)
+#endif
+# else
+#ifdef PERL_CORE
+#define sv_2iuv_non_preserve(a) S_sv_2iuv_non_preserve(aTHX_ a)
+#endif
+# endif
+# endif
+#ifdef PERL_CORE
+#define expect_number(a) S_expect_number(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define sv_pos_u2b_forwards S_sv_pos_u2b_forwards
+#define sv_pos_u2b_midway S_sv_pos_u2b_midway
+#define sv_pos_u2b_cached(a,b,c,d,e,f,g) S_sv_pos_u2b_cached(aTHX_ a,b,c,d,e,f,g)
+#define utf8_mg_pos_cache_update(a,b,c,d,e) S_utf8_mg_pos_cache_update(aTHX_ a,b,c,d,e)
+#define sv_pos_b2u_midway(a,b,c,d) S_sv_pos_b2u_midway(aTHX_ a,b,c,d)
+#define F0convert S_F0convert
+#endif
+# if defined(PERL_OLD_COPY_ON_WRITE)
+#ifdef PERL_CORE
+#define sv_release_COW(a,b,c) S_sv_release_COW(aTHX_ a,b,c)
+#endif
+# endif
+#ifdef PERL_CORE
+#define more_sv() S_more_sv(aTHX)
+#define more_bodies(a) S_more_bodies(aTHX_ a)
+#define sv_2iuv_common(a) S_sv_2iuv_common(aTHX_ a)
+#define glob_assign_glob(a,b,c) S_glob_assign_glob(aTHX_ a,b,c)
+#define glob_assign_ref(a,b) S_glob_assign_ref(aTHX_ a,b)
+#define ptr_table_find S_ptr_table_find
+#endif
+#endif
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define check_uni() S_check_uni(aTHX)
+#define force_next(a) S_force_next(aTHX_ a)
+#define force_version(a,b) S_force_version(aTHX_ a,b)
+#define force_strict_version(a) S_force_strict_version(aTHX_ a)
+#define force_word(a,b,c,d,e) S_force_word(aTHX_ a,b,c,d,e)
+#define tokeq(a) S_tokeq(aTHX_ a)
+#define readpipe_override() S_readpipe_override(aTHX)
+#define scan_const(a) S_scan_const(aTHX_ a)
+#define scan_formline(a) S_scan_formline(aTHX_ a)
+#define scan_heredoc(a) S_scan_heredoc(aTHX_ a)
+#define scan_ident(a,b,c,d,e) S_scan_ident(aTHX_ a,b,c,d,e)
+#define scan_inputsymbol(a) S_scan_inputsymbol(aTHX_ a)
+#define scan_pat(a,b) S_scan_pat(aTHX_ a,b)
+#define scan_str(a,b,c) S_scan_str(aTHX_ a,b,c)
+#define scan_subst(a) S_scan_subst(aTHX_ a)
+#define scan_trans(a) S_scan_trans(aTHX_ a)
+#define scan_word(a,b,c,d,e) S_scan_word(aTHX_ a,b,c,d,e)
+#define update_debugger_info(a,b,c) S_update_debugger_info(aTHX_ a,b,c)
+#define skipspace(a) S_skipspace(aTHX_ a)
+#define swallow_bom(a) S_swallow_bom(aTHX_ a)
+#endif
+#ifndef PERL_NO_UTF16_FILTER
+#ifdef PERL_CORE
+#define utf16_textfilter(a,b,c) S_utf16_textfilter(aTHX_ a,b,c)
+#define add_utf16_textfilter(a,b) S_add_utf16_textfilter(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define checkcomma(a,b,c) S_checkcomma(aTHX_ a,b,c)
+#define feature_is_enabled(a,b) S_feature_is_enabled(aTHX_ a,b)
+#define force_ident(a,b) S_force_ident(aTHX_ a,b)
+#define incline(a) S_incline(aTHX_ a)
+#define intuit_method(a,b,c) S_intuit_method(aTHX_ a,b,c)
+#define intuit_more(a) S_intuit_more(aTHX_ a)
+#define lop(a,b,c) S_lop(aTHX_ a,b,c)
+#define missingterm(a) S_missingterm(aTHX_ a)
+#define no_op(a,b) S_no_op(aTHX_ a,b)
+#define sublex_done() S_sublex_done(aTHX)
+#define sublex_push() S_sublex_push(aTHX)
+#define sublex_start() S_sublex_start(aTHX)
+#define filter_gets(a,b) S_filter_gets(aTHX_ a,b)
+#define find_in_my_stash(a,b) S_find_in_my_stash(aTHX_ a,b)
+#define tokenize_use(a,b) S_tokenize_use(aTHX_ a,b)
+#define deprecate_commaless_var_list() S_deprecate_commaless_var_list(aTHX)
+#define ao(a) S_ao(aTHX_ a)
+#endif
+# if defined(PERL_CR_FILTER)
+#ifdef PERL_CORE
+#define cr_textfilter(a,b,c) S_cr_textfilter(aTHX_ a,b,c)
+#define strip_return(a) S_strip_return(aTHX_ a)
+#endif
+# endif
+# if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define tokereport(a,b) S_tokereport(aTHX_ a,b)
+#define printbuf(a,b) S_printbuf(aTHX_ a,b)
+#endif
+# endif
+#endif
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define isa_lookup(a,b) S_isa_lookup(aTHX_ a,b)
+#endif
+#endif
+#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+#if defined(USE_LOCALE_NUMERIC) || defined(USE_LOCALE_COLLATE)
+#ifdef PERL_CORE
+#define stdize_locale(a) S_stdize_locale(aTHX_ a)
+#endif
+#endif
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define closest_cop(a,b) S_closest_cop(aTHX_ a,b)
+#define mess_alloc() S_mess_alloc(aTHX)
+#define vdie_croak_common(a,b) S_vdie_croak_common(aTHX_ a,b)
+#define vdie_common(a,b) S_vdie_common(aTHX_ a,b)
+#define write_no_mem() S_write_no_mem(aTHX)
+#endif
+#if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+#ifdef PERL_CORE
+#define mem_log_common S_mem_log_common
+#endif
+#endif
+#endif
+#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define mulexp10 S_mulexp10
+#endif
+#endif
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define is_utf8_char_slow S_is_utf8_char_slow
+#define is_utf8_common(a,b,c) S_is_utf8_common(aTHX_ a,b,c)
+#define swash_get(a,b,c) S_swash_get(aTHX_ a,b,c)
+#endif
+#endif
+#define sv_setsv_flags(a,b,c) Perl_sv_setsv_flags(aTHX_ a,b,c)
+#define sv_catpvn_flags(a,b,c,d) Perl_sv_catpvn_flags(aTHX_ a,b,c,d)
+#define sv_catsv_flags(a,b,c) Perl_sv_catsv_flags(aTHX_ a,b,c)
+#define sv_utf8_upgrade_flags_grow(a,b,c) Perl_sv_utf8_upgrade_flags_grow(aTHX_ a,b,c)
+#define sv_pvn_force_flags(a,b,c) Perl_sv_pvn_force_flags(aTHX_ a,b,c)
+#define sv_copypv(a,b) Perl_sv_copypv(aTHX_ a,b)
+#define my_atof2(a,b) Perl_my_atof2(aTHX_ a,b)
+#define my_socketpair Perl_my_socketpair
+#define my_dirfd(a) Perl_my_dirfd(aTHX_ a)
+#ifdef PERL_OLD_COPY_ON_WRITE
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#define sv_setsv_cow(a,b) Perl_sv_setsv_cow(aTHX_ a,b)
+#endif
+#endif
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
+#define PerlIO_close(a) Perl_PerlIO_close(aTHX_ a)
+#define PerlIO_fill(a) Perl_PerlIO_fill(aTHX_ a)
+#define PerlIO_fileno(a) Perl_PerlIO_fileno(aTHX_ a)
+#define PerlIO_eof(a) Perl_PerlIO_eof(aTHX_ a)
+#define PerlIO_error(a) Perl_PerlIO_error(aTHX_ a)
+#define PerlIO_flush(a) Perl_PerlIO_flush(aTHX_ a)
+#define PerlIO_clearerr(a) Perl_PerlIO_clearerr(aTHX_ a)
+#define PerlIO_set_cnt(a,b) Perl_PerlIO_set_cnt(aTHX_ a,b)
+#define PerlIO_set_ptrcnt(a,b,c) Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c)
+#define PerlIO_setlinebuf(a) Perl_PerlIO_setlinebuf(aTHX_ a)
+#define PerlIO_read(a,b,c) Perl_PerlIO_read(aTHX_ a,b,c)
+#define PerlIO_write(a,b,c) Perl_PerlIO_write(aTHX_ a,b,c)
+#define PerlIO_unread(a,b,c) Perl_PerlIO_unread(aTHX_ a,b,c)
+#define PerlIO_tell(a) Perl_PerlIO_tell(aTHX_ a)
+#define PerlIO_seek(a,b,c) Perl_PerlIO_seek(aTHX_ a,b,c)
+#define PerlIO_get_base(a) Perl_PerlIO_get_base(aTHX_ a)
+#define PerlIO_get_ptr(a) Perl_PerlIO_get_ptr(aTHX_ a)
+#define PerlIO_get_bufsiz(a) Perl_PerlIO_get_bufsiz(aTHX_ a)
+#define PerlIO_get_cnt(a) Perl_PerlIO_get_cnt(aTHX_ a)
+#define PerlIO_stdin() Perl_PerlIO_stdin(aTHX)
+#define PerlIO_stdout() Perl_PerlIO_stdout(aTHX)
+#define PerlIO_stderr() Perl_PerlIO_stderr(aTHX)
+#endif /* PERLIO_LAYERS */
+#ifdef PERL_CORE
+#define deb_stack_all() Perl_deb_stack_all(aTHX)
+#endif
+#if defined(PERL_IN_DEB_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define deb_stack_n(a,b,c,d,e) S_deb_stack_n(aTHX_ a,b,c,d,e)
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_new(a) Perl_pad_new(aTHX_ a)
+#define pad_undef(a) Perl_pad_undef(aTHX_ a)
+#define pad_add_name(a,b,c,d,e) Perl_pad_add_name(aTHX_ a,b,c,d,e)
+#define pad_add_anon(a,b) Perl_pad_add_anon(aTHX_ a,b)
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_check_dup(a,b,c) S_pad_check_dup(aTHX_ a,b,c)
+#endif
+#endif
+#ifdef DEBUGGING
+#ifdef PERL_CORE
+#define pad_setsv(a,b) Perl_pad_setsv(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define pad_block_start(a) Perl_pad_block_start(aTHX_ a)
+#define pad_tidy(a) Perl_pad_tidy(aTHX_ a)
+#define do_dump_pad(a,b,c,d) Perl_do_dump_pad(aTHX_ a,b,c,d)
+#define pad_fixup_inner_anons(a,b,c) Perl_pad_fixup_inner_anons(aTHX_ a,b,c)
+#endif
+#ifdef PERL_CORE
+#define pad_push(a,b) Perl_pad_push(aTHX_ a,b)
+#define pad_compname_type(a) Perl_pad_compname_type(aTHX_ a)
+#endif
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define pad_findlex(a,b,c,d,e,f,g) S_pad_findlex(aTHX_ a,b,c,d,e,f,g)
+#define pad_add_name_sv(a,b,c,d) S_pad_add_name_sv(aTHX_ a,b,c,d)
+#endif
+# if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define cv_dump(a,b) S_cv_dump(aTHX_ a,b)
+#endif
+# endif
+#endif
+#define find_runcv(a) Perl_find_runcv(aTHX_ a)
+#ifdef PERL_CORE
+#define free_tied_hv_pool() Perl_free_tied_hv_pool(aTHX)
+#endif
+#if defined(DEBUGGING)
+#ifdef PERL_CORE
+#define get_debug_opts(a,b) Perl_get_debug_opts(aTHX_ a,b)
+#endif
+#endif
+#define save_set_svflags(a,b,c) Perl_save_set_svflags(aTHX_ a,b,c)
+#ifdef DEBUGGING
+#endif
+#define hv_scalar(a) Perl_hv_scalar(aTHX_ a)
+#define hv_name_set(a,b,c,d) Perl_hv_name_set(aTHX_ a,b,c,d)
+#ifdef PERL_CORE
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#endif
+#endif
+#define hv_clear_placeholders(a) Perl_hv_clear_placeholders(aTHX_ a)
+#ifdef PERL_CORE
+#define magic_scalarpack(a,b) Perl_magic_scalarpack(aTHX_ a,b)
+#endif
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define find_hash_subscript(a,b) S_find_hash_subscript(aTHX_ a,b)
+#define find_array_subscript(a,b) S_find_array_subscript(aTHX_ a,b)
+#define find_uninit_var(a,b,c) S_find_uninit_var(aTHX_ a,b,c)
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE16
+#ifdef PERL_CORE
+#define my_htole16 Perl_my_htole16
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH16
+#ifdef PERL_CORE
+#define my_letoh16 Perl_my_letoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE16
+#ifdef PERL_CORE
+#define my_htobe16 Perl_my_htobe16
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH16
+#ifdef PERL_CORE
+#define my_betoh16 Perl_my_betoh16
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE32
+#ifdef PERL_CORE
+#define my_htole32 Perl_my_htole32
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH32
+#ifdef PERL_CORE
+#define my_letoh32 Perl_my_letoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE32
+#ifdef PERL_CORE
+#define my_htobe32 Perl_my_htobe32
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH32
+#ifdef PERL_CORE
+#define my_betoh32 Perl_my_betoh32
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLE64
+#ifdef PERL_CORE
+#define my_htole64 Perl_my_htole64
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOH64
+#ifdef PERL_CORE
+#define my_letoh64 Perl_my_letoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBE64
+#ifdef PERL_CORE
+#define my_htobe64 Perl_my_htobe64
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOH64
+#ifdef PERL_CORE
+#define my_betoh64 Perl_my_betoh64
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLES
+#ifdef PERL_CORE
+#define my_htoles Perl_my_htoles
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHS
+#ifdef PERL_CORE
+#define my_letohs Perl_my_letohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBES
+#ifdef PERL_CORE
+#define my_htobes Perl_my_htobes
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHS
+#ifdef PERL_CORE
+#define my_betohs Perl_my_betohs
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEI
+#ifdef PERL_CORE
+#define my_htolei Perl_my_htolei
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHI
+#ifdef PERL_CORE
+#define my_letohi Perl_my_letohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEI
+#ifdef PERL_CORE
+#define my_htobei Perl_my_htobei
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHI
+#ifdef PERL_CORE
+#define my_betohi Perl_my_betohi
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOLEL
+#ifdef PERL_CORE
+#define my_htolel Perl_my_htolel
+#endif
+#endif
+#ifdef PERL_NEED_MY_LETOHL
+#ifdef PERL_CORE
+#define my_letohl Perl_my_letohl
+#endif
+#endif
+#ifdef PERL_NEED_MY_HTOBEL
+#ifdef PERL_CORE
+#define my_htobel Perl_my_htobel
+#endif
+#endif
+#ifdef PERL_NEED_MY_BETOHL
+#ifdef PERL_CORE
+#define my_betohl Perl_my_betohl
+#endif
+#endif
+#ifdef PERL_CORE
+#define my_swabn Perl_my_swabn
+#endif
+#define gv_fetchpvn_flags(a,b,c,d) Perl_gv_fetchpvn_flags(aTHX_ a,b,c,d)
+#define gv_fetchsv(a,b,c) Perl_gv_fetchsv(aTHX_ a,b,c)
+#ifdef PERL_CORE
+#define is_gv_magical_sv(a,b) Perl_is_gv_magical_sv(aTHX_ a,b)
+#endif
+#define stashpv_hvname_match(a,b) Perl_stashpv_hvname_match(aTHX_ a,b)
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+#ifdef PERL_CORE
+#define dump_sv_child(a) Perl_dump_sv_child(aTHX_ a)
+#endif
+#endif
+#ifdef PERL_DONT_CREATE_GVSV
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define ckwarn_common(a) S_ckwarn_common(aTHX_ a)
+#endif
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#endif
+#ifdef PERL_CORE
+#define offer_nice_chunk(a,b) Perl_offer_nice_chunk(aTHX_ a,b)
+#endif
+#ifndef SPRINTF_RETURNS_STRLEN
+#endif
+#ifdef PERL_CORE
+#define my_clearenv() Perl_my_clearenv(aTHX)
+#endif
+#ifdef PERL_IMPLICIT_CONTEXT
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+#else
+#endif
+#endif
+#ifndef HAS_STRLCAT
+#endif
+#ifndef HAS_STRLCPY
+#endif
+#ifdef PERL_MAD
+#ifdef PERL_CORE
+#define pad_peg Perl_pad_peg
+#endif
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#endif
+#endif
+#ifdef PERL_CORE
+#define xmldump_vindent(a,b,c,d) Perl_xmldump_vindent(aTHX_ a,b,c,d)
+#define xmldump_all() Perl_xmldump_all(aTHX)
+#define xmldump_all_perl(a) Perl_xmldump_all_perl(aTHX_ a)
+#define xmldump_packsubs(a) Perl_xmldump_packsubs(aTHX_ a)
+#define xmldump_packsubs_perl(a,b) Perl_xmldump_packsubs_perl(aTHX_ a,b)
+#define xmldump_sub(a) Perl_xmldump_sub(aTHX_ a)
+#define xmldump_sub_perl(a,b) Perl_xmldump_sub_perl(aTHX_ a,b)
+#define xmldump_form(a) Perl_xmldump_form(aTHX_ a)
+#define xmldump_eval() Perl_xmldump_eval(aTHX)
+#define sv_catxmlsv(a,b) Perl_sv_catxmlsv(aTHX_ a,b)
+#define sv_catxmlpvn(a,b,c,d) Perl_sv_catxmlpvn(aTHX_ a,b,c,d)
+#define sv_xmlpeek(a) Perl_sv_xmlpeek(aTHX_ a)
+#define do_pmop_xmldump(a,b,c) Perl_do_pmop_xmldump(aTHX_ a,b,c)
+#define pmop_xmldump(a) Perl_pmop_xmldump(aTHX_ a)
+#define do_op_xmldump(a,b,c) Perl_do_op_xmldump(aTHX_ a,b,c)
+#define op_xmldump(a) Perl_op_xmldump(aTHX_ a)
+#endif
+#ifdef PERL_CORE
+#define newTOKEN(a,b,c) Perl_newTOKEN(aTHX_ a,b,c)
+#define token_free(a) Perl_token_free(aTHX_ a)
+#define token_getmad(a,b,c) Perl_token_getmad(aTHX_ a,b,c)
+#define op_getmad_weak(a,b,c) Perl_op_getmad_weak(aTHX_ a,b,c)
+#define op_getmad(a,b,c) Perl_op_getmad(aTHX_ a,b,c)
+#define prepend_madprops(a,b,c) Perl_prepend_madprops(aTHX_ a,b,c)
+#define append_madprops(a,b,c) Perl_append_madprops(aTHX_ a,b,c)
+#define addmad(a,b,c) Perl_addmad(aTHX_ a,b,c)
+#define newMADsv(a,b) Perl_newMADsv(aTHX_ a,b)
+#define newMADPROP(a,b,c,d) Perl_newMADPROP(aTHX_ a,b,c,d)
+#define mad_free(a) Perl_mad_free(aTHX_ a)
+#endif
+# if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define skipspace0(a) S_skipspace0(aTHX_ a)
+#define skipspace1(a) S_skipspace1(aTHX_ a)
+#define skipspace2(a,b) S_skipspace2(aTHX_ a,b)
+#define start_force(a) S_start_force(aTHX_ a)
+#define curmad(a,b) S_curmad(aTHX_ a,b)
+#endif
+# endif
+#ifdef PERL_CORE
+#define madlex() Perl_madlex(aTHX)
+#define madparse() Perl_madparse(aTHX)
+#endif
+#endif
+#if !defined(HAS_SIGNBIT)
+#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#endif
+#ifdef PERL_CORE
+#endif
+#if defined(USE_ITHREADS)
+#ifdef PERL_CORE
+#define mro_meta_dup(a,b) Perl_mro_meta_dup(aTHX_ a,b)
+#endif
+#endif
+#define mro_get_linear_isa(a) Perl_mro_get_linear_isa(aTHX_ a)
+#if defined(PERL_IN_MRO_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define mro_get_linear_isa_dfs(a,b) S_mro_get_linear_isa_dfs(aTHX_ a,b)
+#endif
+#endif
+#ifdef PERL_CORE
+#define mro_isa_changed_in(a) Perl_mro_isa_changed_in(aTHX_ a)
+#endif
+#define mro_method_changed_in(a) Perl_mro_method_changed_in(aTHX_ a)
+#ifdef PERL_CORE
+#define boot_core_mro() Perl_boot_core_mro(aTHX)
+#endif
+#ifdef PERL_CORE
+#endif
+#ifdef PERL_CORE
+#endif
+#define ck_anoncode(a) Perl_ck_anoncode(aTHX_ a)
+#define ck_bitop(a) Perl_ck_bitop(aTHX_ a)
+#define ck_chdir(a) Perl_ck_chdir(aTHX_ a)
+#define ck_concat(a) Perl_ck_concat(aTHX_ a)
+#define ck_defined(a) Perl_ck_defined(aTHX_ a)
+#define ck_delete(a) Perl_ck_delete(aTHX_ a)
+#define ck_die(a) Perl_ck_die(aTHX_ a)
+#define ck_each(a) Perl_ck_each(aTHX_ a)
+#define ck_eof(a) Perl_ck_eof(aTHX_ a)
+#define ck_eval(a) Perl_ck_eval(aTHX_ a)
+#define ck_exec(a) Perl_ck_exec(aTHX_ a)
+#define ck_exists(a) Perl_ck_exists(aTHX_ a)
+#define ck_exit(a) Perl_ck_exit(aTHX_ a)
+#define ck_ftst(a) Perl_ck_ftst(aTHX_ a)
+#define ck_fun(a) Perl_ck_fun(aTHX_ a)
+#define ck_glob(a) Perl_ck_glob(aTHX_ a)
+#define ck_grep(a) Perl_ck_grep(aTHX_ a)
+#define ck_index(a) Perl_ck_index(aTHX_ a)
+#define ck_join(a) Perl_ck_join(aTHX_ a)
+#define ck_lfun(a) Perl_ck_lfun(aTHX_ a)
+#define ck_listiob(a) Perl_ck_listiob(aTHX_ a)
+#define ck_match(a) Perl_ck_match(aTHX_ a)
+#define ck_method(a) Perl_ck_method(aTHX_ a)
+#define ck_null(a) Perl_ck_null(aTHX_ a)
+#define ck_open(a) Perl_ck_open(aTHX_ a)
+#define ck_readline(a) Perl_ck_readline(aTHX_ a)
+#define ck_repeat(a) Perl_ck_repeat(aTHX_ a)
+#define ck_require(a) Perl_ck_require(aTHX_ a)
+#define ck_return(a) Perl_ck_return(aTHX_ a)
+#define ck_rfun(a) Perl_ck_rfun(aTHX_ a)
+#define ck_rvconst(a) Perl_ck_rvconst(aTHX_ a)
+#define ck_sassign(a) Perl_ck_sassign(aTHX_ a)
+#define ck_select(a) Perl_ck_select(aTHX_ a)
+#define ck_shift(a) Perl_ck_shift(aTHX_ a)
+#define ck_smartmatch(a) Perl_ck_smartmatch(aTHX_ a)
+#define ck_sort(a) Perl_ck_sort(aTHX_ a)
+#define ck_spair(a) Perl_ck_spair(aTHX_ a)
+#define ck_split(a) Perl_ck_split(aTHX_ a)
+#define ck_subr(a) Perl_ck_subr(aTHX_ a)
+#define ck_substr(a) Perl_ck_substr(aTHX_ a)
+#define ck_svconst(a) Perl_ck_svconst(aTHX_ a)
+#define ck_trunc(a) Perl_ck_trunc(aTHX_ a)
+#define ck_unpack(a) Perl_ck_unpack(aTHX_ a)
+#define pp_aassign() Perl_pp_aassign(aTHX)
+#define pp_abs() Perl_pp_abs(aTHX)
+#define pp_accept() Perl_pp_accept(aTHX)
+#define pp_add() Perl_pp_add(aTHX)
+#define pp_aeach() Perl_pp_aeach(aTHX)
+#define pp_aelem() Perl_pp_aelem(aTHX)
+#define pp_aelemfast() Perl_pp_aelemfast(aTHX)
+#define pp_akeys() Perl_pp_akeys(aTHX)
+#define pp_alarm() Perl_pp_alarm(aTHX)
+#define pp_and() Perl_pp_and(aTHX)
+#define pp_andassign() Perl_pp_andassign(aTHX)
+#define pp_anoncode() Perl_pp_anoncode(aTHX)
+#define pp_anonhash() Perl_pp_anonhash(aTHX)
+#define pp_anonlist() Perl_pp_anonlist(aTHX)
+#define pp_aslice() Perl_pp_aslice(aTHX)
+#define pp_atan2() Perl_pp_atan2(aTHX)
+#define pp_av2arylen() Perl_pp_av2arylen(aTHX)
+#define pp_avalues() Perl_pp_avalues(aTHX)
+#define pp_backtick() Perl_pp_backtick(aTHX)
+#define pp_bind() Perl_pp_bind(aTHX)
+#define pp_binmode() Perl_pp_binmode(aTHX)
+#define pp_bit_and() Perl_pp_bit_and(aTHX)
+#define pp_bit_or() Perl_pp_bit_or(aTHX)
+#define pp_bit_xor() Perl_pp_bit_xor(aTHX)
+#define pp_bless() Perl_pp_bless(aTHX)
+#define pp_boolkeys() Perl_pp_boolkeys(aTHX)
+#define pp_break() Perl_pp_break(aTHX)
+#define pp_caller() Perl_pp_caller(aTHX)
+#define pp_chdir() Perl_pp_chdir(aTHX)
+#define pp_chmod() Perl_pp_chmod(aTHX)
+#define pp_chomp() Perl_pp_chomp(aTHX)
+#define pp_chop() Perl_pp_chop(aTHX)
+#define pp_chown() Perl_pp_chown(aTHX)
+#define pp_chr() Perl_pp_chr(aTHX)
+#define pp_chroot() Perl_pp_chroot(aTHX)
+#define pp_close() Perl_pp_close(aTHX)
+#define pp_closedir() Perl_pp_closedir(aTHX)
+#define pp_complement() Perl_pp_complement(aTHX)
+#define pp_concat() Perl_pp_concat(aTHX)
+#define pp_cond_expr() Perl_pp_cond_expr(aTHX)
+#define pp_connect() Perl_pp_connect(aTHX)
+#define pp_const() Perl_pp_const(aTHX)
+#define pp_continue() Perl_pp_continue(aTHX)
+#define pp_cos() Perl_pp_cos(aTHX)
+#define pp_crypt() Perl_pp_crypt(aTHX)
+#define pp_dbmclose() Perl_pp_dbmclose(aTHX)
+#define pp_dbmopen() Perl_pp_dbmopen(aTHX)
+#define pp_dbstate() Perl_pp_dbstate(aTHX)
+#define pp_defined() Perl_pp_defined(aTHX)
+#define pp_delete() Perl_pp_delete(aTHX)
+#define pp_die() Perl_pp_die(aTHX)
+#define pp_divide() Perl_pp_divide(aTHX)
+#define pp_dofile() Perl_pp_dofile(aTHX)
+#define pp_dor() Perl_pp_dor(aTHX)
+#define pp_dorassign() Perl_pp_dorassign(aTHX)
+#define pp_dump() Perl_pp_dump(aTHX)
+#define pp_each() Perl_pp_each(aTHX)
+#define pp_egrent() Perl_pp_egrent(aTHX)
+#define pp_ehostent() Perl_pp_ehostent(aTHX)
+#define pp_enetent() Perl_pp_enetent(aTHX)
+#define pp_enter() Perl_pp_enter(aTHX)
+#define pp_entereval() Perl_pp_entereval(aTHX)
+#define pp_entergiven() Perl_pp_entergiven(aTHX)
+#define pp_enteriter() Perl_pp_enteriter(aTHX)
+#define pp_enterloop() Perl_pp_enterloop(aTHX)
+#define pp_entersub() Perl_pp_entersub(aTHX)
+#define pp_entertry() Perl_pp_entertry(aTHX)
+#define pp_enterwhen() Perl_pp_enterwhen(aTHX)
+#define pp_enterwrite() Perl_pp_enterwrite(aTHX)
+#define pp_eof() Perl_pp_eof(aTHX)
+#define pp_eprotoent() Perl_pp_eprotoent(aTHX)
+#define pp_epwent() Perl_pp_epwent(aTHX)
+#define pp_eq() Perl_pp_eq(aTHX)
+#define pp_eservent() Perl_pp_eservent(aTHX)
+#define pp_exec() Perl_pp_exec(aTHX)
+#define pp_exists() Perl_pp_exists(aTHX)
+#define pp_exit() Perl_pp_exit(aTHX)
+#define pp_exp() Perl_pp_exp(aTHX)
+#define pp_fcntl() Perl_pp_fcntl(aTHX)
+#define pp_fileno() Perl_pp_fileno(aTHX)
+#define pp_flip() Perl_pp_flip(aTHX)
+#define pp_flock() Perl_pp_flock(aTHX)
+#define pp_flop() Perl_pp_flop(aTHX)
+#define pp_fork() Perl_pp_fork(aTHX)
+#define pp_formline() Perl_pp_formline(aTHX)
+#define pp_ftatime() Perl_pp_ftatime(aTHX)
+#define pp_ftbinary() Perl_pp_ftbinary(aTHX)
+#define pp_ftblk() Perl_pp_ftblk(aTHX)
+#define pp_ftchr() Perl_pp_ftchr(aTHX)
+#define pp_ftctime() Perl_pp_ftctime(aTHX)
+#define pp_ftdir() Perl_pp_ftdir(aTHX)
+#define pp_fteexec() Perl_pp_fteexec(aTHX)
+#define pp_fteowned() Perl_pp_fteowned(aTHX)
+#define pp_fteread() Perl_pp_fteread(aTHX)
+#define pp_ftewrite() Perl_pp_ftewrite(aTHX)
+#define pp_ftfile() Perl_pp_ftfile(aTHX)
+#define pp_ftis() Perl_pp_ftis(aTHX)
+#define pp_ftlink() Perl_pp_ftlink(aTHX)
+#define pp_ftmtime() Perl_pp_ftmtime(aTHX)
+#define pp_ftpipe() Perl_pp_ftpipe(aTHX)
+#define pp_ftrexec() Perl_pp_ftrexec(aTHX)
+#define pp_ftrowned() Perl_pp_ftrowned(aTHX)
+#define pp_ftrread() Perl_pp_ftrread(aTHX)
+#define pp_ftrwrite() Perl_pp_ftrwrite(aTHX)
+#define pp_ftsgid() Perl_pp_ftsgid(aTHX)
+#define pp_ftsize() Perl_pp_ftsize(aTHX)
+#define pp_ftsock() Perl_pp_ftsock(aTHX)
+#define pp_ftsuid() Perl_pp_ftsuid(aTHX)
+#define pp_ftsvtx() Perl_pp_ftsvtx(aTHX)
+#define pp_fttext() Perl_pp_fttext(aTHX)
+#define pp_fttty() Perl_pp_fttty(aTHX)
+#define pp_ftzero() Perl_pp_ftzero(aTHX)
+#define pp_ge() Perl_pp_ge(aTHX)
+#define pp_gelem() Perl_pp_gelem(aTHX)
+#define pp_getc() Perl_pp_getc(aTHX)
+#define pp_getlogin() Perl_pp_getlogin(aTHX)
+#define pp_getpeername() Perl_pp_getpeername(aTHX)
+#define pp_getpgrp() Perl_pp_getpgrp(aTHX)
+#define pp_getppid() Perl_pp_getppid(aTHX)
+#define pp_getpriority() Perl_pp_getpriority(aTHX)
+#define pp_getsockname() Perl_pp_getsockname(aTHX)
+#define pp_ggrent() Perl_pp_ggrent(aTHX)
+#define pp_ggrgid() Perl_pp_ggrgid(aTHX)
+#define pp_ggrnam() Perl_pp_ggrnam(aTHX)
+#define pp_ghbyaddr() Perl_pp_ghbyaddr(aTHX)
+#define pp_ghbyname() Perl_pp_ghbyname(aTHX)
+#define pp_ghostent() Perl_pp_ghostent(aTHX)
+#define pp_glob() Perl_pp_glob(aTHX)
+#define pp_gmtime() Perl_pp_gmtime(aTHX)
+#define pp_gnbyaddr() Perl_pp_gnbyaddr(aTHX)
+#define pp_gnbyname() Perl_pp_gnbyname(aTHX)
+#define pp_gnetent() Perl_pp_gnetent(aTHX)
+#define pp_goto() Perl_pp_goto(aTHX)
+#define pp_gpbyname() Perl_pp_gpbyname(aTHX)
+#define pp_gpbynumber() Perl_pp_gpbynumber(aTHX)
+#define pp_gprotoent() Perl_pp_gprotoent(aTHX)
+#define pp_gpwent() Perl_pp_gpwent(aTHX)
+#define pp_gpwnam() Perl_pp_gpwnam(aTHX)
+#define pp_gpwuid() Perl_pp_gpwuid(aTHX)
+#define pp_grepstart() Perl_pp_grepstart(aTHX)
+#define pp_grepwhile() Perl_pp_grepwhile(aTHX)
+#define pp_gsbyname() Perl_pp_gsbyname(aTHX)
+#define pp_gsbyport() Perl_pp_gsbyport(aTHX)
+#define pp_gservent() Perl_pp_gservent(aTHX)
+#define pp_gsockopt() Perl_pp_gsockopt(aTHX)
+#define pp_gt() Perl_pp_gt(aTHX)
+#define pp_gv() Perl_pp_gv(aTHX)
+#define pp_gvsv() Perl_pp_gvsv(aTHX)
+#define pp_helem() Perl_pp_helem(aTHX)
+#define pp_hex() Perl_pp_hex(aTHX)
+#define pp_hintseval() Perl_pp_hintseval(aTHX)
+#define pp_hslice() Perl_pp_hslice(aTHX)
+#define pp_i_add() Perl_pp_i_add(aTHX)
+#define pp_i_divide() Perl_pp_i_divide(aTHX)
+#define pp_i_eq() Perl_pp_i_eq(aTHX)
+#define pp_i_ge() Perl_pp_i_ge(aTHX)
+#define pp_i_gt() Perl_pp_i_gt(aTHX)
+#define pp_i_le() Perl_pp_i_le(aTHX)
+#define pp_i_lt() Perl_pp_i_lt(aTHX)
+#define pp_i_modulo() Perl_pp_i_modulo(aTHX)
+#define pp_i_multiply() Perl_pp_i_multiply(aTHX)
+#define pp_i_ncmp() Perl_pp_i_ncmp(aTHX)
+#define pp_i_ne() Perl_pp_i_ne(aTHX)
+#define pp_i_negate() Perl_pp_i_negate(aTHX)
+#define pp_i_subtract() Perl_pp_i_subtract(aTHX)
+#define pp_index() Perl_pp_index(aTHX)
+#define pp_int() Perl_pp_int(aTHX)
+#define pp_ioctl() Perl_pp_ioctl(aTHX)
+#define pp_iter() Perl_pp_iter(aTHX)
+#define pp_join() Perl_pp_join(aTHX)
+#define pp_keys() Perl_pp_keys(aTHX)
+#define pp_kill() Perl_pp_kill(aTHX)
+#define pp_last() Perl_pp_last(aTHX)
+#define pp_lc() Perl_pp_lc(aTHX)
+#define pp_lcfirst() Perl_pp_lcfirst(aTHX)
+#define pp_le() Perl_pp_le(aTHX)
+#define pp_leave() Perl_pp_leave(aTHX)
+#define pp_leaveeval() Perl_pp_leaveeval(aTHX)
+#define pp_leavegiven() Perl_pp_leavegiven(aTHX)
+#define pp_leaveloop() Perl_pp_leaveloop(aTHX)
+#define pp_leavesub() Perl_pp_leavesub(aTHX)
+#define pp_leavesublv() Perl_pp_leavesublv(aTHX)
+#define pp_leavetry() Perl_pp_leavetry(aTHX)
+#define pp_leavewhen() Perl_pp_leavewhen(aTHX)
+#define pp_leavewrite() Perl_pp_leavewrite(aTHX)
+#define pp_left_shift() Perl_pp_left_shift(aTHX)
+#define pp_length() Perl_pp_length(aTHX)
+#define pp_lineseq() Perl_pp_lineseq(aTHX)
+#define pp_link() Perl_pp_link(aTHX)
+#define pp_list() Perl_pp_list(aTHX)
+#define pp_listen() Perl_pp_listen(aTHX)
+#define pp_localtime() Perl_pp_localtime(aTHX)
+#define pp_lock() Perl_pp_lock(aTHX)
+#define pp_log() Perl_pp_log(aTHX)
+#define pp_lslice() Perl_pp_lslice(aTHX)
+#define pp_lstat() Perl_pp_lstat(aTHX)
+#define pp_lt() Perl_pp_lt(aTHX)
+#define pp_mapstart() Perl_pp_mapstart(aTHX)
+#define pp_mapwhile() Perl_pp_mapwhile(aTHX)
+#define pp_match() Perl_pp_match(aTHX)
+#define pp_method() Perl_pp_method(aTHX)
+#define pp_method_named() Perl_pp_method_named(aTHX)
+#define pp_mkdir() Perl_pp_mkdir(aTHX)
+#define pp_modulo() Perl_pp_modulo(aTHX)
+#define pp_msgctl() Perl_pp_msgctl(aTHX)
+#define pp_msgget() Perl_pp_msgget(aTHX)
+#define pp_msgrcv() Perl_pp_msgrcv(aTHX)
+#define pp_msgsnd() Perl_pp_msgsnd(aTHX)
+#define pp_multiply() Perl_pp_multiply(aTHX)
+#define pp_ncmp() Perl_pp_ncmp(aTHX)
+#define pp_ne() Perl_pp_ne(aTHX)
+#define pp_negate() Perl_pp_negate(aTHX)
+#define pp_next() Perl_pp_next(aTHX)
+#define pp_nextstate() Perl_pp_nextstate(aTHX)
+#define pp_not() Perl_pp_not(aTHX)
+#define pp_null() Perl_pp_null(aTHX)
+#define pp_oct() Perl_pp_oct(aTHX)
+#define pp_once() Perl_pp_once(aTHX)
+#define pp_open() Perl_pp_open(aTHX)
+#define pp_open_dir() Perl_pp_open_dir(aTHX)
+#define pp_or() Perl_pp_or(aTHX)
+#define pp_orassign() Perl_pp_orassign(aTHX)
+#define pp_ord() Perl_pp_ord(aTHX)
+#define pp_pack() Perl_pp_pack(aTHX)
+#define pp_padany() Perl_pp_padany(aTHX)
+#define pp_padav() Perl_pp_padav(aTHX)
+#define pp_padhv() Perl_pp_padhv(aTHX)
+#define pp_padsv() Perl_pp_padsv(aTHX)
+#define pp_pipe_op() Perl_pp_pipe_op(aTHX)
+#define pp_pop() Perl_pp_pop(aTHX)
+#define pp_pos() Perl_pp_pos(aTHX)
+#define pp_postdec() Perl_pp_postdec(aTHX)
+#define pp_postinc() Perl_pp_postinc(aTHX)
+#define pp_pow() Perl_pp_pow(aTHX)
+#define pp_predec() Perl_pp_predec(aTHX)
+#define pp_preinc() Perl_pp_preinc(aTHX)
+#define pp_print() Perl_pp_print(aTHX)
+#define pp_prototype() Perl_pp_prototype(aTHX)
+#define pp_prtf() Perl_pp_prtf(aTHX)
+#define pp_push() Perl_pp_push(aTHX)
+#define pp_pushmark() Perl_pp_pushmark(aTHX)
+#define pp_pushre() Perl_pp_pushre(aTHX)
+#define pp_qr() Perl_pp_qr(aTHX)
+#define pp_quotemeta() Perl_pp_quotemeta(aTHX)
+#define pp_rand() Perl_pp_rand(aTHX)
+#define pp_range() Perl_pp_range(aTHX)
+#define pp_rcatline() Perl_pp_rcatline(aTHX)
+#define pp_read() Perl_pp_read(aTHX)
+#define pp_readdir() Perl_pp_readdir(aTHX)
+#define pp_readline() Perl_pp_readline(aTHX)
+#define pp_readlink() Perl_pp_readlink(aTHX)
+#define pp_recv() Perl_pp_recv(aTHX)
+#define pp_redo() Perl_pp_redo(aTHX)
+#define pp_ref() Perl_pp_ref(aTHX)
+#define pp_refgen() Perl_pp_refgen(aTHX)
+#define pp_regcmaybe() Perl_pp_regcmaybe(aTHX)
+#define pp_regcomp() Perl_pp_regcomp(aTHX)
+#define pp_regcreset() Perl_pp_regcreset(aTHX)
+#define pp_rename() Perl_pp_rename(aTHX)
+#define pp_repeat() Perl_pp_repeat(aTHX)
+#define pp_require() Perl_pp_require(aTHX)
+#define pp_reset() Perl_pp_reset(aTHX)
+#define pp_return() Perl_pp_return(aTHX)
+#define pp_reverse() Perl_pp_reverse(aTHX)
+#define pp_rewinddir() Perl_pp_rewinddir(aTHX)
+#define pp_right_shift() Perl_pp_right_shift(aTHX)
+#define pp_rindex() Perl_pp_rindex(aTHX)
+#define pp_rmdir() Perl_pp_rmdir(aTHX)
+#define pp_rv2av() Perl_pp_rv2av(aTHX)
+#define pp_rv2cv() Perl_pp_rv2cv(aTHX)
+#define pp_rv2gv() Perl_pp_rv2gv(aTHX)
+#define pp_rv2hv() Perl_pp_rv2hv(aTHX)
+#define pp_rv2sv() Perl_pp_rv2sv(aTHX)
+#define pp_sassign() Perl_pp_sassign(aTHX)
+#define pp_say() Perl_pp_say(aTHX)
+#define pp_scalar() Perl_pp_scalar(aTHX)
+#define pp_schomp() Perl_pp_schomp(aTHX)
+#define pp_schop() Perl_pp_schop(aTHX)
+#define pp_scmp() Perl_pp_scmp(aTHX)
+#define pp_scope() Perl_pp_scope(aTHX)
+#define pp_seek() Perl_pp_seek(aTHX)
+#define pp_seekdir() Perl_pp_seekdir(aTHX)
+#define pp_select() Perl_pp_select(aTHX)
+#define pp_semctl() Perl_pp_semctl(aTHX)
+#define pp_semget() Perl_pp_semget(aTHX)
+#define pp_semop() Perl_pp_semop(aTHX)
+#define pp_send() Perl_pp_send(aTHX)
+#define pp_seq() Perl_pp_seq(aTHX)
+#define pp_setpgrp() Perl_pp_setpgrp(aTHX)
+#define pp_setpriority() Perl_pp_setpriority(aTHX)
+#define pp_sge() Perl_pp_sge(aTHX)
+#define pp_sgrent() Perl_pp_sgrent(aTHX)
+#define pp_sgt() Perl_pp_sgt(aTHX)
+#define pp_shift() Perl_pp_shift(aTHX)
+#define pp_shmctl() Perl_pp_shmctl(aTHX)
+#define pp_shmget() Perl_pp_shmget(aTHX)
+#define pp_shmread() Perl_pp_shmread(aTHX)
+#define pp_shmwrite() Perl_pp_shmwrite(aTHX)
+#define pp_shostent() Perl_pp_shostent(aTHX)
+#define pp_shutdown() Perl_pp_shutdown(aTHX)
+#define pp_sin() Perl_pp_sin(aTHX)
+#define pp_sle() Perl_pp_sle(aTHX)
+#define pp_sleep() Perl_pp_sleep(aTHX)
+#define pp_slt() Perl_pp_slt(aTHX)
+#define pp_smartmatch() Perl_pp_smartmatch(aTHX)
+#define pp_sne() Perl_pp_sne(aTHX)
+#define pp_snetent() Perl_pp_snetent(aTHX)
+#define pp_socket() Perl_pp_socket(aTHX)
+#define pp_sockpair() Perl_pp_sockpair(aTHX)
+#define pp_sort() Perl_pp_sort(aTHX)
+#define pp_splice() Perl_pp_splice(aTHX)
+#define pp_split() Perl_pp_split(aTHX)
+#define pp_sprintf() Perl_pp_sprintf(aTHX)
+#define pp_sprotoent() Perl_pp_sprotoent(aTHX)
+#define pp_spwent() Perl_pp_spwent(aTHX)
+#define pp_sqrt() Perl_pp_sqrt(aTHX)
+#define pp_srand() Perl_pp_srand(aTHX)
+#define pp_srefgen() Perl_pp_srefgen(aTHX)
+#define pp_sselect() Perl_pp_sselect(aTHX)
+#define pp_sservent() Perl_pp_sservent(aTHX)
+#define pp_ssockopt() Perl_pp_ssockopt(aTHX)
+#define pp_stat() Perl_pp_stat(aTHX)
+#define pp_stringify() Perl_pp_stringify(aTHX)
+#define pp_stub() Perl_pp_stub(aTHX)
+#define pp_study() Perl_pp_study(aTHX)
+#define pp_subst() Perl_pp_subst(aTHX)
+#define pp_substcont() Perl_pp_substcont(aTHX)
+#define pp_substr() Perl_pp_substr(aTHX)
+#define pp_subtract() Perl_pp_subtract(aTHX)
+#define pp_symlink() Perl_pp_symlink(aTHX)
+#define pp_syscall() Perl_pp_syscall(aTHX)
+#define pp_sysopen() Perl_pp_sysopen(aTHX)
+#define pp_sysread() Perl_pp_sysread(aTHX)
+#define pp_sysseek() Perl_pp_sysseek(aTHX)
+#define pp_system() Perl_pp_system(aTHX)
+#define pp_syswrite() Perl_pp_syswrite(aTHX)
+#define pp_tell() Perl_pp_tell(aTHX)
+#define pp_telldir() Perl_pp_telldir(aTHX)
+#define pp_tie() Perl_pp_tie(aTHX)
+#define pp_tied() Perl_pp_tied(aTHX)
+#define pp_time() Perl_pp_time(aTHX)
+#define pp_tms() Perl_pp_tms(aTHX)
+#define pp_trans() Perl_pp_trans(aTHX)
+#define pp_truncate() Perl_pp_truncate(aTHX)
+#define pp_uc() Perl_pp_uc(aTHX)
+#define pp_ucfirst() Perl_pp_ucfirst(aTHX)
+#define pp_umask() Perl_pp_umask(aTHX)
+#define pp_undef() Perl_pp_undef(aTHX)
+#define pp_unlink() Perl_pp_unlink(aTHX)
+#define pp_unpack() Perl_pp_unpack(aTHX)
+#define pp_unshift() Perl_pp_unshift(aTHX)
+#define pp_unstack() Perl_pp_unstack(aTHX)
+#define pp_untie() Perl_pp_untie(aTHX)
+#define pp_utime() Perl_pp_utime(aTHX)
+#define pp_values() Perl_pp_values(aTHX)
+#define pp_vec() Perl_pp_vec(aTHX)
+#define pp_wait() Perl_pp_wait(aTHX)
+#define pp_waitpid() Perl_pp_waitpid(aTHX)
+#define pp_wantarray() Perl_pp_wantarray(aTHX)
+#define pp_warn() Perl_pp_warn(aTHX)
+#define pp_xor() Perl_pp_xor(aTHX)
+
+#endif /* PERL_IMPLICIT_CONTEXT */
+
+#endif /* #ifndef PERL_NO_SHORT_NAMES */
+
+
+/* Compatibility stubs. Compile extensions with -DPERL_NOCOMPAT to
+ disable them.
+ */
+
+#if !defined(PERL_CORE)
+# define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,PTR2IV(ptr))
+# define sv_setptrref(rv,ptr) sv_setref_iv(rv,NULL,PTR2IV(ptr))
+#endif
+
+#if !defined(PERL_CORE) && !defined(PERL_NOCOMPAT)
+
+/* Compatibility for various misnamed functions. All functions
+ in the API that begin with "perl_" (not "Perl_") take an explicit
+ interpreter context pointer.
+ The following are not like that, but since they had a "perl_"
+ prefix in previous versions, we provide compatibility macros.
+ */
+# define perl_atexit(a,b) call_atexit(a,b)
+# define perl_call_argv(a,b,c) call_argv(a,b,c)
+# define perl_call_pv(a,b) call_pv(a,b)
+# define perl_call_method(a,b) call_method(a,b)
+# define perl_call_sv(a,b) call_sv(a,b)
+# define perl_eval_sv(a,b) eval_sv(a,b)
+# define perl_eval_pv(a,b) eval_pv(a,b)
+# define perl_require_pv(a) require_pv(a)
+# define perl_get_sv(a,b) get_sv(a,b)
+# define perl_get_av(a,b) get_av(a,b)
+# define perl_get_hv(a,b) get_hv(a,b)
+# define perl_get_cv(a,b) get_cv(a,b)
+# define perl_init_i18nl10n(a) init_i18nl10n(a)
+# define perl_init_i18nl14n(a) init_i18nl14n(a)
+# define perl_new_ctype(a) new_ctype(a)
+# define perl_new_collate(a) new_collate(a)
+# define perl_new_numeric(a) new_numeric(a)
+
+/* varargs functions can't be handled with CPP macros. :-(
+ This provides a set of compatibility functions that don't take
+ an extra argument but grab the context pointer using the macro
+ dTHX.
+ */
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_NO_SHORT_NAMES)
+# define croak Perl_croak_nocontext
+# define deb Perl_deb_nocontext
+# define die Perl_die_nocontext
+# define form Perl_form_nocontext
+# define load_module Perl_load_module_nocontext
+# define mess Perl_mess_nocontext
+# define newSVpvf Perl_newSVpvf_nocontext
+# define sv_catpvf Perl_sv_catpvf_nocontext
+# define sv_setpvf Perl_sv_setpvf_nocontext
+# define warn Perl_warn_nocontext
+# define warner Perl_warner_nocontext
+# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+#endif
+
+#endif /* !defined(PERL_CORE) && !defined(PERL_NOCOMPAT) */
+
+#if !defined(PERL_IMPLICIT_CONTEXT)
+/* undefined symbols, point them back at the usual ones */
+# define Perl_croak_nocontext Perl_croak
+# define Perl_die_nocontext Perl_die
+# define Perl_deb_nocontext Perl_deb
+# define Perl_form_nocontext Perl_form
+# define Perl_load_module_nocontext Perl_load_module
+# define Perl_mess_nocontext Perl_mess
+# define Perl_newSVpvf_nocontext Perl_newSVpvf
+# define Perl_sv_catpvf_nocontext Perl_sv_catpvf
+# define Perl_sv_setpvf_nocontext Perl_sv_setpvf
+# define Perl_warn_nocontext Perl_warn
+# define Perl_warner_nocontext Perl_warner
+# define Perl_sv_catpvf_mg_nocontext Perl_sv_catpvf_mg
+# define Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_mg
+#endif
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/embedvar.h b/Master/tlpkg/tlperl/lib/CORE/embedvar.h
new file mode 100644
index 00000000000..63ed46ee2ab
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/embedvar.h
@@ -0,0 +1,875 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * embedvar.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, and perlvars.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+/* (Doing namespace management portably in C is really gross.) */
+
+/*
+ The following combinations of MULTIPLICITY and PERL_IMPLICIT_CONTEXT
+ are supported:
+ 1) none
+ 2) MULTIPLICITY # supported for compatibility
+ 3) MULTIPLICITY && PERL_IMPLICIT_CONTEXT
+
+ All other combinations of these flags are errors.
+
+ only #3 is supported directly, while #2 is a special
+ case of #3 (supported by redefining vTHX appropriately).
+*/
+
+#if defined(MULTIPLICITY)
+/* cases 2 and 3 above */
+
+# if defined(PERL_IMPLICIT_CONTEXT)
+# define vTHX aTHX
+# else
+# define vTHX PERL_GET_INTERP
+# endif
+
+#define PL_Argv (vTHX->IArgv)
+#define PL_Cmd (vTHX->ICmd)
+#define PL_DBcv (vTHX->IDBcv)
+#define PL_DBgv (vTHX->IDBgv)
+#define PL_DBline (vTHX->IDBline)
+#define PL_DBsignal (vTHX->IDBsignal)
+#define PL_DBsingle (vTHX->IDBsingle)
+#define PL_DBsub (vTHX->IDBsub)
+#define PL_DBtrace (vTHX->IDBtrace)
+#define PL_Dir (vTHX->IDir)
+#define PL_Env (vTHX->IEnv)
+#define PL_LIO (vTHX->ILIO)
+#define PL_Mem (vTHX->IMem)
+#define PL_MemParse (vTHX->IMemParse)
+#define PL_MemShared (vTHX->IMemShared)
+#define PL_OpPtr (vTHX->IOpPtr)
+#define PL_OpSlab (vTHX->IOpSlab)
+#define PL_OpSpace (vTHX->IOpSpace)
+#define PL_Proc (vTHX->IProc)
+#define PL_Sock (vTHX->ISock)
+#define PL_StdIO (vTHX->IStdIO)
+#define PL_Sv (vTHX->ISv)
+#define PL_Xpv (vTHX->IXpv)
+#define PL_amagic_generation (vTHX->Iamagic_generation)
+#define PL_an (vTHX->Ian)
+#define PL_argvgv (vTHX->Iargvgv)
+#define PL_argvout_stack (vTHX->Iargvout_stack)
+#define PL_argvoutgv (vTHX->Iargvoutgv)
+#define PL_basetime (vTHX->Ibasetime)
+#define PL_beginav (vTHX->Ibeginav)
+#define PL_beginav_save (vTHX->Ibeginav_save)
+#define PL_body_arenas (vTHX->Ibody_arenas)
+#define PL_body_roots (vTHX->Ibody_roots)
+#define PL_bodytarget (vTHX->Ibodytarget)
+#define PL_breakable_sub_gen (vTHX->Ibreakable_sub_gen)
+#define PL_checkav (vTHX->Icheckav)
+#define PL_checkav_save (vTHX->Icheckav_save)
+#define PL_chopset (vTHX->Ichopset)
+#define PL_clocktick (vTHX->Iclocktick)
+#define PL_collation_ix (vTHX->Icollation_ix)
+#define PL_collation_name (vTHX->Icollation_name)
+#define PL_collation_standard (vTHX->Icollation_standard)
+#define PL_collxfrm_base (vTHX->Icollxfrm_base)
+#define PL_collxfrm_mult (vTHX->Icollxfrm_mult)
+#define PL_colors (vTHX->Icolors)
+#define PL_colorset (vTHX->Icolorset)
+#define PL_compcv (vTHX->Icompcv)
+#define PL_compiling (vTHX->Icompiling)
+#define PL_comppad (vTHX->Icomppad)
+#define PL_comppad_name (vTHX->Icomppad_name)
+#define PL_comppad_name_fill (vTHX->Icomppad_name_fill)
+#define PL_comppad_name_floor (vTHX->Icomppad_name_floor)
+#define PL_cop_seqmax (vTHX->Icop_seqmax)
+#define PL_cryptseen (vTHX->Icryptseen)
+#define PL_curcop (vTHX->Icurcop)
+#define PL_curcopdb (vTHX->Icurcopdb)
+#define PL_curpad (vTHX->Icurpad)
+#define PL_curpm (vTHX->Icurpm)
+#define PL_curstack (vTHX->Icurstack)
+#define PL_curstackinfo (vTHX->Icurstackinfo)
+#define PL_curstash (vTHX->Icurstash)
+#define PL_curstname (vTHX->Icurstname)
+#define PL_custom_op_descs (vTHX->Icustom_op_descs)
+#define PL_custom_op_names (vTHX->Icustom_op_names)
+#define PL_cv_has_eval (vTHX->Icv_has_eval)
+#define PL_dbargs (vTHX->Idbargs)
+#define PL_debstash (vTHX->Idebstash)
+#define PL_debug (vTHX->Idebug)
+#define PL_debug_pad (vTHX->Idebug_pad)
+#define PL_def_layerlist (vTHX->Idef_layerlist)
+#define PL_defgv (vTHX->Idefgv)
+#define PL_defoutgv (vTHX->Idefoutgv)
+#define PL_defstash (vTHX->Idefstash)
+#define PL_delaymagic (vTHX->Idelaymagic)
+#define PL_destroyhook (vTHX->Idestroyhook)
+#define PL_diehook (vTHX->Idiehook)
+#define PL_dirty (vTHX->Idirty)
+#define PL_doextract (vTHX->Idoextract)
+#define PL_doswitches (vTHX->Idoswitches)
+#define PL_dowarn (vTHX->Idowarn)
+#define PL_dumper_fd (vTHX->Idumper_fd)
+#define PL_dumpindent (vTHX->Idumpindent)
+#define PL_e_script (vTHX->Ie_script)
+#define PL_efloatbuf (vTHX->Iefloatbuf)
+#define PL_efloatsize (vTHX->Iefloatsize)
+#define PL_egid (vTHX->Iegid)
+#define PL_encoding (vTHX->Iencoding)
+#define PL_endav (vTHX->Iendav)
+#define PL_envgv (vTHX->Ienvgv)
+#define PL_errgv (vTHX->Ierrgv)
+#define PL_errors (vTHX->Ierrors)
+#define PL_euid (vTHX->Ieuid)
+#define PL_eval_root (vTHX->Ieval_root)
+#define PL_eval_start (vTHX->Ieval_start)
+#define PL_evalseq (vTHX->Ievalseq)
+#define PL_exit_flags (vTHX->Iexit_flags)
+#define PL_exitlist (vTHX->Iexitlist)
+#define PL_exitlistlen (vTHX->Iexitlistlen)
+#define PL_fdpid (vTHX->Ifdpid)
+#define PL_filemode (vTHX->Ifilemode)
+#define PL_firstgv (vTHX->Ifirstgv)
+#define PL_forkprocess (vTHX->Iforkprocess)
+#define PL_formfeed (vTHX->Iformfeed)
+#define PL_formtarget (vTHX->Iformtarget)
+#define PL_generation (vTHX->Igeneration)
+#define PL_gensym (vTHX->Igensym)
+#define PL_gid (vTHX->Igid)
+#define PL_glob_index (vTHX->Iglob_index)
+#define PL_globalstash (vTHX->Iglobalstash)
+#define PL_hash_seed (vTHX->Ihash_seed)
+#define PL_hintgv (vTHX->Ihintgv)
+#define PL_hints (vTHX->Ihints)
+#define PL_hv_fetch_ent_mh (vTHX->Ihv_fetch_ent_mh)
+#define PL_in_clean_all (vTHX->Iin_clean_all)
+#define PL_in_clean_objs (vTHX->Iin_clean_objs)
+#define PL_in_eval (vTHX->Iin_eval)
+#define PL_in_load_module (vTHX->Iin_load_module)
+#define PL_incgv (vTHX->Iincgv)
+#define PL_initav (vTHX->Iinitav)
+#define PL_inplace (vTHX->Iinplace)
+#define PL_isarev (vTHX->Iisarev)
+#define PL_known_layers (vTHX->Iknown_layers)
+#define PL_last_in_gv (vTHX->Ilast_in_gv)
+#define PL_last_swash_hv (vTHX->Ilast_swash_hv)
+#define PL_last_swash_key (vTHX->Ilast_swash_key)
+#define PL_last_swash_klen (vTHX->Ilast_swash_klen)
+#define PL_last_swash_slen (vTHX->Ilast_swash_slen)
+#define PL_last_swash_tmps (vTHX->Ilast_swash_tmps)
+#define PL_lastfd (vTHX->Ilastfd)
+#define PL_lastgotoprobe (vTHX->Ilastgotoprobe)
+#define PL_lastscream (vTHX->Ilastscream)
+#define PL_laststatval (vTHX->Ilaststatval)
+#define PL_laststype (vTHX->Ilaststype)
+#define PL_localizing (vTHX->Ilocalizing)
+#define PL_localpatches (vTHX->Ilocalpatches)
+#define PL_lockhook (vTHX->Ilockhook)
+#define PL_madskills (vTHX->Imadskills)
+#define PL_main_cv (vTHX->Imain_cv)
+#define PL_main_root (vTHX->Imain_root)
+#define PL_main_start (vTHX->Imain_start)
+#define PL_mainstack (vTHX->Imainstack)
+#define PL_markstack (vTHX->Imarkstack)
+#define PL_markstack_max (vTHX->Imarkstack_max)
+#define PL_markstack_ptr (vTHX->Imarkstack_ptr)
+#define PL_max_intro_pending (vTHX->Imax_intro_pending)
+#define PL_maxo (vTHX->Imaxo)
+#define PL_maxscream (vTHX->Imaxscream)
+#define PL_maxsysfd (vTHX->Imaxsysfd)
+#define PL_memory_debug_header (vTHX->Imemory_debug_header)
+#define PL_mess_sv (vTHX->Imess_sv)
+#define PL_min_intro_pending (vTHX->Imin_intro_pending)
+#define PL_minus_E (vTHX->Iminus_E)
+#define PL_minus_F (vTHX->Iminus_F)
+#define PL_minus_a (vTHX->Iminus_a)
+#define PL_minus_c (vTHX->Iminus_c)
+#define PL_minus_l (vTHX->Iminus_l)
+#define PL_minus_n (vTHX->Iminus_n)
+#define PL_minus_p (vTHX->Iminus_p)
+#define PL_modcount (vTHX->Imodcount)
+#define PL_modglobal (vTHX->Imodglobal)
+#define PL_my_cxt_keys (vTHX->Imy_cxt_keys)
+#define PL_my_cxt_list (vTHX->Imy_cxt_list)
+#define PL_my_cxt_size (vTHX->Imy_cxt_size)
+#define PL_na (vTHX->Ina)
+#define PL_nice_chunk (vTHX->Inice_chunk)
+#define PL_nice_chunk_size (vTHX->Inice_chunk_size)
+#define PL_nomemok (vTHX->Inomemok)
+#define PL_numeric_local (vTHX->Inumeric_local)
+#define PL_numeric_name (vTHX->Inumeric_name)
+#define PL_numeric_radix_sv (vTHX->Inumeric_radix_sv)
+#define PL_numeric_standard (vTHX->Inumeric_standard)
+#define PL_ofsgv (vTHX->Iofsgv)
+#define PL_oldname (vTHX->Ioldname)
+#define PL_op (vTHX->Iop)
+#define PL_op_mask (vTHX->Iop_mask)
+#define PL_opfreehook (vTHX->Iopfreehook)
+#define PL_opsave (vTHX->Iopsave)
+#define PL_origalen (vTHX->Iorigalen)
+#define PL_origargc (vTHX->Iorigargc)
+#define PL_origargv (vTHX->Iorigargv)
+#define PL_origenviron (vTHX->Iorigenviron)
+#define PL_origfilename (vTHX->Iorigfilename)
+#define PL_ors_sv (vTHX->Iors_sv)
+#define PL_osname (vTHX->Iosname)
+#define PL_pad_reset_pending (vTHX->Ipad_reset_pending)
+#define PL_padix (vTHX->Ipadix)
+#define PL_padix_floor (vTHX->Ipadix_floor)
+#define PL_parser (vTHX->Iparser)
+#define PL_patchlevel (vTHX->Ipatchlevel)
+#define PL_peepp (vTHX->Ipeepp)
+#define PL_perl_destruct_level (vTHX->Iperl_destruct_level)
+#define PL_perldb (vTHX->Iperldb)
+#define PL_perlio (vTHX->Iperlio)
+#define PL_pidstatus (vTHX->Ipidstatus)
+#define PL_ppid (vTHX->Ippid)
+#define PL_preambleav (vTHX->Ipreambleav)
+#define PL_profiledata (vTHX->Iprofiledata)
+#define PL_psig_name (vTHX->Ipsig_name)
+#define PL_psig_pend (vTHX->Ipsig_pend)
+#define PL_psig_ptr (vTHX->Ipsig_ptr)
+#define PL_ptr_table (vTHX->Iptr_table)
+#define PL_reentrant_buffer (vTHX->Ireentrant_buffer)
+#define PL_reentrant_retint (vTHX->Ireentrant_retint)
+#define PL_reg_state (vTHX->Ireg_state)
+#define PL_regdummy (vTHX->Iregdummy)
+#define PL_regex_pad (vTHX->Iregex_pad)
+#define PL_regex_padav (vTHX->Iregex_padav)
+#define PL_reginterp_cnt (vTHX->Ireginterp_cnt)
+#define PL_registered_mros (vTHX->Iregistered_mros)
+#define PL_regmatch_slab (vTHX->Iregmatch_slab)
+#define PL_regmatch_state (vTHX->Iregmatch_state)
+#define PL_rehash_seed (vTHX->Irehash_seed)
+#define PL_rehash_seed_set (vTHX->Irehash_seed_set)
+#define PL_replgv (vTHX->Ireplgv)
+#define PL_restartop (vTHX->Irestartop)
+#define PL_rs (vTHX->Irs)
+#define PL_runops (vTHX->Irunops)
+#define PL_savebegin (vTHX->Isavebegin)
+#define PL_savestack (vTHX->Isavestack)
+#define PL_savestack_ix (vTHX->Isavestack_ix)
+#define PL_savestack_max (vTHX->Isavestack_max)
+#define PL_sawampersand (vTHX->Isawampersand)
+#define PL_scopestack (vTHX->Iscopestack)
+#define PL_scopestack_ix (vTHX->Iscopestack_ix)
+#define PL_scopestack_max (vTHX->Iscopestack_max)
+#define PL_scopestack_name (vTHX->Iscopestack_name)
+#define PL_screamfirst (vTHX->Iscreamfirst)
+#define PL_screamnext (vTHX->Iscreamnext)
+#define PL_secondgv (vTHX->Isecondgv)
+#define PL_sharehook (vTHX->Isharehook)
+#define PL_sig_pending (vTHX->Isig_pending)
+#define PL_sighandlerp (vTHX->Isighandlerp)
+#define PL_signals (vTHX->Isignals)
+#define PL_slab_count (vTHX->Islab_count)
+#define PL_slabs (vTHX->Islabs)
+#define PL_sort_RealCmp (vTHX->Isort_RealCmp)
+#define PL_sortcop (vTHX->Isortcop)
+#define PL_sortstash (vTHX->Isortstash)
+#define PL_splitstr (vTHX->Isplitstr)
+#define PL_srand_called (vTHX->Isrand_called)
+#define PL_stack_base (vTHX->Istack_base)
+#define PL_stack_max (vTHX->Istack_max)
+#define PL_stack_sp (vTHX->Istack_sp)
+#define PL_start_env (vTHX->Istart_env)
+#define PL_stashcache (vTHX->Istashcache)
+#define PL_statbuf (vTHX->Istatbuf)
+#define PL_statcache (vTHX->Istatcache)
+#define PL_statgv (vTHX->Istatgv)
+#define PL_statname (vTHX->Istatname)
+#define PL_statusvalue (vTHX->Istatusvalue)
+#define PL_statusvalue_posix (vTHX->Istatusvalue_posix)
+#define PL_statusvalue_vms (vTHX->Istatusvalue_vms)
+#define PL_stderrgv (vTHX->Istderrgv)
+#define PL_stdingv (vTHX->Istdingv)
+#define PL_strtab (vTHX->Istrtab)
+#define PL_sub_generation (vTHX->Isub_generation)
+#define PL_subline (vTHX->Isubline)
+#define PL_subname (vTHX->Isubname)
+#define PL_sv_arenaroot (vTHX->Isv_arenaroot)
+#define PL_sv_count (vTHX->Isv_count)
+#define PL_sv_no (vTHX->Isv_no)
+#define PL_sv_objcount (vTHX->Isv_objcount)
+#define PL_sv_root (vTHX->Isv_root)
+#define PL_sv_serial (vTHX->Isv_serial)
+#define PL_sv_undef (vTHX->Isv_undef)
+#define PL_sv_yes (vTHX->Isv_yes)
+#define PL_sys_intern (vTHX->Isys_intern)
+#define PL_taint_warn (vTHX->Itaint_warn)
+#define PL_tainted (vTHX->Itainted)
+#define PL_tainting (vTHX->Itainting)
+#define PL_threadhook (vTHX->Ithreadhook)
+#define PL_timesbuf (vTHX->Itimesbuf)
+#define PL_tmps_floor (vTHX->Itmps_floor)
+#define PL_tmps_ix (vTHX->Itmps_ix)
+#define PL_tmps_max (vTHX->Itmps_max)
+#define PL_tmps_stack (vTHX->Itmps_stack)
+#define PL_top_env (vTHX->Itop_env)
+#define PL_toptarget (vTHX->Itoptarget)
+#define PL_uid (vTHX->Iuid)
+#define PL_unicode (vTHX->Iunicode)
+#define PL_unitcheckav (vTHX->Iunitcheckav)
+#define PL_unitcheckav_save (vTHX->Iunitcheckav_save)
+#define PL_unlockhook (vTHX->Iunlockhook)
+#define PL_unsafe (vTHX->Iunsafe)
+#define PL_utf8_X_L (vTHX->Iutf8_X_L)
+#define PL_utf8_X_LV (vTHX->Iutf8_X_LV)
+#define PL_utf8_X_LVT (vTHX->Iutf8_X_LVT)
+#define PL_utf8_X_LV_LVT_V (vTHX->Iutf8_X_LV_LVT_V)
+#define PL_utf8_X_T (vTHX->Iutf8_X_T)
+#define PL_utf8_X_V (vTHX->Iutf8_X_V)
+#define PL_utf8_X_begin (vTHX->Iutf8_X_begin)
+#define PL_utf8_X_extend (vTHX->Iutf8_X_extend)
+#define PL_utf8_X_non_hangul (vTHX->Iutf8_X_non_hangul)
+#define PL_utf8_X_prepend (vTHX->Iutf8_X_prepend)
+#define PL_utf8_alnum (vTHX->Iutf8_alnum)
+#define PL_utf8_alpha (vTHX->Iutf8_alpha)
+#define PL_utf8_ascii (vTHX->Iutf8_ascii)
+#define PL_utf8_cntrl (vTHX->Iutf8_cntrl)
+#define PL_utf8_digit (vTHX->Iutf8_digit)
+#define PL_utf8_graph (vTHX->Iutf8_graph)
+#define PL_utf8_idcont (vTHX->Iutf8_idcont)
+#define PL_utf8_idstart (vTHX->Iutf8_idstart)
+#define PL_utf8_lower (vTHX->Iutf8_lower)
+#define PL_utf8_mark (vTHX->Iutf8_mark)
+#define PL_utf8_perl_space (vTHX->Iutf8_perl_space)
+#define PL_utf8_perl_word (vTHX->Iutf8_perl_word)
+#define PL_utf8_posix_digit (vTHX->Iutf8_posix_digit)
+#define PL_utf8_print (vTHX->Iutf8_print)
+#define PL_utf8_punct (vTHX->Iutf8_punct)
+#define PL_utf8_space (vTHX->Iutf8_space)
+#define PL_utf8_tofold (vTHX->Iutf8_tofold)
+#define PL_utf8_tolower (vTHX->Iutf8_tolower)
+#define PL_utf8_totitle (vTHX->Iutf8_totitle)
+#define PL_utf8_toupper (vTHX->Iutf8_toupper)
+#define PL_utf8_upper (vTHX->Iutf8_upper)
+#define PL_utf8_xdigit (vTHX->Iutf8_xdigit)
+#define PL_utf8cache (vTHX->Iutf8cache)
+#define PL_utf8locale (vTHX->Iutf8locale)
+#define PL_warnhook (vTHX->Iwarnhook)
+#define PL_watchaddr (vTHX->Iwatchaddr)
+#define PL_watchok (vTHX->Iwatchok)
+#define PL_xmlfp (vTHX->Ixmlfp)
+
+#else /* !MULTIPLICITY */
+
+/* case 1 above */
+
+#define PL_IArgv PL_Argv
+#define PL_ICmd PL_Cmd
+#define PL_IDBcv PL_DBcv
+#define PL_IDBgv PL_DBgv
+#define PL_IDBline PL_DBline
+#define PL_IDBsignal PL_DBsignal
+#define PL_IDBsingle PL_DBsingle
+#define PL_IDBsub PL_DBsub
+#define PL_IDBtrace PL_DBtrace
+#define PL_IDir PL_Dir
+#define PL_IEnv PL_Env
+#define PL_ILIO PL_LIO
+#define PL_IMem PL_Mem
+#define PL_IMemParse PL_MemParse
+#define PL_IMemShared PL_MemShared
+#define PL_IOpPtr PL_OpPtr
+#define PL_IOpSlab PL_OpSlab
+#define PL_IOpSpace PL_OpSpace
+#define PL_IProc PL_Proc
+#define PL_ISock PL_Sock
+#define PL_IStdIO PL_StdIO
+#define PL_ISv PL_Sv
+#define PL_IXpv PL_Xpv
+#define PL_Iamagic_generation PL_amagic_generation
+#define PL_Ian PL_an
+#define PL_Iargvgv PL_argvgv
+#define PL_Iargvout_stack PL_argvout_stack
+#define PL_Iargvoutgv PL_argvoutgv
+#define PL_Ibasetime PL_basetime
+#define PL_Ibeginav PL_beginav
+#define PL_Ibeginav_save PL_beginav_save
+#define PL_Ibody_arenas PL_body_arenas
+#define PL_Ibody_roots PL_body_roots
+#define PL_Ibodytarget PL_bodytarget
+#define PL_Ibreakable_sub_gen PL_breakable_sub_gen
+#define PL_Icheckav PL_checkav
+#define PL_Icheckav_save PL_checkav_save
+#define PL_Ichopset PL_chopset
+#define PL_Iclocktick PL_clocktick
+#define PL_Icollation_ix PL_collation_ix
+#define PL_Icollation_name PL_collation_name
+#define PL_Icollation_standard PL_collation_standard
+#define PL_Icollxfrm_base PL_collxfrm_base
+#define PL_Icollxfrm_mult PL_collxfrm_mult
+#define PL_Icolors PL_colors
+#define PL_Icolorset PL_colorset
+#define PL_Icompcv PL_compcv
+#define PL_Icompiling PL_compiling
+#define PL_Icomppad PL_comppad
+#define PL_Icomppad_name PL_comppad_name
+#define PL_Icomppad_name_fill PL_comppad_name_fill
+#define PL_Icomppad_name_floor PL_comppad_name_floor
+#define PL_Icop_seqmax PL_cop_seqmax
+#define PL_Icryptseen PL_cryptseen
+#define PL_Icurcop PL_curcop
+#define PL_Icurcopdb PL_curcopdb
+#define PL_Icurpad PL_curpad
+#define PL_Icurpm PL_curpm
+#define PL_Icurstack PL_curstack
+#define PL_Icurstackinfo PL_curstackinfo
+#define PL_Icurstash PL_curstash
+#define PL_Icurstname PL_curstname
+#define PL_Icustom_op_descs PL_custom_op_descs
+#define PL_Icustom_op_names PL_custom_op_names
+#define PL_Icv_has_eval PL_cv_has_eval
+#define PL_Idbargs PL_dbargs
+#define PL_Idebstash PL_debstash
+#define PL_Idebug PL_debug
+#define PL_Idebug_pad PL_debug_pad
+#define PL_Idef_layerlist PL_def_layerlist
+#define PL_Idefgv PL_defgv
+#define PL_Idefoutgv PL_defoutgv
+#define PL_Idefstash PL_defstash
+#define PL_Idelaymagic PL_delaymagic
+#define PL_Idestroyhook PL_destroyhook
+#define PL_Idiehook PL_diehook
+#define PL_Idirty PL_dirty
+#define PL_Idoextract PL_doextract
+#define PL_Idoswitches PL_doswitches
+#define PL_Idowarn PL_dowarn
+#define PL_Idumper_fd PL_dumper_fd
+#define PL_Idumpindent PL_dumpindent
+#define PL_Ie_script PL_e_script
+#define PL_Iefloatbuf PL_efloatbuf
+#define PL_Iefloatsize PL_efloatsize
+#define PL_Iegid PL_egid
+#define PL_Iencoding PL_encoding
+#define PL_Iendav PL_endav
+#define PL_Ienvgv PL_envgv
+#define PL_Ierrgv PL_errgv
+#define PL_Ierrors PL_errors
+#define PL_Ieuid PL_euid
+#define PL_Ieval_root PL_eval_root
+#define PL_Ieval_start PL_eval_start
+#define PL_Ievalseq PL_evalseq
+#define PL_Iexit_flags PL_exit_flags
+#define PL_Iexitlist PL_exitlist
+#define PL_Iexitlistlen PL_exitlistlen
+#define PL_Ifdpid PL_fdpid
+#define PL_Ifilemode PL_filemode
+#define PL_Ifirstgv PL_firstgv
+#define PL_Iforkprocess PL_forkprocess
+#define PL_Iformfeed PL_formfeed
+#define PL_Iformtarget PL_formtarget
+#define PL_Igeneration PL_generation
+#define PL_Igensym PL_gensym
+#define PL_Igid PL_gid
+#define PL_Iglob_index PL_glob_index
+#define PL_Iglobalstash PL_globalstash
+#define PL_Ihash_seed PL_hash_seed
+#define PL_Ihintgv PL_hintgv
+#define PL_Ihints PL_hints
+#define PL_Ihv_fetch_ent_mh PL_hv_fetch_ent_mh
+#define PL_Iin_clean_all PL_in_clean_all
+#define PL_Iin_clean_objs PL_in_clean_objs
+#define PL_Iin_eval PL_in_eval
+#define PL_Iin_load_module PL_in_load_module
+#define PL_Iincgv PL_incgv
+#define PL_Iinitav PL_initav
+#define PL_Iinplace PL_inplace
+#define PL_Iisarev PL_isarev
+#define PL_Iknown_layers PL_known_layers
+#define PL_Ilast_in_gv PL_last_in_gv
+#define PL_Ilast_swash_hv PL_last_swash_hv
+#define PL_Ilast_swash_key PL_last_swash_key
+#define PL_Ilast_swash_klen PL_last_swash_klen
+#define PL_Ilast_swash_slen PL_last_swash_slen
+#define PL_Ilast_swash_tmps PL_last_swash_tmps
+#define PL_Ilastfd PL_lastfd
+#define PL_Ilastgotoprobe PL_lastgotoprobe
+#define PL_Ilastscream PL_lastscream
+#define PL_Ilaststatval PL_laststatval
+#define PL_Ilaststype PL_laststype
+#define PL_Ilocalizing PL_localizing
+#define PL_Ilocalpatches PL_localpatches
+#define PL_Ilockhook PL_lockhook
+#define PL_Imadskills PL_madskills
+#define PL_Imain_cv PL_main_cv
+#define PL_Imain_root PL_main_root
+#define PL_Imain_start PL_main_start
+#define PL_Imainstack PL_mainstack
+#define PL_Imarkstack PL_markstack
+#define PL_Imarkstack_max PL_markstack_max
+#define PL_Imarkstack_ptr PL_markstack_ptr
+#define PL_Imax_intro_pending PL_max_intro_pending
+#define PL_Imaxo PL_maxo
+#define PL_Imaxscream PL_maxscream
+#define PL_Imaxsysfd PL_maxsysfd
+#define PL_Imemory_debug_header PL_memory_debug_header
+#define PL_Imess_sv PL_mess_sv
+#define PL_Imin_intro_pending PL_min_intro_pending
+#define PL_Iminus_E PL_minus_E
+#define PL_Iminus_F PL_minus_F
+#define PL_Iminus_a PL_minus_a
+#define PL_Iminus_c PL_minus_c
+#define PL_Iminus_l PL_minus_l
+#define PL_Iminus_n PL_minus_n
+#define PL_Iminus_p PL_minus_p
+#define PL_Imodcount PL_modcount
+#define PL_Imodglobal PL_modglobal
+#define PL_Imy_cxt_keys PL_my_cxt_keys
+#define PL_Imy_cxt_list PL_my_cxt_list
+#define PL_Imy_cxt_size PL_my_cxt_size
+#define PL_Ina PL_na
+#define PL_Inice_chunk PL_nice_chunk
+#define PL_Inice_chunk_size PL_nice_chunk_size
+#define PL_Inomemok PL_nomemok
+#define PL_Inumeric_local PL_numeric_local
+#define PL_Inumeric_name PL_numeric_name
+#define PL_Inumeric_radix_sv PL_numeric_radix_sv
+#define PL_Inumeric_standard PL_numeric_standard
+#define PL_Iofsgv PL_ofsgv
+#define PL_Ioldname PL_oldname
+#define PL_Iop PL_op
+#define PL_Iop_mask PL_op_mask
+#define PL_Iopfreehook PL_opfreehook
+#define PL_Iopsave PL_opsave
+#define PL_Iorigalen PL_origalen
+#define PL_Iorigargc PL_origargc
+#define PL_Iorigargv PL_origargv
+#define PL_Iorigenviron PL_origenviron
+#define PL_Iorigfilename PL_origfilename
+#define PL_Iors_sv PL_ors_sv
+#define PL_Iosname PL_osname
+#define PL_Ipad_reset_pending PL_pad_reset_pending
+#define PL_Ipadix PL_padix
+#define PL_Ipadix_floor PL_padix_floor
+#define PL_Iparser PL_parser
+#define PL_Ipatchlevel PL_patchlevel
+#define PL_Ipeepp PL_peepp
+#define PL_Iperl_destruct_level PL_perl_destruct_level
+#define PL_Iperldb PL_perldb
+#define PL_Iperlio PL_perlio
+#define PL_Ipidstatus PL_pidstatus
+#define PL_Ippid PL_ppid
+#define PL_Ipreambleav PL_preambleav
+#define PL_Iprofiledata PL_profiledata
+#define PL_Ipsig_name PL_psig_name
+#define PL_Ipsig_pend PL_psig_pend
+#define PL_Ipsig_ptr PL_psig_ptr
+#define PL_Iptr_table PL_ptr_table
+#define PL_Ireentrant_buffer PL_reentrant_buffer
+#define PL_Ireentrant_retint PL_reentrant_retint
+#define PL_Ireg_state PL_reg_state
+#define PL_Iregdummy PL_regdummy
+#define PL_Iregex_pad PL_regex_pad
+#define PL_Iregex_padav PL_regex_padav
+#define PL_Ireginterp_cnt PL_reginterp_cnt
+#define PL_Iregistered_mros PL_registered_mros
+#define PL_Iregmatch_slab PL_regmatch_slab
+#define PL_Iregmatch_state PL_regmatch_state
+#define PL_Irehash_seed PL_rehash_seed
+#define PL_Irehash_seed_set PL_rehash_seed_set
+#define PL_Ireplgv PL_replgv
+#define PL_Irestartop PL_restartop
+#define PL_Irs PL_rs
+#define PL_Irunops PL_runops
+#define PL_Isavebegin PL_savebegin
+#define PL_Isavestack PL_savestack
+#define PL_Isavestack_ix PL_savestack_ix
+#define PL_Isavestack_max PL_savestack_max
+#define PL_Isawampersand PL_sawampersand
+#define PL_Iscopestack PL_scopestack
+#define PL_Iscopestack_ix PL_scopestack_ix
+#define PL_Iscopestack_max PL_scopestack_max
+#define PL_Iscopestack_name PL_scopestack_name
+#define PL_Iscreamfirst PL_screamfirst
+#define PL_Iscreamnext PL_screamnext
+#define PL_Isecondgv PL_secondgv
+#define PL_Isharehook PL_sharehook
+#define PL_Isig_pending PL_sig_pending
+#define PL_Isighandlerp PL_sighandlerp
+#define PL_Isignals PL_signals
+#define PL_Islab_count PL_slab_count
+#define PL_Islabs PL_slabs
+#define PL_Isort_RealCmp PL_sort_RealCmp
+#define PL_Isortcop PL_sortcop
+#define PL_Isortstash PL_sortstash
+#define PL_Isplitstr PL_splitstr
+#define PL_Isrand_called PL_srand_called
+#define PL_Istack_base PL_stack_base
+#define PL_Istack_max PL_stack_max
+#define PL_Istack_sp PL_stack_sp
+#define PL_Istart_env PL_start_env
+#define PL_Istashcache PL_stashcache
+#define PL_Istatbuf PL_statbuf
+#define PL_Istatcache PL_statcache
+#define PL_Istatgv PL_statgv
+#define PL_Istatname PL_statname
+#define PL_Istatusvalue PL_statusvalue
+#define PL_Istatusvalue_posix PL_statusvalue_posix
+#define PL_Istatusvalue_vms PL_statusvalue_vms
+#define PL_Istderrgv PL_stderrgv
+#define PL_Istdingv PL_stdingv
+#define PL_Istrtab PL_strtab
+#define PL_Isub_generation PL_sub_generation
+#define PL_Isubline PL_subline
+#define PL_Isubname PL_subname
+#define PL_Isv_arenaroot PL_sv_arenaroot
+#define PL_Isv_count PL_sv_count
+#define PL_Isv_no PL_sv_no
+#define PL_Isv_objcount PL_sv_objcount
+#define PL_Isv_root PL_sv_root
+#define PL_Isv_serial PL_sv_serial
+#define PL_Isv_undef PL_sv_undef
+#define PL_Isv_yes PL_sv_yes
+#define PL_Isys_intern PL_sys_intern
+#define PL_Itaint_warn PL_taint_warn
+#define PL_Itainted PL_tainted
+#define PL_Itainting PL_tainting
+#define PL_Ithreadhook PL_threadhook
+#define PL_Itimesbuf PL_timesbuf
+#define PL_Itmps_floor PL_tmps_floor
+#define PL_Itmps_ix PL_tmps_ix
+#define PL_Itmps_max PL_tmps_max
+#define PL_Itmps_stack PL_tmps_stack
+#define PL_Itop_env PL_top_env
+#define PL_Itoptarget PL_toptarget
+#define PL_Iuid PL_uid
+#define PL_Iunicode PL_unicode
+#define PL_Iunitcheckav PL_unitcheckav
+#define PL_Iunitcheckav_save PL_unitcheckav_save
+#define PL_Iunlockhook PL_unlockhook
+#define PL_Iunsafe PL_unsafe
+#define PL_Iutf8_X_L PL_utf8_X_L
+#define PL_Iutf8_X_LV PL_utf8_X_LV
+#define PL_Iutf8_X_LVT PL_utf8_X_LVT
+#define PL_Iutf8_X_LV_LVT_V PL_utf8_X_LV_LVT_V
+#define PL_Iutf8_X_T PL_utf8_X_T
+#define PL_Iutf8_X_V PL_utf8_X_V
+#define PL_Iutf8_X_begin PL_utf8_X_begin
+#define PL_Iutf8_X_extend PL_utf8_X_extend
+#define PL_Iutf8_X_non_hangul PL_utf8_X_non_hangul
+#define PL_Iutf8_X_prepend PL_utf8_X_prepend
+#define PL_Iutf8_alnum PL_utf8_alnum
+#define PL_Iutf8_alpha PL_utf8_alpha
+#define PL_Iutf8_ascii PL_utf8_ascii
+#define PL_Iutf8_cntrl PL_utf8_cntrl
+#define PL_Iutf8_digit PL_utf8_digit
+#define PL_Iutf8_graph PL_utf8_graph
+#define PL_Iutf8_idcont PL_utf8_idcont
+#define PL_Iutf8_idstart PL_utf8_idstart
+#define PL_Iutf8_lower PL_utf8_lower
+#define PL_Iutf8_mark PL_utf8_mark
+#define PL_Iutf8_perl_space PL_utf8_perl_space
+#define PL_Iutf8_perl_word PL_utf8_perl_word
+#define PL_Iutf8_posix_digit PL_utf8_posix_digit
+#define PL_Iutf8_print PL_utf8_print
+#define PL_Iutf8_punct PL_utf8_punct
+#define PL_Iutf8_space PL_utf8_space
+#define PL_Iutf8_tofold PL_utf8_tofold
+#define PL_Iutf8_tolower PL_utf8_tolower
+#define PL_Iutf8_totitle PL_utf8_totitle
+#define PL_Iutf8_toupper PL_utf8_toupper
+#define PL_Iutf8_upper PL_utf8_upper
+#define PL_Iutf8_xdigit PL_utf8_xdigit
+#define PL_Iutf8cache PL_utf8cache
+#define PL_Iutf8locale PL_utf8locale
+#define PL_Iwarnhook PL_warnhook
+#define PL_Iwatchaddr PL_watchaddr
+#define PL_Iwatchok PL_watchok
+#define PL_Ixmlfp PL_xmlfp
+
+
+#endif /* MULTIPLICITY */
+
+#if defined(PERL_GLOBAL_STRUCT)
+
+#define PL_No (my_vars->GNo)
+#define PL_GNo (my_vars->GNo)
+#define PL_Yes (my_vars->GYes)
+#define PL_GYes (my_vars->GYes)
+#define PL_appctx (my_vars->Gappctx)
+#define PL_Gappctx (my_vars->Gappctx)
+#define PL_check (my_vars->Gcheck)
+#define PL_Gcheck (my_vars->Gcheck)
+#define PL_csighandlerp (my_vars->Gcsighandlerp)
+#define PL_Gcsighandlerp (my_vars->Gcsighandlerp)
+#define PL_curinterp (my_vars->Gcurinterp)
+#define PL_Gcurinterp (my_vars->Gcurinterp)
+#define PL_do_undump (my_vars->Gdo_undump)
+#define PL_Gdo_undump (my_vars->Gdo_undump)
+#define PL_dollarzero_mutex (my_vars->Gdollarzero_mutex)
+#define PL_Gdollarzero_mutex (my_vars->Gdollarzero_mutex)
+#define PL_fold_locale (my_vars->Gfold_locale)
+#define PL_Gfold_locale (my_vars->Gfold_locale)
+#define PL_global_struct_size (my_vars->Gglobal_struct_size)
+#define PL_Gglobal_struct_size (my_vars->Gglobal_struct_size)
+#define PL_hexdigit (my_vars->Ghexdigit)
+#define PL_Ghexdigit (my_vars->Ghexdigit)
+#define PL_hints_mutex (my_vars->Ghints_mutex)
+#define PL_Ghints_mutex (my_vars->Ghints_mutex)
+#define PL_interp_size (my_vars->Ginterp_size)
+#define PL_Ginterp_size (my_vars->Ginterp_size)
+#define PL_interp_size_5_10_0 (my_vars->Ginterp_size_5_10_0)
+#define PL_Ginterp_size_5_10_0 (my_vars->Ginterp_size_5_10_0)
+#define PL_keyword_plugin (my_vars->Gkeyword_plugin)
+#define PL_Gkeyword_plugin (my_vars->Gkeyword_plugin)
+#define PL_malloc_mutex (my_vars->Gmalloc_mutex)
+#define PL_Gmalloc_mutex (my_vars->Gmalloc_mutex)
+#define PL_mmap_page_size (my_vars->Gmmap_page_size)
+#define PL_Gmmap_page_size (my_vars->Gmmap_page_size)
+#define PL_my_ctx_mutex (my_vars->Gmy_ctx_mutex)
+#define PL_Gmy_ctx_mutex (my_vars->Gmy_ctx_mutex)
+#define PL_my_cxt_index (my_vars->Gmy_cxt_index)
+#define PL_Gmy_cxt_index (my_vars->Gmy_cxt_index)
+#define PL_op_mutex (my_vars->Gop_mutex)
+#define PL_Gop_mutex (my_vars->Gop_mutex)
+#define PL_op_seq (my_vars->Gop_seq)
+#define PL_Gop_seq (my_vars->Gop_seq)
+#define PL_op_sequence (my_vars->Gop_sequence)
+#define PL_Gop_sequence (my_vars->Gop_sequence)
+#define PL_patleave (my_vars->Gpatleave)
+#define PL_Gpatleave (my_vars->Gpatleave)
+#define PL_perlio_debug_fd (my_vars->Gperlio_debug_fd)
+#define PL_Gperlio_debug_fd (my_vars->Gperlio_debug_fd)
+#define PL_perlio_fd_refcnt (my_vars->Gperlio_fd_refcnt)
+#define PL_Gperlio_fd_refcnt (my_vars->Gperlio_fd_refcnt)
+#define PL_perlio_fd_refcnt_size (my_vars->Gperlio_fd_refcnt_size)
+#define PL_Gperlio_fd_refcnt_size (my_vars->Gperlio_fd_refcnt_size)
+#define PL_perlio_mutex (my_vars->Gperlio_mutex)
+#define PL_Gperlio_mutex (my_vars->Gperlio_mutex)
+#define PL_ppaddr (my_vars->Gppaddr)
+#define PL_Gppaddr (my_vars->Gppaddr)
+#define PL_revision (my_vars->Grevision)
+#define PL_Grevision (my_vars->Grevision)
+#define PL_runops_dbg (my_vars->Grunops_dbg)
+#define PL_Grunops_dbg (my_vars->Grunops_dbg)
+#define PL_runops_std (my_vars->Grunops_std)
+#define PL_Grunops_std (my_vars->Grunops_std)
+#define PL_sh_path (my_vars->Gsh_path)
+#define PL_Gsh_path (my_vars->Gsh_path)
+#define PL_sig_defaulting (my_vars->Gsig_defaulting)
+#define PL_Gsig_defaulting (my_vars->Gsig_defaulting)
+#define PL_sig_handlers_initted (my_vars->Gsig_handlers_initted)
+#define PL_Gsig_handlers_initted (my_vars->Gsig_handlers_initted)
+#define PL_sig_ignoring (my_vars->Gsig_ignoring)
+#define PL_Gsig_ignoring (my_vars->Gsig_ignoring)
+#define PL_sig_sv (my_vars->Gsig_sv)
+#define PL_Gsig_sv (my_vars->Gsig_sv)
+#define PL_sig_trapped (my_vars->Gsig_trapped)
+#define PL_Gsig_trapped (my_vars->Gsig_trapped)
+#define PL_sigfpe_saved (my_vars->Gsigfpe_saved)
+#define PL_Gsigfpe_saved (my_vars->Gsigfpe_saved)
+#define PL_subversion (my_vars->Gsubversion)
+#define PL_Gsubversion (my_vars->Gsubversion)
+#define PL_sv_placeholder (my_vars->Gsv_placeholder)
+#define PL_Gsv_placeholder (my_vars->Gsv_placeholder)
+#define PL_thr_key (my_vars->Gthr_key)
+#define PL_Gthr_key (my_vars->Gthr_key)
+#define PL_timesbase (my_vars->Gtimesbase)
+#define PL_Gtimesbase (my_vars->Gtimesbase)
+#define PL_use_safe_putenv (my_vars->Guse_safe_putenv)
+#define PL_Guse_safe_putenv (my_vars->Guse_safe_putenv)
+#define PL_version (my_vars->Gversion)
+#define PL_Gversion (my_vars->Gversion)
+#define PL_veto_cleanup (my_vars->Gveto_cleanup)
+#define PL_Gveto_cleanup (my_vars->Gveto_cleanup)
+#define PL_watch_pvx (my_vars->Gwatch_pvx)
+#define PL_Gwatch_pvx (my_vars->Gwatch_pvx)
+
+#else /* !PERL_GLOBAL_STRUCT */
+
+#define PL_GNo PL_No
+#define PL_GYes PL_Yes
+#define PL_Gappctx PL_appctx
+#define PL_Gcheck PL_check
+#define PL_Gcsighandlerp PL_csighandlerp
+#define PL_Gcurinterp PL_curinterp
+#define PL_Gdo_undump PL_do_undump
+#define PL_Gdollarzero_mutex PL_dollarzero_mutex
+#define PL_Gfold_locale PL_fold_locale
+#define PL_Gglobal_struct_size PL_global_struct_size
+#define PL_Ghexdigit PL_hexdigit
+#define PL_Ghints_mutex PL_hints_mutex
+#define PL_Ginterp_size PL_interp_size
+#define PL_Ginterp_size_5_10_0 PL_interp_size_5_10_0
+#define PL_Gkeyword_plugin PL_keyword_plugin
+#define PL_Gmalloc_mutex PL_malloc_mutex
+#define PL_Gmmap_page_size PL_mmap_page_size
+#define PL_Gmy_ctx_mutex PL_my_ctx_mutex
+#define PL_Gmy_cxt_index PL_my_cxt_index
+#define PL_Gop_mutex PL_op_mutex
+#define PL_Gop_seq PL_op_seq
+#define PL_Gop_sequence PL_op_sequence
+#define PL_Gpatleave PL_patleave
+#define PL_Gperlio_debug_fd PL_perlio_debug_fd
+#define PL_Gperlio_fd_refcnt PL_perlio_fd_refcnt
+#define PL_Gperlio_fd_refcnt_size PL_perlio_fd_refcnt_size
+#define PL_Gperlio_mutex PL_perlio_mutex
+#define PL_Gppaddr PL_ppaddr
+#define PL_Grevision PL_revision
+#define PL_Grunops_dbg PL_runops_dbg
+#define PL_Grunops_std PL_runops_std
+#define PL_Gsh_path PL_sh_path
+#define PL_Gsig_defaulting PL_sig_defaulting
+#define PL_Gsig_handlers_initted PL_sig_handlers_initted
+#define PL_Gsig_ignoring PL_sig_ignoring
+#define PL_Gsig_sv PL_sig_sv
+#define PL_Gsig_trapped PL_sig_trapped
+#define PL_Gsigfpe_saved PL_sigfpe_saved
+#define PL_Gsubversion PL_subversion
+#define PL_Gsv_placeholder PL_sv_placeholder
+#define PL_Gthr_key PL_thr_key
+#define PL_Gtimesbase PL_timesbase
+#define PL_Guse_safe_putenv PL_use_safe_putenv
+#define PL_Gversion PL_version
+#define PL_Gveto_cleanup PL_veto_cleanup
+#define PL_Gwatch_pvx PL_watch_pvx
+
+#endif /* PERL_GLOBAL_STRUCT */
+
+#ifdef PERL_POLLUTE /* disabled by default in 5.6.0 */
+
+#define DBassertion PL_DBassertion
+#define DBsingle PL_DBsingle
+#define DBsub PL_DBsub
+#define compiling PL_compiling
+#define curcop PL_curcop
+#define curstash PL_curstash
+#define debstash PL_debstash
+#define defgv PL_defgv
+#define diehook PL_diehook
+#define dirty PL_dirty
+#define dowarn PL_dowarn
+#define errgv PL_errgv
+#define na PL_na
+#define no_modify PL_no_modify
+#define perl_destruct_level PL_perl_destruct_level
+#define perldb PL_perldb
+#define ppaddr PL_ppaddr
+#define rsfp PL_rsfp
+#define rsfp_filters PL_rsfp_filters
+#define stack_base PL_stack_base
+#define stack_sp PL_stack_sp
+#define stdingv PL_stdingv
+#define sv_arenaroot PL_sv_arenaroot
+#define sv_no PL_sv_no
+#define sv_undef PL_sv_undef
+#define sv_yes PL_sv_yes
+#define tainted PL_tainted
+#define tainting PL_tainting
+
+#endif /* PERL_POLLUTE */
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/fakesdio.h b/Master/tlpkg/tlperl/lib/CORE/fakesdio.h
new file mode 100644
index 00000000000..614438096e0
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/fakesdio.h
@@ -0,0 +1,133 @@
+/* fakestdio.h
+ *
+ * Copyright (C) 2000, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * This is "source level" stdio compatibility mode.
+ * We try and #define stdio functions in terms of PerlIO.
+ */
+#define _CANNOT "CANNOT"
+#undef FILE
+#define FILE PerlIO
+#undef clearerr
+#undef fclose
+#undef fdopen
+#undef feof
+#undef ferror
+#undef fflush
+#undef fgetc
+#undef fgetpos
+#undef fgets
+#undef fileno
+#undef flockfile
+#undef fopen
+#undef fprintf
+#undef fputc
+#undef fputs
+#undef fread
+#undef freopen
+#undef fscanf
+#undef fseek
+#undef fsetpos
+#undef ftell
+#undef ftrylockfile
+#undef funlockfile
+#undef fwrite
+#undef getc
+#undef getc_unlocked
+#undef getw
+#undef pclose
+#undef popen
+#undef putc
+#undef putc_unlocked
+#undef putw
+#undef rewind
+#undef setbuf
+#undef setvbuf
+#undef stderr
+#undef stdin
+#undef stdout
+#undef tmpfile
+#undef ungetc
+#undef vfprintf
+#undef printf
+
+/* printf used to live in perl.h like this - more sophisticated
+ than the rest
+ */
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
+#define printf(fmt,args...) PerlIO_stdoutf(fmt,##args)
+#else
+#define printf PerlIO_stdoutf
+#endif
+
+#define fprintf PerlIO_printf
+#define stdin PerlIO_stdin()
+#define stdout PerlIO_stdout()
+#define stderr PerlIO_stderr()
+#define tmpfile() PerlIO_tmpfile()
+#define fclose(f) PerlIO_close(f)
+#define fflush(f) PerlIO_flush(f)
+#define fopen(p,m) PerlIO_open(p,m)
+#define vfprintf(f,fmt,a) PerlIO_vprintf(f,fmt,a)
+#define fgetc(f) PerlIO_getc(f)
+#define fputc(c,f) PerlIO_putc(f,c)
+#define fputs(s,f) PerlIO_puts(f,s)
+#define getc(f) PerlIO_getc(f)
+#define getc_unlocked(f) PerlIO_getc(f)
+#define putc(c,f) PerlIO_putc(f,c)
+#define putc_unlocked(c,f) PerlIO_putc(c,f)
+#define ungetc(c,f) PerlIO_ungetc(f,c)
+#if 0
+/* return values of read/write need work */
+#define fread(b,s,c,f) PerlIO_read(f,b,(s*c))
+#define fwrite(b,s,c,f) PerlIO_write(f,b,(s*c))
+#else
+#define fread(b,s,c,f) _CANNOT fread
+#define fwrite(b,s,c,f) _CANNOT fwrite
+#endif
+#define fseek(f,o,w) PerlIO_seek(f,o,w)
+#define ftell(f) PerlIO_tell(f)
+#define rewind(f) PerlIO_rewind(f)
+#define clearerr(f) PerlIO_clearerr(f)
+#define feof(f) PerlIO_eof(f)
+#define ferror(f) PerlIO_error(f)
+#define fdopen(fd,p) PerlIO_fdopen(fd,p)
+#define fileno(f) PerlIO_fileno(f)
+#define popen(c,m) my_popen(c,m)
+#define pclose(f) my_pclose(f)
+
+#define fsetpos(f,p) _CANNOT _fsetpos_
+#define fgetpos(f,p) _CANNOT _fgetpos_
+
+#define __filbuf(f) _CANNOT __filbuf_
+#define _filbuf(f) _CANNOT _filbuf_
+#define __flsbuf(c,f) _CANNOT __flsbuf_
+#define _flsbuf(c,f) _CANNOT _flsbuf_
+#define getw(f) _CANNOT _getw_
+#define putw(v,f) _CANNOT _putw_
+#if SFIO_VERSION < 20000101L
+#define flockfile(f) _CANNOT _flockfile_
+#define ftrylockfile(f) _CANNOT _ftrylockfile_
+#define funlockfile(f) _CANNOT _funlockfile_
+#endif
+#define freopen(p,m,f) _CANNOT _freopen_
+#define setbuf(f,b) _CANNOT _setbuf_
+#define setvbuf(f,b,x,s) _CANNOT _setvbuf_
+#define fscanf _CANNOT _fscanf_
+#define fgets(s,n,f) _CANNOT _fgets_
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/fakethr.h b/Master/tlpkg/tlperl/lib/CORE/fakethr.h
new file mode 100644
index 00000000000..7c82aa6d691
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/fakethr.h
@@ -0,0 +1,75 @@
+/* fakethr.h
+ *
+ * Copyright (C) 1999, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+typedef int perl_mutex;
+typedef int perl_key;
+
+typedef struct perl_thread *perl_os_thread;
+/* With fake threads, thr is global(ish) so we don't need dTHR */
+#define dTHR extern int errno
+
+struct perl_wait_queue {
+ struct perl_thread * thread;
+ struct perl_wait_queue * next;
+};
+typedef struct perl_wait_queue *perl_cond;
+
+/* Ask thread.h to include our per-thread extras */
+#define HAVE_THREAD_INTERN
+struct thread_intern {
+ perl_os_thread next_run, prev_run; /* Linked list of runnable threads */
+ perl_cond wait_queue; /* Wait queue that we are waiting on */
+ IV private; /* Holds data across time slices */
+ I32 savemark; /* Holds MARK for thread join values */
+};
+
+#define init_thread_intern(t) \
+ STMT_START { \
+ t->self = (t); \
+ (t)->i.next_run = (t)->i.prev_run = (t); \
+ (t)->i.wait_queue = 0; \
+ (t)->i.private = 0; \
+ } STMT_END
+
+/*
+ * Note that SCHEDULE() is only callable from pp code (which
+ * must be expecting to be restarted). We'll have to do
+ * something a bit different for XS code.
+ */
+
+#define SCHEDULE() return schedule(), PL_op
+
+#define MUTEX_LOCK(m)
+#define MUTEX_UNLOCK(m)
+#define MUTEX_INIT(m)
+#define MUTEX_DESTROY(m)
+#define COND_INIT(c) perl_cond_init(c)
+#define COND_SIGNAL(c) perl_cond_signal(c)
+#define COND_BROADCAST(c) perl_cond_broadcast(c)
+#define COND_WAIT(c, m) \
+ STMT_START { \
+ perl_cond_wait(c); \
+ SCHEDULE(); \
+ } STMT_END
+#define COND_DESTROY(c)
+
+#define THREAD_CREATE(t, f) f((t))
+#define THREAD_POST_CREATE(t) NOOP
+
+#define YIELD NOOP
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/form.h b/Master/tlpkg/tlperl/lib/CORE/form.h
new file mode 100644
index 00000000000..114d6d4475f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/form.h
@@ -0,0 +1,27 @@
+/* form.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 2000, 2004 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define FF_END 0
+#define FF_LINEMARK 1
+#define FF_LITERAL 2
+#define FF_SKIP 3
+#define FF_FETCH 4
+#define FF_CHECKNL 5
+#define FF_CHECKCHOP 6
+#define FF_SPACE 7
+#define FF_HALFSPACE 8
+#define FF_ITEM 9
+#define FF_CHOP 10
+#define FF_LINEGLOB 11
+#define FF_DECIMAL 12
+#define FF_NEWLINE 13
+#define FF_BLANK 14
+#define FF_MORE 15
+#define FF_0DECIMAL 16
+#define FF_LINESNGL 17
diff --git a/Master/tlpkg/tlperl/lib/CORE/git_version.h b/Master/tlpkg/tlperl/lib/CORE/git_version.h
new file mode 100644
index 00000000000..38da47c0542
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/git_version.h
@@ -0,0 +1,8 @@
+/**************************************************************************
+* WARNING: 'git_version.h' is automatically generated by make_patchnum.pl
+* DO NOT EDIT DIRECTLY - edit make_patchnum.pl instead
+***************************************************************************/
+
+#define PERL_GIT_UNPUSHED_COMMITS \
+ /*leave-this-comment*/
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/gv.h b/Master/tlpkg/tlperl/lib/CORE/gv.h
new file mode 100644
index 00000000000..4986b43cc60
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/gv.h
@@ -0,0 +1,223 @@
+/* gv.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+struct gp {
+ SV * gp_sv; /* scalar value */
+ struct io * gp_io; /* filehandle value */
+ CV * gp_cv; /* subroutine value */
+ U32 gp_cvgen; /* generational validity of cached gv_cv */
+ U32 gp_refcnt; /* how many globs point to this? */
+ HV * gp_hv; /* hash value */
+ AV * gp_av; /* array value */
+ CV * gp_form; /* format value */
+ GV * gp_egv; /* effective gv, if *glob */
+ line_t gp_line; /* line first declared at (for -w) */
+ HEK * gp_file_hek; /* file first declared in (for -w) */
+};
+
+#define GvXPVGV(gv) ((XPVGV*)SvANY(gv))
+
+
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__INTEL_COMPILER)
+# define GvGP(gv) \
+ (*({GV *const _gvgp = (GV *) (gv); \
+ assert(SvTYPE(_gvgp) == SVt_PVGV || SvTYPE(_gvgp) == SVt_PVLV); \
+ assert(isGV_with_GP(_gvgp)); \
+ &((_gvgp)->sv_u.svu_gp);}))
+# define GvFLAGS(gv) \
+ (*({GV *const _gvflags = (GV *) (gv); \
+ assert(SvTYPE(_gvflags) == SVt_PVGV || SvTYPE(_gvflags) == SVt_PVLV); \
+ assert(isGV_with_GP(_gvflags)); \
+ &(GvXPVGV(_gvflags)->xpv_cur);}))
+# define GvSTASH(gv) \
+ (*({ GV * const _gvstash = (GV *) (gv); \
+ assert(isGV_with_GP(_gvstash)); \
+ assert(SvTYPE(_gvstash) == SVt_PVGV || SvTYPE(_gvstash) >= SVt_PVLV); \
+ &(GvXPVGV(_gvstash)->xnv_u.xgv_stash); \
+ }))
+# define GvNAME_HEK(gv) \
+ (*({ GV * const _gvname_hek = (GV *) (gv); \
+ assert(isGV_with_GP(_gvname_hek)); \
+ assert(SvTYPE(_gvname_hek) == SVt_PVGV || SvTYPE(_gvname_hek) >= SVt_PVLV); \
+ assert(!SvVALID(_gvname_hek)); \
+ &(GvXPVGV(_gvname_hek)->xiv_u.xivu_namehek); \
+ }))
+# define GvNAME_get(gv) ({ assert(GvNAME_HEK(gv)); (char *)HEK_KEY(GvNAME_HEK(gv)); })
+# define GvNAMELEN_get(gv) ({ assert(GvNAME_HEK(gv)); HEK_LEN(GvNAME_HEK(gv)); })
+#else
+# define GvGP(gv) ((gv)->sv_u.svu_gp)
+# define GvFLAGS(gv) (GvXPVGV(gv)->xpv_cur)
+# define GvSTASH(gv) (GvXPVGV(gv)->xnv_u.xgv_stash)
+# define GvNAME_HEK(gv) (GvXPVGV(gv)->xiv_u.xivu_namehek)
+# define GvNAME_get(gv) HEK_KEY(GvNAME_HEK(gv))
+# define GvNAMELEN_get(gv) HEK_LEN(GvNAME_HEK(gv))
+#endif
+
+#define GvNAME(gv) GvNAME_get(gv)
+#define GvNAMELEN(gv) GvNAMELEN_get(gv)
+
+#define GvASSIGN_GENERATION(gv) (0 + ((XPV*) SvANY(gv))->xpv_len)
+#define GvASSIGN_GENERATION_set(gv,val) \
+ STMT_START { assert(SvTYPE(gv) == SVt_PVGV); \
+ (((XPV*) SvANY(gv))->xpv_len = (val)); } STMT_END
+
+/*
+=head1 GV Functions
+
+=for apidoc Am|SV*|GvSV|GV* gv
+
+Return the SV from the GV.
+
+=cut
+*/
+
+#define GvSV(gv) (GvGP(gv)->gp_sv)
+#ifdef PERL_DONT_CREATE_GVSV
+#define GvSVn(gv) (*(GvGP(gv)->gp_sv ? \
+ &(GvGP(gv)->gp_sv) : \
+ &(GvGP(gv_SVadd(gv))->gp_sv)))
+#else
+#define GvSVn(gv) GvSV(gv)
+#endif
+
+#define GvREFCNT(gv) (GvGP(gv)->gp_refcnt)
+#define GvIO(gv) ((gv) && SvTYPE((const SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : NULL)
+#define GvIOp(gv) (GvGP(gv)->gp_io)
+#define GvIOn(gv) (GvIO(gv) ? GvIOp(gv) : GvIOp(gv_IOadd(gv)))
+
+#define GvFORM(gv) (GvGP(gv)->gp_form)
+#define GvAV(gv) (GvGP(gv)->gp_av)
+
+#define GvAVn(gv) (GvGP(gv)->gp_av ? \
+ GvGP(gv)->gp_av : \
+ GvGP(gv_AVadd(gv))->gp_av)
+#define GvHV(gv) ((GvGP(gv))->gp_hv)
+
+#define GvHVn(gv) (GvGP(gv)->gp_hv ? \
+ GvGP(gv)->gp_hv : \
+ GvGP(gv_HVadd(gv))->gp_hv)
+
+#define GvCV(gv) (GvGP(gv)->gp_cv)
+#define GvCVGEN(gv) (GvGP(gv)->gp_cvgen)
+#define GvCVu(gv) (GvGP(gv)->gp_cvgen ? NULL : GvGP(gv)->gp_cv)
+
+#define GvLINE(gv) (GvGP(gv)->gp_line)
+#define GvFILE_HEK(gv) (GvGP(gv)->gp_file_hek)
+#define GvFILE(gv) (GvFILE_HEK(gv) ? HEK_KEY(GvFILE_HEK(gv)) : NULL)
+#define GvFILEGV(gv) (gv_fetchfile(GvFILE(gv)))
+
+#define GvEGV(gv) (GvGP(gv)->gp_egv)
+#define GvENAME(gv) GvNAME(GvEGV(gv) ? GvEGV(gv) : gv)
+#define GvESTASH(gv) GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv)
+
+#define GVf_INTRO 0x01
+#define GVf_MULTI 0x02
+#define GVf_ASSUMECV 0x04
+#define GVf_IN_PAD 0x08
+#define GVf_IMPORTED 0xF0
+#define GVf_IMPORTED_SV 0x10
+#define GVf_IMPORTED_AV 0x20
+#define GVf_IMPORTED_HV 0x40
+#define GVf_IMPORTED_CV 0x80
+
+#define GvINTRO(gv) (GvFLAGS(gv) & GVf_INTRO)
+#define GvINTRO_on(gv) (GvFLAGS(gv) |= GVf_INTRO)
+#define GvINTRO_off(gv) (GvFLAGS(gv) &= ~GVf_INTRO)
+
+#define GvMULTI(gv) (GvFLAGS(gv) & GVf_MULTI)
+#define GvMULTI_on(gv) (GvFLAGS(gv) |= GVf_MULTI)
+#define GvMULTI_off(gv) (GvFLAGS(gv) &= ~GVf_MULTI)
+
+#define GvASSUMECV(gv) (GvFLAGS(gv) & GVf_ASSUMECV)
+#define GvASSUMECV_on(gv) (GvFLAGS(gv) |= GVf_ASSUMECV)
+#define GvASSUMECV_off(gv) (GvFLAGS(gv) &= ~GVf_ASSUMECV)
+
+#define GvIMPORTED(gv) (GvFLAGS(gv) & GVf_IMPORTED)
+#define GvIMPORTED_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED)
+#define GvIMPORTED_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED)
+
+#define GvIMPORTED_SV(gv) (GvFLAGS(gv) & GVf_IMPORTED_SV)
+#define GvIMPORTED_SV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_SV)
+#define GvIMPORTED_SV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_SV)
+
+#define GvIMPORTED_AV(gv) (GvFLAGS(gv) & GVf_IMPORTED_AV)
+#define GvIMPORTED_AV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_AV)
+#define GvIMPORTED_AV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_AV)
+
+#define GvIMPORTED_HV(gv) (GvFLAGS(gv) & GVf_IMPORTED_HV)
+#define GvIMPORTED_HV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_HV)
+#define GvIMPORTED_HV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_HV)
+
+#define GvIMPORTED_CV(gv) (GvFLAGS(gv) & GVf_IMPORTED_CV)
+#define GvIMPORTED_CV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_CV)
+#define GvIMPORTED_CV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_CV)
+
+#define GvIN_PAD(gv) (GvFLAGS(gv) & GVf_IN_PAD)
+#define GvIN_PAD_on(gv) (GvFLAGS(gv) |= GVf_IN_PAD)
+#define GvIN_PAD_off(gv) (GvFLAGS(gv) &= ~GVf_IN_PAD)
+
+#ifndef PERL_CORE
+# define Nullgv Null(GV*)
+#endif
+
+#define DM_UID 0x003
+#define DM_RUID 0x001
+#define DM_EUID 0x002
+#define DM_ARRAY 0x004
+#define DM_GID 0x030
+#define DM_RGID 0x010
+#define DM_EGID 0x020
+#define DM_DELAY 0x100
+
+/*
+ * symbol creation flags, for use in gv_fetchpv() and get_*v()
+ */
+#define GV_ADD 0x01 /* add, if symbol not already there
+ For gv_name_set, adding a HEK for the first
+ time, so don't try to free what's there. */
+#define GV_ADDMULTI 0x02 /* add, pretending it has been added already */
+#define GV_ADDWARN 0x04 /* add, but warn if symbol wasn't already there */
+#define GV_ADDINEVAL 0x08 /* add, as though we're doing so within an eval */
+#define GV_NOINIT 0x10 /* add, but don't init symbol, if type != PVGV */
+/* This is used by toke.c to avoid turing placeholder constants in the symbol
+ table into full PVGVs with attached constant subroutines. */
+#define GV_NOADD_NOINIT 0x20 /* Don't add the symbol if it's not there.
+ Don't init it if it is there but ! PVGV */
+#define GV_NOEXPAND 0x40 /* Don't expand SvOK() entries to PVGV */
+#define GV_NOTQUAL 0x80 /* A plain symbol name, not qualified with a
+ package (so skip checks for :: and ') */
+#define GV_AUTOLOAD 0x100 /* gv_fetchmethod_flags() should AUTOLOAD */
+#define GV_CROAK 0x200 /* gv_fetchmethod_flags() should croak */
+
+/* SVf_UTF8 (more accurately the return value from SvUTF8) is also valid
+ as a flag to gv_fetch_pvn_flags, so ensure it lies outside this range.
+*/
+
+#define GV_NOADD_MASK (SVf_UTF8|GV_NOADD_NOINIT|GV_NOEXPAND|GV_NOTQUAL)
+/* The bit flags that don't cause gv_fetchpv() to add a symbol if not found */
+
+#define gv_fullname3(sv,gv,prefix) gv_fullname4(sv,gv,prefix,TRUE)
+#define gv_efullname3(sv,gv,prefix) gv_efullname4(sv,gv,prefix,TRUE)
+#define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE)
+
+#define gv_AVadd(gv) gv_add_by_type((gv), SVt_PVAV)
+#define gv_HVadd(gv) gv_add_by_type((gv), SVt_PVHV)
+#define gv_IOadd(gv) gv_add_by_type((gv), SVt_PVIO)
+#define gv_SVadd(gv) gv_add_by_type((gv), SVt_NULL)
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/handy.h b/Master/tlpkg/tlperl/lib/CORE/handy.h
new file mode 100644
index 00000000000..d12972d5297
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/handy.h
@@ -0,0 +1,960 @@
+/* handy.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
+ * 2001, 2002, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#if !defined(__STDC__)
+#ifdef NULL
+#undef NULL
+#endif
+#ifndef I286
+# define NULL 0
+#else
+# define NULL 0L
+#endif
+#endif
+
+#ifndef PERL_CORE
+# define Null(type) ((type)NULL)
+
+/*
+=head1 Handy Values
+
+=for apidoc AmU||Nullch
+Null character pointer. (No longer available when C<PERL_CORE> is defined.)
+
+=for apidoc AmU||Nullsv
+Null SV pointer. (No longer available when C<PERL_CORE> is defined.)
+
+=cut
+*/
+
+# define Nullch Null(char*)
+# define Nullfp Null(PerlIO*)
+# define Nullsv Null(SV*)
+#endif
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#ifdef FALSE
+#undef FALSE
+#endif
+#define TRUE (1)
+#define FALSE (0)
+
+/* The MUTABLE_*() macros cast pointers to the types shown, in such a way
+ * (compiler permitting) that casting away const-ness will give a warning;
+ * e.g.:
+ *
+ * const SV *sv = ...;
+ * AV *av1 = (AV*)sv; <== BAD: the const has been silently cast away
+ * AV *av2 = MUTABLE_AV(sv); <== GOOD: it may warn
+ */
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
+#else
+# define MUTABLE_PTR(p) ((void *) (p))
+#endif
+
+#define MUTABLE_AV(p) ((AV *)MUTABLE_PTR(p))
+#define MUTABLE_CV(p) ((CV *)MUTABLE_PTR(p))
+#define MUTABLE_GV(p) ((GV *)MUTABLE_PTR(p))
+#define MUTABLE_HV(p) ((HV *)MUTABLE_PTR(p))
+#define MUTABLE_IO(p) ((IO *)MUTABLE_PTR(p))
+#define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p))
+
+/* XXX Configure ought to have a test for a boolean type, if I can
+ just figure out all the headers such a test needs.
+ Andy Dougherty August 1996
+*/
+/* bool is built-in for g++-2.6.3 and later, which might be used
+ for extensions. <_G_config.h> defines _G_HAVE_BOOL, but we can't
+ be sure _G_config.h will be included before this file. _G_config.h
+ also defines _G_HAVE_BOOL for both gcc and g++, but only g++
+ actually has bool. Hence, _G_HAVE_BOOL is pretty useless for us.
+ g++ can be identified by __GNUG__.
+ Andy Dougherty February 2000
+*/
+#ifdef __GNUG__ /* GNU g++ has bool built-in */
+# ifndef HAS_BOOL
+# define HAS_BOOL 1
+# endif
+#endif
+
+/* The NeXT dynamic loader headers will not build with the bool macro
+ So declare them now to clear confusion.
+*/
+#if defined(NeXT) || defined(__NeXT__)
+# undef FALSE
+# undef TRUE
+ typedef enum bool { FALSE = 0, TRUE = 1 } bool;
+# define ENUM_BOOL 1
+# ifndef HAS_BOOL
+# define HAS_BOOL 1
+# endif /* !HAS_BOOL */
+#endif /* NeXT || __NeXT__ */
+
+#ifndef HAS_BOOL
+# if defined(UTS) || defined(VMS)
+# define bool int
+# else
+# define bool char
+# endif
+# define HAS_BOOL 1
+#endif
+
+/* Try to figure out __func__ or __FUNCTION__ equivalent, if any.
+ * XXX Should really be a Configure probe, with HAS__FUNCTION__
+ * and FUNCTION__ as results.
+ * XXX Similarly, a Configure probe for __FILE__ and __LINE__ is needed. */
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__SUNPRO_C)) /* C99 or close enough. */
+# define FUNCTION__ __func__
+#else
+# if (defined(_MSC_VER) && _MSC_VER < 1300) || /* Pre-MSVC 7.0 has neither __func__ nor __FUNCTION and no good workarounds, either. */ \
+ (defined(__DECC_VER)) /* Tru64 or VMS, and strict C89 being used, but not modern enough cc (in Tur64, -c99 not known, only -std1). */
+# define FUNCTION__ ""
+# else
+# define FUNCTION__ __FUNCTION__ /* Common extension. */
+# endif
+#endif
+
+/* XXX A note on the perl source internal type system. The
+ original intent was that I32 be *exactly* 32 bits.
+
+ Currently, we only guarantee that I32 is *at least* 32 bits.
+ Specifically, if int is 64 bits, then so is I32. (This is the case
+ for the Cray.) This has the advantage of meshing nicely with
+ standard library calls (where we pass an I32 and the library is
+ expecting an int), but the disadvantage that an I32 is not 32 bits.
+ Andy Dougherty August 1996
+
+ There is no guarantee that there is *any* integral type with
+ exactly 32 bits. It is perfectly legal for a system to have
+ sizeof(short) == sizeof(int) == sizeof(long) == 8.
+
+ Similarly, there is no guarantee that I16 and U16 have exactly 16
+ bits.
+
+ For dealing with issues that may arise from various 32/64-bit
+ systems, we will ask Configure to check out
+
+ SHORTSIZE == sizeof(short)
+ INTSIZE == sizeof(int)
+ LONGSIZE == sizeof(long)
+ LONGLONGSIZE == sizeof(long long) (if HAS_LONG_LONG)
+ PTRSIZE == sizeof(void *)
+ DOUBLESIZE == sizeof(double)
+ LONG_DOUBLESIZE == sizeof(long double) (if HAS_LONG_DOUBLE).
+
+*/
+
+#ifdef I_INTTYPES /* e.g. Linux has int64_t without <inttypes.h> */
+# include <inttypes.h>
+# ifdef INT32_MIN_BROKEN
+# undef INT32_MIN
+# define INT32_MIN (-2147483647-1)
+# endif
+# ifdef INT64_MIN_BROKEN
+# undef INT64_MIN
+# define INT64_MIN (-9223372036854775807LL-1)
+# endif
+#endif
+
+typedef I8TYPE I8;
+typedef U8TYPE U8;
+typedef I16TYPE I16;
+typedef U16TYPE U16;
+typedef I32TYPE I32;
+typedef U32TYPE U32;
+#ifdef PERL_CORE
+# ifdef HAS_QUAD
+typedef I64TYPE I64;
+typedef U64TYPE U64;
+# endif
+#endif /* PERL_CORE */
+
+#if defined(HAS_QUAD) && defined(USE_64_BIT_INT)
+# ifndef UINT64_C /* usually from <inttypes.h> */
+# if defined(HAS_LONG_LONG) && QUADKIND == QUAD_IS_LONG_LONG
+# define INT64_C(c) CAT2(c,LL)
+# define UINT64_C(c) CAT2(c,ULL)
+# else
+# if LONGSIZE == 8 && QUADKIND == QUAD_IS_LONG
+# define INT64_C(c) CAT2(c,L)
+# define UINT64_C(c) CAT2(c,UL)
+# else
+# if defined(_WIN64) && defined(_MSC_VER)
+# define INT64_C(c) CAT2(c,I64)
+# define UINT64_C(c) CAT2(c,UI64)
+# else
+# define INT64_C(c) ((I64TYPE)(c))
+# define UINT64_C(c) ((U64TYPE)(c))
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/* HMB H.Merijn Brand - a placeholder for preparing Configure patches:
+ *
+ * USE_DTRACE HAS_PSEUDOFORK HAS_TIMEGM LOCALTIME_R_NEEDS_TZSET
+ * GMTIME_MAX GMTIME_MIN LOCALTIME_MAX LOCALTIME_MIN
+ * HAS_CTIME64 HAS_LOCALTIME64 HAS_GMTIME64 HAS_DIFFTIME64
+ * HAS_MKTIME64 HAS_ASCTIME64 HAS_GETADDRINFO HAS_GETNAMEINFO
+ * HAS_INETNTOP HAS_INETPTON CHARBITS
+ * Not (yet) used at top level, but mention them for metaconfig
+ */
+
+/* Mention I8SIZE, U8SIZE, I16SIZE, U16SIZE, I32SIZE, U32SIZE,
+ I64SIZE, and U64SIZE here so that metaconfig pulls them in. */
+
+#if defined(UINT8_MAX) && defined(INT16_MAX) && defined(INT32_MAX)
+
+/* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type.
+ Please search CHAR_MAX in perl.h for further details. */
+#define U8_MAX UINT8_MAX
+#define U8_MIN UINT8_MIN
+
+#define I16_MAX INT16_MAX
+#define I16_MIN INT16_MIN
+#define U16_MAX UINT16_MAX
+#define U16_MIN UINT16_MIN
+
+#define I32_MAX INT32_MAX
+#define I32_MIN INT32_MIN
+#ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */
+# define U32_MAX UINT32_MAX
+#else
+# define U32_MAX 4294967295U
+#endif
+#define U32_MIN UINT32_MIN
+
+#else
+
+/* I8_MAX and I8_MIN constants are not defined, as I8 is an ambiguous type.
+ Please search CHAR_MAX in perl.h for further details. */
+#define U8_MAX PERL_UCHAR_MAX
+#define U8_MIN PERL_UCHAR_MIN
+
+#define I16_MAX PERL_SHORT_MAX
+#define I16_MIN PERL_SHORT_MIN
+#define U16_MAX PERL_USHORT_MAX
+#define U16_MIN PERL_USHORT_MIN
+
+#if LONGSIZE > 4
+# define I32_MAX PERL_INT_MAX
+# define I32_MIN PERL_INT_MIN
+# define U32_MAX PERL_UINT_MAX
+# define U32_MIN PERL_UINT_MIN
+#else
+# define I32_MAX PERL_LONG_MAX
+# define I32_MIN PERL_LONG_MIN
+# define U32_MAX PERL_ULONG_MAX
+# define U32_MIN PERL_ULONG_MIN
+#endif
+
+#endif
+
+/* log(2) is pretty close to 0.30103, just in case anyone is grepping for it */
+#define BIT_DIGITS(N) (((N)*146)/485 + 1) /* log2(10) =~ 146/485 */
+#define TYPE_DIGITS(T) BIT_DIGITS(sizeof(T) * 8)
+#define TYPE_CHARS(T) (TYPE_DIGITS(T) + 2) /* sign, NUL */
+
+#define Ctl(ch) ((ch) & 037)
+
+/*
+=head1 SV-Body Allocation
+
+=for apidoc Ama|SV*|newSVpvs|const char* s
+Like C<newSVpvn>, but takes a literal string instead of a string/length pair.
+
+=for apidoc Ama|SV*|newSVpvs_flags|const char* s|U32 flags
+Like C<newSVpvn_flags>, but takes a literal string instead of a string/length
+pair.
+
+=for apidoc Ama|SV*|newSVpvs_share|const char* s
+Like C<newSVpvn_share>, but takes a literal string instead of a string/length
+pair and omits the hash parameter.
+
+=for apidoc Am|void|sv_catpvs|SV* sv|const char* s
+Like C<sv_catpvn>, but takes a literal string instead of a string/length pair.
+
+=for apidoc Am|void|sv_setpvs|SV* sv|const char* s
+Like C<sv_setpvn>, but takes a literal string instead of a string/length pair.
+
+=head1 Memory Management
+
+=for apidoc Ama|char*|savepvs|const char* s
+Like C<savepvn>, but takes a literal string instead of a string/length pair.
+
+=head1 GV Functions
+
+=for apidoc Am|HV*|gv_stashpvs|const char* name|I32 create
+Like C<gv_stashpvn>, but takes a literal string instead of a string/length pair.
+
+=head1 Hash Manipulation Functions
+
+=for apidoc Am|SV**|hv_fetchs|HV* tb|const char* key|I32 lval
+Like C<hv_fetch>, but takes a literal string instead of a string/length pair.
+
+=for apidoc Am|SV**|hv_stores|HV* tb|const char* key|NULLOK SV* val
+Like C<hv_store>, but takes a literal string instead of a string/length pair
+and omits the hash parameter.
+
+=cut
+*/
+
+/* concatenating with "" ensures that only literal strings are accepted as argument */
+#define STR_WITH_LEN(s) ("" s ""), (sizeof(s)-1)
+
+/* note that STR_WITH_LEN() can't be used as argument to macros or functions that
+ * under some configurations might be macros, which means that it requires the full
+ * Perl_xxx(aTHX_ ...) form for any API calls where it's used.
+ */
+
+/* STR_WITH_LEN() shortcuts */
+#define newSVpvs(str) Perl_newSVpvn(aTHX_ STR_WITH_LEN(str))
+#define newSVpvs_flags(str,flags) \
+ Perl_newSVpvn_flags(aTHX_ STR_WITH_LEN(str), flags)
+#define newSVpvs_share(str) Perl_newSVpvn_share(aTHX_ STR_WITH_LEN(str), 0)
+#define sv_catpvs(sv, str) Perl_sv_catpvn_flags(aTHX_ sv, STR_WITH_LEN(str), SV_GMAGIC)
+#define sv_setpvs(sv, str) Perl_sv_setpvn(aTHX_ sv, STR_WITH_LEN(str))
+#define savepvs(str) Perl_savepvn(aTHX_ STR_WITH_LEN(str))
+#define gv_stashpvs(str, create) Perl_gv_stashpvn(aTHX_ STR_WITH_LEN(str), create)
+#define gv_fetchpvs(namebeg, add, sv_type) Perl_gv_fetchpvn_flags(aTHX_ STR_WITH_LEN(namebeg), add, sv_type)
+#define hv_fetchs(hv,key,lval) \
+ ((SV **)Perl_hv_common(aTHX_ (hv), NULL, STR_WITH_LEN(key), 0, \
+ (lval) ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \
+ : HV_FETCH_JUST_SV, NULL, 0))
+
+#define hv_stores(hv,key,val) \
+ ((SV **)Perl_hv_common(aTHX_ (hv), NULL, STR_WITH_LEN(key), 0, \
+ (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (val), 0))
+
+#define get_cvs(str, flags) \
+ Perl_get_cvn_flags(aTHX_ STR_WITH_LEN(str), (flags))
+
+/*
+=head1 Miscellaneous Functions
+
+=for apidoc Am|bool|strNE|char* s1|char* s2
+Test two strings to see if they are different. Returns true or
+false.
+
+=for apidoc Am|bool|strEQ|char* s1|char* s2
+Test two strings to see if they are equal. Returns true or false.
+
+=for apidoc Am|bool|strLT|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is less than the second,
+C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strLE|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is less than or equal to the
+second, C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strGT|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is greater than the second,
+C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strGE|char* s1|char* s2
+Test two strings to see if the first, C<s1>, is greater than or equal to
+the second, C<s2>. Returns true or false.
+
+=for apidoc Am|bool|strnNE|char* s1|char* s2|STRLEN len
+Test two strings to see if they are different. The C<len> parameter
+indicates the number of bytes to compare. Returns true or false. (A
+wrapper for C<strncmp>).
+
+=for apidoc Am|bool|strnEQ|char* s1|char* s2|STRLEN len
+Test two strings to see if they are equal. The C<len> parameter indicates
+the number of bytes to compare. Returns true or false. (A wrapper for
+C<strncmp>).
+
+=cut
+*/
+
+#define strNE(s1,s2) (strcmp(s1,s2))
+#define strEQ(s1,s2) (!strcmp(s1,s2))
+#define strLT(s1,s2) (strcmp(s1,s2) < 0)
+#define strLE(s1,s2) (strcmp(s1,s2) <= 0)
+#define strGT(s1,s2) (strcmp(s1,s2) > 0)
+#define strGE(s1,s2) (strcmp(s1,s2) >= 0)
+#define strnNE(s1,s2,l) (strncmp(s1,s2,l))
+#define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
+
+#ifdef HAS_MEMCMP
+# define memNE(s1,s2,l) (memcmp(s1,s2,l))
+# define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#else
+# define memNE(s1,s2,l) (bcmp(s1,s2,l))
+# define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
+#define memEQs(s1, l, s2) \
+ (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1)))
+#define memNEs(s1, l, s2) !memEQs(s1, l, s2)
+
+/*
+ * Character classes.
+ *
+ * Unfortunately, the introduction of locales means that we
+ * can't trust isupper(), etc. to tell the truth. And when
+ * it comes to /\w+/ with tainting enabled, we *must* be able
+ * to trust our character classes.
+ *
+ * Therefore, the default tests in the text of Perl will be
+ * independent of locale. Any code that wants to depend on
+ * the current locale will use the tests that begin with "lc".
+ */
+
+#ifdef HAS_SETLOCALE /* XXX Is there a better test for this? */
+# ifndef CTYPE256
+# define CTYPE256
+# endif
+#endif
+
+/*
+
+=head1 Character classes
+
+=for apidoc Am|bool|isALNUM|char ch
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+alphanumeric character (including underscore) or digit.
+
+=for apidoc Am|bool|isALPHA|char ch
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+alphabetic character.
+
+=for apidoc Am|bool|isSPACE|char ch
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+whitespace.
+
+=for apidoc Am|bool|isDIGIT|char ch
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+digit.
+
+=for apidoc Am|bool|isUPPER|char ch
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+uppercase character.
+
+=for apidoc Am|bool|isLOWER|char ch
+Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
+lowercase character.
+
+=for apidoc Am|char|toUPPER|char ch
+Converts the specified character to uppercase. Characters outside the
+US-ASCII (Basic Latin) range are viewed as not having any case.
+
+=for apidoc Am|char|toLOWER|char ch
+Converts the specified character to lowercase. Characters outside the
+US-ASCII (Basic Latin) range are viewed as not having any case.
+
+=cut
+*/
+
+#define isALNUM(c) (isALPHA(c) || isDIGIT(c) || (c) == '_')
+#define isIDFIRST(c) (isALPHA(c) || (c) == '_')
+#define isALPHA(c) (isUPPER(c) || isLOWER(c))
+/* ALPHAU includes Unicode semantics for latin1 characters. It has an extra
+ * >= AA test to speed up ASCII-only tests at the expense of the others */
+#define isALPHAU(c) (isALPHA(c) || (NATIVE_TO_UNI((U8) c) >= 0xAA \
+ && ((NATIVE_TO_UNI((U8) c) >= 0xC0 \
+ && NATIVE_TO_UNI((U8) c) != 0xD7 && NATIVE_TO_UNI((U8) c) != 0xF7) \
+ || NATIVE_TO_UNI((U8) c) == 0xAA \
+ || NATIVE_TO_UNI((U8) c) == 0xB5 \
+ || NATIVE_TO_UNI((U8) c) == 0xBA)))
+#define isALNUMU(c) (isDIGIT(c) || isALPHAU(c) || (c) == '_')
+
+/* continuation character for legal NAME in \N{NAME} */
+#define isCHARNAME_CONT(c) (isALNUMU(c) || (c) == ' ' || (c) == '-' || (c) == '(' || (c) == ')' || (c) == ':' || NATIVE_TO_UNI((U8) c) == 0xA0)
+#define isSPACE(c) \
+ ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) =='\r' || (c) == '\f')
+#define isPSXSPC(c) (isSPACE(c) || (c) == '\v')
+#define isBLANK(c) ((c) == ' ' || (c) == '\t')
+#define isDIGIT(c) ((c) >= '0' && (c) <= '9')
+#ifdef EBCDIC
+ /* In EBCDIC we do not do locales: therefore() isupper() is fine. */
+# define isUPPER(c) isupper(c)
+# define isLOWER(c) islower(c)
+# define isALNUMC(c) isalnum(c)
+# define isASCII(c) isascii(c)
+# define isCNTRL(c) iscntrl(c)
+# define isGRAPH(c) isgraph(c)
+# define isPRINT(c) isprint(c)
+# define isPUNCT(c) ispunct(c)
+# define isXDIGIT(c) isxdigit(c)
+# define toUPPER(c) toupper(c)
+# define toUPPER_LATIN1_MOD(c) UNI_TO_NATIVE(PL_mod_latin1_uc[(U8) NATIVE_TO_UNI(c)])
+# define toLOWER(c) tolower(c)
+# define toLOWER_LATIN1(c) UNI_TO_NATIVE(PL_latin1_lc[(U8) NATIVE_TO_UNI(c)])
+#else
+# define isUPPER(c) ((c) >= 'A' && (c) <= 'Z')
+# define isLOWER(c) ((c) >= 'a' && (c) <= 'z')
+# define isALNUMC(c) (isALPHA(c) || isDIGIT(c))
+# define isASCII(c) ((c) <= 127)
+# define isCNTRL(c) ((c) < ' ' || (c) == 127)
+# define isGRAPH(c) (isALNUM(c) || isPUNCT(c))
+# define isPRINT(c) (((c) >= 32 && (c) < 127))
+# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+
+/* Use table lookup for speed */
+# define toLOWER_LATIN1(c) (PL_latin1_lc[(U8) c])
+
+/* Modified uc. Is correct uc except for three non-ascii chars which are
+ * all mapped to one of them, and these need special handling */
+# define toUPPER_LATIN1_MOD(c) (PL_mod_latin1_uc[(U8) c])
+
+/* ASCII casing. */
+# define toUPPER(c) (isLOWER(c) ? (c) - ('a' - 'A') : (c))
+# define toLOWER(c) (isUPPER(c) ? (c) + ('a' - 'A') : (c))
+#endif
+
+#ifdef USE_NEXT_CTYPE
+
+# define isALNUM_LC(c) \
+ (NXIsAlNum((unsigned int)(c)) || (char)(c) == '_')
+# define isIDFIRST_LC(c) \
+ (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_')
+# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c))
+# define isSPACE_LC(c) NXIsSpace((unsigned int)(c))
+# define isDIGIT_LC(c) NXIsDigit((unsigned int)(c))
+# define isUPPER_LC(c) NXIsUpper((unsigned int)(c))
+# define isLOWER_LC(c) NXIsLower((unsigned int)(c))
+# define isALNUMC_LC(c) NXIsAlNum((unsigned int)(c))
+# define isCNTRL_LC(c) NXIsCntrl((unsigned int)(c))
+# define isGRAPH_LC(c) NXIsGraph((unsigned int)(c))
+# define isPRINT_LC(c) NXIsPrint((unsigned int)(c))
+# define isPUNCT_LC(c) NXIsPunct((unsigned int)(c))
+# define toUPPER_LC(c) NXToUpper((unsigned int)(c))
+# define toLOWER_LC(c) NXToLower((unsigned int)(c))
+
+#else /* !USE_NEXT_CTYPE */
+
+# if defined(CTYPE256) || (!defined(isascii) && !defined(HAS_ISASCII))
+
+# define isALNUM_LC(c) (isalnum((unsigned char)(c)) || (char)(c) == '_')
+# define isIDFIRST_LC(c) (isalpha((unsigned char)(c)) || (char)(c) == '_')
+# define isALPHA_LC(c) isalpha((unsigned char)(c))
+# define isSPACE_LC(c) isspace((unsigned char)(c))
+# define isDIGIT_LC(c) isdigit((unsigned char)(c))
+# define isUPPER_LC(c) isupper((unsigned char)(c))
+# define isLOWER_LC(c) islower((unsigned char)(c))
+# define isALNUMC_LC(c) isalnum((unsigned char)(c))
+# define isCNTRL_LC(c) iscntrl((unsigned char)(c))
+# define isGRAPH_LC(c) isgraph((unsigned char)(c))
+# define isPRINT_LC(c) isprint((unsigned char)(c))
+# define isPUNCT_LC(c) ispunct((unsigned char)(c))
+# define toUPPER_LC(c) toupper((unsigned char)(c))
+# define toLOWER_LC(c) tolower((unsigned char)(c))
+
+# else
+
+# define isALNUM_LC(c) (isascii(c) && (isalnum(c) || (c) == '_'))
+# define isIDFIRST_LC(c) (isascii(c) && (isalpha(c) || (c) == '_'))
+# define isALPHA_LC(c) (isascii(c) && isalpha(c))
+# define isSPACE_LC(c) (isascii(c) && isspace(c))
+# define isDIGIT_LC(c) (isascii(c) && isdigit(c))
+# define isUPPER_LC(c) (isascii(c) && isupper(c))
+# define isLOWER_LC(c) (isascii(c) && islower(c))
+# define isALNUMC_LC(c) (isascii(c) && isalnum(c))
+# define isCNTRL_LC(c) (isascii(c) && iscntrl(c))
+# define isGRAPH_LC(c) (isascii(c) && isgraph(c))
+# define isPRINT_LC(c) (isascii(c) && isprint(c))
+# define isPUNCT_LC(c) (isascii(c) && ispunct(c))
+# define toUPPER_LC(c) toupper(c)
+# define toLOWER_LC(c) tolower(c)
+
+# endif
+#endif /* USE_NEXT_CTYPE */
+
+#define isPSXSPC_LC(c) (isSPACE_LC(c) || (c) == '\v')
+#define isBLANK_LC(c) isBLANK(c) /* could be wrong */
+
+#define isALNUM_uni(c) is_uni_alnum(c)
+#define isIDFIRST_uni(c) is_uni_idfirst(c)
+#define isALPHA_uni(c) is_uni_alpha(c)
+#define isSPACE_uni(c) is_uni_space(c)
+#define isDIGIT_uni(c) is_uni_digit(c)
+#define isUPPER_uni(c) is_uni_upper(c)
+#define isLOWER_uni(c) is_uni_lower(c)
+#define isASCII_uni(c) is_uni_ascii(c)
+#define isCNTRL_uni(c) is_uni_cntrl(c)
+#define isGRAPH_uni(c) is_uni_graph(c)
+#define isPRINT_uni(c) is_uni_print(c)
+#define isPUNCT_uni(c) is_uni_punct(c)
+#define isXDIGIT_uni(c) is_uni_xdigit(c)
+#define toUPPER_uni(c,s,l) to_uni_upper(c,s,l)
+#define toTITLE_uni(c,s,l) to_uni_title(c,s,l)
+#define toLOWER_uni(c,s,l) to_uni_lower(c,s,l)
+#define toFOLD_uni(c,s,l) to_uni_fold(c,s,l)
+
+#define isPSXSPC_uni(c) (isSPACE_uni(c) ||(c) == '\f')
+#define isBLANK_uni(c) isBLANK(c) /* could be wrong */
+
+#define isALNUM_LC_uvchr(c) (c < 256 ? isALNUM_LC(c) : is_uni_alnum_lc(c))
+#define isIDFIRST_LC_uvchr(c) (c < 256 ? isIDFIRST_LC(c) : is_uni_idfirst_lc(c))
+#define isALPHA_LC_uvchr(c) (c < 256 ? isALPHA_LC(c) : is_uni_alpha_lc(c))
+#define isSPACE_LC_uvchr(c) (c < 256 ? isSPACE_LC(c) : is_uni_space_lc(c))
+#define isDIGIT_LC_uvchr(c) (c < 256 ? isDIGIT_LC(c) : is_uni_digit_lc(c))
+#define isUPPER_LC_uvchr(c) (c < 256 ? isUPPER_LC(c) : is_uni_upper_lc(c))
+#define isLOWER_LC_uvchr(c) (c < 256 ? isLOWER_LC(c) : is_uni_lower_lc(c))
+#define isCNTRL_LC_uvchr(c) (c < 256 ? isCNTRL_LC(c) : is_uni_cntrl_lc(c))
+#define isGRAPH_LC_uvchr(c) (c < 256 ? isGRAPH_LC(c) : is_uni_graph_lc(c))
+#define isPRINT_LC_uvchr(c) (c < 256 ? isPRINT_LC(c) : is_uni_print_lc(c))
+#define isPUNCT_LC_uvchr(c) (c < 256 ? isPUNCT_LC(c) : is_uni_punct_lc(c))
+
+#define isPSXSPC_LC_uni(c) (isSPACE_LC_uni(c) ||(c) == '\f')
+#define isBLANK_LC_uni(c) isBLANK(c) /* could be wrong */
+
+#define isALNUM_utf8(p) is_utf8_alnum(p)
+/* The ID_Start of Unicode is quite limiting: it assumes a L-class
+ * character (meaning that you cannot have, say, a CJK character).
+ * Instead, let's allow ID_Continue but not digits. */
+#define isIDFIRST_utf8(p) (is_utf8_idcont(p) && !is_utf8_digit(p))
+#define isALPHA_utf8(p) is_utf8_alpha(p)
+#define isSPACE_utf8(p) is_utf8_space(p)
+#define isDIGIT_utf8(p) is_utf8_digit(p)
+#define isUPPER_utf8(p) is_utf8_upper(p)
+#define isLOWER_utf8(p) is_utf8_lower(p)
+#define isASCII_utf8(p) is_utf8_ascii(p)
+#define isCNTRL_utf8(p) is_utf8_cntrl(p)
+#define isGRAPH_utf8(p) is_utf8_graph(p)
+#define isPRINT_utf8(p) is_utf8_print(p)
+#define isPUNCT_utf8(p) is_utf8_punct(p)
+#define isXDIGIT_utf8(p) is_utf8_xdigit(p)
+#define toUPPER_utf8(p,s,l) to_utf8_upper(p,s,l)
+#define toTITLE_utf8(p,s,l) to_utf8_title(p,s,l)
+#define toLOWER_utf8(p,s,l) to_utf8_lower(p,s,l)
+
+#define isPSXSPC_utf8(c) (isSPACE_utf8(c) ||(c) == '\f')
+#define isBLANK_utf8(c) isBLANK(c) /* could be wrong */
+
+#define isALNUM_LC_utf8(p) isALNUM_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isIDFIRST_LC_utf8(p) isIDFIRST_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isALPHA_LC_utf8(p) isALPHA_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isSPACE_LC_utf8(p) isSPACE_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isDIGIT_LC_utf8(p) isDIGIT_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isUPPER_LC_utf8(p) isUPPER_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isLOWER_LC_utf8(p) isLOWER_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isALNUMC_LC_utf8(p) isALNUMC_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isCNTRL_LC_utf8(p) isCNTRL_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isGRAPH_LC_utf8(p) isGRAPH_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isPRINT_LC_utf8(p) isPRINT_LC_uvchr(utf8_to_uvchr(p, 0))
+#define isPUNCT_LC_utf8(p) isPUNCT_LC_uvchr(utf8_to_uvchr(p, 0))
+
+#define isPSXSPC_LC_utf8(c) (isSPACE_LC_utf8(c) ||(c) == '\f')
+#define isBLANK_LC_utf8(c) isBLANK(c) /* could be wrong */
+
+#ifdef EBCDIC
+# ifdef PERL_IMPLICIT_CONTEXT
+# define toCTRL(c) Perl_ebcdic_control(aTHX_ c)
+# else
+# define toCTRL Perl_ebcdic_control
+# endif
+#else
+ /* This conversion works both ways, strangely enough. */
+# define toCTRL(c) (toUPPER(c) ^ 64)
+#endif
+
+/* Line numbers are unsigned, 32 bits. */
+typedef U32 line_t;
+#define NOLINE ((line_t) 4294967295UL)
+
+/* Helpful alias for version prescan */
+#define is_LAX_VERSION(a,b) \
+ (a != Perl_prescan_version(aTHX_ a, FALSE, b, NULL, NULL, NULL, NULL))
+
+#define is_STRICT_VERSION(a,b) \
+ (a != Perl_prescan_version(aTHX_ a, TRUE, b, NULL, NULL, NULL, NULL))
+
+#define BADVERSION(a,b,c) \
+ if (b) { \
+ *b = c; \
+ } \
+ return a;
+
+/*
+=head1 Memory Management
+
+=for apidoc Am|void|Newx|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<malloc> function.
+
+In 5.9.3, Newx() and friends replace the older New() API, and drops
+the first parameter, I<x>, a debug aid which allowed callers to identify
+themselves. This aid has been superseded by a new build option,
+PERL_MEM_LOG (see L<perlhack/PERL_MEM_LOG>). The older API is still
+there for use in XS modules supporting older perls.
+
+=for apidoc Am|void|Newxc|void* ptr|int nitems|type|cast
+The XSUB-writer's interface to the C C<malloc> function, with
+cast. See also C<Newx>.
+
+=for apidoc Am|void|Newxz|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<malloc> function. The allocated
+memory is zeroed with C<memzero>. See also C<Newx>.
+
+=for apidoc Am|void|Renew|void* ptr|int nitems|type
+The XSUB-writer's interface to the C C<realloc> function.
+
+=for apidoc Am|void|Renewc|void* ptr|int nitems|type|cast
+The XSUB-writer's interface to the C C<realloc> function, with
+cast.
+
+=for apidoc Am|void|Safefree|void* ptr
+The XSUB-writer's interface to the C C<free> function.
+
+=for apidoc Am|void|Move|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<memmove> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. Can do overlapping moves. See also C<Copy>.
+
+=for apidoc Am|void *|MoveD|void* src|void* dest|int nitems|type
+Like C<Move> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+=for apidoc Am|void|Copy|void* src|void* dest|int nitems|type
+The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the
+source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
+the type. May fail on overlapping copies. See also C<Move>.
+
+=for apidoc Am|void *|CopyD|void* src|void* dest|int nitems|type
+
+Like C<Copy> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+=for apidoc Am|void|Zero|void* dest|int nitems|type
+
+The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the
+destination, C<nitems> is the number of items, and C<type> is the type.
+
+=for apidoc Am|void *|ZeroD|void* dest|int nitems|type
+
+Like C<Zero> but returns dest. Useful for encouraging compilers to tail-call
+optimise.
+
+=for apidoc Am|void|StructCopy|type src|type dest|type
+This is an architecture-independent macro to copy one structure to another.
+
+=for apidoc Am|void|PoisonWith|void* dest|int nitems|type|U8 byte
+
+Fill up memory with a byte pattern (a byte repeated over and over
+again) that hopefully catches attempts to access uninitialized memory.
+
+=for apidoc Am|void|PoisonNew|void* dest|int nitems|type
+
+PoisonWith(0xAB) for catching access to allocated but uninitialized memory.
+
+=for apidoc Am|void|PoisonFree|void* dest|int nitems|type
+
+PoisonWith(0xEF) for catching access to freed memory.
+
+=for apidoc Am|void|Poison|void* dest|int nitems|type
+
+PoisonWith(0xEF) for catching access to freed memory.
+
+=cut */
+
+/* Maintained for backwards-compatibility only. Use newSV() instead. */
+#ifndef PERL_CORE
+#define NEWSV(x,len) newSV(len)
+#endif
+
+#define MEM_SIZE_MAX ((MEM_SIZE)~0)
+
+/* The +0.0 in MEM_WRAP_CHECK_ is an attempt to foil
+ * overly eager compilers that will bleat about e.g.
+ * (U16)n > (size_t)~0/sizeof(U16) always being false. */
+#ifdef PERL_MALLOC_WRAP
+#define MEM_WRAP_CHECK(n,t) MEM_WRAP_CHECK_1(n,t,PL_memory_wrap)
+#define MEM_WRAP_CHECK_1(n,t,a) \
+ (void)(sizeof(t) > 1 && ((MEM_SIZE)(n)+0.0) > MEM_SIZE_MAX/sizeof(t) && (Perl_croak_nocontext("%s",(a)),0))
+#define MEM_WRAP_CHECK_(n,t) MEM_WRAP_CHECK(n,t),
+
+#define PERL_STRLEN_ROUNDUP(n) ((void)(((n) > MEM_SIZE_MAX - 2 * PERL_STRLEN_ROUNDUP_QUANTUM) ? (Perl_croak_nocontext("%s",PL_memory_wrap),0):0),((n-1+PERL_STRLEN_ROUNDUP_QUANTUM)&~((MEM_SIZE)PERL_STRLEN_ROUNDUP_QUANTUM-1)))
+
+#else
+
+#define MEM_WRAP_CHECK(n,t)
+#define MEM_WRAP_CHECK_1(n,t,a)
+#define MEM_WRAP_CHECK_2(n,t,a,b)
+#define MEM_WRAP_CHECK_(n,t)
+
+#define PERL_STRLEN_ROUNDUP(n) (((n-1+PERL_STRLEN_ROUNDUP_QUANTUM)&~((MEM_SIZE)PERL_STRLEN_ROUNDUP_QUANTUM-1)))
+
+#endif
+
+#ifdef PERL_MEM_LOG
+/*
+ * If PERL_MEM_LOG is defined, all Newx()s, Renew()s, and Safefree()s
+ * go through functions, which are handy for debugging breakpoints, but
+ * which more importantly get the immediate calling environment (file and
+ * line number, and C function name if available) passed in. This info can
+ * then be used for logging the calls, for which one gets a sample
+ * implementation unless -DPERL_MEM_LOG_NOIMPL is also defined.
+ *
+ * Known problems:
+ * - not all memory allocs get logged, only those
+ * that go through Newx() and derivatives (while all
+ * Safefrees do get logged)
+ * - __FILE__ and __LINE__ do not work everywhere
+ * - __func__ or __FUNCTION__ even less so
+ * - I think more goes on after the perlio frees but
+ * the thing is that STDERR gets closed (as do all
+ * the file descriptors)
+ * - no deeper calling stack than the caller of the Newx()
+ * or the kind, but do I look like a C reflection/introspection
+ * utility to you?
+ * - the function prototypes for the logging functions
+ * probably should maybe be somewhere else than handy.h
+ * - one could consider inlining (macrofying) the logging
+ * for speed, but I am too lazy
+ * - one could imagine recording the allocations in a hash,
+ * (keyed by the allocation address?), and maintain that
+ * through reallocs and frees, but how to do that without
+ * any News() happening...?
+ * - lots of -Ddefines to get useful/controllable output
+ * - lots of ENV reads
+ */
+
+PERL_EXPORT_C Malloc_t Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
+
+PERL_EXPORT_C Malloc_t Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
+
+PERL_EXPORT_C Malloc_t Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname);
+
+# ifdef PERL_CORE
+# ifndef PERL_MEM_LOG_NOIMPL
+enum mem_log_type {
+ MLT_ALLOC,
+ MLT_REALLOC,
+ MLT_FREE,
+ MLT_NEW_SV,
+ MLT_DEL_SV
+};
+# endif
+# if defined(PERL_IN_SV_C) /* those are only used in sv.c */
+void Perl_mem_log_new_sv(const SV *sv, const char *filename, const int linenumber, const char *funcname);
+void Perl_mem_log_del_sv(const SV *sv, const char *filename, const int linenumber, const char *funcname);
+# endif
+# endif
+
+#endif
+
+#ifdef PERL_MEM_LOG
+#define MEM_LOG_ALLOC(n,t,a) Perl_mem_log_alloc(n,sizeof(t),STRINGIFY(t),a,__FILE__,__LINE__,FUNCTION__)
+#define MEM_LOG_REALLOC(n,t,v,a) Perl_mem_log_realloc(n,sizeof(t),STRINGIFY(t),v,a,__FILE__,__LINE__,FUNCTION__)
+#define MEM_LOG_FREE(a) Perl_mem_log_free(a,__FILE__,__LINE__,FUNCTION__)
+#endif
+
+#ifndef MEM_LOG_ALLOC
+#define MEM_LOG_ALLOC(n,t,a) (a)
+#endif
+#ifndef MEM_LOG_REALLOC
+#define MEM_LOG_REALLOC(n,t,v,a) (a)
+#endif
+#ifndef MEM_LOG_FREE
+#define MEM_LOG_FREE(a) (a)
+#endif
+
+#define Newx(v,n,t) (v = (MEM_WRAP_CHECK_(n,t) (t*)MEM_LOG_ALLOC(n,t,safemalloc((MEM_SIZE)((n)*sizeof(t))))))
+#define Newxc(v,n,t,c) (v = (MEM_WRAP_CHECK_(n,t) (c*)MEM_LOG_ALLOC(n,t,safemalloc((MEM_SIZE)((n)*sizeof(t))))))
+#define Newxz(v,n,t) (v = (MEM_WRAP_CHECK_(n,t) (t*)MEM_LOG_ALLOC(n,t,safecalloc((n),sizeof(t)))))
+
+#ifndef PERL_CORE
+/* pre 5.9.x compatibility */
+#define New(x,v,n,t) Newx(v,n,t)
+#define Newc(x,v,n,t,c) Newxc(v,n,t,c)
+#define Newz(x,v,n,t) Newxz(v,n,t)
+#endif
+
+#define Renew(v,n,t) \
+ (v = (MEM_WRAP_CHECK_(n,t) (t*)MEM_LOG_REALLOC(n,t,v,saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))))
+#define Renewc(v,n,t,c) \
+ (v = (MEM_WRAP_CHECK_(n,t) (c*)MEM_LOG_REALLOC(n,t,v,saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))))
+
+#ifdef PERL_POISON
+#define Safefree(d) \
+ ((d) ? (void)(safefree(MEM_LOG_FREE((Malloc_t)(d))), Poison(&(d), 1, Malloc_t)) : (void) 0)
+#else
+#define Safefree(d) safefree(MEM_LOG_FREE((Malloc_t)(d)))
+#endif
+
+#define Move(s,d,n,t) (MEM_WRAP_CHECK_(n,t) (void)memmove((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#define Copy(s,d,n,t) (MEM_WRAP_CHECK_(n,t) (void)memcpy((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#define Zero(d,n,t) (MEM_WRAP_CHECK_(n,t) (void)memzero((char*)(d), (n) * sizeof(t)))
+
+#define MoveD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) memmove((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#define CopyD(s,d,n,t) (MEM_WRAP_CHECK_(n,t) memcpy((char*)(d),(const char*)(s), (n) * sizeof(t)))
+#ifdef HAS_MEMSET
+#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) memzero((char*)(d), (n) * sizeof(t)))
+#else
+/* Using bzero(), which returns void. */
+#define ZeroD(d,n,t) (MEM_WRAP_CHECK_(n,t) memzero((char*)(d), (n) * sizeof(t)),d)
+#endif
+
+#define PoisonWith(d,n,t,b) (MEM_WRAP_CHECK_(n,t) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)))
+#define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB)
+#define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF)
+#define Poison(d,n,t) PoisonFree(d,n,t)
+
+#ifdef USE_STRUCT_COPY
+#define StructCopy(s,d,t) (*((t*)(d)) = *((t*)(s)))
+#else
+#define StructCopy(s,d,t) Copy(s,d,1,t)
+#endif
+
+#define C_ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))
+
+#ifdef NEED_VA_COPY
+# ifdef va_copy
+# define Perl_va_copy(s, d) va_copy(d, s)
+# else
+# if defined(__va_copy)
+# define Perl_va_copy(s, d) __va_copy(d, s)
+# else
+# define Perl_va_copy(s, d) Copy(s, d, 1, va_list)
+# endif
+# endif
+#endif
+
+/* convenience debug macros */
+#ifdef USE_ITHREADS
+#define pTHX_FORMAT "Perl interpreter: 0x%p"
+#define pTHX__FORMAT ", Perl interpreter: 0x%p"
+#define pTHX_VALUE_ (void *)my_perl,
+#define pTHX_VALUE (void *)my_perl
+#define pTHX__VALUE_ ,(void *)my_perl,
+#define pTHX__VALUE ,(void *)my_perl
+#else
+#define pTHX_FORMAT
+#define pTHX__FORMAT
+#define pTHX_VALUE_
+#define pTHX_VALUE
+#define pTHX__VALUE_
+#define pTHX__VALUE
+#endif /* USE_ITHREADS */
+
+/* Perl_deprecate was not part of the public API, and did not have a deprecate()
+ shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor
+ CPAN::Unpack show any users outside the core. */
+#ifdef PERL_CORE
+# define deprecate(s) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), "Use of " s " is deprecated")
+#endif
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/hv.h b/Master/tlpkg/tlperl/lib/CORE/hv.h
new file mode 100644
index 00000000000..f38d584d2cc
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/hv.h
@@ -0,0 +1,546 @@
+/* hv.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* entry in hash value chain */
+struct he {
+ /* Keep hent_next first in this structure, because sv_free_arenas take
+ advantage of this to share code between the he arenas and the SV
+ body arenas */
+ HE *hent_next; /* next entry in chain */
+ HEK *hent_hek; /* hash key */
+ union {
+ SV *hent_val; /* scalar value that was hashed */
+ Size_t hent_refcount; /* references for this shared hash key */
+ } he_valu;
+};
+
+/* hash key -- defined separately for use as shared pointer */
+struct hek {
+ U32 hek_hash; /* hash of key */
+ I32 hek_len; /* length of hash key */
+ char hek_key[1]; /* variable-length hash key */
+ /* the hash-key is \0-terminated */
+ /* after the \0 there is a byte for flags, such as whether the key
+ is UTF-8 */
+};
+
+struct shared_he {
+ struct he shared_he_he;
+ struct hek shared_he_hek;
+};
+
+/* Subject to change.
+ Don't access this directly.
+ Use the funcs in mro.c
+*/
+
+struct mro_alg {
+ AV *(*resolve)(pTHX_ HV* stash, U32 level);
+ const char *name;
+ U16 length;
+ U16 kflags; /* For the hash API - set HVhek_UTF8 if name is UTF-8 */
+ U32 hash; /* or 0 */
+};
+
+struct mro_meta {
+ /* a hash holding the different MROs private data. */
+ HV *mro_linear_all;
+ /* a pointer directly to the current MROs private data. If mro_linear_all
+ is NULL, this owns the SV reference, else it is just a pointer to a
+ value stored in and owned by mro_linear_all. */
+ SV *mro_linear_current;
+ HV *mro_nextmethod; /* next::method caching */
+ U32 cache_gen; /* Bumping this invalidates our method cache */
+ U32 pkg_gen; /* Bumps when local methods/@ISA change */
+ const struct mro_alg *mro_which; /* which mro alg is in use? */
+ HV *isa; /* Everything this class @ISA */
+};
+
+#define MRO_GET_PRIVATE_DATA(smeta, which) \
+ (((smeta)->mro_which && (which) == (smeta)->mro_which) \
+ ? (smeta)->mro_linear_current \
+ : Perl_mro_get_private_data(aTHX_ (smeta), (which)))
+
+/* Subject to change.
+ Don't access this directly.
+*/
+
+struct xpvhv_aux {
+ HEK *xhv_name; /* name, if a symbol table */
+ AV *xhv_backreferences; /* back references for weak references */
+ HE *xhv_eiter; /* current entry of iterator */
+ I32 xhv_riter; /* current root of iterator */
+ struct mro_meta *xhv_mro_meta;
+};
+
+/* hash structure: */
+/* This structure must match the beginning of struct xpvmg in sv.h. */
+struct xpvhv {
+ union _xnvu xnv_u;
+ STRLEN xhv_fill; /* how full xhv_array currently is */
+ STRLEN xhv_max; /* subscript of last element of xhv_array */
+ _XPVMG_HEAD;
+};
+
+#define xhv_keys xiv_u.xivu_iv
+
+/* hash a key */
+/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins
+ * from requirements by Colin Plumb.
+ * (http://burtleburtle.net/bob/hash/doobs.html) */
+/* The use of a temporary pointer and the casting games
+ * is needed to serve the dual purposes of
+ * (a) the hashed data being interpreted as "unsigned char" (new since 5.8,
+ * a "char" can be either signed or unsigned, depending on the compiler)
+ * (b) catering for old code that uses a "char"
+ *
+ * The "hash seed" feature was added in Perl 5.8.1 to perturb the results
+ * to avoid "algorithmic complexity attacks".
+ *
+ * If USE_HASH_SEED is defined, hash randomisation is done by default
+ * If USE_HASH_SEED_EXPLICIT is defined, hash randomisation is done
+ * only if the environment variable PERL_HASH_SEED is set.
+ * For maximal control, one can define PERL_HASH_SEED.
+ * (see also perl.c:perl_parse()).
+ */
+#ifndef PERL_HASH_SEED
+# if defined(USE_HASH_SEED) || defined(USE_HASH_SEED_EXPLICIT)
+# define PERL_HASH_SEED PL_hash_seed
+# else
+# define PERL_HASH_SEED 0
+# endif
+#endif
+#define PERL_HASH(hash,str,len) \
+ STMT_START { \
+ register const char * const s_PeRlHaSh_tmp = str; \
+ register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+ register I32 i_PeRlHaSh = len; \
+ register U32 hash_PeRlHaSh = PERL_HASH_SEED; \
+ while (i_PeRlHaSh--) { \
+ hash_PeRlHaSh += *s_PeRlHaSh++; \
+ hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
+ hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
+ } \
+ hash_PeRlHaSh += (hash_PeRlHaSh << 3); \
+ hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
+ (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
+ } STMT_END
+
+/* Only hv.c and mod_perl should be doing this. */
+#ifdef PERL_HASH_INTERNAL_ACCESS
+#define PERL_HASH_INTERNAL(hash,str,len) \
+ STMT_START { \
+ register const char * const s_PeRlHaSh_tmp = str; \
+ register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
+ register I32 i_PeRlHaSh = len; \
+ register U32 hash_PeRlHaSh = PL_rehash_seed; \
+ while (i_PeRlHaSh--) { \
+ hash_PeRlHaSh += *s_PeRlHaSh++; \
+ hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
+ hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
+ } \
+ hash_PeRlHaSh += (hash_PeRlHaSh << 3); \
+ hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
+ (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
+ } STMT_END
+#endif
+
+/*
+=head1 Hash Manipulation Functions
+
+=for apidoc AmU||HEf_SVKEY
+This flag, used in the length slot of hash entries and magic structures,
+specifies the structure contains an C<SV*> pointer where a C<char*> pointer
+is to be expected. (For information only--not to be used).
+
+=head1 Handy Values
+
+=for apidoc AmU||Nullhv
+Null HV pointer.
+
+(deprecated - use C<(HV *)NULL> instead)
+
+=head1 Hash Manipulation Functions
+
+=for apidoc Am|char*|HvNAME|HV* stash
+Returns the package name of a stash, or NULL if C<stash> isn't a stash.
+See C<SvSTASH>, C<CvSTASH>.
+
+=for apidoc Am|void*|HeKEY|HE* he
+Returns the actual pointer stored in the key slot of the hash entry. The
+pointer may be either C<char*> or C<SV*>, depending on the value of
+C<HeKLEN()>. Can be assigned to. The C<HePV()> or C<HeSVKEY()> macros are
+usually preferable for finding the value of a key.
+
+=for apidoc Am|STRLEN|HeKLEN|HE* he
+If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
+holds an C<SV*> key. Otherwise, holds the actual length of the key. Can
+be assigned to. The C<HePV()> macro is usually preferable for finding key
+lengths.
+
+=for apidoc Am|SV*|HeVAL|HE* he
+Returns the value slot (type C<SV*>) stored in the hash entry.
+
+=for apidoc Am|U32|HeHASH|HE* he
+Returns the computed hash stored in the hash entry.
+
+=for apidoc Am|char*|HePV|HE* he|STRLEN len
+Returns the key slot of the hash entry as a C<char*> value, doing any
+necessary dereferencing of possibly C<SV*> keys. The length of the string
+is placed in C<len> (this is a macro, so do I<not> use C<&len>). If you do
+not care about what the length of the key is, you may use the global
+variable C<PL_na>, though this is rather less efficient than using a local
+variable. Remember though, that hash keys in perl are free to contain
+embedded nulls, so using C<strlen()> or similar is not a good way to find
+the length of hash keys. This is very similar to the C<SvPV()> macro
+described elsewhere in this document. See also C<HeUTF8>.
+
+If you are using C<HePV> to get values to pass to C<newSVpvn()> to create a
+new SV, you should consider using C<newSVhek(HeKEY_hek(he))> as it is more
+efficient.
+
+=for apidoc Am|char*|HeUTF8|HE* he
+Returns whether the C<char *> value returned by C<HePV> is encoded in UTF-8,
+doing any necessary dereferencing of possibly C<SV*> keys. The value returned
+will be 0 or non-0, not necessarily 1 (or even a value with any low bits set),
+so B<do not> blindly assign this to a C<bool> variable, as C<bool> may be a
+typedef for C<char>.
+
+=for apidoc Am|SV*|HeSVKEY|HE* he
+Returns the key as an C<SV*>, or C<NULL> if the hash entry does not
+contain an C<SV*> key.
+
+=for apidoc Am|SV*|HeSVKEY_force|HE* he
+Returns the key as an C<SV*>. Will create and return a temporary mortal
+C<SV*> if the hash entry contains only a C<char*> key.
+
+=for apidoc Am|SV*|HeSVKEY_set|HE* he|SV* sv
+Sets the key to a given C<SV*>, taking care to set the appropriate flags to
+indicate the presence of an C<SV*> key, and returns the same
+C<SV*>.
+
+=cut
+*/
+
+/* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
+#define HEf_SVKEY -2 /* hent_key is an SV* */
+
+#ifndef PERL_CORE
+# define Nullhv Null(HV*)
+#endif
+#define HvARRAY(hv) ((hv)->sv_u.svu_hash)
+#define HvFILL(hv) ((XPVHV*) SvANY(hv))->xhv_fill
+#define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max
+/* This quite intentionally does no flag checking first. That's your
+ responsibility. */
+#define HvAUX(hv) ((struct xpvhv_aux*)&(HvARRAY(hv)[HvMAX(hv)+1]))
+#define HvRITER(hv) (*Perl_hv_riter_p(aTHX_ MUTABLE_HV(hv)))
+#define HvEITER(hv) (*Perl_hv_eiter_p(aTHX_ MUTABLE_HV(hv)))
+#define HvRITER_set(hv,r) Perl_hv_riter_set(aTHX_ MUTABLE_HV(hv), r)
+#define HvEITER_set(hv,e) Perl_hv_eiter_set(aTHX_ MUTABLE_HV(hv), e)
+#define HvRITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1)
+#define HvEITER_get(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : NULL)
+#define HvNAME(hv) HvNAME_get(hv)
+
+/* Checking that hv is a valid package stash is the
+ caller's responsibility */
+#define HvMROMETA(hv) (HvAUX(hv)->xhv_mro_meta \
+ ? HvAUX(hv)->xhv_mro_meta \
+ : Perl_mro_meta_init(aTHX_ hv))
+
+/* FIXME - all of these should use a UTF8 aware API, which should also involve
+ getting the length. */
+/* This macro may go away without notice. */
+#define HvNAME_HEK(hv) (SvOOK(hv) ? HvAUX(hv)->xhv_name : NULL)
+#define HvNAME_get(hv) ((SvOOK(hv) && (HvAUX(hv)->xhv_name)) \
+ ? HEK_KEY(HvAUX(hv)->xhv_name) : NULL)
+#define HvNAMELEN_get(hv) ((SvOOK(hv) && (HvAUX(hv)->xhv_name)) \
+ ? HEK_LEN(HvAUX(hv)->xhv_name) : 0)
+
+/* the number of keys (including any placeholers) */
+#define XHvTOTALKEYS(xhv) ((xhv)->xhv_keys)
+
+/*
+ * HvKEYS gets the number of keys that actually exist(), and is provided
+ * for backwards compatibility with old XS code. The core uses HvUSEDKEYS
+ * (keys, excluding placeholdes) and HvTOTALKEYS (including placeholders)
+ */
+#define HvKEYS(hv) HvUSEDKEYS(hv)
+#define HvUSEDKEYS(hv) (HvTOTALKEYS(hv) - HvPLACEHOLDERS_get(hv))
+#define HvTOTALKEYS(hv) XHvTOTALKEYS((XPVHV*) SvANY(hv))
+#define HvPLACEHOLDERS(hv) (*Perl_hv_placeholders_p(aTHX_ MUTABLE_HV(hv)))
+#define HvPLACEHOLDERS_get(hv) (SvMAGIC(hv) ? Perl_hv_placeholders_get(aTHX_ (const HV *)hv) : 0)
+#define HvPLACEHOLDERS_set(hv,p) Perl_hv_placeholders_set(aTHX_ MUTABLE_HV(hv), p)
+
+#define HvSHAREKEYS(hv) (SvFLAGS(hv) & SVphv_SHAREKEYS)
+#define HvSHAREKEYS_on(hv) (SvFLAGS(hv) |= SVphv_SHAREKEYS)
+#define HvSHAREKEYS_off(hv) (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
+
+/* This is an optimisation flag. It won't be set if all hash keys have a 0
+ * flag. Currently the only flags relate to utf8.
+ * Hence it won't be set if all keys are 8 bit only. It will be set if any key
+ * is utf8 (including 8 bit keys that were entered as utf8, and need upgrading
+ * when retrieved during iteration. It may still be set when there are no longer
+ * any utf8 keys.
+ * See HVhek_ENABLEHVKFLAGS for the trigger.
+ */
+#define HvHASKFLAGS(hv) (SvFLAGS(hv) & SVphv_HASKFLAGS)
+#define HvHASKFLAGS_on(hv) (SvFLAGS(hv) |= SVphv_HASKFLAGS)
+#define HvHASKFLAGS_off(hv) (SvFLAGS(hv) &= ~SVphv_HASKFLAGS)
+
+#define HvLAZYDEL(hv) (SvFLAGS(hv) & SVphv_LAZYDEL)
+#define HvLAZYDEL_on(hv) (SvFLAGS(hv) |= SVphv_LAZYDEL)
+#define HvLAZYDEL_off(hv) (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
+
+#define HvREHASH(hv) (SvFLAGS(hv) & SVphv_REHASH)
+#define HvREHASH_on(hv) (SvFLAGS(hv) |= SVphv_REHASH)
+#define HvREHASH_off(hv) (SvFLAGS(hv) &= ~SVphv_REHASH)
+
+#ifndef PERL_CORE
+# define Nullhe Null(HE*)
+#endif
+#define HeNEXT(he) (he)->hent_next
+#define HeKEY_hek(he) (he)->hent_hek
+#define HeKEY(he) HEK_KEY(HeKEY_hek(he))
+#define HeKEY_sv(he) (*(SV**)HeKEY(he))
+#define HeKLEN(he) HEK_LEN(HeKEY_hek(he))
+#define HeKUTF8(he) HEK_UTF8(HeKEY_hek(he))
+#define HeKWASUTF8(he) HEK_WASUTF8(HeKEY_hek(he))
+#define HeKREHASH(he) HEK_REHASH(HeKEY_hek(he))
+#define HeKLEN_UTF8(he) (HeKUTF8(he) ? -HeKLEN(he) : HeKLEN(he))
+#define HeKFLAGS(he) HEK_FLAGS(HeKEY_hek(he))
+#define HeVAL(he) (he)->he_valu.hent_val
+#define HeHASH(he) HEK_HASH(HeKEY_hek(he))
+#define HePV(he,lp) ((HeKLEN(he) == HEf_SVKEY) ? \
+ SvPV(HeKEY_sv(he),lp) : \
+ ((lp = HeKLEN(he)), HeKEY(he)))
+#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \
+ SvUTF8(HeKEY_sv(he)) : \
+ (U32)HeKUTF8(he))
+
+#define HeSVKEY(he) ((HeKEY(he) && \
+ HeKLEN(he) == HEf_SVKEY) ? \
+ HeKEY_sv(he) : NULL)
+
+#define HeSVKEY_force(he) (HeKEY(he) ? \
+ ((HeKLEN(he) == HEf_SVKEY) ? \
+ HeKEY_sv(he) : \
+ newSVpvn_flags(HeKEY(he), \
+ HeKLEN(he), SVs_TEMP)) : \
+ &PL_sv_undef)
+#define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
+
+#ifndef PERL_CORE
+# define Nullhek Null(HEK*)
+#endif
+#define HEK_BASESIZE STRUCT_OFFSET(HEK, hek_key[0])
+#define HEK_HASH(hek) (hek)->hek_hash
+#define HEK_LEN(hek) (hek)->hek_len
+#define HEK_KEY(hek) (hek)->hek_key
+#define HEK_FLAGS(hek) (*((unsigned char *)(HEK_KEY(hek))+HEK_LEN(hek)+1))
+
+#define HVhek_UTF8 0x01 /* Key is utf8 encoded. */
+#define HVhek_WASUTF8 0x02 /* Key is bytes here, but was supplied as utf8. */
+#define HVhek_REHASH 0x04 /* This key is in an hv using a custom HASH . */
+#define HVhek_UNSHARED 0x08 /* This key isn't a shared hash key. */
+#define HVhek_FREEKEY 0x100 /* Internal flag to say key is malloc()ed. */
+#define HVhek_PLACEHOLD 0x200 /* Internal flag to create placeholder.
+ * (may change, but Storable is a core module) */
+#define HVhek_KEYCANONICAL 0x400 /* Internal flag - key is in canonical form.
+ If the string is UTF-8, it cannot be
+ converted to bytes. */
+#define HVhek_MASK 0xFF
+
+/* Which flags enable HvHASKFLAGS? Somewhat a hack on a hack, as
+ HVhek_REHASH is only needed because the rehash flag has to be duplicated
+ into all keys as hv_iternext has no access to the hash flags. At this
+ point Storable's tests get upset, because sometimes hashes are "keyed"
+ and sometimes not, depending on the order of data insertion, and whether
+ it triggered rehashing. So currently HVhek_REHASH is exempt.
+ Similarly UNSHARED
+*/
+
+#define HVhek_ENABLEHVKFLAGS (HVhek_MASK & ~(HVhek_REHASH|HVhek_UNSHARED))
+
+#define HEK_UTF8(hek) (HEK_FLAGS(hek) & HVhek_UTF8)
+#define HEK_UTF8_on(hek) (HEK_FLAGS(hek) |= HVhek_UTF8)
+#define HEK_UTF8_off(hek) (HEK_FLAGS(hek) &= ~HVhek_UTF8)
+#define HEK_WASUTF8(hek) (HEK_FLAGS(hek) & HVhek_WASUTF8)
+#define HEK_WASUTF8_on(hek) (HEK_FLAGS(hek) |= HVhek_WASUTF8)
+#define HEK_WASUTF8_off(hek) (HEK_FLAGS(hek) &= ~HVhek_WASUTF8)
+#define HEK_REHASH(hek) (HEK_FLAGS(hek) & HVhek_REHASH)
+#define HEK_REHASH_on(hek) (HEK_FLAGS(hek) |= HVhek_REHASH)
+
+/* calculate HV array allocation */
+#ifndef PERL_USE_LARGE_HV_ALLOC
+/* Default to allocating the correct size - default to assuming that malloc()
+ is not broken and is efficient at allocating blocks sized at powers-of-two.
+*/
+# define PERL_HV_ARRAY_ALLOC_BYTES(size) ((size) * sizeof(HE*))
+#else
+# define MALLOC_OVERHEAD 16
+# define PERL_HV_ARRAY_ALLOC_BYTES(size) \
+ (((size) < 64) \
+ ? (size) * sizeof(HE*) \
+ : (size) * sizeof(HE*) * 2 - MALLOC_OVERHEAD)
+#endif
+
+/* Flags for hv_iternext_flags. */
+#define HV_ITERNEXT_WANTPLACEHOLDERS 0x01 /* Don't skip placeholders. */
+
+#define hv_iternext(hv) hv_iternext_flags(hv, 0)
+#define hv_magic(hv, gv, how) sv_magic(MUTABLE_SV(hv), MUTABLE_SV(gv), how, NULL, 0)
+
+/* available as a function in hv.c */
+#define Perl_sharepvn(sv, len, hash) HEK_KEY(share_hek(sv, len, hash))
+#define sharepvn(sv, len, hash) Perl_sharepvn(sv, len, hash)
+
+#define share_hek_hek(hek) \
+ (++(((struct shared_he *)(((char *)hek) \
+ - STRUCT_OFFSET(struct shared_he, \
+ shared_he_hek))) \
+ ->shared_he_he.he_valu.hent_refcount), \
+ hek)
+
+#define hv_store_ent(hv, keysv, val, hash) \
+ ((HE *) hv_common((hv), (keysv), NULL, 0, 0, HV_FETCH_ISSTORE, \
+ (val), (hash)))
+
+#define hv_exists_ent(hv, keysv, hash) \
+ (hv_common((hv), (keysv), NULL, 0, 0, HV_FETCH_ISEXISTS, 0, (hash)) \
+ ? TRUE : FALSE)
+#define hv_fetch_ent(hv, keysv, lval, hash) \
+ ((HE *) hv_common((hv), (keysv), NULL, 0, 0, \
+ ((lval) ? HV_FETCH_LVALUE : 0), NULL, (hash)))
+#define hv_delete_ent(hv, key, flags, hash) \
+ (MUTABLE_SV(hv_common((hv), (key), NULL, 0, 0, (flags) | HV_DELETE, \
+ NULL, (hash))))
+
+#define hv_store_flags(hv, key, klen, val, hash, flags) \
+ ((SV**) hv_common((hv), NULL, (key), (klen), (flags), \
+ (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (val), \
+ (hash)))
+
+#define hv_store(hv, key, klen, val, hash) \
+ ((SV**) hv_common_key_len((hv), (key), (klen), \
+ (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), \
+ (val), (hash)))
+
+#define hv_exists(hv, key, klen) \
+ (hv_common_key_len((hv), (key), (klen), HV_FETCH_ISEXISTS, NULL, 0) \
+ ? TRUE : FALSE)
+
+#define hv_fetch(hv, key, klen, lval) \
+ ((SV**) hv_common_key_len((hv), (key), (klen), (lval) \
+ ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \
+ : HV_FETCH_JUST_SV, NULL, 0))
+
+#define hv_delete(hv, key, klen, flags) \
+ (MUTABLE_SV(hv_common_key_len((hv), (key), (klen), \
+ (flags) | HV_DELETE, NULL, 0)))
+
+/* This refcounted he structure is used for storing the hints used for lexical
+ pragmas. Without threads, it's basically struct he + refcount.
+ With threads, life gets more complex as the structure needs to be shared
+ between threads (because it hangs from OPs, which are shared), hence the
+ alternate definition and mutex. */
+
+struct refcounted_he;
+
+#ifdef PERL_CORE
+
+/* Gosh. This really isn't a good name any longer. */
+struct refcounted_he {
+ struct refcounted_he *refcounted_he_next; /* next entry in chain */
+#ifdef USE_ITHREADS
+ U32 refcounted_he_hash;
+ U32 refcounted_he_keylen;
+#else
+ HEK *refcounted_he_hek; /* hint key */
+#endif
+ union {
+ IV refcounted_he_u_iv;
+ UV refcounted_he_u_uv;
+ STRLEN refcounted_he_u_len;
+ void *refcounted_he_u_ptr; /* Might be useful in future */
+ } refcounted_he_val;
+ U32 refcounted_he_refcnt; /* reference count */
+ /* First byte is flags. Then NUL-terminated value. Then for ithreads,
+ non-NUL terminated key. */
+ char refcounted_he_data[1];
+};
+
+/* Flag bits are HVhek_UTF8, HVhek_WASUTF8, then */
+#define HVrhek_undef 0x00 /* Value is undef. */
+#define HVrhek_delete 0x10 /* Value is placeholder - signifies delete. */
+#define HVrhek_IV 0x20 /* Value is IV. */
+#define HVrhek_UV 0x30 /* Value is UV. */
+#define HVrhek_PV 0x40 /* Value is a (byte) string. */
+#define HVrhek_PV_UTF8 0x50 /* Value is a (utf8) string. */
+/* Two spare. As these have to live in the optree, you can't store anything
+ interpreter specific, such as SVs. :-( */
+#define HVrhek_typemask 0x70
+
+#ifdef USE_ITHREADS
+/* A big expression to find the key offset */
+#define REF_HE_KEY(chain) \
+ ((((chain->refcounted_he_data[0] & 0x60) == 0x40) \
+ ? chain->refcounted_he_val.refcounted_he_u_len + 1 : 0) \
+ + 1 + chain->refcounted_he_data)
+#endif
+
+# ifdef USE_ITHREADS
+# define HINTS_REFCNT_LOCK MUTEX_LOCK(&PL_hints_mutex)
+# define HINTS_REFCNT_UNLOCK MUTEX_UNLOCK(&PL_hints_mutex)
+# else
+# define HINTS_REFCNT_LOCK NOOP
+# define HINTS_REFCNT_UNLOCK NOOP
+# endif
+#endif
+
+#ifdef USE_ITHREADS
+# define HINTS_REFCNT_INIT MUTEX_INIT(&PL_hints_mutex)
+# define HINTS_REFCNT_TERM MUTEX_DESTROY(&PL_hints_mutex)
+#else
+# define HINTS_REFCNT_INIT NOOP
+# define HINTS_REFCNT_TERM NOOP
+#endif
+
+/* Hash actions
+ * Passed in PERL_MAGIC_uvar calls
+ */
+#define HV_DISABLE_UVAR_XKEY 0x01
+/* We need to ensure that these don't clash with G_DISCARD, which is 2, as it
+ is documented as being passed to hv_delete(). */
+#define HV_FETCH_ISSTORE 0x04
+#define HV_FETCH_ISEXISTS 0x08
+#define HV_FETCH_LVALUE 0x10
+#define HV_FETCH_JUST_SV 0x20
+#define HV_DELETE 0x40
+
+/*
+=for apidoc newHV
+
+Creates a new HV. The reference count is set to 1.
+
+=cut
+*/
+
+#define newHV() MUTABLE_HV(newSV_type(SVt_PVHV))
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/intrpvar.h b/Master/tlpkg/tlperl/lib/CORE/intrpvar.h
new file mode 100644
index 00000000000..8fe641c29c7
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/intrpvar.h
@@ -0,0 +1,731 @@
+/* intrpvar.h
+ *
+ * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ * 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+=head1 Per-Interpreter Variables
+*/
+
+/* These variables are per-interpreter in threaded/multiplicity builds,
+ * global otherwise.
+
+ * Don't forget to re-run embed.pl to propagate changes! */
+
+/* New variables must be added to the very end for binary compatibility.
+ * XSUB.h provides wrapper functions via perlapi.h that make this
+ * irrelevant, but not all code may be expected to #include XSUB.h. */
+
+/* Don't forget to add your variable also to perl_clone()! */
+
+/* The 'I' prefix is only needed for vars that need appropriate #defines
+ * generated when built with or without MULTIPLICITY. It is also used
+ * to generate the appropriate export list for win32.
+ *
+ * When building without MULTIPLICITY, these variables will be truly global.
+ *
+ * Important ones in the first cache line (if alignment is done right) */
+
+PERLVAR(Istack_sp, SV **) /* top of the stack */
+#ifdef OP_IN_REGISTER
+PERLVAR(Iopsave, OP *)
+#else
+PERLVAR(Iop, OP *) /* currently executing op */
+#endif
+PERLVAR(Icurpad, SV **) /* active pad (lexicals+tmps) */
+
+PERLVAR(Istack_base, SV **)
+PERLVAR(Istack_max, SV **)
+
+PERLVAR(Iscopestack, I32 *) /* scopes we've ENTERed */
+/* name of the scopes we've ENTERed. Only used with -DDEBUGGING, but needs to be
+ present always, as -DDEUBGGING must be binary compatible with non. */
+PERLVARI(Iscopestack_name, const char * *, NULL)
+PERLVAR(Iscopestack_ix, I32)
+PERLVAR(Iscopestack_max,I32)
+
+PERLVAR(Isavestack, ANY *) /* items that need to be restored when
+ LEAVEing scopes we've ENTERed */
+PERLVAR(Isavestack_ix, I32)
+PERLVAR(Isavestack_max, I32)
+
+PERLVAR(Itmps_stack, SV **) /* mortals we've made */
+PERLVARI(Itmps_ix, I32, -1)
+PERLVARI(Itmps_floor, I32, -1)
+PERLVAR(Itmps_max, I32)
+PERLVAR(Imodcount, I32) /* how much mod()ification in
+ assignment? */
+
+PERLVAR(Imarkstack, I32 *) /* stack_sp locations we're
+ remembering */
+PERLVAR(Imarkstack_ptr, I32 *)
+PERLVAR(Imarkstack_max, I32 *)
+
+PERLVAR(ISv, SV *) /* used to hold temporary values */
+PERLVAR(IXpv, XPV *) /* used to hold temporary values */
+
+/*
+=for apidoc Amn|STRLEN|PL_na
+
+A convenience variable which is typically used with C<SvPV> when one
+doesn't care about the length of the string. It is usually more efficient
+to either declare a local variable and use that instead or to use the
+C<SvPV_nolen> macro.
+
+=cut
+*/
+
+PERLVAR(Ina, STRLEN) /* for use in SvPV when length is
+ Not Applicable */
+
+/* stat stuff */
+PERLVAR(Istatbuf, Stat_t)
+PERLVAR(Istatcache, Stat_t) /* _ */
+PERLVAR(Istatgv, GV *)
+PERLVARI(Istatname, SV *, NULL)
+
+#ifdef HAS_TIMES
+PERLVAR(Itimesbuf, struct tms)
+#endif
+
+/* Fields used by magic variables such as $@, $/ and so on */
+PERLVAR(Icurpm, PMOP *) /* what to do \ interps in REs from */
+
+/*
+=for apidoc mn|SV*|PL_rs
+
+The input record separator - C<$/> in Perl space.
+
+=for apidoc mn|GV*|PL_last_in_gv
+
+The GV which was last used for a filehandle input operation. (C<< <FH> >>)
+
+=for apidoc mn|GV*|PL_ofsgv
+
+The glob containing the output field separator - C<*,> in Perl space.
+
+=cut
+*/
+
+PERLVAR(Irs, SV *) /* input record separator $/ */
+PERLVAR(Ilast_in_gv, GV *) /* GV used in last <FH> */
+PERLVAR(Iofsgv, GV *) /* GV of output field separator *, */
+PERLVAR(Idefoutgv, GV *) /* default FH for output */
+PERLVARI(Ichopset, const char *, " \n-") /* $: */
+PERLVAR(Iformtarget, SV *)
+PERLVAR(Ibodytarget, SV *)
+PERLVAR(Itoptarget, SV *)
+
+/* Stashes */
+PERLVAR(Idefstash, HV *) /* main symbol table */
+PERLVAR(Icurstash, HV *) /* symbol table for current package */
+
+PERLVAR(Irestartop, OP *) /* propagating an error from croak? */
+PERLVAR(Icurcop, COP *)
+PERLVAR(Icurstack, AV *) /* THE STACK */
+PERLVAR(Icurstackinfo, PERL_SI *) /* current stack + context */
+PERLVAR(Imainstack, AV *) /* the stack when nothing funny is
+ happening */
+
+PERLVAR(Itop_env, JMPENV *) /* ptr to current sigjmp environment */
+PERLVAR(Istart_env, JMPENV) /* empty startup sigjmp environment */
+PERLVARI(Ierrors, SV *, NULL) /* outstanding queued errors */
+
+/* statics "owned" by various functions */
+PERLVAR(Ihv_fetch_ent_mh, HE*) /* owned by hv_fetch_ent() */
+
+PERLVAR(Ilastgotoprobe, OP*) /* from pp_ctl.c */
+
+/* sort stuff */
+PERLVAR(Isortcop, OP *) /* user defined sort routine */
+PERLVAR(Isortstash, HV *) /* which is in some package or other */
+PERLVAR(Ifirstgv, GV *) /* $a */
+PERLVAR(Isecondgv, GV *) /* $b */
+
+/* float buffer */
+PERLVAR(Iefloatbuf, char *)
+PERLVAR(Iefloatsize, STRLEN)
+
+/* regex stuff */
+
+PERLVAR(Iscreamfirst, I32 *)
+PERLVAR(Iscreamnext, I32 *)
+PERLVAR(Ilastscream, SV *)
+
+PERLVAR(Ireg_state, struct re_save_state)
+
+PERLVAR(Iregdummy, regnode) /* from regcomp.c */
+
+PERLVARI(Idumpindent, U16, 4) /* number of blanks per dump
+ indentation level */
+
+
+PERLVAR(Iutf8locale, bool) /* utf8 locale detected */
+PERLVARI(Irehash_seed_set, bool, FALSE) /* 582 hash initialized? */
+
+PERLVARA(Icolors,6, char *) /* from regcomp.c */
+
+PERLVARI(Ipeepp, peep_t, MEMBER_TO_FPTR(Perl_peep))
+ /* Pointer to peephole optimizer */
+
+/*
+=for apidoc Amn|Perl_ophook_t|PL_opfreehook
+
+When non-C<NULL>, the function pointed by this variable will be called each time an OP is freed with the corresponding OP as the argument.
+This allows extensions to free any extra attribute they have locally attached to an OP.
+It is also assured to first fire for the parent OP and then for its kids.
+
+When you replace this variable, it is considered a good practice to store the possibly previously installed hook and that you recall it inside your own.
+
+=cut
+*/
+
+PERLVARI(Iopfreehook, Perl_ophook_t, 0) /* op_free() hook */
+
+PERLVARI(Imaxscream, I32, -1)
+PERLVARI(Ireginterp_cnt,I32, 0) /* Whether "Regexp" was interpolated. */
+PERLVARI(Iwatchaddr, char **, 0)
+PERLVAR(Iwatchok, char *)
+
+/* the currently active slab in a chain of slabs of regmatch states,
+ * and the currently active state within that slab */
+
+PERLVARI(Iregmatch_slab, regmatch_slab *, NULL)
+PERLVAR(Iregmatch_state, regmatch_state *)
+
+/* Put anything new that is pointer aligned here. */
+
+PERLVAR(Idelaymagic, U16) /* ($<,$>) = ... */
+PERLVAR(Ilocalizing, U8) /* are we processing a local() list? */
+PERLVAR(Icolorset, bool) /* from regcomp.c */
+PERLVARI(Idirty, bool, FALSE) /* in the middle of tearing things
+ down? */
+PERLVAR(Iin_eval, U8) /* trap "fatal" errors? */
+PERLVAR(Itainted, bool) /* using variables controlled by $< */
+
+/* This value may be set when embedding for full cleanup */
+/* 0=none, 1=full, 2=full with checks */
+/* mod_perl is special, and also assigns a meaning -1 */
+PERLVARI(Iperl_destruct_level, signed char, 0)
+
+PERLVAR(Iperldb, U32)
+
+/* pseudo environmental stuff */
+PERLVAR(Iorigargc, int)
+PERLVAR(Iorigargv, char **)
+PERLVAR(Ienvgv, GV *)
+PERLVAR(Iincgv, GV *)
+PERLVAR(Ihintgv, GV *)
+PERLVAR(Iorigfilename, char *)
+PERLVAR(Idiehook, SV *)
+PERLVAR(Iwarnhook, SV *)
+
+/* switches */
+PERLVAR(Ipatchlevel, SV *)
+PERLVAR(Ilocalpatches, const char * const *)
+PERLVARI(Isplitstr, const char *, " ")
+
+PERLVAR(Iminus_c, bool)
+PERLVAR(Iminus_n, bool)
+PERLVAR(Iminus_p, bool)
+PERLVAR(Iminus_l, bool)
+PERLVAR(Iminus_a, bool)
+PERLVAR(Iminus_F, bool)
+PERLVAR(Idoswitches, bool)
+PERLVAR(Iminus_E, bool)
+
+/*
+
+=for apidoc mn|bool|PL_dowarn
+
+The C variable which corresponds to Perl's $^W warning variable.
+
+=cut
+*/
+
+PERLVAR(Idowarn, U8)
+PERLVAR(Idoextract, bool)
+PERLVAR(Isawampersand, bool) /* must save all match strings */
+PERLVAR(Iunsafe, bool)
+PERLVAR(Iexit_flags, U8) /* was exit() unexpected, etc. */
+PERLVAR(Isrand_called, bool)
+/* Part of internal state, but makes the 16th 1 byte variable in a row. */
+PERLVAR(Itainting, bool) /* doing taint checks */
+/* Space for a U8 */
+PERLVAR(Iinplace, char *)
+PERLVAR(Ie_script, SV *)
+
+/* magical thingies */
+PERLVAR(Ibasetime, Time_t) /* $^T */
+PERLVAR(Iformfeed, SV *) /* $^L */
+
+
+PERLVARI(Imaxsysfd, I32, MAXSYSFD)
+ /* top fd to pass to subprocesses */
+PERLVAR(Istatusvalue, I32) /* $? */
+#ifdef VMS
+PERLVAR(Istatusvalue_vms,U32)
+#else
+PERLVAR(Istatusvalue_posix,I32)
+#endif
+
+PERLVARI(Isig_pending, int,0) /* Number if highest signal pending */
+PERLVAR(Ipsig_pend, int *) /* per-signal "count" of pending */
+
+/* shortcuts to various I/O objects */
+PERLVAR(Istdingv, GV *)
+PERLVAR(Istderrgv, GV *)
+PERLVAR(Idefgv, GV *)
+PERLVAR(Iargvgv, GV *)
+PERLVAR(Iargvoutgv, GV *)
+PERLVAR(Iargvout_stack, AV *)
+
+/* shortcuts to regexp stuff */
+PERLVAR(Ireplgv, GV *)
+
+/* shortcuts to misc objects */
+PERLVAR(Ierrgv, GV *)
+
+/* shortcuts to debugging objects */
+PERLVAR(IDBgv, GV *)
+PERLVAR(IDBline, GV *)
+
+/*
+=for apidoc mn|GV *|PL_DBsub
+When Perl is run in debugging mode, with the B<-d> switch, this GV contains
+the SV which holds the name of the sub being debugged. This is the C
+variable which corresponds to Perl's $DB::sub variable. See
+C<PL_DBsingle>.
+
+=for apidoc mn|SV *|PL_DBsingle
+When Perl is run in debugging mode, with the B<-d> switch, this SV is a
+boolean which indicates whether subs are being single-stepped.
+Single-stepping is automatically turned on after every step. This is the C
+variable which corresponds to Perl's $DB::single variable. See
+C<PL_DBsub>.
+
+=for apidoc mn|SV *|PL_DBtrace
+Trace variable used when Perl is run in debugging mode, with the B<-d>
+switch. This is the C variable which corresponds to Perl's $DB::trace
+variable. See C<PL_DBsingle>.
+
+=cut
+*/
+
+PERLVAR(IDBsub, GV *)
+PERLVAR(IDBsingle, SV *)
+PERLVAR(IDBtrace, SV *)
+PERLVAR(IDBsignal, SV *)
+PERLVAR(Idbargs, AV *) /* args to call listed by caller function */
+
+/* symbol tables */
+PERLVAR(Idebstash, HV *) /* symbol table for perldb package */
+PERLVAR(Iglobalstash, HV *) /* global keyword overrides imported here */
+PERLVAR(Icurstname, SV *) /* name of current package */
+PERLVAR(Ibeginav, AV *) /* names of BEGIN subroutines */
+PERLVAR(Iendav, AV *) /* names of END subroutines */
+PERLVAR(Iunitcheckav, AV *) /* names of UNITCHECK subroutines */
+PERLVAR(Icheckav, AV *) /* names of CHECK subroutines */
+PERLVAR(Iinitav, AV *) /* names of INIT subroutines */
+PERLVAR(Istrtab, HV *) /* shared string table */
+PERLVARI(Isub_generation,U32,1) /* incr to invalidate method cache */
+
+/* funky return mechanisms */
+PERLVAR(Iforkprocess, int) /* so do_open |- can return proc# */
+
+/* memory management */
+PERLVAR(Isv_count, I32) /* how many SV* are currently allocated */
+PERLVAR(Isv_objcount, I32) /* how many objects are currently allocated */
+PERLVAR(Isv_root, SV*) /* storage for SVs belonging to interp */
+PERLVAR(Isv_arenaroot, SV*) /* list of areas for garbage collection */
+
+/* subprocess state */
+PERLVAR(Ifdpid, AV *) /* keep fd-to-pid mappings for my_popen */
+
+/* internal state */
+PERLVARI(Iop_mask, char *, NULL) /* masked operations for safe evals */
+
+/* current interpreter roots */
+PERLVAR(Imain_cv, CV *)
+PERLVAR(Imain_root, OP *)
+PERLVAR(Imain_start, OP *)
+PERLVAR(Ieval_root, OP *)
+PERLVAR(Ieval_start, OP *)
+
+/* runtime control stuff */
+PERLVARI(Icurcopdb, COP *, NULL)
+
+PERLVAR(Ifilemode, int) /* so nextargv() can preserve mode */
+PERLVAR(Ilastfd, int) /* what to preserve mode on */
+PERLVAR(Ioldname, char *) /* what to preserve mode on */
+PERLVAR(IArgv, const char **) /* stuff to free from do_aexec, vfork safe */
+PERLVAR(ICmd, char *) /* stuff to free from do_aexec, vfork safe */
+/* Elements in this array have ';' appended and are injected as a single line
+ into the tokeniser. You can't put any (literal) newlines into any program
+ you stuff in into this array, as the point where it's injected is expecting
+ a single physical line. */
+PERLVAR(Ipreambleav, AV *)
+PERLVAR(Imess_sv, SV *)
+PERLVAR(Iors_sv, SV *) /* output record separator $\ */
+/* statics moved here for shared library purposes */
+PERLVARI(Igensym, I32, 0) /* next symbol for getsym() to define */
+PERLVARI(Icv_has_eval, bool, FALSE) /* PL_compcv includes an entereval or similar */
+PERLVAR(Itaint_warn, bool) /* taint warns instead of dying */
+PERLVARI(Ilaststype, U16, OP_STAT)
+PERLVARI(Ilaststatval, int, -1)
+
+/* interpreter atexit processing */
+PERLVARI(Iexitlistlen, I32, 0) /* length of same */
+PERLVARI(Iexitlist, PerlExitListEntry *, NULL)
+ /* list of exit functions */
+
+/*
+=for apidoc Amn|HV*|PL_modglobal
+
+C<PL_modglobal> is a general purpose, interpreter global HV for use by
+extensions that need to keep information on a per-interpreter basis.
+In a pinch, it can also be used as a symbol table for extensions
+to share data among each other. It is a good idea to use keys
+prefixed by the package name of the extension that owns the data.
+
+=cut
+*/
+
+PERLVAR(Imodglobal, HV *) /* per-interp module data */
+
+/* these used to be in global before 5.004_68 */
+PERLVARI(Iprofiledata, U32 *, NULL) /* table of ops, counts */
+
+PERLVAR(Icompiling, COP) /* compiling/done executing marker */
+
+PERLVAR(Icompcv, CV *) /* currently compiling subroutine */
+PERLVAR(Icomppad, AV *) /* storage for lexically scoped temporaries */
+PERLVAR(Icomppad_name, AV *) /* variable names for "my" variables */
+PERLVAR(Icomppad_name_fill, I32) /* last "introduced" variable offset */
+PERLVAR(Icomppad_name_floor, I32) /* start of vars in innermost block */
+
+#ifdef HAVE_INTERP_INTERN
+PERLVAR(Isys_intern, struct interp_intern)
+ /* platform internals */
+#endif
+
+/* more statics moved here */
+PERLVAR(IDBcv, CV *) /* from perl.c */
+PERLVARI(Igeneration, int, 100) /* from op.c */
+
+PERLVARI(Iin_clean_objs,bool, FALSE) /* from sv.c */
+PERLVARI(Iin_clean_all, bool, FALSE) /* from sv.c */
+PERLVAR(Inomemok, bool) /* let malloc context handle nomem */
+PERLVARI(Isavebegin, bool, FALSE) /* save BEGINs for compiler */
+
+PERLVAR(Iuid, Uid_t) /* current real user id */
+PERLVAR(Ieuid, Uid_t) /* current effective user id */
+PERLVAR(Igid, Gid_t) /* current real group id */
+PERLVAR(Iegid, Gid_t) /* current effective group id */
+PERLVARI(Ian, U32, 0) /* malloc sequence number */
+PERLVARI(Icop_seqmax, U32, 0) /* statement sequence number */
+PERLVARI(Ievalseq, U32, 0) /* eval sequence number */
+PERLVAR(Iorigalen, U32)
+PERLVAR(Iorigenviron, char **)
+#ifdef PERL_USES_PL_PIDSTATUS
+PERLVAR(Ipidstatus, HV *) /* pid-to-status mappings for waitpid */
+#endif
+PERLVAR(Iosname, char *) /* operating system */
+
+PERLVAR(Isighandlerp, Sighandler_t)
+
+PERLVARA(Ibody_roots, PERL_ARENA_ROOTS_SIZE, void*) /* array of body roots */
+
+PERLVAR(Inice_chunk, char *) /* a nice chunk of memory to reuse */
+PERLVAR(Inice_chunk_size, U32) /* how nice the chunk of memory is */
+
+PERLVARI(Imaxo, int, MAXO) /* maximum number of ops */
+
+PERLVARI(Irunops, runops_proc_t, MEMBER_TO_FPTR(RUNOPS_DEFAULT))
+
+/*
+=for apidoc Amn|SV|PL_sv_undef
+This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
+
+=for apidoc Amn|SV|PL_sv_no
+This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as
+C<&PL_sv_no>.
+
+=for apidoc Amn|SV|PL_sv_yes
+This is the C<true> SV. See C<PL_sv_no>. Always refer to this as
+C<&PL_sv_yes>.
+
+=cut
+*/
+
+PERLVAR(Isv_undef, SV)
+PERLVAR(Isv_no, SV)
+PERLVAR(Isv_yes, SV)
+
+PERLVAR(Isubname, SV *) /* name of current subroutine */
+
+PERLVAR(Isubline, I32) /* line this subroutine began on */
+PERLVAR(Imin_intro_pending, I32) /* start of vars to introduce */
+
+PERLVAR(Imax_intro_pending, I32) /* end of vars to introduce */
+PERLVAR(Ipadix, I32) /* max used index in current "register" pad */
+
+PERLVAR(Ipadix_floor, I32) /* how low may inner block reset padix */
+
+PERLVAR(Ihints, U32) /* pragma-tic compile-time flags */
+
+PERLVAR(Idebug, VOL U32) /* flags given to -D switch */
+
+/* Perl_Ibreakable_sub_generation_ptr was too long for VMS, hence "gen" */
+PERLVARI(Ibreakable_sub_gen, U32, 0)
+
+PERLVARI(Iamagic_generation, long, 0)
+
+#ifdef USE_LOCALE_COLLATE
+PERLVAR(Icollation_name,char *) /* Name of current collation */
+PERLVAR(Icollxfrm_base, Size_t) /* Basic overhead in *xfrm() */
+PERLVARI(Icollxfrm_mult,Size_t, 2) /* Expansion factor in *xfrm() */
+PERLVARI(Icollation_ix, U32, 0) /* Collation generation index */
+PERLVARI(Icollation_standard, bool, TRUE)
+ /* Assume simple collation */
+#endif /* USE_LOCALE_COLLATE */
+
+
+#if defined (PERL_UTF8_CACHE_ASSERT) || defined (DEBUGGING)
+# define PERL___I -1
+#else
+# define PERL___I 1
+#endif
+PERLVARI(Iutf8cache, I8, PERL___I) /* Is the utf8 caching code enabled? */
+#undef PERL___I
+
+
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVARI(Inumeric_standard, bool, TRUE)
+ /* Assume simple numerics */
+PERLVARI(Inumeric_local, bool, TRUE)
+ /* Assume local numerics */
+PERLVAR(Inumeric_name, char *) /* Name of current numeric locale */
+#endif /* !USE_LOCALE_NUMERIC */
+
+/* utf8 character classes */
+PERLVAR(Iutf8_alnum, SV *)
+PERLVAR(Iutf8_ascii, SV *)
+PERLVAR(Iutf8_alpha, SV *)
+PERLVAR(Iutf8_space, SV *)
+PERLVAR(Iutf8_perl_space, SV *)
+PERLVAR(Iutf8_perl_word, SV *)
+PERLVAR(Iutf8_posix_digit, SV *)
+PERLVAR(Iutf8_cntrl, SV *)
+PERLVAR(Iutf8_graph, SV *)
+PERLVAR(Iutf8_digit, SV *)
+PERLVAR(Iutf8_upper, SV *)
+PERLVAR(Iutf8_lower, SV *)
+PERLVAR(Iutf8_print, SV *)
+PERLVAR(Iutf8_punct, SV *)
+PERLVAR(Iutf8_xdigit, SV *)
+PERLVAR(Iutf8_mark, SV *)
+PERLVAR(Iutf8_X_begin, SV *)
+PERLVAR(Iutf8_X_extend, SV *)
+PERLVAR(Iutf8_X_prepend, SV *)
+PERLVAR(Iutf8_X_non_hangul, SV *)
+PERLVAR(Iutf8_X_L, SV *)
+PERLVAR(Iutf8_X_LV, SV *)
+PERLVAR(Iutf8_X_LVT, SV *)
+PERLVAR(Iutf8_X_T, SV *)
+PERLVAR(Iutf8_X_V, SV *)
+PERLVAR(Iutf8_X_LV_LVT_V, SV *)
+PERLVAR(Iutf8_toupper, SV *)
+PERLVAR(Iutf8_totitle, SV *)
+PERLVAR(Iutf8_tolower, SV *)
+PERLVAR(Iutf8_tofold, SV *)
+PERLVAR(Ilast_swash_hv, HV *)
+PERLVAR(Ilast_swash_tmps, U8 *)
+PERLVAR(Ilast_swash_slen, STRLEN)
+PERLVARA(Ilast_swash_key,10, U8)
+PERLVAR(Ilast_swash_klen, U8) /* Only needs to store 0-10 */
+
+#ifdef FCRYPT
+PERLVARI(Icryptseen, bool, FALSE) /* has fast crypt() been initialized? */
+#endif
+
+PERLVAR(Ipad_reset_pending, bool) /* reset pad on next attempted alloc */
+
+PERLVARI(Iglob_index, int, 0)
+
+
+PERLVAR(Iparser, yy_parser *) /* current parser state */
+
+/* Array of signal handlers, indexed by signal number, through which the C
+ signal handler dispatches. */
+PERLVAR(Ipsig_ptr, SV**)
+/* Array of names of signals, indexed by signal number, for (re)use as the first
+ argument to a signal handler. Only one block of memory is allocated for
+ both psig_name and psig_ptr. */
+PERLVAR(Ipsig_name, SV**)
+
+#if defined(PERL_IMPLICIT_SYS)
+PERLVAR(IMem, struct IPerlMem*)
+PERLVAR(IMemShared, struct IPerlMem*)
+PERLVAR(IMemParse, struct IPerlMem*)
+PERLVAR(IEnv, struct IPerlEnv*)
+PERLVAR(IStdIO, struct IPerlStdIO*)
+PERLVAR(ILIO, struct IPerlLIO*)
+PERLVAR(IDir, struct IPerlDir*)
+PERLVAR(ISock, struct IPerlSock*)
+PERLVAR(IProc, struct IPerlProc*)
+#endif
+
+PERLVAR(Iptr_table, PTR_TBL_t*)
+PERLVARI(Ibeginav_save, AV*, NULL) /* save BEGIN{}s when compiling */
+
+PERLVAR(Ibody_arenas, void*) /* pointer to list of body-arenas */
+
+
+#ifdef USE_LOCALE_NUMERIC
+
+PERLVAR(Inumeric_radix_sv, SV *) /* The radix separator if not '.' */
+
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Iregex_pad, SV**) /* Shortcut into the array of
+ regex_padav */
+PERLVAR(Iregex_padav, AV*) /* All regex objects, indexed via the
+ values in op_pmoffset of pmop.
+ Entry 0 is an SV whose PV is a
+ "packed" list of IVs listing
+ the now-free slots in the array */
+#endif
+
+#ifdef USE_REENTRANT_API
+PERLVAR(Ireentrant_buffer, REENTR*) /* here we store the _r buffers */
+#endif
+
+PERLVAR(Icustom_op_names, HV*) /* Names of user defined ops */
+PERLVAR(Icustom_op_descs, HV*) /* Descriptions of user defined ops */
+
+#ifdef PERLIO_LAYERS
+PERLVARI(Iperlio, PerlIO *,NULL)
+PERLVARI(Iknown_layers, PerlIO_list_t *,NULL)
+PERLVARI(Idef_layerlist, PerlIO_list_t *,NULL)
+#endif
+
+PERLVARI(Iencoding, SV*, NULL) /* character encoding */
+
+PERLVAR(Idebug_pad, struct perl_debug_pad) /* always needed because of the re extension */
+
+PERLVAR(Iutf8_idstart, SV *)
+PERLVAR(Iutf8_idcont, SV *)
+
+PERLVAR(Isort_RealCmp, SVCOMPARE_t)
+
+PERLVARI(Icheckav_save, AV*, NULL) /* save CHECK{}s when compiling */
+PERLVARI(Iunitcheckav_save, AV*, NULL) /* save UNITCHECK{}s when compiling */
+
+PERLVARI(Iclocktick, long, 0) /* this many times() ticks in a second */
+
+PERLVARI(Iin_load_module, int, 0) /* to prevent recursions in PerlIO_find_layer */
+
+PERLVAR(Iunicode, U32) /* Unicode features: $ENV{PERL_UNICODE} or -C */
+
+PERLVAR(Isignals, U32) /* Using which pre-5.8 signals */
+
+PERLVAR(Ireentrant_retint, int) /* Integer return value from reentrant functions */
+
+PERLVAR(Istashcache, HV *) /* Cache to speed up S_method_common */
+
+/* Hooks to shared SVs and locks. */
+PERLVARI(Isharehook, share_proc_t, MEMBER_TO_FPTR(Perl_sv_nosharing))
+PERLVARI(Ilockhook, share_proc_t, MEMBER_TO_FPTR(Perl_sv_nosharing))
+#ifdef NO_MATHOMS
+# define PERL_UNLOCK_HOOK Perl_sv_nosharing
+#else
+/* This reference ensures that the mathoms are linked with perl */
+# define PERL_UNLOCK_HOOK Perl_sv_nounlocking
+#endif
+PERLVARI(Iunlockhook, share_proc_t, MEMBER_TO_FPTR(PERL_UNLOCK_HOOK))
+
+PERLVARI(Ithreadhook, thrhook_proc_t, MEMBER_TO_FPTR(Perl_nothreadhook))
+
+PERLVARI(Ihash_seed, UV, 0) /* Hash initializer */
+
+PERLVARI(Irehash_seed, UV, 0) /* 582 hash initializer */
+
+PERLVARI(Iisarev, HV*, NULL) /* Reverse map of @ISA dependencies */
+
+/* The last unconditional member of the interpreter structure when 5.10.0 was
+ released. The offset of the end of this is baked into a global variable in
+ any shared perl library which will allow a sanity test in future perl
+ releases. */
+#define PERL_LAST_5_10_0_INTERP_MEMBER Iisarev
+
+#ifdef PERL_IMPLICIT_CONTEXT
+PERLVARI(Imy_cxt_size, int, 0) /* size of PL_my_cxt_list */
+PERLVARI(Imy_cxt_list, void **, NULL) /* per-module array of MY_CXT pointers */
+# ifdef PERL_GLOBAL_STRUCT_PRIVATE
+PERLVARI(Imy_cxt_keys, const char **, NULL) /* per-module array of pointers to MY_CXT_KEY constants */
+# endif
+#endif
+
+#ifdef PERL_TRACK_MEMPOOL
+/* For use with the memory debugging code in util.c */
+PERLVAR(Imemory_debug_header, struct perl_memory_debug_header)
+#endif
+
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+/* File descriptor to talk to the child which dumps scalars. */
+PERLVARI(Idumper_fd, int, -1)
+#endif
+
+/* Stores the PPID */
+#ifdef THREADS_HAVE_PIDS
+PERLVARI(Ippid, IV, 0)
+#endif
+
+#ifdef PERL_MAD
+PERLVARI(Imadskills, bool, FALSE) /* preserve all syntactic info */
+ /* (MAD = Misc Attribute Decoration) */
+PERLVARI(Ixmlfp, PerlIO *,NULL)
+#endif
+
+#ifdef PL_OP_SLAB_ALLOC
+PERLVAR(IOpPtr,I32 **)
+PERLVARI(IOpSpace,I32,0)
+PERLVAR(IOpSlab,I32 *)
+#endif
+
+#ifdef PERL_DEBUG_READONLY_OPS
+PERLVARI(Islabs, I32**, NULL) /* Array of slabs that have been allocated */
+PERLVARI(Islab_count, U32, 0) /* Size of the array */
+#endif
+
+/* Can shared object be destroyed */
+PERLVARI(Idestroyhook, destroyable_proc_t, MEMBER_TO_FPTR(Perl_sv_destroyable))
+
+#ifdef DEBUG_LEAKING_SCALARS
+PERLVARI(Isv_serial, U32, 0) /* SV serial number, used in sv.c */
+#endif
+
+/* Register of known Method Resolution Orders.
+ What this actually points to is an implementation detail (it may change to
+ a structure incorporating a reference count - use mro_get_from_name to
+ retrieve a C<struct mro_alg *> */
+PERLVAR(Iregistered_mros, HV *)
+
+/* If you are adding a U8 or U16, check to see if there are 'Space' comments
+ * above on where there are gaps which currently will be structure padding. */
+
+/* Within a stable branch, new variables must be added to the very end, before
+ * this comment, for binary compatibility (the offsets of the old members must
+ * not change).
+ * (Don't forget to add your variable also to perl_clone()!)
+ * XSUB.h provides wrapper functions via perlapi.h that make this
+ * irrelevant, but not all code may be expected to #include XSUB.h.
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/iperlsys.h b/Master/tlpkg/tlperl/lib/CORE/iperlsys.h
new file mode 100644
index 00000000000..76f5c41ae67
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/iperlsys.h
@@ -0,0 +1,1423 @@
+/*
+ * iperlsys.h - Perl's interface to the system
+ *
+ * This file defines the system level functionality that perl needs.
+ *
+ * When using C, this definition is in the form of a set of macros
+ * that can be #defined to the system-level function (or a wrapper
+ * provided elsewhere).
+ *
+ * GSAR 21-JUN-98
+ */
+
+#ifndef __Inc__IPerl___
+#define __Inc__IPerl___
+
+/*
+ * PerlXXX_YYY explained - DickH and DougL @ ActiveState.com
+ *
+ * XXX := functional group
+ * YYY := stdlib/OS function name
+ *
+ * Continuing with the theme of PerlIO, all OS functionality was
+ * encapsulated into one of several interfaces.
+ *
+ * PerlIO - stdio
+ * PerlLIO - low level I/O
+ * PerlMem - malloc, realloc, free
+ * PerlDir - directory related
+ * PerlEnv - process environment handling
+ * PerlProc - process control
+ * PerlSock - socket functions
+ *
+ *
+ * The features of this are:
+ * 1. All OS dependant code is in the Perl Host and not the Perl Core.
+ * (At least this is the holy grail goal of this work)
+ * 2. The Perl Host (see perl.h for description) can provide a new and
+ * improved interface to OS functionality if required.
+ * 3. Developers can easily hook into the OS calls for instrumentation
+ * or diagnostic purposes.
+ *
+ * What was changed to do this:
+ * 1. All calls to OS functions were replaced with PerlXXX_YYY
+ *
+ */
+
+/*
+ Interface for perl stdio functions, or whatever we are Configure-d
+ to use.
+*/
+#include "perlio.h"
+
+#ifndef Sighandler_t
+# if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+typedef Signal_t (*Sighandler_t) (int, siginfo_t*, void*);
+# else
+typedef Signal_t (*Sighandler_t) (int);
+# endif
+#endif
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlStdIO */
+struct IPerlStdIO;
+struct IPerlStdIOInfo;
+typedef FILE* (*LPStdin)(struct IPerlStdIO*);
+typedef FILE* (*LPStdout)(struct IPerlStdIO*);
+typedef FILE* (*LPStderr)(struct IPerlStdIO*);
+typedef FILE* (*LPOpen)(struct IPerlStdIO*, const char*,
+ const char*);
+typedef int (*LPClose)(struct IPerlStdIO*, FILE*);
+typedef int (*LPEof)(struct IPerlStdIO*, FILE*);
+typedef int (*LPError)(struct IPerlStdIO*, FILE*);
+typedef void (*LPClearerr)(struct IPerlStdIO*, FILE*);
+typedef int (*LPGetc)(struct IPerlStdIO*, FILE*);
+typedef STDCHAR* (*LPGetBase)(struct IPerlStdIO*, FILE*);
+typedef int (*LPGetBufsiz)(struct IPerlStdIO*, FILE*);
+typedef int (*LPGetCnt)(struct IPerlStdIO*, FILE*);
+typedef STDCHAR* (*LPGetPtr)(struct IPerlStdIO*, FILE*);
+typedef char* (*LPGets)(struct IPerlStdIO*, FILE*, char*, int);
+typedef int (*LPPutc)(struct IPerlStdIO*, FILE*, int);
+typedef int (*LPPuts)(struct IPerlStdIO*, FILE*, const char*);
+typedef int (*LPFlush)(struct IPerlStdIO*, FILE*);
+typedef int (*LPUngetc)(struct IPerlStdIO*, int,FILE*);
+typedef int (*LPFileno)(struct IPerlStdIO*, FILE*);
+typedef FILE* (*LPFdopen)(struct IPerlStdIO*, int, const char*);
+typedef FILE* (*LPReopen)(struct IPerlStdIO*, const char*,
+ const char*, FILE*);
+typedef SSize_t (*LPRead)(struct IPerlStdIO*, void*, Size_t, Size_t, FILE *);
+typedef SSize_t (*LPWrite)(struct IPerlStdIO*, const void*, Size_t, Size_t, FILE *);
+typedef void (*LPSetBuf)(struct IPerlStdIO*, FILE*, char*);
+typedef int (*LPSetVBuf)(struct IPerlStdIO*, FILE*, char*, int,
+ Size_t);
+typedef void (*LPSetCnt)(struct IPerlStdIO*, FILE*, int);
+
+#ifndef NETWARE
+typedef void (*LPSetPtr)(struct IPerlStdIO*, FILE*, STDCHAR*);
+#elif defined(NETWARE)
+typedef void (*LPSetPtr)(struct IPerlStdIO*, FILE*, STDCHAR*, int);
+#endif
+
+typedef void (*LPSetlinebuf)(struct IPerlStdIO*, FILE*);
+typedef int (*LPPrintf)(struct IPerlStdIO*, FILE*, const char*,
+ ...);
+typedef int (*LPVprintf)(struct IPerlStdIO*, FILE*, const char*,
+ va_list);
+typedef Off_t (*LPTell)(struct IPerlStdIO*, FILE*);
+typedef int (*LPSeek)(struct IPerlStdIO*, FILE*, Off_t, int);
+typedef void (*LPRewind)(struct IPerlStdIO*, FILE*);
+typedef FILE* (*LPTmpfile)(struct IPerlStdIO*);
+typedef int (*LPGetpos)(struct IPerlStdIO*, FILE*, Fpos_t*);
+typedef int (*LPSetpos)(struct IPerlStdIO*, FILE*,
+ const Fpos_t*);
+typedef void (*LPInit)(struct IPerlStdIO*);
+typedef void (*LPInitOSExtras)(struct IPerlStdIO*);
+typedef FILE* (*LPFdupopen)(struct IPerlStdIO*, FILE*);
+
+struct IPerlStdIO
+{
+ LPStdin pStdin;
+ LPStdout pStdout;
+ LPStderr pStderr;
+ LPOpen pOpen;
+ LPClose pClose;
+ LPEof pEof;
+ LPError pError;
+ LPClearerr pClearerr;
+ LPGetc pGetc;
+ LPGetBase pGetBase;
+ LPGetBufsiz pGetBufsiz;
+ LPGetCnt pGetCnt;
+ LPGetPtr pGetPtr;
+ LPGets pGets;
+ LPPutc pPutc;
+ LPPuts pPuts;
+ LPFlush pFlush;
+ LPUngetc pUngetc;
+ LPFileno pFileno;
+ LPFdopen pFdopen;
+ LPReopen pReopen;
+ LPRead pRead;
+ LPWrite pWrite;
+ LPSetBuf pSetBuf;
+ LPSetVBuf pSetVBuf;
+ LPSetCnt pSetCnt;
+ LPSetPtr pSetPtr;
+ LPSetlinebuf pSetlinebuf;
+ LPPrintf pPrintf;
+ LPVprintf pVprintf;
+ LPTell pTell;
+ LPSeek pSeek;
+ LPRewind pRewind;
+ LPTmpfile pTmpfile;
+ LPGetpos pGetpos;
+ LPSetpos pSetpos;
+ LPInit pInit;
+ LPInitOSExtras pInitOSExtras;
+ LPFdupopen pFdupopen;
+};
+
+struct IPerlStdIOInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlStdIO perlStdIOList;
+};
+
+/* These do not belong here ... NI-S, 14 Nov 2000 */
+
+#ifdef USE_STDIO_PTR
+# define PerlSIO_has_cntptr(f) 1
+# ifdef STDIO_PTR_LVALUE
+# ifdef STDIO_CNT_LVALUE
+# define PerlSIO_canset_cnt(f) 1
+# ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+# define PerlSIO_fast_gets(f) 1
+# endif
+# else /* STDIO_CNT_LVALUE */
+# define PerlSIO_canset_cnt(f) 0
+# endif
+# else /* STDIO_PTR_LVALUE */
+# ifdef STDIO_PTR_LVAL_SETS_CNT
+# define PerlSIO_fast_gets(f) 1
+# endif
+# endif
+#else /* USE_STDIO_PTR */
+# define PerlSIO_has_cntptr(f) 0
+# define PerlSIO_canset_cnt(f) 0
+#endif /* USE_STDIO_PTR */
+
+#ifndef PerlSIO_fast_gets
+#define PerlSIO_fast_gets(f) 0
+#endif
+
+#ifdef FILE_base
+#define PerlSIO_has_base(f) 1
+#else
+#define PerlSIO_has_base(f) 0
+#endif
+
+/* Now take FILE * via function table */
+
+#define PerlSIO_stdin \
+ (*PL_StdIO->pStdin)(PL_StdIO)
+#define PerlSIO_stdout \
+ (*PL_StdIO->pStdout)(PL_StdIO)
+#define PerlSIO_stderr \
+ (*PL_StdIO->pStderr)(PL_StdIO)
+#define PerlSIO_fopen(x,y) \
+ (*PL_StdIO->pOpen)(PL_StdIO, (x),(y))
+#define PerlSIO_fclose(f) \
+ (*PL_StdIO->pClose)(PL_StdIO, (f))
+#define PerlSIO_feof(f) \
+ (*PL_StdIO->pEof)(PL_StdIO, (f))
+#define PerlSIO_ferror(f) \
+ (*PL_StdIO->pError)(PL_StdIO, (f))
+#define PerlSIO_clearerr(f) \
+ (*PL_StdIO->pClearerr)(PL_StdIO, (f))
+#define PerlSIO_fgetc(f) \
+ (*PL_StdIO->pGetc)(PL_StdIO, (f))
+#define PerlSIO_get_base(f) \
+ (*PL_StdIO->pGetBase)(PL_StdIO, (f))
+#define PerlSIO_get_bufsiz(f) \
+ (*PL_StdIO->pGetBufsiz)(PL_StdIO, (f))
+#define PerlSIO_get_cnt(f) \
+ (*PL_StdIO->pGetCnt)(PL_StdIO, (f))
+#define PerlSIO_get_ptr(f) \
+ (*PL_StdIO->pGetPtr)(PL_StdIO, (f))
+#define PerlSIO_fputc(f,c) \
+ (*PL_StdIO->pPutc)(PL_StdIO, (c),(f))
+#define PerlSIO_fputs(f,s) \
+ (*PL_StdIO->pPuts)(PL_StdIO, (s),(f))
+#define PerlSIO_fflush(f) \
+ (*PL_StdIO->pFlush)(PL_StdIO, (f))
+#define PerlSIO_fgets(s, n, fp) \
+ (*PL_StdIO->pGets)(PL_StdIO, (fp), s, n)
+#define PerlSIO_ungetc(c,f) \
+ (*PL_StdIO->pUngetc)(PL_StdIO, (c),(f))
+#define PerlSIO_fileno(f) \
+ (*PL_StdIO->pFileno)(PL_StdIO, (f))
+#define PerlSIO_fdopen(f, s) \
+ (*PL_StdIO->pFdopen)(PL_StdIO, (f),(s))
+#define PerlSIO_freopen(p, m, f) \
+ (*PL_StdIO->pReopen)(PL_StdIO, (p), (m), (f))
+#define PerlSIO_fread(buf,sz,count,f) \
+ (*PL_StdIO->pRead)(PL_StdIO, (buf), (sz), (count), (f))
+#define PerlSIO_fwrite(buf,sz,count,f) \
+ (*PL_StdIO->pWrite)(PL_StdIO, (buf), (sz), (count), (f))
+#define PerlSIO_setbuf(f,b) \
+ (*PL_StdIO->pSetBuf)(PL_StdIO, (f), (b))
+#define PerlSIO_setvbuf(f,b,t,s) \
+ (*PL_StdIO->pSetVBuf)(PL_StdIO, (f),(b),(t),(s))
+#define PerlSIO_set_cnt(f,c) \
+ (*PL_StdIO->pSetCnt)(PL_StdIO, (f), (c))
+#define PerlSIO_set_ptr(f,p) \
+ (*PL_StdIO->pSetPtr)(PL_StdIO, (f), (p))
+#define PerlSIO_setlinebuf(f) \
+ (*PL_StdIO->pSetlinebuf)(PL_StdIO, (f))
+#define PerlSIO_printf Perl_fprintf_nocontext
+#define PerlSIO_stdoutf Perl_printf_nocontext
+#define PerlSIO_vprintf(f,fmt,a) \
+ (*PL_StdIO->pVprintf)(PL_StdIO, (f),(fmt),a)
+#define PerlSIO_ftell(f) \
+ (*PL_StdIO->pTell)(PL_StdIO, (f))
+#define PerlSIO_fseek(f,o,w) \
+ (*PL_StdIO->pSeek)(PL_StdIO, (f),(o),(w))
+#define PerlSIO_fgetpos(f,p) \
+ (*PL_StdIO->pGetpos)(PL_StdIO, (f),(p))
+#define PerlSIO_fsetpos(f,p) \
+ (*PL_StdIO->pSetpos)(PL_StdIO, (f),(p))
+#define PerlSIO_rewind(f) \
+ (*PL_StdIO->pRewind)(PL_StdIO, (f))
+#define PerlSIO_tmpfile() \
+ (*PL_StdIO->pTmpfile)(PL_StdIO)
+#define PerlSIO_init() \
+ (*PL_StdIO->pInit)(PL_StdIO)
+#undef init_os_extras
+#define init_os_extras() \
+ (*PL_StdIO->pInitOSExtras)(PL_StdIO)
+#define PerlSIO_fdupopen(f) \
+ (*PL_StdIO->pFdupopen)(PL_StdIO, (f))
+
+#else /* PERL_IMPLICIT_SYS */
+
+#define PerlSIO_stdin stdin
+#define PerlSIO_stdout stdout
+#define PerlSIO_stderr stderr
+#define PerlSIO_fopen(x,y) fopen(x,y)
+#ifdef __VOS__
+/* Work around VOS bug posix-979, wrongly setting errno when at end of file. */
+#define PerlSIO_fclose(f) (((errno==1025)?errno=0:0),fclose(f))
+#define PerlSIO_feof(f) (((errno==1025)?errno=0:0),feof(f))
+#define PerlSIO_ferror(f) (((errno==1025)?errno=0:0),ferror(f))
+#else
+#define PerlSIO_fclose(f) fclose(f)
+#define PerlSIO_feof(f) feof(f)
+#define PerlSIO_ferror(f) ferror(f)
+#endif
+#define PerlSIO_clearerr(f) clearerr(f)
+#define PerlSIO_fgetc(f) fgetc(f)
+#ifdef FILE_base
+#define PerlSIO_get_base(f) FILE_base(f)
+#define PerlSIO_get_bufsiz(f) FILE_bufsiz(f)
+#else
+#define PerlSIO_get_base(f) NULL
+#define PerlSIO_get_bufsiz(f) 0
+#endif
+#ifdef USE_STDIO_PTR
+#define PerlSIO_get_cnt(f) FILE_cnt(f)
+#define PerlSIO_get_ptr(f) FILE_ptr(f)
+#else
+#define PerlSIO_get_cnt(f) 0
+#define PerlSIO_get_ptr(f) NULL
+#endif
+#define PerlSIO_fputc(f,c) fputc(c,f)
+#define PerlSIO_fputs(f,s) fputs(s,f)
+#define PerlSIO_fflush(f) Fflush(f)
+#define PerlSIO_fgets(s, n, fp) fgets(s,n,fp)
+#if defined(VMS) && defined(__DECC)
+ /* Unusual definition of ungetc() here to accomodate fast_sv_gets()'
+ * belief that it can mix getc/ungetc with reads from stdio buffer */
+ int decc$ungetc(int __c, FILE *__stream);
+# define PerlSIO_ungetc(c,f) ((c) == EOF ? EOF : \
+ ((*(f) && !((*(f))->_flag & _IONBF) && \
+ ((*(f))->_ptr > (*(f))->_base)) ? \
+ ((*(f))->_cnt++, *(--(*(f))->_ptr) = (c)) : decc$ungetc(c,f)))
+#else
+# define PerlSIO_ungetc(c,f) ungetc(c,f)
+#endif
+#define PerlSIO_fileno(f) fileno(f)
+#define PerlSIO_fdopen(f, s) fdopen(f,s)
+#define PerlSIO_freopen(p, m, f) freopen(p,m,f)
+#define PerlSIO_fread(buf,sz,count,f) fread(buf,sz,count,f)
+#define PerlSIO_fwrite(buf,sz,count,f) fwrite(buf,sz,count,f)
+#define PerlSIO_setbuf(f,b) setbuf(f,b)
+#define PerlSIO_setvbuf(f,b,t,s) setvbuf(f,b,t,s)
+#if defined(USE_STDIO_PTR) && defined(STDIO_CNT_LVALUE)
+#define PerlSIO_set_cnt(f,c) FILE_cnt(f) = (c)
+#else
+#define PerlSIO_set_cnt(f,c) PerlIOProc_abort()
+#endif
+#if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE)
+#define PerlSIO_set_ptr(f,p) (FILE_ptr(f) = (p))
+#else
+#define PerlSIO_set_ptr(f,p) PerlIOProc_abort()
+#endif
+#define PerlSIO_setlinebuf(f) setlinebuf(f)
+#define PerlSIO_printf fprintf
+#define PerlSIO_stdoutf printf
+#define PerlSIO_vprintf(f,fmt,a) vfprintf(f,fmt,a)
+#define PerlSIO_ftell(f) ftell(f)
+#define PerlSIO_fseek(f,o,w) fseek(f,o,w)
+#define PerlSIO_fgetpos(f,p) fgetpos(f,p)
+#define PerlSIO_fsetpos(f,p) fsetpos(f,p)
+#define PerlSIO_rewind(f) rewind(f)
+#define PerlSIO_tmpfile() tmpfile()
+#define PerlSIO_fdupopen(f) (f)
+
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+ * Interface for directory functions
+ */
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlDir */
+struct IPerlDir;
+struct IPerlDirInfo;
+typedef int (*LPMakedir)(struct IPerlDir*, const char*, int);
+typedef int (*LPChdir)(struct IPerlDir*, const char*);
+typedef int (*LPRmdir)(struct IPerlDir*, const char*);
+typedef int (*LPDirClose)(struct IPerlDir*, DIR*);
+typedef DIR* (*LPDirOpen)(struct IPerlDir*, const char*);
+typedef struct direct* (*LPDirRead)(struct IPerlDir*, DIR*);
+typedef void (*LPDirRewind)(struct IPerlDir*, DIR*);
+typedef void (*LPDirSeek)(struct IPerlDir*, DIR*, long);
+typedef long (*LPDirTell)(struct IPerlDir*, DIR*);
+#ifdef WIN32
+typedef char* (*LPDirMapPathA)(struct IPerlDir*, const char*);
+typedef WCHAR* (*LPDirMapPathW)(struct IPerlDir*, const WCHAR*);
+#endif
+
+struct IPerlDir
+{
+ LPMakedir pMakedir;
+ LPChdir pChdir;
+ LPRmdir pRmdir;
+ LPDirClose pClose;
+ LPDirOpen pOpen;
+ LPDirRead pRead;
+ LPDirRewind pRewind;
+ LPDirSeek pSeek;
+ LPDirTell pTell;
+#ifdef WIN32
+ LPDirMapPathA pMapPathA;
+ LPDirMapPathW pMapPathW;
+#endif
+};
+
+struct IPerlDirInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlDir perlDirList;
+};
+
+#define PerlDir_mkdir(name, mode) \
+ (*PL_Dir->pMakedir)(PL_Dir, (name), (mode))
+#define PerlDir_chdir(name) \
+ (*PL_Dir->pChdir)(PL_Dir, (name))
+#define PerlDir_rmdir(name) \
+ (*PL_Dir->pRmdir)(PL_Dir, (name))
+#define PerlDir_close(dir) \
+ (*PL_Dir->pClose)(PL_Dir, (dir))
+#define PerlDir_open(name) \
+ (*PL_Dir->pOpen)(PL_Dir, (name))
+#define PerlDir_read(dir) \
+ (*PL_Dir->pRead)(PL_Dir, (dir))
+#define PerlDir_rewind(dir) \
+ (*PL_Dir->pRewind)(PL_Dir, (dir))
+#define PerlDir_seek(dir, loc) \
+ (*PL_Dir->pSeek)(PL_Dir, (dir), (loc))
+#define PerlDir_tell(dir) \
+ (*PL_Dir->pTell)(PL_Dir, (dir))
+#ifdef WIN32
+#define PerlDir_mapA(dir) \
+ (*PL_Dir->pMapPathA)(PL_Dir, (dir))
+#define PerlDir_mapW(dir) \
+ (*PL_Dir->pMapPathW)(PL_Dir, (dir))
+#endif
+
+#else /* PERL_IMPLICIT_SYS */
+
+#define PerlDir_mkdir(name, mode) Mkdir((name), (mode))
+#ifdef VMS
+# define PerlDir_chdir(n) Chdir((n))
+#else
+# define PerlDir_chdir(name) chdir((name))
+#endif
+#define PerlDir_rmdir(name) rmdir((name))
+#define PerlDir_close(dir) closedir((dir))
+#define PerlDir_open(name) opendir((name))
+#define PerlDir_read(dir) readdir((dir))
+#define PerlDir_rewind(dir) rewinddir((dir))
+#define PerlDir_seek(dir, loc) seekdir((dir), (loc))
+#define PerlDir_tell(dir) telldir((dir))
+#ifdef WIN32
+#define PerlDir_mapA(dir) dir
+#define PerlDir_mapW(dir) dir
+#endif
+
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+ Interface for perl environment functions
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlEnv */
+struct IPerlEnv;
+struct IPerlEnvInfo;
+typedef char* (*LPEnvGetenv)(struct IPerlEnv*, const char*);
+typedef int (*LPEnvPutenv)(struct IPerlEnv*, const char*);
+typedef char* (*LPEnvGetenv_len)(struct IPerlEnv*,
+ const char *varname, unsigned long *len);
+typedef int (*LPEnvUname)(struct IPerlEnv*, struct utsname *name);
+typedef void (*LPEnvClearenv)(struct IPerlEnv*);
+typedef void* (*LPEnvGetChildenv)(struct IPerlEnv*);
+typedef void (*LPEnvFreeChildenv)(struct IPerlEnv*, void* env);
+typedef char* (*LPEnvGetChilddir)(struct IPerlEnv*);
+typedef void (*LPEnvFreeChilddir)(struct IPerlEnv*, char* dir);
+#ifdef HAS_ENVGETENV
+typedef char* (*LPENVGetenv)(struct IPerlEnv*, const char *varname);
+typedef char* (*LPENVGetenv_len)(struct IPerlEnv*,
+ const char *varname, unsigned long *len);
+#endif
+#ifdef WIN32
+typedef unsigned long (*LPEnvOsID)(struct IPerlEnv*);
+typedef char* (*LPEnvLibPath)(struct IPerlEnv*, const char*,
+ STRLEN *const len);
+typedef char* (*LPEnvSiteLibPath)(struct IPerlEnv*, const char*,
+ STRLEN *const len);
+typedef char* (*LPEnvVendorLibPath)(struct IPerlEnv*, const char*,
+ STRLEN *const len);
+typedef void (*LPEnvGetChildIO)(struct IPerlEnv*, child_IO_table*);
+#endif
+
+struct IPerlEnv
+{
+ LPEnvGetenv pGetenv;
+ LPEnvPutenv pPutenv;
+ LPEnvGetenv_len pGetenv_len;
+ LPEnvUname pEnvUname;
+ LPEnvClearenv pClearenv;
+ LPEnvGetChildenv pGetChildenv;
+ LPEnvFreeChildenv pFreeChildenv;
+ LPEnvGetChilddir pGetChilddir;
+ LPEnvFreeChilddir pFreeChilddir;
+#ifdef HAS_ENVGETENV
+ LPENVGetenv pENVGetenv;
+ LPENVGetenv_len pENVGetenv_len;
+#endif
+#ifdef WIN32
+ LPEnvOsID pEnvOsID;
+ LPEnvLibPath pLibPath;
+ LPEnvSiteLibPath pSiteLibPath;
+ LPEnvVendorLibPath pVendorLibPath;
+ LPEnvGetChildIO pGetChildIO;
+#endif
+};
+
+struct IPerlEnvInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlEnv perlEnvList;
+};
+
+#define PerlEnv_putenv(str) \
+ (*PL_Env->pPutenv)(PL_Env,(str))
+#define PerlEnv_getenv(str) \
+ (*PL_Env->pGetenv)(PL_Env,(str))
+#define PerlEnv_getenv_len(str,l) \
+ (*PL_Env->pGetenv_len)(PL_Env,(str), (l))
+#define PerlEnv_clearenv() \
+ (*PL_Env->pClearenv)(PL_Env)
+#define PerlEnv_get_childenv() \
+ (*PL_Env->pGetChildenv)(PL_Env)
+#define PerlEnv_free_childenv(e) \
+ (*PL_Env->pFreeChildenv)(PL_Env, (e))
+#define PerlEnv_get_childdir() \
+ (*PL_Env->pGetChilddir)(PL_Env)
+#define PerlEnv_free_childdir(d) \
+ (*PL_Env->pFreeChilddir)(PL_Env, (d))
+#ifdef HAS_ENVGETENV
+# define PerlEnv_ENVgetenv(str) \
+ (*PL_Env->pENVGetenv)(PL_Env,(str))
+# define PerlEnv_ENVgetenv_len(str,l) \
+ (*PL_Env->pENVGetenv_len)(PL_Env,(str), (l))
+#else
+# define PerlEnv_ENVgetenv(str) \
+ PerlEnv_getenv((str))
+# define PerlEnv_ENVgetenv_len(str,l) \
+ PerlEnv_getenv_len((str),(l))
+#endif
+#define PerlEnv_uname(name) \
+ (*PL_Env->pEnvUname)(PL_Env,(name))
+#ifdef WIN32
+#define PerlEnv_os_id() \
+ (*PL_Env->pEnvOsID)(PL_Env)
+#define PerlEnv_lib_path(str, lenp) \
+ (*PL_Env->pLibPath)(PL_Env,(str),(lenp))
+#define PerlEnv_sitelib_path(str, lenp) \
+ (*PL_Env->pSiteLibPath)(PL_Env,(str),(lenp))
+#define PerlEnv_vendorlib_path(str, lenp) \
+ (*PL_Env->pVendorLibPath)(PL_Env,(str),(lenp))
+#define PerlEnv_get_child_IO(ptr) \
+ (*PL_Env->pGetChildIO)(PL_Env, ptr)
+#endif
+
+#else /* PERL_IMPLICIT_SYS */
+
+#define PerlEnv_putenv(str) putenv((str))
+#define PerlEnv_getenv(str) getenv((str))
+#define PerlEnv_getenv_len(str,l) getenv_len((str), (l))
+#ifdef HAS_ENVGETENV
+# define PerlEnv_ENVgetenv(str) ENVgetenv((str))
+# define PerlEnv_ENVgetenv_len(str,l) ENVgetenv_len((str), (l))
+#else
+# define PerlEnv_ENVgetenv(str) PerlEnv_getenv((str))
+# define PerlEnv_ENVgetenv_len(str,l) PerlEnv_getenv_len((str), (l))
+#endif
+#define PerlEnv_uname(name) uname((name))
+
+#ifdef WIN32
+#define PerlEnv_os_id() win32_os_id()
+#define PerlEnv_lib_path(str, lenp) win32_get_privlib(str, lenp)
+#define PerlEnv_sitelib_path(str, lenp) win32_get_sitelib(str, lenp)
+#define PerlEnv_vendorlib_path(str, lenp) win32_get_vendorlib(str, lenp)
+#define PerlEnv_get_child_IO(ptr) win32_get_child_IO(ptr)
+#define PerlEnv_clearenv() win32_clearenv()
+#define PerlEnv_get_childenv() win32_get_childenv()
+#define PerlEnv_free_childenv(e) win32_free_childenv((e))
+#define PerlEnv_get_childdir() win32_get_childdir()
+#define PerlEnv_free_childdir(d) win32_free_childdir((d))
+#else
+#define PerlEnv_clearenv() clearenv()
+#define PerlEnv_get_childenv() get_childenv()
+#define PerlEnv_free_childenv(e) free_childenv((e))
+#define PerlEnv_get_childdir() get_childdir()
+#define PerlEnv_free_childdir(d) free_childdir((d))
+#endif
+
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+ Interface for perl low-level IO functions
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlLIO */
+struct IPerlLIO;
+struct IPerlLIOInfo;
+typedef int (*LPLIOAccess)(struct IPerlLIO*, const char*, int);
+typedef int (*LPLIOChmod)(struct IPerlLIO*, const char*, int);
+typedef int (*LPLIOChown)(struct IPerlLIO*, const char*, uid_t,
+ gid_t);
+typedef int (*LPLIOChsize)(struct IPerlLIO*, int, Off_t);
+typedef int (*LPLIOClose)(struct IPerlLIO*, int);
+typedef int (*LPLIODup)(struct IPerlLIO*, int);
+typedef int (*LPLIODup2)(struct IPerlLIO*, int, int);
+typedef int (*LPLIOFlock)(struct IPerlLIO*, int, int);
+typedef int (*LPLIOFileStat)(struct IPerlLIO*, int, Stat_t*);
+typedef int (*LPLIOIOCtl)(struct IPerlLIO*, int, unsigned int,
+ char*);
+typedef int (*LPLIOIsatty)(struct IPerlLIO*, int);
+typedef int (*LPLIOLink)(struct IPerlLIO*, const char*,
+ const char *);
+typedef Off_t (*LPLIOLseek)(struct IPerlLIO*, int, Off_t, int);
+typedef int (*LPLIOLstat)(struct IPerlLIO*, const char*,
+ Stat_t*);
+typedef char* (*LPLIOMktemp)(struct IPerlLIO*, char*);
+typedef int (*LPLIOOpen)(struct IPerlLIO*, const char*, int);
+typedef int (*LPLIOOpen3)(struct IPerlLIO*, const char*, int, int);
+typedef int (*LPLIORead)(struct IPerlLIO*, int, void*, unsigned int);
+typedef int (*LPLIORename)(struct IPerlLIO*, const char*,
+ const char*);
+#ifdef NETWARE
+typedef int (*LPLIOSetmode)(struct IPerlLIO*, FILE*, int);
+#else
+typedef int (*LPLIOSetmode)(struct IPerlLIO*, int, int);
+#endif /* NETWARE */
+typedef int (*LPLIONameStat)(struct IPerlLIO*, const char*,
+ Stat_t*);
+typedef char* (*LPLIOTmpnam)(struct IPerlLIO*, char*);
+typedef int (*LPLIOUmask)(struct IPerlLIO*, int);
+typedef int (*LPLIOUnlink)(struct IPerlLIO*, const char*);
+typedef int (*LPLIOUtime)(struct IPerlLIO*, const char*, struct utimbuf*);
+typedef int (*LPLIOWrite)(struct IPerlLIO*, int, const void*,
+ unsigned int);
+
+struct IPerlLIO
+{
+ LPLIOAccess pAccess;
+ LPLIOChmod pChmod;
+ LPLIOChown pChown;
+ LPLIOChsize pChsize;
+ LPLIOClose pClose;
+ LPLIODup pDup;
+ LPLIODup2 pDup2;
+ LPLIOFlock pFlock;
+ LPLIOFileStat pFileStat;
+ LPLIOIOCtl pIOCtl;
+ LPLIOIsatty pIsatty;
+ LPLIOLink pLink;
+ LPLIOLseek pLseek;
+ LPLIOLstat pLstat;
+ LPLIOMktemp pMktemp;
+ LPLIOOpen pOpen;
+ LPLIOOpen3 pOpen3;
+ LPLIORead pRead;
+ LPLIORename pRename;
+ LPLIOSetmode pSetmode;
+ LPLIONameStat pNameStat;
+ LPLIOTmpnam pTmpnam;
+ LPLIOUmask pUmask;
+ LPLIOUnlink pUnlink;
+ LPLIOUtime pUtime;
+ LPLIOWrite pWrite;
+};
+
+struct IPerlLIOInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlLIO perlLIOList;
+};
+
+#define PerlLIO_access(file, mode) \
+ (*PL_LIO->pAccess)(PL_LIO, (file), (mode))
+#define PerlLIO_chmod(file, mode) \
+ (*PL_LIO->pChmod)(PL_LIO, (file), (mode))
+#define PerlLIO_chown(file, owner, group) \
+ (*PL_LIO->pChown)(PL_LIO, (file), (owner), (group))
+#define PerlLIO_chsize(fd, size) \
+ (*PL_LIO->pChsize)(PL_LIO, (fd), (size))
+#define PerlLIO_close(fd) \
+ (*PL_LIO->pClose)(PL_LIO, (fd))
+#define PerlLIO_dup(fd) \
+ (*PL_LIO->pDup)(PL_LIO, (fd))
+#define PerlLIO_dup2(fd1, fd2) \
+ (*PL_LIO->pDup2)(PL_LIO, (fd1), (fd2))
+#define PerlLIO_flock(fd, op) \
+ (*PL_LIO->pFlock)(PL_LIO, (fd), (op))
+#define PerlLIO_fstat(fd, buf) \
+ (*PL_LIO->pFileStat)(PL_LIO, (fd), (buf))
+#define PerlLIO_ioctl(fd, u, buf) \
+ (*PL_LIO->pIOCtl)(PL_LIO, (fd), (u), (buf))
+#define PerlLIO_isatty(fd) \
+ (*PL_LIO->pIsatty)(PL_LIO, (fd))
+#define PerlLIO_link(oldname, newname) \
+ (*PL_LIO->pLink)(PL_LIO, (oldname), (newname))
+#define PerlLIO_lseek(fd, offset, mode) \
+ (*PL_LIO->pLseek)(PL_LIO, (fd), (offset), (mode))
+#define PerlLIO_lstat(name, buf) \
+ (*PL_LIO->pLstat)(PL_LIO, (name), (buf))
+#define PerlLIO_mktemp(file) \
+ (*PL_LIO->pMktemp)(PL_LIO, (file))
+#define PerlLIO_open(file, flag) \
+ (*PL_LIO->pOpen)(PL_LIO, (file), (flag))
+#define PerlLIO_open3(file, flag, perm) \
+ (*PL_LIO->pOpen3)(PL_LIO, (file), (flag), (perm))
+#define PerlLIO_read(fd, buf, count) \
+ (*PL_LIO->pRead)(PL_LIO, (fd), (buf), (count))
+#define PerlLIO_rename(oname, newname) \
+ (*PL_LIO->pRename)(PL_LIO, (oname), (newname))
+#define PerlLIO_setmode(fd, mode) \
+ (*PL_LIO->pSetmode)(PL_LIO, (fd), (mode))
+#define PerlLIO_stat(name, buf) \
+ (*PL_LIO->pNameStat)(PL_LIO, (name), (buf))
+#define PerlLIO_tmpnam(str) \
+ (*PL_LIO->pTmpnam)(PL_LIO, (str))
+#define PerlLIO_umask(mode) \
+ (*PL_LIO->pUmask)(PL_LIO, (mode))
+#define PerlLIO_unlink(file) \
+ (*PL_LIO->pUnlink)(PL_LIO, (file))
+#define PerlLIO_utime(file, time) \
+ (*PL_LIO->pUtime)(PL_LIO, (file), (time))
+#define PerlLIO_write(fd, buf, count) \
+ (*PL_LIO->pWrite)(PL_LIO, (fd), (buf), (count))
+
+#else /* PERL_IMPLICIT_SYS */
+
+#define PerlLIO_access(file, mode) access((file), (mode))
+#define PerlLIO_chmod(file, mode) chmod((file), (mode))
+#define PerlLIO_chown(file, owner, grp) chown((file), (owner), (grp))
+#if defined(HAS_TRUNCATE)
+# define PerlLIO_chsize(fd, size) ftruncate((fd), (size))
+#elif defined(HAS_CHSIZE)
+# define PerlLIO_chsize(fd, size) chsize((fd), (size))
+#else
+# define PerlLIO_chsize(fd, size) my_chsize((fd), (size))
+#endif
+#define PerlLIO_close(fd) close((fd))
+#define PerlLIO_dup(fd) dup((fd))
+#define PerlLIO_dup2(fd1, fd2) dup2((fd1), (fd2))
+#define PerlLIO_flock(fd, op) FLOCK((fd), (op))
+#define PerlLIO_fstat(fd, buf) Fstat((fd), (buf))
+#define PerlLIO_ioctl(fd, u, buf) ioctl((fd), (u), (buf))
+#define PerlLIO_isatty(fd) isatty((fd))
+#define PerlLIO_link(oldname, newname) link((oldname), (newname))
+#define PerlLIO_lseek(fd, offset, mode) lseek((fd), (offset), (mode))
+#define PerlLIO_stat(name, buf) Stat((name), (buf))
+#ifdef HAS_LSTAT
+# define PerlLIO_lstat(name, buf) lstat((name), (buf))
+#else
+# define PerlLIO_lstat(name, buf) PerlLIO_stat((name), (buf))
+#endif
+#define PerlLIO_mktemp(file) mktemp((file))
+#define PerlLIO_mkstemp(file) mkstemp((file))
+#define PerlLIO_open(file, flag) open((file), (flag))
+#define PerlLIO_open3(file, flag, perm) open((file), (flag), (perm))
+#define PerlLIO_read(fd, buf, count) read((fd), (buf), (count))
+#define PerlLIO_rename(old, new) rename((old), (new))
+#define PerlLIO_setmode(fd, mode) setmode((fd), (mode))
+#define PerlLIO_tmpnam(str) tmpnam((str))
+#define PerlLIO_umask(mode) umask((mode))
+#define PerlLIO_unlink(file) unlink((file))
+#define PerlLIO_utime(file, time) utime((file), (time))
+#define PerlLIO_write(fd, buf, count) write((fd), (buf), (count))
+
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+ Interface for perl memory allocation
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* IPerlMem */
+struct IPerlMem;
+struct IPerlMemInfo;
+typedef void* (*LPMemMalloc)(struct IPerlMem*, size_t);
+typedef void* (*LPMemRealloc)(struct IPerlMem*, void*, size_t);
+typedef void (*LPMemFree)(struct IPerlMem*, void*);
+typedef void* (*LPMemCalloc)(struct IPerlMem*, size_t, size_t);
+typedef void (*LPMemGetLock)(struct IPerlMem*);
+typedef void (*LPMemFreeLock)(struct IPerlMem*);
+typedef int (*LPMemIsLocked)(struct IPerlMem*);
+
+struct IPerlMem
+{
+ LPMemMalloc pMalloc;
+ LPMemRealloc pRealloc;
+ LPMemFree pFree;
+ LPMemCalloc pCalloc;
+ LPMemGetLock pGetLock;
+ LPMemFreeLock pFreeLock;
+ LPMemIsLocked pIsLocked;
+};
+
+struct IPerlMemInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlMem perlMemList;
+};
+
+/* Interpreter specific memory macros */
+#define PerlMem_malloc(size) \
+ (*PL_Mem->pMalloc)(PL_Mem, (size))
+#define PerlMem_realloc(buf, size) \
+ (*PL_Mem->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMem_free(buf) \
+ (*PL_Mem->pFree)(PL_Mem, (buf))
+#define PerlMem_calloc(num, size) \
+ (*PL_Mem->pCalloc)(PL_Mem, (num), (size))
+#define PerlMem_get_lock() \
+ (*PL_Mem->pGetLock)(PL_Mem)
+#define PerlMem_free_lock() \
+ (*PL_Mem->pFreeLock)(PL_Mem)
+#define PerlMem_is_locked() \
+ (*PL_Mem->pIsLocked)(PL_Mem)
+
+/* Shared memory macros */
+#ifdef NETWARE
+
+#define PerlMemShared_malloc(size) \
+ (*PL_Mem->pMalloc)(PL_Mem, (size))
+#define PerlMemShared_realloc(buf, size) \
+ (*PL_Mem->pRealloc)(PL_Mem, (buf), (size))
+#define PerlMemShared_free(buf) \
+ (*PL_Mem->pFree)(PL_Mem, (buf))
+#define PerlMemShared_calloc(num, size) \
+ (*PL_Mem->pCalloc)(PL_Mem, (num), (size))
+#define PerlMemShared_get_lock() \
+ (*PL_Mem->pGetLock)(PL_Mem)
+#define PerlMemShared_free_lock() \
+ (*PL_Mem->pFreeLock)(PL_Mem)
+#define PerlMemShared_is_locked() \
+ (*PL_Mem->pIsLocked)(PL_Mem)
+
+#else
+
+#define PerlMemShared_malloc(size) \
+ (*PL_MemShared->pMalloc)(PL_MemShared, (size))
+#define PerlMemShared_realloc(buf, size) \
+ (*PL_MemShared->pRealloc)(PL_MemShared, (buf), (size))
+#define PerlMemShared_free(buf) \
+ (*PL_MemShared->pFree)(PL_MemShared, (buf))
+#define PerlMemShared_calloc(num, size) \
+ (*PL_MemShared->pCalloc)(PL_MemShared, (num), (size))
+#define PerlMemShared_get_lock() \
+ (*PL_MemShared->pGetLock)(PL_MemShared)
+#define PerlMemShared_free_lock() \
+ (*PL_MemShared->pFreeLock)(PL_MemShared)
+#define PerlMemShared_is_locked() \
+ (*PL_MemShared->pIsLocked)(PL_MemShared)
+
+#endif
+
+/* Parse tree memory macros */
+#define PerlMemParse_malloc(size) \
+ (*PL_MemParse->pMalloc)(PL_MemParse, (size))
+#define PerlMemParse_realloc(buf, size) \
+ (*PL_MemParse->pRealloc)(PL_MemParse, (buf), (size))
+#define PerlMemParse_free(buf) \
+ (*PL_MemParse->pFree)(PL_MemParse, (buf))
+#define PerlMemParse_calloc(num, size) \
+ (*PL_MemParse->pCalloc)(PL_MemParse, (num), (size))
+#define PerlMemParse_get_lock() \
+ (*PL_MemParse->pGetLock)(PL_MemParse)
+#define PerlMemParse_free_lock() \
+ (*PL_MemParse->pFreeLock)(PL_MemParse)
+#define PerlMemParse_is_locked() \
+ (*PL_MemParse->pIsLocked)(PL_MemParse)
+
+
+#else /* PERL_IMPLICIT_SYS */
+
+/* Interpreter specific memory macros */
+#define PerlMem_malloc(size) malloc((size))
+#define PerlMem_realloc(buf, size) realloc((buf), (size))
+#define PerlMem_free(buf) free((buf))
+#define PerlMem_calloc(num, size) calloc((num), (size))
+#define PerlMem_get_lock()
+#define PerlMem_free_lock()
+#define PerlMem_is_locked() 0
+
+/* Shared memory macros */
+#define PerlMemShared_malloc(size) malloc((size))
+#define PerlMemShared_realloc(buf, size) realloc((buf), (size))
+#define PerlMemShared_free(buf) free((buf))
+#define PerlMemShared_calloc(num, size) calloc((num), (size))
+#define PerlMemShared_get_lock()
+#define PerlMemShared_free_lock()
+#define PerlMemShared_is_locked() 0
+
+/* Parse tree memory macros */
+#define PerlMemParse_malloc(size) malloc((size))
+#define PerlMemParse_realloc(buf, size) realloc((buf), (size))
+#define PerlMemParse_free(buf) free((buf))
+#define PerlMemParse_calloc(num, size) calloc((num), (size))
+#define PerlMemParse_get_lock()
+#define PerlMemParse_free_lock()
+#define PerlMemParse_is_locked() 0
+
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+ Interface for perl process functions
+*/
+
+
+#if defined(PERL_IMPLICIT_SYS)
+
+#ifndef jmp_buf
+#include <setjmp.h>
+#endif
+
+/* IPerlProc */
+struct IPerlProc;
+struct IPerlProcInfo;
+typedef void (*LPProcAbort)(struct IPerlProc*);
+typedef char* (*LPProcCrypt)(struct IPerlProc*, const char*,
+ const char*);
+typedef void (*LPProcExit)(struct IPerlProc*, int)
+ __attribute__noreturn__;
+typedef void (*LPProc_Exit)(struct IPerlProc*, int)
+ __attribute__noreturn__;
+typedef int (*LPProcExecl)(struct IPerlProc*, const char*,
+ const char*, const char*, const char*,
+ const char*);
+typedef int (*LPProcExecv)(struct IPerlProc*, const char*,
+ const char*const*);
+typedef int (*LPProcExecvp)(struct IPerlProc*, const char*,
+ const char*const*);
+typedef uid_t (*LPProcGetuid)(struct IPerlProc*);
+typedef uid_t (*LPProcGeteuid)(struct IPerlProc*);
+typedef gid_t (*LPProcGetgid)(struct IPerlProc*);
+typedef gid_t (*LPProcGetegid)(struct IPerlProc*);
+typedef char* (*LPProcGetlogin)(struct IPerlProc*);
+typedef int (*LPProcKill)(struct IPerlProc*, int, int);
+typedef int (*LPProcKillpg)(struct IPerlProc*, int, int);
+typedef int (*LPProcPauseProc)(struct IPerlProc*);
+typedef PerlIO* (*LPProcPopen)(struct IPerlProc*, const char*,
+ const char*);
+typedef PerlIO* (*LPProcPopenList)(struct IPerlProc*, const char*,
+ IV narg, SV **args);
+typedef int (*LPProcPclose)(struct IPerlProc*, PerlIO*);
+typedef int (*LPProcPipe)(struct IPerlProc*, int*);
+typedef int (*LPProcSetuid)(struct IPerlProc*, uid_t);
+typedef int (*LPProcSetgid)(struct IPerlProc*, gid_t);
+typedef int (*LPProcSleep)(struct IPerlProc*, unsigned int);
+typedef int (*LPProcTimes)(struct IPerlProc*, struct tms*);
+typedef int (*LPProcWait)(struct IPerlProc*, int*);
+typedef int (*LPProcWaitpid)(struct IPerlProc*, int, int*, int);
+typedef Sighandler_t (*LPProcSignal)(struct IPerlProc*, int, Sighandler_t);
+typedef int (*LPProcFork)(struct IPerlProc*);
+typedef int (*LPProcGetpid)(struct IPerlProc*);
+#ifdef WIN32
+typedef void* (*LPProcDynaLoader)(struct IPerlProc*, const char*);
+typedef void (*LPProcGetOSError)(struct IPerlProc*,
+ SV* sv, DWORD dwErr);
+typedef int (*LPProcSpawnvp)(struct IPerlProc*, int, const char*,
+ const char*const*);
+#endif
+typedef int (*LPProcLastHost)(struct IPerlProc*);
+typedef int (*LPProcGetTimeOfDay)(struct IPerlProc*,
+ struct timeval*, void*);
+
+struct IPerlProc
+{
+ LPProcAbort pAbort;
+ LPProcCrypt pCrypt;
+ LPProcExit pExit;
+ LPProc_Exit p_Exit;
+ LPProcExecl pExecl;
+ LPProcExecv pExecv;
+ LPProcExecvp pExecvp;
+ LPProcGetuid pGetuid;
+ LPProcGeteuid pGeteuid;
+ LPProcGetgid pGetgid;
+ LPProcGetegid pGetegid;
+ LPProcGetlogin pGetlogin;
+ LPProcKill pKill;
+ LPProcKillpg pKillpg;
+ LPProcPauseProc pPauseProc;
+ LPProcPopen pPopen;
+ LPProcPclose pPclose;
+ LPProcPipe pPipe;
+ LPProcSetuid pSetuid;
+ LPProcSetgid pSetgid;
+ LPProcSleep pSleep;
+ LPProcTimes pTimes;
+ LPProcWait pWait;
+ LPProcWaitpid pWaitpid;
+ LPProcSignal pSignal;
+ LPProcFork pFork;
+ LPProcGetpid pGetpid;
+#ifdef WIN32
+ LPProcDynaLoader pDynaLoader;
+ LPProcGetOSError pGetOSError;
+ LPProcSpawnvp pSpawnvp;
+#endif
+ LPProcLastHost pLastHost;
+ LPProcPopenList pPopenList;
+ LPProcGetTimeOfDay pGetTimeOfDay;
+};
+
+struct IPerlProcInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlProc perlProcList;
+};
+
+#define PerlProc_abort() \
+ (*PL_Proc->pAbort)(PL_Proc)
+#define PerlProc_crypt(c,s) \
+ (*PL_Proc->pCrypt)(PL_Proc, (c), (s))
+#define PerlProc_exit(s) \
+ (*PL_Proc->pExit)(PL_Proc, (s))
+#define PerlProc__exit(s) \
+ (*PL_Proc->p_Exit)(PL_Proc, (s))
+#define PerlProc_execl(c, w, x, y, z) \
+ (*PL_Proc->pExecl)(PL_Proc, (c), (w), (x), (y), (z))
+#define PerlProc_execv(c, a) \
+ (*PL_Proc->pExecv)(PL_Proc, (c), (a))
+#define PerlProc_execvp(c, a) \
+ (*PL_Proc->pExecvp)(PL_Proc, (c), (a))
+#define PerlProc_getuid() \
+ (*PL_Proc->pGetuid)(PL_Proc)
+#define PerlProc_geteuid() \
+ (*PL_Proc->pGeteuid)(PL_Proc)
+#define PerlProc_getgid() \
+ (*PL_Proc->pGetgid)(PL_Proc)
+#define PerlProc_getegid() \
+ (*PL_Proc->pGetegid)(PL_Proc)
+#define PerlProc_getlogin() \
+ (*PL_Proc->pGetlogin)(PL_Proc)
+#define PerlProc_kill(i, a) \
+ (*PL_Proc->pKill)(PL_Proc, (i), (a))
+#define PerlProc_killpg(i, a) \
+ (*PL_Proc->pKillpg)(PL_Proc, (i), (a))
+#define PerlProc_pause() \
+ (*PL_Proc->pPauseProc)(PL_Proc)
+#define PerlProc_popen(c, m) \
+ (*PL_Proc->pPopen)(PL_Proc, (c), (m))
+#define PerlProc_popen_list(m, n, a) \
+ (*PL_Proc->pPopenList)(PL_Proc, (m), (n), (a))
+#define PerlProc_pclose(f) \
+ (*PL_Proc->pPclose)(PL_Proc, (f))
+#define PerlProc_pipe(fd) \
+ (*PL_Proc->pPipe)(PL_Proc, (fd))
+#define PerlProc_setuid(u) \
+ (*PL_Proc->pSetuid)(PL_Proc, (u))
+#define PerlProc_setgid(g) \
+ (*PL_Proc->pSetgid)(PL_Proc, (g))
+#define PerlProc_sleep(t) \
+ (*PL_Proc->pSleep)(PL_Proc, (t))
+#define PerlProc_times(t) \
+ (*PL_Proc->pTimes)(PL_Proc, (t))
+#define PerlProc_wait(t) \
+ (*PL_Proc->pWait)(PL_Proc, (t))
+#define PerlProc_waitpid(p,s,f) \
+ (*PL_Proc->pWaitpid)(PL_Proc, (p), (s), (f))
+#define PerlProc_signal(n, h) \
+ (*PL_Proc->pSignal)(PL_Proc, (n), (h))
+#define PerlProc_fork() \
+ (*PL_Proc->pFork)(PL_Proc)
+#define PerlProc_getpid() \
+ (*PL_Proc->pGetpid)(PL_Proc)
+#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n))
+#define PerlProc_longjmp(b, n) Siglongjmp((b), (n))
+
+#ifdef WIN32
+#define PerlProc_DynaLoad(f) \
+ (*PL_Proc->pDynaLoader)(PL_Proc, (f))
+#define PerlProc_GetOSError(s,e) \
+ (*PL_Proc->pGetOSError)(PL_Proc, (s), (e))
+#define PerlProc_spawnvp(m, c, a) \
+ (*PL_Proc->pSpawnvp)(PL_Proc, (m), (c), (a))
+#endif
+#define PerlProc_lasthost() \
+ (*PL_Proc->pLastHost)(PL_Proc)
+#define PerlProc_gettimeofday(t,z) \
+ (*PL_Proc->pGetTimeOfDay)(PL_Proc,(t),(z))
+
+#else /* PERL_IMPLICIT_SYS */
+
+#define PerlProc_abort() abort()
+#define PerlProc_crypt(c,s) crypt((c), (s))
+#define PerlProc_exit(s) exit((s))
+#define PerlProc__exit(s) _exit((s))
+#define PerlProc_execl(c,w,x,y,z) \
+ execl((c), (w), (x), (y), (z))
+#define PerlProc_execv(c, a) execv((c), (a))
+#define PerlProc_execvp(c, a) execvp((c), (a))
+#define PerlProc_getuid() getuid()
+#define PerlProc_geteuid() geteuid()
+#define PerlProc_getgid() getgid()
+#define PerlProc_getegid() getegid()
+#define PerlProc_getlogin() getlogin()
+#define PerlProc_kill(i, a) kill((i), (a))
+#define PerlProc_killpg(i, a) killpg((i), (a))
+#define PerlProc_pause() Pause()
+#define PerlProc_popen(c, m) my_popen((c), (m))
+#define PerlProc_popen_list(m,n,a) my_popen_list((m),(n),(a))
+#define PerlProc_pclose(f) my_pclose((f))
+#define PerlProc_pipe(fd) pipe((fd))
+#define PerlProc_setuid(u) setuid((u))
+#define PerlProc_setgid(g) setgid((g))
+#define PerlProc_sleep(t) sleep((t))
+#define PerlProc_times(t) times((t))
+#define PerlProc_wait(t) wait((t))
+#define PerlProc_waitpid(p,s,f) waitpid((p), (s), (f))
+#define PerlProc_setjmp(b, n) Sigsetjmp((b), (n))
+#define PerlProc_longjmp(b, n) Siglongjmp((b), (n))
+#define PerlProc_signal(n, h) signal((n), (h))
+#define PerlProc_fork() my_fork()
+#define PerlProc_getpid() getpid()
+#define PerlProc_gettimeofday(t,z) gettimeofday((t),(z))
+
+#ifdef WIN32
+#define PerlProc_DynaLoad(f) \
+ win32_dynaload((f))
+#define PerlProc_GetOSError(s,e) \
+ win32_str_os_error((s), (e))
+#define PerlProc_spawnvp(m, c, a) \
+ win32_spawnvp((m), (c), (a))
+#undef PerlProc_signal
+#define PerlProc_signal(n, h) win32_signal((n), (h))
+#endif
+#endif /* PERL_IMPLICIT_SYS */
+
+/*
+ Interface for perl socket functions
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+
+/* PerlSock */
+struct IPerlSock;
+struct IPerlSockInfo;
+typedef u_long (*LPHtonl)(struct IPerlSock*, u_long);
+typedef u_short (*LPHtons)(struct IPerlSock*, u_short);
+typedef u_long (*LPNtohl)(struct IPerlSock*, u_long);
+typedef u_short (*LPNtohs)(struct IPerlSock*, u_short);
+typedef SOCKET (*LPAccept)(struct IPerlSock*, SOCKET,
+ struct sockaddr*, int*);
+typedef int (*LPBind)(struct IPerlSock*, SOCKET,
+ const struct sockaddr*, int);
+typedef int (*LPConnect)(struct IPerlSock*, SOCKET,
+ const struct sockaddr*, int);
+typedef void (*LPEndhostent)(struct IPerlSock*);
+typedef void (*LPEndnetent)(struct IPerlSock*);
+typedef void (*LPEndprotoent)(struct IPerlSock*);
+typedef void (*LPEndservent)(struct IPerlSock*);
+typedef int (*LPGethostname)(struct IPerlSock*, char*, int);
+typedef int (*LPGetpeername)(struct IPerlSock*, SOCKET,
+ struct sockaddr*, int*);
+typedef struct hostent* (*LPGethostbyaddr)(struct IPerlSock*, const char*,
+ int, int);
+typedef struct hostent* (*LPGethostbyname)(struct IPerlSock*, const char*);
+typedef struct hostent* (*LPGethostent)(struct IPerlSock*);
+typedef struct netent* (*LPGetnetbyaddr)(struct IPerlSock*, long, int);
+typedef struct netent* (*LPGetnetbyname)(struct IPerlSock*, const char*);
+typedef struct netent* (*LPGetnetent)(struct IPerlSock*);
+typedef struct protoent*(*LPGetprotobyname)(struct IPerlSock*, const char*);
+typedef struct protoent*(*LPGetprotobynumber)(struct IPerlSock*, int);
+typedef struct protoent*(*LPGetprotoent)(struct IPerlSock*);
+typedef struct servent* (*LPGetservbyname)(struct IPerlSock*, const char*,
+ const char*);
+typedef struct servent* (*LPGetservbyport)(struct IPerlSock*, int,
+ const char*);
+typedef struct servent* (*LPGetservent)(struct IPerlSock*);
+typedef int (*LPGetsockname)(struct IPerlSock*, SOCKET,
+ struct sockaddr*, int*);
+typedef int (*LPGetsockopt)(struct IPerlSock*, SOCKET, int, int,
+ char*, int*);
+typedef unsigned long (*LPInetAddr)(struct IPerlSock*, const char*);
+typedef char* (*LPInetNtoa)(struct IPerlSock*, struct in_addr);
+typedef int (*LPListen)(struct IPerlSock*, SOCKET, int);
+typedef int (*LPRecv)(struct IPerlSock*, SOCKET, char*, int, int);
+typedef int (*LPRecvfrom)(struct IPerlSock*, SOCKET, char*, int,
+ int, struct sockaddr*, int*);
+typedef int (*LPSelect)(struct IPerlSock*, int, char*, char*,
+ char*, const struct timeval*);
+typedef int (*LPSend)(struct IPerlSock*, SOCKET, const char*, int,
+ int);
+typedef int (*LPSendto)(struct IPerlSock*, SOCKET, const char*,
+ int, int, const struct sockaddr*, int);
+typedef void (*LPSethostent)(struct IPerlSock*, int);
+typedef void (*LPSetnetent)(struct IPerlSock*, int);
+typedef void (*LPSetprotoent)(struct IPerlSock*, int);
+typedef void (*LPSetservent)(struct IPerlSock*, int);
+typedef int (*LPSetsockopt)(struct IPerlSock*, SOCKET, int, int,
+ const char*, int);
+typedef int (*LPShutdown)(struct IPerlSock*, SOCKET, int);
+typedef SOCKET (*LPSocket)(struct IPerlSock*, int, int, int);
+typedef int (*LPSocketpair)(struct IPerlSock*, int, int, int,
+ int*);
+#ifdef WIN32
+typedef int (*LPClosesocket)(struct IPerlSock*, SOCKET s);
+#endif
+
+struct IPerlSock
+{
+ LPHtonl pHtonl;
+ LPHtons pHtons;
+ LPNtohl pNtohl;
+ LPNtohs pNtohs;
+ LPAccept pAccept;
+ LPBind pBind;
+ LPConnect pConnect;
+ LPEndhostent pEndhostent;
+ LPEndnetent pEndnetent;
+ LPEndprotoent pEndprotoent;
+ LPEndservent pEndservent;
+ LPGethostname pGethostname;
+ LPGetpeername pGetpeername;
+ LPGethostbyaddr pGethostbyaddr;
+ LPGethostbyname pGethostbyname;
+ LPGethostent pGethostent;
+ LPGetnetbyaddr pGetnetbyaddr;
+ LPGetnetbyname pGetnetbyname;
+ LPGetnetent pGetnetent;
+ LPGetprotobyname pGetprotobyname;
+ LPGetprotobynumber pGetprotobynumber;
+ LPGetprotoent pGetprotoent;
+ LPGetservbyname pGetservbyname;
+ LPGetservbyport pGetservbyport;
+ LPGetservent pGetservent;
+ LPGetsockname pGetsockname;
+ LPGetsockopt pGetsockopt;
+ LPInetAddr pInetAddr;
+ LPInetNtoa pInetNtoa;
+ LPListen pListen;
+ LPRecv pRecv;
+ LPRecvfrom pRecvfrom;
+ LPSelect pSelect;
+ LPSend pSend;
+ LPSendto pSendto;
+ LPSethostent pSethostent;
+ LPSetnetent pSetnetent;
+ LPSetprotoent pSetprotoent;
+ LPSetservent pSetservent;
+ LPSetsockopt pSetsockopt;
+ LPShutdown pShutdown;
+ LPSocket pSocket;
+ LPSocketpair pSocketpair;
+#ifdef WIN32
+ LPClosesocket pClosesocket;
+#endif
+};
+
+struct IPerlSockInfo
+{
+ unsigned long nCount; /* number of entries expected */
+ struct IPerlSock perlSockList;
+};
+
+#define PerlSock_htonl(x) \
+ (*PL_Sock->pHtonl)(PL_Sock, x)
+#define PerlSock_htons(x) \
+ (*PL_Sock->pHtons)(PL_Sock, x)
+#define PerlSock_ntohl(x) \
+ (*PL_Sock->pNtohl)(PL_Sock, x)
+#define PerlSock_ntohs(x) \
+ (*PL_Sock->pNtohs)(PL_Sock, x)
+#define PerlSock_accept(s, a, l) \
+ (*PL_Sock->pAccept)(PL_Sock, s, a, l)
+#define PerlSock_bind(s, n, l) \
+ (*PL_Sock->pBind)(PL_Sock, s, n, l)
+#define PerlSock_connect(s, n, l) \
+ (*PL_Sock->pConnect)(PL_Sock, s, n, l)
+#define PerlSock_endhostent() \
+ (*PL_Sock->pEndhostent)(PL_Sock)
+#define PerlSock_endnetent() \
+ (*PL_Sock->pEndnetent)(PL_Sock)
+#define PerlSock_endprotoent() \
+ (*PL_Sock->pEndprotoent)(PL_Sock)
+#define PerlSock_endservent() \
+ (*PL_Sock->pEndservent)(PL_Sock)
+#define PerlSock_gethostbyaddr(a, l, t) \
+ (*PL_Sock->pGethostbyaddr)(PL_Sock, a, l, t)
+#define PerlSock_gethostbyname(n) \
+ (*PL_Sock->pGethostbyname)(PL_Sock, n)
+#define PerlSock_gethostent() \
+ (*PL_Sock->pGethostent)(PL_Sock)
+#define PerlSock_gethostname(n, l) \
+ (*PL_Sock->pGethostname)(PL_Sock, n, l)
+#define PerlSock_getnetbyaddr(n, t) \
+ (*PL_Sock->pGetnetbyaddr)(PL_Sock, n, t)
+#define PerlSock_getnetbyname(c) \
+ (*PL_Sock->pGetnetbyname)(PL_Sock, c)
+#define PerlSock_getnetent() \
+ (*PL_Sock->pGetnetent)(PL_Sock)
+#define PerlSock_getpeername(s, n, l) \
+ (*PL_Sock->pGetpeername)(PL_Sock, s, n, l)
+#define PerlSock_getprotobyname(n) \
+ (*PL_Sock->pGetprotobyname)(PL_Sock, n)
+#define PerlSock_getprotobynumber(n) \
+ (*PL_Sock->pGetprotobynumber)(PL_Sock, n)
+#define PerlSock_getprotoent() \
+ (*PL_Sock->pGetprotoent)(PL_Sock)
+#define PerlSock_getservbyname(n, p) \
+ (*PL_Sock->pGetservbyname)(PL_Sock, n, p)
+#define PerlSock_getservbyport(port, p) \
+ (*PL_Sock->pGetservbyport)(PL_Sock, port, p)
+#define PerlSock_getservent() \
+ (*PL_Sock->pGetservent)(PL_Sock)
+#define PerlSock_getsockname(s, n, l) \
+ (*PL_Sock->pGetsockname)(PL_Sock, s, n, l)
+#define PerlSock_getsockopt(s,l,n,v,i) \
+ (*PL_Sock->pGetsockopt)(PL_Sock, s, l, n, v, i)
+#define PerlSock_inet_addr(c) \
+ (*PL_Sock->pInetAddr)(PL_Sock, c)
+#define PerlSock_inet_ntoa(i) \
+ (*PL_Sock->pInetNtoa)(PL_Sock, i)
+#define PerlSock_listen(s, b) \
+ (*PL_Sock->pListen)(PL_Sock, s, b)
+#define PerlSock_recv(s, b, l, f) \
+ (*PL_Sock->pRecv)(PL_Sock, s, b, l, f)
+#define PerlSock_recvfrom(s,b,l,f,from,fromlen) \
+ (*PL_Sock->pRecvfrom)(PL_Sock, s, b, l, f, from, fromlen)
+#define PerlSock_select(n, r, w, e, t) \
+ (*PL_Sock->pSelect)(PL_Sock, n, (char*)r, (char*)w, (char*)e, t)
+#define PerlSock_send(s, b, l, f) \
+ (*PL_Sock->pSend)(PL_Sock, s, b, l, f)
+#define PerlSock_sendto(s, b, l, f, t, tlen) \
+ (*PL_Sock->pSendto)(PL_Sock, s, b, l, f, t, tlen)
+#define PerlSock_sethostent(f) \
+ (*PL_Sock->pSethostent)(PL_Sock, f)
+#define PerlSock_setnetent(f) \
+ (*PL_Sock->pSetnetent)(PL_Sock, f)
+#define PerlSock_setprotoent(f) \
+ (*PL_Sock->pSetprotoent)(PL_Sock, f)
+#define PerlSock_setservent(f) \
+ (*PL_Sock->pSetservent)(PL_Sock, f)
+#define PerlSock_setsockopt(s, l, n, v, len) \
+ (*PL_Sock->pSetsockopt)(PL_Sock, s, l, n, v, len)
+#define PerlSock_shutdown(s, h) \
+ (*PL_Sock->pShutdown)(PL_Sock, s, h)
+#define PerlSock_socket(a, t, p) \
+ (*PL_Sock->pSocket)(PL_Sock, a, t, p)
+#define PerlSock_socketpair(a, t, p, f) \
+ (*PL_Sock->pSocketpair)(PL_Sock, a, t, p, f)
+
+#ifdef WIN32
+#define PerlSock_closesocket(s) \
+ (*PL_Sock->pClosesocket)(PL_Sock, s)
+#endif
+
+#else /* PERL_IMPLICIT_SYS */
+
+#define PerlSock_htonl(x) htonl(x)
+#define PerlSock_htons(x) htons(x)
+#define PerlSock_ntohl(x) ntohl(x)
+#define PerlSock_ntohs(x) ntohs(x)
+#define PerlSock_accept(s, a, l) accept(s, a, l)
+#define PerlSock_bind(s, n, l) bind(s, n, l)
+#define PerlSock_connect(s, n, l) connect(s, n, l)
+
+#define PerlSock_gethostbyaddr(a, l, t) gethostbyaddr(a, l, t)
+#define PerlSock_gethostbyname(n) gethostbyname(n)
+#define PerlSock_gethostent gethostent
+#define PerlSock_endhostent endhostent
+#define PerlSock_gethostname(n, l) gethostname(n, l)
+
+#define PerlSock_getnetbyaddr(n, t) getnetbyaddr(n, t)
+#define PerlSock_getnetbyname(n) getnetbyname(n)
+#define PerlSock_getnetent getnetent
+#define PerlSock_endnetent endnetent
+#define PerlSock_getpeername(s, n, l) getpeername(s, n, l)
+
+#define PerlSock_getprotobyname(n) getprotobyname(n)
+#define PerlSock_getprotobynumber(n) getprotobynumber(n)
+#define PerlSock_getprotoent getprotoent
+#define PerlSock_endprotoent endprotoent
+
+#define PerlSock_getservbyname(n, p) getservbyname(n, p)
+#define PerlSock_getservbyport(port, p) getservbyport(port, p)
+#define PerlSock_getservent getservent
+#define PerlSock_endservent endservent
+
+#define PerlSock_getsockname(s, n, l) getsockname(s, n, l)
+#define PerlSock_getsockopt(s,l,n,v,i) getsockopt(s, l, n, v, i)
+#define PerlSock_inet_addr(c) inet_addr(c)
+#define PerlSock_inet_ntoa(i) inet_ntoa(i)
+#define PerlSock_listen(s, b) listen(s, b)
+#define PerlSock_recv(s, b, l, f) recv(s, b, l, f)
+#define PerlSock_recvfrom(s, b, l, f, from, fromlen) \
+ recvfrom(s, b, l, f, from, fromlen)
+#define PerlSock_select(n, r, w, e, t) select(n, r, w, e, t)
+#define PerlSock_send(s, b, l, f) send(s, b, l, f)
+#define PerlSock_sendto(s, b, l, f, t, tlen) \
+ sendto(s, b, l, f, t, tlen)
+#define PerlSock_sethostent(f) sethostent(f)
+#define PerlSock_setnetent(f) setnetent(f)
+#define PerlSock_setprotoent(f) setprotoent(f)
+#define PerlSock_setservent(f) setservent(f)
+#define PerlSock_setsockopt(s, l, n, v, len) \
+ setsockopt(s, l, n, v, len)
+#define PerlSock_shutdown(s, h) shutdown(s, h)
+#define PerlSock_socket(a, t, p) socket(a, t, p)
+#define PerlSock_socketpair(a, t, p, f) socketpair(a, t, p, f)
+
+#ifdef WIN32
+#define PerlSock_closesocket(s) closesocket(s)
+#endif
+
+#endif /* PERL_IMPLICIT_SYS */
+
+#endif /* __Inc__IPerl___ */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/keywords.h b/Master/tlpkg/tlperl/lib/CORE/keywords.h
new file mode 100644
index 00000000000..b2e996db886
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/keywords.h
@@ -0,0 +1,269 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * keywords.h
+ *
+ * Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2005,
+ * 2006, 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by keywords.pl from its data. Any changes made here
+ * will be lost!
+ */
+#define KEY_NULL 0
+#define KEY___FILE__ 1
+#define KEY___LINE__ 2
+#define KEY___PACKAGE__ 3
+#define KEY___DATA__ 4
+#define KEY___END__ 5
+#define KEY_AUTOLOAD 6
+#define KEY_BEGIN 7
+#define KEY_UNITCHECK 8
+#define KEY_CORE 9
+#define KEY_DESTROY 10
+#define KEY_END 11
+#define KEY_INIT 12
+#define KEY_CHECK 13
+#define KEY_abs 14
+#define KEY_accept 15
+#define KEY_alarm 16
+#define KEY_and 17
+#define KEY_atan2 18
+#define KEY_bind 19
+#define KEY_binmode 20
+#define KEY_bless 21
+#define KEY_break 22
+#define KEY_caller 23
+#define KEY_chdir 24
+#define KEY_chmod 25
+#define KEY_chomp 26
+#define KEY_chop 27
+#define KEY_chown 28
+#define KEY_chr 29
+#define KEY_chroot 30
+#define KEY_close 31
+#define KEY_closedir 32
+#define KEY_cmp 33
+#define KEY_connect 34
+#define KEY_continue 35
+#define KEY_cos 36
+#define KEY_crypt 37
+#define KEY_dbmclose 38
+#define KEY_dbmopen 39
+#define KEY_default 40
+#define KEY_defined 41
+#define KEY_delete 42
+#define KEY_die 43
+#define KEY_do 44
+#define KEY_dump 45
+#define KEY_each 46
+#define KEY_else 47
+#define KEY_elsif 48
+#define KEY_endgrent 49
+#define KEY_endhostent 50
+#define KEY_endnetent 51
+#define KEY_endprotoent 52
+#define KEY_endpwent 53
+#define KEY_endservent 54
+#define KEY_eof 55
+#define KEY_eq 56
+#define KEY_eval 57
+#define KEY_exec 58
+#define KEY_exists 59
+#define KEY_exit 60
+#define KEY_exp 61
+#define KEY_fcntl 62
+#define KEY_fileno 63
+#define KEY_flock 64
+#define KEY_for 65
+#define KEY_foreach 66
+#define KEY_fork 67
+#define KEY_format 68
+#define KEY_formline 69
+#define KEY_ge 70
+#define KEY_getc 71
+#define KEY_getgrent 72
+#define KEY_getgrgid 73
+#define KEY_getgrnam 74
+#define KEY_gethostbyaddr 75
+#define KEY_gethostbyname 76
+#define KEY_gethostent 77
+#define KEY_getlogin 78
+#define KEY_getnetbyaddr 79
+#define KEY_getnetbyname 80
+#define KEY_getnetent 81
+#define KEY_getpeername 82
+#define KEY_getpgrp 83
+#define KEY_getppid 84
+#define KEY_getpriority 85
+#define KEY_getprotobyname 86
+#define KEY_getprotobynumber 87
+#define KEY_getprotoent 88
+#define KEY_getpwent 89
+#define KEY_getpwnam 90
+#define KEY_getpwuid 91
+#define KEY_getservbyname 92
+#define KEY_getservbyport 93
+#define KEY_getservent 94
+#define KEY_getsockname 95
+#define KEY_getsockopt 96
+#define KEY_given 97
+#define KEY_glob 98
+#define KEY_gmtime 99
+#define KEY_goto 100
+#define KEY_grep 101
+#define KEY_gt 102
+#define KEY_hex 103
+#define KEY_if 104
+#define KEY_index 105
+#define KEY_int 106
+#define KEY_ioctl 107
+#define KEY_join 108
+#define KEY_keys 109
+#define KEY_kill 110
+#define KEY_last 111
+#define KEY_lc 112
+#define KEY_lcfirst 113
+#define KEY_le 114
+#define KEY_length 115
+#define KEY_link 116
+#define KEY_listen 117
+#define KEY_local 118
+#define KEY_localtime 119
+#define KEY_lock 120
+#define KEY_log 121
+#define KEY_lstat 122
+#define KEY_lt 123
+#define KEY_m 124
+#define KEY_map 125
+#define KEY_mkdir 126
+#define KEY_msgctl 127
+#define KEY_msgget 128
+#define KEY_msgrcv 129
+#define KEY_msgsnd 130
+#define KEY_my 131
+#define KEY_ne 132
+#define KEY_next 133
+#define KEY_no 134
+#define KEY_not 135
+#define KEY_oct 136
+#define KEY_open 137
+#define KEY_opendir 138
+#define KEY_or 139
+#define KEY_ord 140
+#define KEY_our 141
+#define KEY_pack 142
+#define KEY_package 143
+#define KEY_pipe 144
+#define KEY_pop 145
+#define KEY_pos 146
+#define KEY_print 147
+#define KEY_printf 148
+#define KEY_prototype 149
+#define KEY_push 150
+#define KEY_q 151
+#define KEY_qq 152
+#define KEY_qr 153
+#define KEY_quotemeta 154
+#define KEY_qw 155
+#define KEY_qx 156
+#define KEY_rand 157
+#define KEY_read 158
+#define KEY_readdir 159
+#define KEY_readline 160
+#define KEY_readlink 161
+#define KEY_readpipe 162
+#define KEY_recv 163
+#define KEY_redo 164
+#define KEY_ref 165
+#define KEY_rename 166
+#define KEY_require 167
+#define KEY_reset 168
+#define KEY_return 169
+#define KEY_reverse 170
+#define KEY_rewinddir 171
+#define KEY_rindex 172
+#define KEY_rmdir 173
+#define KEY_s 174
+#define KEY_say 175
+#define KEY_scalar 176
+#define KEY_seek 177
+#define KEY_seekdir 178
+#define KEY_select 179
+#define KEY_semctl 180
+#define KEY_semget 181
+#define KEY_semop 182
+#define KEY_send 183
+#define KEY_setgrent 184
+#define KEY_sethostent 185
+#define KEY_setnetent 186
+#define KEY_setpgrp 187
+#define KEY_setpriority 188
+#define KEY_setprotoent 189
+#define KEY_setpwent 190
+#define KEY_setservent 191
+#define KEY_setsockopt 192
+#define KEY_shift 193
+#define KEY_shmctl 194
+#define KEY_shmget 195
+#define KEY_shmread 196
+#define KEY_shmwrite 197
+#define KEY_shutdown 198
+#define KEY_sin 199
+#define KEY_sleep 200
+#define KEY_socket 201
+#define KEY_socketpair 202
+#define KEY_sort 203
+#define KEY_splice 204
+#define KEY_split 205
+#define KEY_sprintf 206
+#define KEY_sqrt 207
+#define KEY_srand 208
+#define KEY_stat 209
+#define KEY_state 210
+#define KEY_study 211
+#define KEY_sub 212
+#define KEY_substr 213
+#define KEY_symlink 214
+#define KEY_syscall 215
+#define KEY_sysopen 216
+#define KEY_sysread 217
+#define KEY_sysseek 218
+#define KEY_system 219
+#define KEY_syswrite 220
+#define KEY_tell 221
+#define KEY_telldir 222
+#define KEY_tie 223
+#define KEY_tied 224
+#define KEY_time 225
+#define KEY_times 226
+#define KEY_tr 227
+#define KEY_truncate 228
+#define KEY_uc 229
+#define KEY_ucfirst 230
+#define KEY_umask 231
+#define KEY_undef 232
+#define KEY_unless 233
+#define KEY_unlink 234
+#define KEY_unpack 235
+#define KEY_unshift 236
+#define KEY_untie 237
+#define KEY_until 238
+#define KEY_use 239
+#define KEY_utime 240
+#define KEY_values 241
+#define KEY_vec 242
+#define KEY_wait 243
+#define KEY_waitpid 244
+#define KEY_wantarray 245
+#define KEY_warn 246
+#define KEY_when 247
+#define KEY_while 248
+#define KEY_write 249
+#define KEY_x 250
+#define KEY_xor 251
+#define KEY_y 252
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/libperl512.a b/Master/tlpkg/tlperl/lib/CORE/libperl512.a
new file mode 100644
index 00000000000..d837df3ee31
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/libperl512.a
Binary files differ
diff --git a/Master/tlpkg/tlperl/lib/CORE/malloc_ctl.h b/Master/tlpkg/tlperl/lib/CORE/malloc_ctl.h
new file mode 100644
index 00000000000..7a6aed0db73
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/malloc_ctl.h
@@ -0,0 +1,64 @@
+#ifndef MALLOC_CTL_H
+# define MALLOC_CTL_H
+
+struct perl_mstats {
+ UV *nfree;
+ UV *ntotal;
+ IV topbucket, topbucket_ev, topbucket_odd, totfree, total, total_chain;
+ IV total_sbrk, sbrks, sbrk_good, sbrk_slack, start_slack, sbrked_remains;
+ IV minbucket;
+ /* Level 1 info */
+ UV *bucket_mem_size;
+ UV *bucket_available_size;
+ UV nbuckets;
+};
+typedef struct perl_mstats perl_mstats_t;
+
+START_EXTERN_C
+Malloc_t Perl_malloc (MEM_SIZE nbytes);
+Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size);
+Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes);
+/* 'mfree' rather than 'free', since there is already a 'perl_free'
+ * that causes clashes with case-insensitive linkers */
+Free_t Perl_mfree (Malloc_t where);
+END_EXTERN_C
+
+#ifndef NO_MALLOC_DYNAMIC_CFG
+
+/* IV configuration data */
+enum {
+ MallocCfg_FIRST_SBRK,
+ MallocCfg_MIN_SBRK,
+ MallocCfg_MIN_SBRK_FRAC1000,
+ MallocCfg_SBRK_ALLOW_FAILURES,
+ MallocCfg_SBRK_FAILURE_PRICE,
+ MallocCfg_sbrk_goodness,
+
+ MallocCfg_filldead,
+ MallocCfg_fillalive,
+ MallocCfg_fillcheck,
+
+ MallocCfg_skip_cfg_env,
+ MallocCfg_cfg_env_read,
+
+ MallocCfg_emergency_buffer_size,
+ MallocCfg_emergency_buffer_last_req,
+
+ MallocCfg_emergency_buffer_prepared_size,
+
+ MallocCfg_last
+};
+/* char* configuration data */
+enum {
+ MallocCfgP_emergency_buffer,
+ MallocCfgP_emergency_buffer_prepared,
+ MallocCfgP_last
+};
+START_EXTERN_C
+extern IV *MallocCfg_ptr;
+extern char **MallocCfgP_ptr;
+END_EXTERN_C
+
+#endif
+
+#endif
diff --git a/Master/tlpkg/tlperl/lib/CORE/mg.h b/Master/tlpkg/tlperl/lib/CORE/mg.h
new file mode 100644
index 00000000000..fcac4111131
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/mg.h
@@ -0,0 +1,72 @@
+/* mg.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999,
+ * 2000, 2002, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef STRUCT_MGVTBL_DEFINITION
+STRUCT_MGVTBL_DEFINITION;
+#else
+struct mgvtbl {
+ int (CPERLscope(*svt_get)) (pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_set)) (pTHX_ SV *sv, MAGIC* mg);
+ U32 (CPERLscope(*svt_len)) (pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_free)) (pTHX_ SV *sv, MAGIC* mg);
+ int (CPERLscope(*svt_copy)) (pTHX_ SV *sv, MAGIC* mg,
+ SV *nsv, const char *name, I32 namlen);
+ int (CPERLscope(*svt_dup)) (pTHX_ MAGIC *mg, CLONE_PARAMS *param);
+ int (CPERLscope(*svt_local))(pTHX_ SV *nsv, MAGIC *mg);
+};
+#endif
+
+struct magic {
+ MAGIC* mg_moremagic;
+ MGVTBL* mg_virtual; /* pointer to magic functions */
+ U16 mg_private;
+ char mg_type;
+ U8 mg_flags;
+ I32 mg_len;
+ SV* mg_obj;
+ char* mg_ptr;
+};
+
+#define MGf_TAINTEDDIR 1 /* PERL_MAGIC_envelem only */
+#define MGf_MINMATCH 1 /* PERL_MAGIC_regex_global only */
+#define MGf_REFCOUNTED 2
+#define MGf_GSKIP 4
+#define MGf_COPY 8 /* has an svt_copy MGVTBL entry */
+#define MGf_DUP 0x10 /* has an svt_dup MGVTBL entry */
+#define MGf_LOCAL 0x20 /* has an svt_local MGVTBL entry */
+
+#define MgTAINTEDDIR(mg) (mg->mg_flags & MGf_TAINTEDDIR)
+#define MgTAINTEDDIR_on(mg) (mg->mg_flags |= MGf_TAINTEDDIR)
+#define MgTAINTEDDIR_off(mg) (mg->mg_flags &= ~MGf_TAINTEDDIR)
+
+#define MgPV(mg,lp) ((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ? \
+ SvPV(MUTABLE_SV((mg)->mg_ptr),lp) : \
+ (mg)->mg_ptr)
+#define MgPV_const(mg,lp) ((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ? \
+ SvPV_const(MUTABLE_SV((mg)->mg_ptr),lp) : \
+ (const char*)(mg)->mg_ptr)
+#define MgPV_nolen_const(mg) (((((int)(mg)->mg_len)) == HEf_SVKEY) ? \
+ SvPV_nolen_const(MUTABLE_SV((mg)->mg_ptr)) : \
+ (const char*)(mg)->mg_ptr)
+
+#define SvTIED_mg(sv,how) (SvRMAGICAL(sv) ? mg_find((sv),(how)) : NULL)
+#define SvTIED_obj(sv,mg) \
+ ((mg)->mg_obj ? (mg)->mg_obj : sv_2mortal(newRV(sv)))
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/mydtrace.h b/Master/tlpkg/tlperl/lib/CORE/mydtrace.h
new file mode 100644
index 00000000000..daabcfa0b9c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/mydtrace.h
@@ -0,0 +1,42 @@
+/* mydtrace.h
+ *
+ * Copyright (C) 2008, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * Provides macros that wrap the various DTrace probes we use. We add
+ * an extra level of wrapping to encapsulate the _ENABLED tests.
+ */
+
+#if defined(USE_DTRACE) && defined(PERL_CORE)
+
+# include "perldtrace.h"
+
+# define ENTRY_PROBE(func, file, line) \
+ if (PERL_SUB_ENTRY_ENABLED()) { \
+ PERL_SUB_ENTRY(func, file, line); \
+ }
+
+# define RETURN_PROBE(func, file, line) \
+ if (PERL_SUB_RETURN_ENABLED()) { \
+ PERL_SUB_RETURN(func, file, line); \
+ }
+
+#else
+
+/* NOPs */
+# define ENTRY_PROBE(func, file, line)
+# define RETURN_PROBE(func, file, line)
+
+#endif
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/netdb.h b/Master/tlpkg/tlperl/lib/CORE/netdb.h
new file mode 100644
index 00000000000..43c03c75446
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/netdb.h
@@ -0,0 +1,12 @@
+/* netdb.h */
+
+/* djl */
+/* Provide UNIX compatibility */
+
+
+#ifndef _INC_NETDB
+#define _INC_NETDB
+
+#include <sys/socket.h>
+
+#endif /* _INC_NETDB */
diff --git a/Master/tlpkg/tlperl/lib/CORE/nostdio.h b/Master/tlpkg/tlperl/lib/CORE/nostdio.h
new file mode 100644
index 00000000000..f6a13b4998c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/nostdio.h
@@ -0,0 +1,136 @@
+/* nostdio.h
+ *
+ * Copyright (C) 1996, 2000, 2001, 2005, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * Strong denial of stdio - make all stdio calls (we can think of) errors
+ */
+/* This is a 1st attempt to stop other include files pulling
+ in real <stdio.h>.
+ A more ambitious set of possible symbols can be found in
+ sfio.h (inside an _cplusplus gard).
+ It is completely pointless as we have already included it ourselves.
+*/
+
+#if !defined(_STDIO_H) && !defined(FILE) && !defined(_STDIO_INCLUDED) && !defined(__STDIO_LOADED)
+#define _STDIO_H
+#define _STDIO_INCLUDED
+#define __STDIO_LOADED
+struct _FILE;
+#define FILE struct _FILE
+#endif
+
+#define _CANNOT "CANNOT"
+
+#undef clearerr
+#undef fclose
+#undef fdopen
+#undef feof
+#undef ferror
+#undef fflush
+#undef fgetc
+#undef fgetpos
+#undef fgets
+#undef fileno
+#undef flockfile
+#undef fopen
+#undef fprintf
+#undef fputc
+#undef fputs
+#undef fread
+#undef freopen
+#undef fscanf
+#undef fseek
+#undef fsetpos
+#undef ftell
+#undef ftrylockfile
+#undef funlockfile
+#undef fwrite
+#undef getc
+#undef getc_unlocked
+#undef getw
+#undef pclose
+#undef popen
+#undef putc
+#undef putc_unlocked
+#undef putw
+#undef rewind
+#undef setbuf
+#undef setvbuf
+#undef stderr
+#undef stdin
+#undef stdout
+#undef tmpfile
+#undef ungetc
+#undef vfprintf
+#undef printf
+
+#define fprintf _CANNOT _fprintf_
+#define printf _CANNOT _printf_
+#define stdin _CANNOT _stdin_
+#define stdout _CANNOT _stdout_
+#define stderr _CANNOT _stderr_
+#ifndef OS2
+#define tmpfile() _CANNOT _tmpfile_
+#endif
+#define fclose(f) _CANNOT _fclose_
+#define fflush(f) _CANNOT _fflush_
+#define fopen(p,m) _CANNOT _fopen_
+#define freopen(p,m,f) _CANNOT _freopen_
+#define setbuf(f,b) _CANNOT _setbuf_
+#define setvbuf(f,b,x,s) _CANNOT _setvbuf_
+#define fscanf _CANNOT _fscanf_
+#define vfprintf(f,fmt,a) _CANNOT _vfprintf_
+#define fgetc(f) _CANNOT _fgetc_
+#define fgets(s,n,f) _CANNOT _fgets_
+#define fputc(c,f) _CANNOT _fputc_
+#define fputs(s,f) _CANNOT _fputs_
+#define getc(f) _CANNOT _getc_
+#define putc(c,f) _CANNOT _putc_
+#ifndef OS2
+#define ungetc(c,f) _CANNOT _ungetc_
+#endif
+#define fread(b,s,c,f) _CANNOT _fread_
+#define fwrite(b,s,c,f) _CANNOT _fwrite_
+#define fgetpos(f,p) _CANNOT _fgetpos_
+#define fseek(f,o,w) _CANNOT _fseek_
+#define fsetpos(f,p) _CANNOT _fsetpos_
+#define ftell(f) _CANNOT _ftell_
+#define rewind(f) _CANNOT _rewind_
+#define clearerr(f) _CANNOT _clearerr_
+#define feof(f) _CANNOT _feof_
+#define ferror(f) _CANNOT _ferror_
+#define __filbuf(f) _CANNOT __filbuf_
+#define __flsbuf(c,f) _CANNOT __flsbuf_
+#define _filbuf(f) _CANNOT _filbuf_
+#define _flsbuf(c,f) _CANNOT _flsbuf_
+#define fdopen(fd,p) _CANNOT _fdopen_
+#define fileno(f) _CANNOT _fileno_
+#if defined(SFIO_VERSION) && SFIO_VERSION < 20000101L
+#define flockfile(f) _CANNOT _flockfile_
+#define ftrylockfile(f) _CANNOT _ftrylockfile_
+#define funlockfile(f) _CANNOT _funlockfile_
+#endif
+#define getc_unlocked(f) _CANNOT _getc_unlocked_
+#define putc_unlocked(c,f) _CANNOT _putc_unlocked_
+#define popen(c,m) _CANNOT _popen_
+#define getw(f) _CANNOT _getw_
+#define putw(v,f) _CANNOT _putw_
+#ifndef OS2
+#define pclose(f) _CANNOT _pclose_
+#endif
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/op.h b/Master/tlpkg/tlperl/lib/CORE/op.h
new file mode 100644
index 00000000000..25b59ea5c22
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/op.h
@@ -0,0 +1,749 @@
+/* op.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * The fields of BASEOP are:
+ * op_next Pointer to next ppcode to execute after this one.
+ * (Top level pre-grafted op points to first op,
+ * but this is replaced when op is grafted in, when
+ * this op will point to the real next op, and the new
+ * parent takes over role of remembering starting op.)
+ * op_ppaddr Pointer to current ppcode's function.
+ * op_type The type of the operation.
+ * op_opt Whether or not the op has been optimised by the
+ * peephole optimiser.
+ *
+ * See the comments in S_clear_yystack() for more
+ * details on the following three flags:
+ *
+ * op_latefree tell op_free() to clear this op (and free any kids)
+ * but not yet deallocate the struct. This means that
+ * the op may be safely op_free()d multiple times
+ * op_latefreed an op_latefree op has been op_free()d
+ * op_attached this op (sub)tree has been attached to a CV
+ *
+ * op_spare three spare bits!
+ * op_flags Flags common to all operations. See OPf_* below.
+ * op_private Flags peculiar to a particular operation (BUT,
+ * by default, set to the number of children until
+ * the operation is privatized by a check routine,
+ * which may or may not check number of children).
+ */
+
+#define OPCODE U16
+
+#ifdef PERL_MAD
+# define MADPROP_IN_BASEOP MADPROP* op_madprop;
+#else
+# define MADPROP_IN_BASEOP
+#endif
+
+typedef PERL_BITFIELD16 Optype;
+
+#ifdef BASEOP_DEFINITION
+#define BASEOP BASEOP_DEFINITION
+#else
+#define BASEOP \
+ OP* op_next; \
+ OP* op_sibling; \
+ OP* (CPERLscope(*op_ppaddr))(pTHX); \
+ MADPROP_IN_BASEOP \
+ PADOFFSET op_targ; \
+ PERL_BITFIELD16 op_type:9; \
+ PERL_BITFIELD16 op_opt:1; \
+ PERL_BITFIELD16 op_latefree:1; \
+ PERL_BITFIELD16 op_latefreed:1; \
+ PERL_BITFIELD16 op_attached:1; \
+ PERL_BITFIELD16 op_spare:3; \
+ U8 op_flags; \
+ U8 op_private;
+#endif
+
+/* If op_type:9 is changed to :10, also change PUSHEVAL in cop.h.
+ Also, if the type of op_type is ever changed (e.g. to PERL_BITFIELD32)
+ then all the other bit-fields before/after it should change their
+ types too to let VC pack them into the same 4 byte integer.*/
+
+#define OP_GIMME(op,dfl) \
+ (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID ? G_VOID : \
+ ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
+ ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST ? G_ARRAY : \
+ dfl)
+
+#define OP_GIMME_REVERSE(flags) ((flags) & G_WANT)
+
+/*
+=head1 "Gimme" Values
+
+=for apidoc Amn|U32|GIMME_V
+The XSUB-writer's equivalent to Perl's C<wantarray>. Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
+respectively.
+
+=for apidoc Amn|U32|GIMME
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated. Use C<GIMME_V> instead.
+
+=cut
+*/
+
+#define GIMME_V OP_GIMME(PL_op, block_gimme())
+
+/* Public flags */
+
+#define OPf_WANT 3 /* Mask for "want" bits: */
+#define OPf_WANT_VOID 1 /* Want nothing */
+#define OPf_WANT_SCALAR 2 /* Want single value */
+#define OPf_WANT_LIST 3 /* Want list of any length */
+#define OPf_KIDS 4 /* There is a firstborn child. */
+#define OPf_PARENS 8 /* This operator was parenthesized. */
+ /* (Or block needs explicit scope entry.) */
+#define OPf_REF 16 /* Certified reference. */
+ /* (Return container, not containee). */
+#define OPf_MOD 32 /* Will modify (lvalue). */
+#define OPf_STACKED 64 /* Some arg is arriving on the stack. */
+#define OPf_SPECIAL 128 /* Do something weird for this op: */
+ /* On local LVAL, don't init local value. */
+ /* On OP_SORT, subroutine is inlined. */
+ /* On OP_NOT, inversion was implicit. */
+ /* On OP_LEAVE, don't restore curpm. */
+ /* On truncate, we truncate filehandle */
+ /* On control verbs, we saw no label */
+ /* On flipflop, we saw ... instead of .. */
+ /* On UNOPs, saw bare parens, e.g. eof(). */
+ /* On OP_ENTERSUB || OP_NULL, saw a "do". */
+ /* On OP_EXISTS, treat av as av, not avhv. */
+ /* On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
+ /* On OP_ENTERITER, loop var is per-thread */
+ /* On pushre, rx is used as part of split, e.g. split " " */
+ /* On regcomp, "use re 'eval'" was in scope */
+ /* On OP_READLINE, was <$filehandle> */
+ /* On RV2[ACGHS]V, don't create GV--in
+ defined()*/
+ /* On OP_DBSTATE, indicates breakpoint
+ * (runtime property) */
+ /* On OP_AELEMFAST, indiciates pad var */
+ /* On OP_REQUIRE, was seen as CORE::require */
+ /* On OP_ENTERWHEN, there's no condition */
+ /* On OP_BREAK, an implicit break */
+ /* On OP_SMARTMATCH, an implicit smartmatch */
+ /* On OP_ANONHASH and OP_ANONLIST, create a
+ reference to the new anon hash or array */
+ /* On OP_ENTER, store caller context */
+ /* On OP_HELEM and OP_HSLICE, localization will be followed
+ by assignment, so do not wipe the target if it is special
+ (e.g. a glob or a magic SV) */
+
+/* old names; don't use in new code, but don't break them, either */
+#define OPf_LIST OPf_WANT_LIST
+#define OPf_KNOW OPf_WANT
+
+#define GIMME \
+ (PL_op->op_flags & OPf_WANT \
+ ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST \
+ ? G_ARRAY \
+ : G_SCALAR) \
+ : dowantarray())
+
+/* NOTE: OP_NEXTSTATE, OP_DBSTATE, and OP_SETSTATE (i.e. COPs) carry lower
+ * bits of PL_hints in op_private */
+
+/* Private for lvalues */
+#define OPpLVAL_INTRO 128 /* Lvalue must be localized or lvalue sub */
+
+/* Private for OP_LEAVE, OP_LEAVESUB, OP_LEAVESUBLV and OP_LEAVEWRITE */
+#define OPpREFCOUNTED 64 /* op_targ carries a refcount */
+
+/* Private for OP_AASSIGN */
+#define OPpASSIGN_COMMON 64 /* Left & right have syms in common. */
+
+/* Private for OP_SASSIGN */
+#define OPpASSIGN_BACKWARDS 64 /* Left & right switched. */
+#define OPpASSIGN_CV_TO_GV 128 /* Possible optimisation for constants. */
+
+/* Private for OP_MATCH and OP_SUBST{,CONST} */
+#define OPpRUNTIME 64 /* Pattern coming in on the stack */
+
+/* Private for OP_TRANS */
+#define OPpTRANS_FROM_UTF 1
+#define OPpTRANS_TO_UTF 2
+#define OPpTRANS_IDENTICAL 4 /* right side is same as left */
+#define OPpTRANS_SQUASH 8
+ /* 16 is used for OPpTARGET_MY */
+#define OPpTRANS_COMPLEMENT 32
+#define OPpTRANS_GROWS 64
+#define OPpTRANS_DELETE 128
+#define OPpTRANS_ALL (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
+
+/* Private for OP_REPEAT */
+#define OPpREPEAT_DOLIST 64 /* List replication. */
+
+/* Private for OP_RV2GV, OP_RV2SV, OP_AELEM, OP_HELEM, OP_PADSV */
+#define OPpDEREF (32|64) /* autovivify: Want ref to something: */
+#define OPpDEREF_AV 32 /* Want ref to AV. */
+#define OPpDEREF_HV 64 /* Want ref to HV. */
+#define OPpDEREF_SV (32|64) /* Want ref to SV. */
+ /* OP_ENTERSUB only */
+#define OPpENTERSUB_DB 16 /* Debug subroutine. */
+#define OPpENTERSUB_HASTARG 32 /* Called from OP tree. */
+#define OPpENTERSUB_NOMOD 64 /* Immune to mod() for :attrlist. */
+ /* OP_ENTERSUB and OP_RV2CV only */
+#define OPpENTERSUB_AMPER 8 /* Used & form to call. */
+#define OPpENTERSUB_NOPAREN 128 /* bare sub call (without parens) */
+#define OPpENTERSUB_INARGS 4 /* Lval used as arg to a sub. */
+ /* OP_GV only */
+#define OPpEARLY_CV 32 /* foo() called before sub foo was parsed */
+ /* OP_?ELEM only */
+#define OPpLVAL_DEFER 16 /* Defer creation of array/hash elem */
+ /* OP_RV2?V, OP_GVSV, OP_ENTERITER only */
+#define OPpOUR_INTRO 16 /* Variable was in an our() */
+ /* OP_RV2[AGH]V, OP_PAD[AH]V, OP_[AH]ELEM */
+#define OPpMAYBE_LVSUB 8 /* We might be an lvalue to return */
+ /* OP_PADSV only */
+#define OPpPAD_STATE 16 /* is a "state" pad */
+ /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
+
+ /* OP_RV2GV only */
+#define OPpDONT_INIT_GV 4 /* Call gv_fetchpv with GV_NOINIT */
+/* (Therefore will return whatever is currently in the symbol table, not
+ guaranteed to be a PVGV) */
+
+ /* OP_RV2CV only */
+#define OPpMAY_RETURN_CONSTANT 1 /* If a constant sub, return the constant */
+
+/* Private for OPs with TARGLEX */
+ /* (lower bits may carry MAXARG) */
+#define OPpTARGET_MY 16 /* Target is PADMY. */
+
+/* Private for OP_ENTERITER and OP_ITER */
+#define OPpITER_REVERSED 4 /* for (reverse ...) */
+#define OPpITER_DEF 8 /* for $_ or for my $_ */
+
+/* Private for OP_CONST */
+#define OPpCONST_NOVER 2 /* no 6; */
+#define OPpCONST_SHORTCIRCUIT 4 /* eg the constant 5 in (5 || foo) */
+#define OPpCONST_STRICT 8 /* bearword subject to strict 'subs' */
+#define OPpCONST_ENTERED 16 /* Has been entered as symbol. */
+#define OPpCONST_ARYBASE 32 /* Was a $[ translated to constant. */
+#define OPpCONST_BARE 64 /* Was a bare word (filehandle?). */
+#define OPpCONST_WARNING 128 /* Was a $^W translated to constant. */
+
+/* Private for OP_FLIP/FLOP */
+#define OPpFLIP_LINENUM 64 /* Range arg potentially a line num. */
+
+/* Private for OP_LIST */
+#define OPpLIST_GUESSED 64 /* Guessed that pushmark was needed. */
+
+/* Private for OP_DELETE */
+#define OPpSLICE 64 /* Operating on a list of keys */
+/* Also OPpLVAL_INTRO (128) */
+
+/* Private for OP_EXISTS */
+#define OPpEXISTS_SUB 64 /* Checking for &sub, not {} or []. */
+
+/* Private for OP_SORT */
+#define OPpSORT_NUMERIC 1 /* Optimized away { $a <=> $b } */
+#define OPpSORT_INTEGER 2 /* Ditto while under "use integer" */
+#define OPpSORT_REVERSE 4 /* Reversed sort */
+#define OPpSORT_INPLACE 8 /* sort in-place; eg @a = sort @a */
+#define OPpSORT_DESCEND 16 /* Descending sort */
+#define OPpSORT_QSORT 32 /* Use quicksort (not mergesort) */
+#define OPpSORT_STABLE 64 /* Use a stable algorithm */
+
+/* Private for OP_REVERSE */
+#define OPpREVERSE_INPLACE 8 /* reverse in-place (@a = reverse @a) */
+
+/* Private for OP_OPEN and OP_BACKTICK */
+#define OPpOPEN_IN_RAW 16 /* binmode(F,":raw") on input fh */
+#define OPpOPEN_IN_CRLF 32 /* binmode(F,":crlf") on input fh */
+#define OPpOPEN_OUT_RAW 64 /* binmode(F,":raw") on output fh */
+#define OPpOPEN_OUT_CRLF 128 /* binmode(F,":crlf") on output fh */
+
+/* Private for OP_EXIT, HUSH also for OP_DIE */
+#define OPpHUSH_VMSISH 64 /* hush DCL exit msg vmsish mode*/
+#define OPpEXIT_VMSISH 128 /* exit(0) vs. exit(1) vmsish mode*/
+
+/* Private for OP_FTXXX */
+#define OPpFT_ACCESS 2 /* use filetest 'access' */
+#define OPpFT_STACKED 4 /* stacked filetest, as in "-f -x $f" */
+
+/* Private for OP_(MAP|GREP)(WHILE|START) */
+#define OPpGREP_LEX 2 /* iterate over lexical $_ */
+
+/* Private for OP_ENTEREVAL */
+#define OPpEVAL_HAS_HH 2 /* Does it have a copy of %^H */
+
+struct op {
+ BASEOP
+};
+
+struct unop {
+ BASEOP
+ OP * op_first;
+};
+
+struct binop {
+ BASEOP
+ OP * op_first;
+ OP * op_last;
+};
+
+struct logop {
+ BASEOP
+ OP * op_first;
+ OP * op_other;
+};
+
+struct listop {
+ BASEOP
+ OP * op_first;
+ OP * op_last;
+};
+
+struct pmop {
+ BASEOP
+ OP * op_first;
+ OP * op_last;
+#ifdef USE_ITHREADS
+ IV op_pmoffset;
+#else
+ REGEXP * op_pmregexp; /* compiled expression */
+#endif
+ U32 op_pmflags;
+ union {
+ OP * op_pmreplroot; /* For OP_SUBST */
+#ifdef USE_ITHREADS
+ PADOFFSET op_pmtargetoff; /* For OP_PUSHRE */
+#else
+ GV * op_pmtargetgv;
+#endif
+ } op_pmreplrootu;
+ union {
+ OP * op_pmreplstart; /* Only used in OP_SUBST */
+#ifdef USE_ITHREADS
+ char * op_pmstashpv; /* Only used in OP_MATCH, with PMf_ONCE set */
+#else
+ HV * op_pmstash;
+#endif
+ } op_pmstashstartu;
+};
+
+#ifdef USE_ITHREADS
+#define PM_GETRE(o) (SvTYPE(PL_regex_pad[(o)->op_pmoffset]) == SVt_REGEXP \
+ ? (REGEXP*)(PL_regex_pad[(o)->op_pmoffset]) : NULL)
+/* The assignment is just to enforce type safety (or at least get a warning).
+ */
+/* With first class regexps not via a reference one needs to assign
+ &PL_sv_undef under ithreads. (This would probably work unthreaded, but NULL
+ is cheaper. I guess we could allow NULL, but the check above would get
+ more complex, and we'd have an AV with (SV*)NULL in it, which feels bad */
+/* BEWARE - something that calls this macro passes (r) which has a side
+ effect. */
+#define PM_SETRE(o,r) STMT_START { \
+ REGEXP *const _pm_setre = (r); \
+ assert(_pm_setre); \
+ PL_regex_pad[(o)->op_pmoffset] = MUTABLE_SV(_pm_setre); \
+ } STMT_END
+#else
+#define PM_GETRE(o) ((o)->op_pmregexp)
+#define PM_SETRE(o,r) ((o)->op_pmregexp = (r))
+#endif
+
+
+#define PMf_RETAINT 0x00000040 /* taint $1 etc. if target tainted */
+#define PMf_ONCE 0x00000080 /* match successfully only once per
+ reset, with related flag RXf_USED
+ in re->extflags holding state.
+ This is used only for ?? matches,
+ and only on OP_MATCH and OP_QR */
+
+#define PMf_UNUSED 0x00000100 /* free for use */
+#define PMf_MAYBE_CONST 0x00000200 /* replacement contains variables */
+
+#define PMf_USED 0x00000400 /* PMf_ONCE has matched successfully.
+ Not used under threading. */
+
+#define PMf_CONST 0x00000800 /* subst replacement is constant */
+#define PMf_KEEP 0x00001000 /* keep 1st runtime pattern forever */
+#define PMf_GLOBAL 0x00002000 /* pattern had a g modifier */
+#define PMf_CONTINUE 0x00004000 /* don't reset pos() if //g fails */
+#define PMf_EVAL 0x00008000 /* evaluating replacement as expr */
+
+/* The following flags have exact equivalents in regcomp.h with the prefix RXf_
+ * which are stored in the regexp->extflags member. If you change them here,
+ * you have to change them there, and vice versa.
+ */
+#define PMf_MULTILINE 0x00000001 /* assume multiple lines */
+#define PMf_SINGLELINE 0x00000002 /* assume single line */
+#define PMf_FOLD 0x00000004 /* case insensitivity */
+#define PMf_EXTENDED 0x00000008 /* chuck embedded whitespace */
+#define PMf_KEEPCOPY 0x00000010 /* copy the string when matching */
+#define PMf_LOCALE 0x00000020 /* use locale for character types */
+
+/* mask of bits that need to be transfered to re->extflags */
+#define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED|PMf_KEEPCOPY)
+
+#ifdef USE_ITHREADS
+
+# define PmopSTASHPV(o) \
+ (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstashpv : NULL)
+# if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define PmopSTASHPV_set(o,pv) ({ \
+ assert((o)->op_pmflags & PMf_ONCE); \
+ ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv)); \
+ })
+# else
+# define PmopSTASHPV_set(o,pv) \
+ ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv))
+# endif
+# define PmopSTASH(o) (PmopSTASHPV(o) \
+ ? gv_stashpv((o)->op_pmstashstartu.op_pmstashpv,GV_ADD) : NULL)
+# define PmopSTASH_set(o,hv) PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : NULL))
+# define PmopSTASH_free(o) PerlMemShared_free(PmopSTASHPV(o))
+
+#else
+# define PmopSTASH(o) \
+ (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstash : NULL)
+# if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define PmopSTASH_set(o,hv) ({ \
+ assert((o)->op_pmflags & PMf_ONCE); \
+ ((o)->op_pmstashstartu.op_pmstash = (hv)); \
+ })
+# else
+# define PmopSTASH_set(o,hv) ((o)->op_pmstashstartu.op_pmstash = (hv))
+# endif
+# define PmopSTASHPV(o) (PmopSTASH(o) ? HvNAME_get(PmopSTASH(o)) : NULL)
+ /* op_pmstashstartu.op_pmstash is not refcounted */
+# define PmopSTASHPV_set(o,pv) PmopSTASH_set((o), gv_stashpv(pv,GV_ADD))
+/* Note that if this becomes non-empty, then S_forget_pmop in op.c will need
+ changing */
+# define PmopSTASH_free(o)
+#endif
+
+struct svop {
+ BASEOP
+ SV * op_sv;
+};
+
+struct padop {
+ BASEOP
+ PADOFFSET op_padix;
+};
+
+struct pvop {
+ BASEOP
+ char * op_pv;
+};
+
+struct loop {
+ BASEOP
+ OP * op_first;
+ OP * op_last;
+ OP * op_redoop;
+ OP * op_nextop;
+ OP * op_lastop;
+};
+
+#define cUNOPx(o) ((UNOP*)o)
+#define cBINOPx(o) ((BINOP*)o)
+#define cLISTOPx(o) ((LISTOP*)o)
+#define cLOGOPx(o) ((LOGOP*)o)
+#define cPMOPx(o) ((PMOP*)o)
+#define cSVOPx(o) ((SVOP*)o)
+#define cPADOPx(o) ((PADOP*)o)
+#define cPVOPx(o) ((PVOP*)o)
+#define cCOPx(o) ((COP*)o)
+#define cLOOPx(o) ((LOOP*)o)
+
+#define cUNOP cUNOPx(PL_op)
+#define cBINOP cBINOPx(PL_op)
+#define cLISTOP cLISTOPx(PL_op)
+#define cLOGOP cLOGOPx(PL_op)
+#define cPMOP cPMOPx(PL_op)
+#define cSVOP cSVOPx(PL_op)
+#define cPADOP cPADOPx(PL_op)
+#define cPVOP cPVOPx(PL_op)
+#define cCOP cCOPx(PL_op)
+#define cLOOP cLOOPx(PL_op)
+
+#define cUNOPo cUNOPx(o)
+#define cBINOPo cBINOPx(o)
+#define cLISTOPo cLISTOPx(o)
+#define cLOGOPo cLOGOPx(o)
+#define cPMOPo cPMOPx(o)
+#define cSVOPo cSVOPx(o)
+#define cPADOPo cPADOPx(o)
+#define cPVOPo cPVOPx(o)
+#define cCOPo cCOPx(o)
+#define cLOOPo cLOOPx(o)
+
+#define kUNOP cUNOPx(kid)
+#define kBINOP cBINOPx(kid)
+#define kLISTOP cLISTOPx(kid)
+#define kLOGOP cLOGOPx(kid)
+#define kPMOP cPMOPx(kid)
+#define kSVOP cSVOPx(kid)
+#define kPADOP cPADOPx(kid)
+#define kPVOP cPVOPx(kid)
+#define kCOP cCOPx(kid)
+#define kLOOP cLOOPx(kid)
+
+
+#ifdef USE_ITHREADS
+# define cGVOPx_gv(o) ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
+# define IS_PADGV(v) (v && SvTYPE(v) == SVt_PVGV && isGV_with_GP(v) \
+ && GvIN_PAD(v))
+# define IS_PADCONST(v) (v && SvREADONLY(v))
+# define cSVOPx_sv(v) (cSVOPx(v)->op_sv \
+ ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
+# define cSVOPx_svp(v) (cSVOPx(v)->op_sv \
+ ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ))
+#else
+# define cGVOPx_gv(o) ((GV*)cSVOPx(o)->op_sv)
+# define IS_PADGV(v) FALSE
+# define IS_PADCONST(v) FALSE
+# define cSVOPx_sv(v) (cSVOPx(v)->op_sv)
+# define cSVOPx_svp(v) (&cSVOPx(v)->op_sv)
+#endif
+
+#define cGVOP_gv cGVOPx_gv(PL_op)
+#define cGVOPo_gv cGVOPx_gv(o)
+#define kGVOP_gv cGVOPx_gv(kid)
+#define cSVOP_sv cSVOPx_sv(PL_op)
+#define cSVOPo_sv cSVOPx_sv(o)
+#define kSVOP_sv cSVOPx_sv(kid)
+
+#ifndef PERL_CORE
+# define Nullop ((OP*)NULL)
+#endif
+
+/* Lowest byte-and-a-bit of PL_opargs */
+#define OA_MARK 1
+#define OA_FOLDCONST 2
+#define OA_RETSCALAR 4
+#define OA_TARGET 8
+#define OA_RETINTEGER 16
+#define OA_OTHERINT 32
+#define OA_DANGEROUS 64
+#define OA_DEFGV 128
+#define OA_TARGLEX 256
+
+/* The next 4 bits encode op class information */
+#define OCSHIFT 9
+
+#define OA_CLASS_MASK (15 << OCSHIFT)
+
+#define OA_BASEOP (0 << OCSHIFT)
+#define OA_UNOP (1 << OCSHIFT)
+#define OA_BINOP (2 << OCSHIFT)
+#define OA_LOGOP (3 << OCSHIFT)
+#define OA_LISTOP (4 << OCSHIFT)
+#define OA_PMOP (5 << OCSHIFT)
+#define OA_SVOP (6 << OCSHIFT)
+#define OA_PADOP (7 << OCSHIFT)
+#define OA_PVOP_OR_SVOP (8 << OCSHIFT)
+#define OA_LOOP (9 << OCSHIFT)
+#define OA_COP (10 << OCSHIFT)
+#define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
+#define OA_FILESTATOP (12 << OCSHIFT)
+#define OA_LOOPEXOP (13 << OCSHIFT)
+
+#define OASHIFT 13
+
+/* Remaining nybbles of PL_opargs */
+#define OA_SCALAR 1
+#define OA_LIST 2
+#define OA_AVREF 3
+#define OA_HVREF 4
+#define OA_CVREF 5
+#define OA_FILEREF 6
+#define OA_SCALARREF 7
+#define OA_OPTIONAL 8
+
+/* Op_REFCNT is a reference count at the head of each op tree: needed
+ * since the tree is shared between threads, and between cloned closure
+ * copies in the same thread. OP_REFCNT_LOCK/UNLOCK is used when modifying
+ * this count.
+ * The same mutex is used to protect the refcounts of the reg_trie_data
+ * and reg_ac_data structures, which are shared between duplicated
+ * regexes.
+ */
+
+#ifdef USE_ITHREADS
+# define OP_REFCNT_INIT MUTEX_INIT(&PL_op_mutex)
+# ifdef PERL_CORE
+# define OP_REFCNT_LOCK MUTEX_LOCK(&PL_op_mutex)
+# define OP_REFCNT_UNLOCK MUTEX_UNLOCK(&PL_op_mutex)
+# else
+# define OP_REFCNT_LOCK op_refcnt_lock()
+# define OP_REFCNT_UNLOCK op_refcnt_unlock()
+# endif
+# define OP_REFCNT_TERM MUTEX_DESTROY(&PL_op_mutex)
+#else
+# define OP_REFCNT_INIT NOOP
+# define OP_REFCNT_LOCK NOOP
+# define OP_REFCNT_UNLOCK NOOP
+# define OP_REFCNT_TERM NOOP
+#endif
+
+#define OpREFCNT_set(o,n) ((o)->op_targ = (n))
+#ifdef PERL_DEBUG_READONLY_OPS
+# define OpREFCNT_inc(o) Perl_op_refcnt_inc(aTHX_ o)
+# define OpREFCNT_dec(o) Perl_op_refcnt_dec(aTHX_ o)
+#else
+# define OpREFCNT_inc(o) ((o) ? (++(o)->op_targ, (o)) : NULL)
+# define OpREFCNT_dec(o) (--(o)->op_targ)
+#endif
+
+/* flags used by Perl_load_module() */
+#define PERL_LOADMOD_DENY 0x1 /* no Module */
+#define PERL_LOADMOD_NOIMPORT 0x2 /* use Module () */
+#define PERL_LOADMOD_IMPORT_OPS 0x4 /* use Module (...) */
+
+#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C)
+#define ref(o, type) doref(o, type, TRUE)
+#endif
+
+/* no longer used anywhere in core */
+#ifndef PERL_CORE
+#define cv_ckproto(cv, gv, p) \
+ cv_ckproto_len((cv), (gv), (p), (p) ? strlen(p) : 0)
+#endif
+
+#ifdef PERL_CORE
+# define my(o) my_attrs((o), NULL)
+#endif
+
+#ifdef USE_REENTRANT_API
+#include "reentr.h"
+#endif
+
+#if defined(PL_OP_SLAB_ALLOC)
+#define NewOp(m,var,c,type) \
+ (var = (type *) Perl_Slab_Alloc(aTHX_ c*sizeof(type)))
+#define NewOpSz(m,var,size) \
+ (var = (OP *) Perl_Slab_Alloc(aTHX_ size))
+#define FreeOp(p) Perl_Slab_Free(aTHX_ p)
+#else
+#define NewOp(m, var, c, type) \
+ (var = (MEM_WRAP_CHECK_(c,type) \
+ (type*)PerlMemShared_calloc(c, sizeof(type))))
+#define NewOpSz(m, var, size) \
+ (var = (OP*)PerlMemShared_calloc(1, size))
+#define FreeOp(p) PerlMemShared_free(p)
+#endif
+
+#ifdef PERL_MAD
+# define MAD_NULL 1
+# define MAD_PV 2
+# define MAD_OP 3
+# define MAD_SV 4
+
+struct madprop {
+ MADPROP* mad_next;
+ void *mad_val;
+ U32 mad_vlen;
+/* short mad_count; */
+ char mad_key;
+ char mad_type;
+};
+
+struct token {
+ I32 tk_type;
+ YYSTYPE tk_lval;
+ MADPROP* tk_mad;
+};
+#endif
+
+/*
+ * Values that can be held by mad_key :
+ * ^ unfilled head spot
+ * , literal ,
+ * ; literal ; (blank if implicit ; at end of block)
+ * : literal : from ?: or attr list
+ * + unary +
+ * ? literal ? from ?:
+ * ( literal (
+ * ) literal )
+ * [ literal [
+ * ] literal ]
+ * { literal {
+ * } literal }
+ * @ literal @ sigil
+ * $ literal $ sigil
+ * * literal * sigil
+ * ! use is source filtered
+ * & & or sub
+ * # whitespace/comment following ; or }
+ * # $# sigil
+ * 1 1st ; from for(;;)
+ * 1 retired protasis
+ * 2 2nd ; from for(;;)
+ * 2 retired apodosis
+ * 3 C-style for list
+ * a sub or var attributes
+ * a non-method arrow operator
+ * A method arrow operator
+ * A use import args
+ * b format block
+ * B retired stub block
+ * C constant conditional op
+ * d declarator
+ * D do block
+ * e unreached "else" (see C)
+ * e expression producing E
+ * E tr/E/R/, /E/
+ * f folded constant op
+ * F peg op for format
+ * g op was forced to be a word
+ * i if/unless modifier
+ * I if/elsif/unless statement
+ * k local declarator
+ * K retired kid op
+ * l last index of array ($#foo)
+ * L label
+ * m modifier on regex
+ * n sub or format name
+ * o current operator/declarator name
+ * o else/continue
+ * O generic optimized op
+ * p peg to hold extra whitespace at statement level
+ * P peg op for package declaration
+ * q opening quote
+ * = quoted material
+ * Q closing quote
+ * Q optimized qw//
+ * r expression producing R
+ * R tr/E/R/ s/E/R/
+ * s sub signature
+ * S use import stub (no import)
+ * S retired sort block
+ * t unreached "then" (see C)
+ * U use import op
+ * v private sv of for loop
+ * V use version
+ * w while/until modifier
+ * W while/for statement
+ * x optimized qw
+ * X random thing
+ * _ whitespace/comments preceding anything else
+ * ~ =~ operator
+ */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/opcode.h b/Master/tlpkg/tlperl/lib/CORE/opcode.h
new file mode 100644
index 00000000000..0849839c7a5
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/opcode.h
@@ -0,0 +1,1931 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * opcode.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2003, 2004, 2005, 2006, 2007 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by opcode.pl from its data. Any changes made here
+ * will be lost!
+ */
+
+#ifndef PERL_GLOBAL_STRUCT_INIT
+
+#define Perl_pp_i_preinc Perl_pp_preinc
+#define Perl_pp_i_predec Perl_pp_predec
+#define Perl_pp_i_postinc Perl_pp_postinc
+#define Perl_pp_i_postdec Perl_pp_postdec
+
+PERL_PPDEF(Perl_unimplemented_op)
+
+START_EXTERN_C
+
+#define OP_NAME(o) ((o)->op_type == OP_CUSTOM ? custom_op_name(o) : \
+ PL_op_name[(o)->op_type])
+#define OP_DESC(o) ((o)->op_type == OP_CUSTOM ? custom_op_desc(o) : \
+ PL_op_desc[(o)->op_type])
+
+#ifndef DOINIT
+EXTCONST char* const PL_op_name[];
+#else
+EXTCONST char* const PL_op_name[] = {
+ "null",
+ "stub",
+ "scalar",
+ "pushmark",
+ "wantarray",
+ "const",
+ "gvsv",
+ "gv",
+ "gelem",
+ "padsv",
+ "padav",
+ "padhv",
+ "padany",
+ "pushre",
+ "rv2gv",
+ "rv2sv",
+ "av2arylen",
+ "rv2cv",
+ "anoncode",
+ "prototype",
+ "refgen",
+ "srefgen",
+ "ref",
+ "bless",
+ "backtick",
+ "glob",
+ "readline",
+ "rcatline",
+ "regcmaybe",
+ "regcreset",
+ "regcomp",
+ "match",
+ "qr",
+ "subst",
+ "substcont",
+ "trans",
+ "sassign",
+ "aassign",
+ "chop",
+ "schop",
+ "chomp",
+ "schomp",
+ "defined",
+ "undef",
+ "study",
+ "pos",
+ "preinc",
+ "i_preinc",
+ "predec",
+ "i_predec",
+ "postinc",
+ "i_postinc",
+ "postdec",
+ "i_postdec",
+ "pow",
+ "multiply",
+ "i_multiply",
+ "divide",
+ "i_divide",
+ "modulo",
+ "i_modulo",
+ "repeat",
+ "add",
+ "i_add",
+ "subtract",
+ "i_subtract",
+ "concat",
+ "stringify",
+ "left_shift",
+ "right_shift",
+ "lt",
+ "i_lt",
+ "gt",
+ "i_gt",
+ "le",
+ "i_le",
+ "ge",
+ "i_ge",
+ "eq",
+ "i_eq",
+ "ne",
+ "i_ne",
+ "ncmp",
+ "i_ncmp",
+ "slt",
+ "sgt",
+ "sle",
+ "sge",
+ "seq",
+ "sne",
+ "scmp",
+ "bit_and",
+ "bit_xor",
+ "bit_or",
+ "negate",
+ "i_negate",
+ "not",
+ "complement",
+ "smartmatch",
+ "atan2",
+ "sin",
+ "cos",
+ "rand",
+ "srand",
+ "exp",
+ "log",
+ "sqrt",
+ "int",
+ "hex",
+ "oct",
+ "abs",
+ "length",
+ "substr",
+ "vec",
+ "index",
+ "rindex",
+ "sprintf",
+ "formline",
+ "ord",
+ "chr",
+ "crypt",
+ "ucfirst",
+ "lcfirst",
+ "uc",
+ "lc",
+ "quotemeta",
+ "rv2av",
+ "aelemfast",
+ "aelem",
+ "aslice",
+ "aeach",
+ "akeys",
+ "avalues",
+ "each",
+ "values",
+ "keys",
+ "delete",
+ "exists",
+ "rv2hv",
+ "helem",
+ "hslice",
+ "boolkeys",
+ "unpack",
+ "pack",
+ "split",
+ "join",
+ "list",
+ "lslice",
+ "anonlist",
+ "anonhash",
+ "splice",
+ "push",
+ "pop",
+ "shift",
+ "unshift",
+ "sort",
+ "reverse",
+ "grepstart",
+ "grepwhile",
+ "mapstart",
+ "mapwhile",
+ "range",
+ "flip",
+ "flop",
+ "and",
+ "or",
+ "xor",
+ "dor",
+ "cond_expr",
+ "andassign",
+ "orassign",
+ "dorassign",
+ "method",
+ "entersub",
+ "leavesub",
+ "leavesublv",
+ "caller",
+ "warn",
+ "die",
+ "reset",
+ "lineseq",
+ "nextstate",
+ "dbstate",
+ "unstack",
+ "enter",
+ "leave",
+ "scope",
+ "enteriter",
+ "iter",
+ "enterloop",
+ "leaveloop",
+ "return",
+ "last",
+ "next",
+ "redo",
+ "dump",
+ "goto",
+ "exit",
+ "method_named",
+ "entergiven",
+ "leavegiven",
+ "enterwhen",
+ "leavewhen",
+ "break",
+ "continue",
+ "open",
+ "close",
+ "pipe_op",
+ "fileno",
+ "umask",
+ "binmode",
+ "tie",
+ "untie",
+ "tied",
+ "dbmopen",
+ "dbmclose",
+ "sselect",
+ "select",
+ "getc",
+ "read",
+ "enterwrite",
+ "leavewrite",
+ "prtf",
+ "print",
+ "say",
+ "sysopen",
+ "sysseek",
+ "sysread",
+ "syswrite",
+ "eof",
+ "tell",
+ "seek",
+ "truncate",
+ "fcntl",
+ "ioctl",
+ "flock",
+ "send",
+ "recv",
+ "socket",
+ "sockpair",
+ "bind",
+ "connect",
+ "listen",
+ "accept",
+ "shutdown",
+ "gsockopt",
+ "ssockopt",
+ "getsockname",
+ "getpeername",
+ "lstat",
+ "stat",
+ "ftrread",
+ "ftrwrite",
+ "ftrexec",
+ "fteread",
+ "ftewrite",
+ "fteexec",
+ "ftis",
+ "ftsize",
+ "ftmtime",
+ "ftatime",
+ "ftctime",
+ "ftrowned",
+ "fteowned",
+ "ftzero",
+ "ftsock",
+ "ftchr",
+ "ftblk",
+ "ftfile",
+ "ftdir",
+ "ftpipe",
+ "ftsuid",
+ "ftsgid",
+ "ftsvtx",
+ "ftlink",
+ "fttty",
+ "fttext",
+ "ftbinary",
+ "chdir",
+ "chown",
+ "chroot",
+ "unlink",
+ "chmod",
+ "utime",
+ "rename",
+ "link",
+ "symlink",
+ "readlink",
+ "mkdir",
+ "rmdir",
+ "open_dir",
+ "readdir",
+ "telldir",
+ "seekdir",
+ "rewinddir",
+ "closedir",
+ "fork",
+ "wait",
+ "waitpid",
+ "system",
+ "exec",
+ "kill",
+ "getppid",
+ "getpgrp",
+ "setpgrp",
+ "getpriority",
+ "setpriority",
+ "time",
+ "tms",
+ "localtime",
+ "gmtime",
+ "alarm",
+ "sleep",
+ "shmget",
+ "shmctl",
+ "shmread",
+ "shmwrite",
+ "msgget",
+ "msgctl",
+ "msgsnd",
+ "msgrcv",
+ "semop",
+ "semget",
+ "semctl",
+ "require",
+ "dofile",
+ "hintseval",
+ "entereval",
+ "leaveeval",
+ "entertry",
+ "leavetry",
+ "ghbyname",
+ "ghbyaddr",
+ "ghostent",
+ "gnbyname",
+ "gnbyaddr",
+ "gnetent",
+ "gpbyname",
+ "gpbynumber",
+ "gprotoent",
+ "gsbyname",
+ "gsbyport",
+ "gservent",
+ "shostent",
+ "snetent",
+ "sprotoent",
+ "sservent",
+ "ehostent",
+ "enetent",
+ "eprotoent",
+ "eservent",
+ "gpwnam",
+ "gpwuid",
+ "gpwent",
+ "spwent",
+ "epwent",
+ "ggrnam",
+ "ggrgid",
+ "ggrent",
+ "sgrent",
+ "egrent",
+ "getlogin",
+ "syscall",
+ "lock",
+ "once",
+ "custom",
+};
+#endif
+
+#ifndef DOINIT
+EXTCONST char* const PL_op_desc[];
+#else
+EXTCONST char* const PL_op_desc[] = {
+ "null operation",
+ "stub",
+ "scalar",
+ "pushmark",
+ "wantarray",
+ "constant item",
+ "scalar variable",
+ "glob value",
+ "glob elem",
+ "private variable",
+ "private array",
+ "private hash",
+ "private value",
+ "push regexp",
+ "ref-to-glob cast",
+ "scalar dereference",
+ "array length",
+ "subroutine dereference",
+ "anonymous subroutine",
+ "subroutine prototype",
+ "reference constructor",
+ "single ref constructor",
+ "reference-type operator",
+ "bless",
+ "quoted execution (``, qx)",
+ "glob",
+ "<HANDLE>",
+ "append I/O operator",
+ "regexp internal guard",
+ "regexp internal reset",
+ "regexp compilation",
+ "pattern match (m//)",
+ "pattern quote (qr//)",
+ "substitution (s///)",
+ "substitution iterator",
+ "transliteration (tr///)",
+ "scalar assignment",
+ "list assignment",
+ "chop",
+ "scalar chop",
+ "chomp",
+ "scalar chomp",
+ "defined operator",
+ "undef operator",
+ "study",
+ "match position",
+ "preincrement (++)",
+ "integer preincrement (++)",
+ "predecrement (--)",
+ "integer predecrement (--)",
+ "postincrement (++)",
+ "integer postincrement (++)",
+ "postdecrement (--)",
+ "integer postdecrement (--)",
+ "exponentiation (**)",
+ "multiplication (*)",
+ "integer multiplication (*)",
+ "division (/)",
+ "integer division (/)",
+ "modulus (%)",
+ "integer modulus (%)",
+ "repeat (x)",
+ "addition (+)",
+ "integer addition (+)",
+ "subtraction (-)",
+ "integer subtraction (-)",
+ "concatenation (.) or string",
+ "string",
+ "left bitshift (<<)",
+ "right bitshift (>>)",
+ "numeric lt (<)",
+ "integer lt (<)",
+ "numeric gt (>)",
+ "integer gt (>)",
+ "numeric le (<=)",
+ "integer le (<=)",
+ "numeric ge (>=)",
+ "integer ge (>=)",
+ "numeric eq (==)",
+ "integer eq (==)",
+ "numeric ne (!=)",
+ "integer ne (!=)",
+ "numeric comparison (<=>)",
+ "integer comparison (<=>)",
+ "string lt",
+ "string gt",
+ "string le",
+ "string ge",
+ "string eq",
+ "string ne",
+ "string comparison (cmp)",
+ "bitwise and (&)",
+ "bitwise xor (^)",
+ "bitwise or (|)",
+ "negation (-)",
+ "integer negation (-)",
+ "not",
+ "1's complement (~)",
+ "smart match",
+ "atan2",
+ "sin",
+ "cos",
+ "rand",
+ "srand",
+ "exp",
+ "log",
+ "sqrt",
+ "int",
+ "hex",
+ "oct",
+ "abs",
+ "length",
+ "substr",
+ "vec",
+ "index",
+ "rindex",
+ "sprintf",
+ "formline",
+ "ord",
+ "chr",
+ "crypt",
+ "ucfirst",
+ "lcfirst",
+ "uc",
+ "lc",
+ "quotemeta",
+ "array dereference",
+ "constant array element",
+ "array element",
+ "array slice",
+ "each on array",
+ "keys on array",
+ "values on array",
+ "each",
+ "values",
+ "keys",
+ "delete",
+ "exists",
+ "hash dereference",
+ "hash element",
+ "hash slice",
+ "boolkeys",
+ "unpack",
+ "pack",
+ "split",
+ "join or string",
+ "list",
+ "list slice",
+ "anonymous list ([])",
+ "anonymous hash ({})",
+ "splice",
+ "push",
+ "pop",
+ "shift",
+ "unshift",
+ "sort",
+ "reverse",
+ "grep",
+ "grep iterator",
+ "map",
+ "map iterator",
+ "flipflop",
+ "range (or flip)",
+ "range (or flop)",
+ "logical and (&&)",
+ "logical or (||)",
+ "logical xor",
+ "defined or (//)",
+ "conditional expression",
+ "logical and assignment (&&=)",
+ "logical or assignment (||=)",
+ "defined or assignment (//=)",
+ "method lookup",
+ "subroutine entry",
+ "subroutine exit",
+ "lvalue subroutine return",
+ "caller",
+ "warn",
+ "die",
+ "symbol reset",
+ "line sequence",
+ "next statement",
+ "debug next statement",
+ "iteration finalizer",
+ "block entry",
+ "block exit",
+ "block",
+ "foreach loop entry",
+ "foreach loop iterator",
+ "loop entry",
+ "loop exit",
+ "return",
+ "last",
+ "next",
+ "redo",
+ "dump",
+ "goto",
+ "exit",
+ "method with known name",
+ "given()",
+ "leave given block",
+ "when()",
+ "leave when block",
+ "break",
+ "continue",
+ "open",
+ "close",
+ "pipe",
+ "fileno",
+ "umask",
+ "binmode",
+ "tie",
+ "untie",
+ "tied",
+ "dbmopen",
+ "dbmclose",
+ "select system call",
+ "select",
+ "getc",
+ "read",
+ "write",
+ "write exit",
+ "printf",
+ "print",
+ "say",
+ "sysopen",
+ "sysseek",
+ "sysread",
+ "syswrite",
+ "eof",
+ "tell",
+ "seek",
+ "truncate",
+ "fcntl",
+ "ioctl",
+ "flock",
+ "send",
+ "recv",
+ "socket",
+ "socketpair",
+ "bind",
+ "connect",
+ "listen",
+ "accept",
+ "shutdown",
+ "getsockopt",
+ "setsockopt",
+ "getsockname",
+ "getpeername",
+ "lstat",
+ "stat",
+ "-R",
+ "-W",
+ "-X",
+ "-r",
+ "-w",
+ "-x",
+ "-e",
+ "-s",
+ "-M",
+ "-A",
+ "-C",
+ "-O",
+ "-o",
+ "-z",
+ "-S",
+ "-c",
+ "-b",
+ "-f",
+ "-d",
+ "-p",
+ "-u",
+ "-g",
+ "-k",
+ "-l",
+ "-t",
+ "-T",
+ "-B",
+ "chdir",
+ "chown",
+ "chroot",
+ "unlink",
+ "chmod",
+ "utime",
+ "rename",
+ "link",
+ "symlink",
+ "readlink",
+ "mkdir",
+ "rmdir",
+ "opendir",
+ "readdir",
+ "telldir",
+ "seekdir",
+ "rewinddir",
+ "closedir",
+ "fork",
+ "wait",
+ "waitpid",
+ "system",
+ "exec",
+ "kill",
+ "getppid",
+ "getpgrp",
+ "setpgrp",
+ "getpriority",
+ "setpriority",
+ "time",
+ "times",
+ "localtime",
+ "gmtime",
+ "alarm",
+ "sleep",
+ "shmget",
+ "shmctl",
+ "shmread",
+ "shmwrite",
+ "msgget",
+ "msgctl",
+ "msgsnd",
+ "msgrcv",
+ "semop",
+ "semget",
+ "semctl",
+ "require",
+ "do \"file\"",
+ "eval hints",
+ "eval \"string\"",
+ "eval \"string\" exit",
+ "eval {block}",
+ "eval {block} exit",
+ "gethostbyname",
+ "gethostbyaddr",
+ "gethostent",
+ "getnetbyname",
+ "getnetbyaddr",
+ "getnetent",
+ "getprotobyname",
+ "getprotobynumber",
+ "getprotoent",
+ "getservbyname",
+ "getservbyport",
+ "getservent",
+ "sethostent",
+ "setnetent",
+ "setprotoent",
+ "setservent",
+ "endhostent",
+ "endnetent",
+ "endprotoent",
+ "endservent",
+ "getpwnam",
+ "getpwuid",
+ "getpwent",
+ "setpwent",
+ "endpwent",
+ "getgrnam",
+ "getgrgid",
+ "getgrent",
+ "setgrent",
+ "endgrent",
+ "getlogin",
+ "syscall",
+ "lock",
+ "once",
+ "unknown custom operator",
+};
+#endif
+
+END_EXTERN_C
+
+#endif /* !PERL_GLOBAL_STRUCT_INIT */
+
+START_EXTERN_C
+
+#ifdef PERL_GLOBAL_STRUCT_INIT
+# define PERL_PPADDR_INITED
+static const Perl_ppaddr_t Gppaddr[]
+#else
+# ifndef PERL_GLOBAL_STRUCT
+# define PERL_PPADDR_INITED
+EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
+# endif
+#endif /* PERL_GLOBAL_STRUCT */
+#if (defined(DOINIT) && !defined(PERL_GLOBAL_STRUCT)) || defined(PERL_GLOBAL_STRUCT_INIT)
+# define PERL_PPADDR_INITED
+= {
+ MEMBER_TO_FPTR(Perl_pp_null),
+ MEMBER_TO_FPTR(Perl_pp_stub),
+ MEMBER_TO_FPTR(Perl_pp_null), /* Perl_pp_scalar */
+ MEMBER_TO_FPTR(Perl_pp_pushmark),
+ MEMBER_TO_FPTR(Perl_pp_wantarray),
+ MEMBER_TO_FPTR(Perl_pp_const),
+ MEMBER_TO_FPTR(Perl_pp_gvsv),
+ MEMBER_TO_FPTR(Perl_pp_gv),
+ MEMBER_TO_FPTR(Perl_pp_gelem),
+ MEMBER_TO_FPTR(Perl_pp_padsv),
+ MEMBER_TO_FPTR(Perl_pp_padav),
+ MEMBER_TO_FPTR(Perl_pp_padhv),
+ MEMBER_TO_FPTR(Perl_unimplemented_op), /* Perl_pp_padany */
+ MEMBER_TO_FPTR(Perl_pp_pushre),
+ MEMBER_TO_FPTR(Perl_pp_rv2gv),
+ MEMBER_TO_FPTR(Perl_pp_rv2sv),
+ MEMBER_TO_FPTR(Perl_pp_av2arylen),
+ MEMBER_TO_FPTR(Perl_pp_rv2cv),
+ MEMBER_TO_FPTR(Perl_pp_anoncode),
+ MEMBER_TO_FPTR(Perl_pp_prototype),
+ MEMBER_TO_FPTR(Perl_pp_refgen),
+ MEMBER_TO_FPTR(Perl_pp_srefgen),
+ MEMBER_TO_FPTR(Perl_pp_ref),
+ MEMBER_TO_FPTR(Perl_pp_bless),
+ MEMBER_TO_FPTR(Perl_pp_backtick),
+ MEMBER_TO_FPTR(Perl_pp_glob),
+ MEMBER_TO_FPTR(Perl_pp_readline),
+ MEMBER_TO_FPTR(Perl_pp_rcatline),
+ MEMBER_TO_FPTR(Perl_pp_null), /* Perl_pp_regcmaybe */
+ MEMBER_TO_FPTR(Perl_pp_regcreset),
+ MEMBER_TO_FPTR(Perl_pp_regcomp),
+ MEMBER_TO_FPTR(Perl_pp_match),
+ MEMBER_TO_FPTR(Perl_pp_qr),
+ MEMBER_TO_FPTR(Perl_pp_subst),
+ MEMBER_TO_FPTR(Perl_pp_substcont),
+ MEMBER_TO_FPTR(Perl_pp_trans),
+ MEMBER_TO_FPTR(Perl_pp_sassign),
+ MEMBER_TO_FPTR(Perl_pp_aassign),
+ MEMBER_TO_FPTR(Perl_pp_chop),
+ MEMBER_TO_FPTR(Perl_pp_schop),
+ MEMBER_TO_FPTR(Perl_pp_chomp),
+ MEMBER_TO_FPTR(Perl_pp_schomp),
+ MEMBER_TO_FPTR(Perl_pp_defined),
+ MEMBER_TO_FPTR(Perl_pp_undef),
+ MEMBER_TO_FPTR(Perl_pp_study),
+ MEMBER_TO_FPTR(Perl_pp_pos),
+ MEMBER_TO_FPTR(Perl_pp_preinc),
+ MEMBER_TO_FPTR(Perl_pp_i_preinc),
+ MEMBER_TO_FPTR(Perl_pp_predec),
+ MEMBER_TO_FPTR(Perl_pp_i_predec),
+ MEMBER_TO_FPTR(Perl_pp_postinc),
+ MEMBER_TO_FPTR(Perl_pp_i_postinc),
+ MEMBER_TO_FPTR(Perl_pp_postdec),
+ MEMBER_TO_FPTR(Perl_pp_i_postdec),
+ MEMBER_TO_FPTR(Perl_pp_pow),
+ MEMBER_TO_FPTR(Perl_pp_multiply),
+ MEMBER_TO_FPTR(Perl_pp_i_multiply),
+ MEMBER_TO_FPTR(Perl_pp_divide),
+ MEMBER_TO_FPTR(Perl_pp_i_divide),
+ MEMBER_TO_FPTR(Perl_pp_modulo),
+ MEMBER_TO_FPTR(Perl_pp_i_modulo),
+ MEMBER_TO_FPTR(Perl_pp_repeat),
+ MEMBER_TO_FPTR(Perl_pp_add),
+ MEMBER_TO_FPTR(Perl_pp_i_add),
+ MEMBER_TO_FPTR(Perl_pp_subtract),
+ MEMBER_TO_FPTR(Perl_pp_i_subtract),
+ MEMBER_TO_FPTR(Perl_pp_concat),
+ MEMBER_TO_FPTR(Perl_pp_stringify),
+ MEMBER_TO_FPTR(Perl_pp_left_shift),
+ MEMBER_TO_FPTR(Perl_pp_right_shift),
+ MEMBER_TO_FPTR(Perl_pp_lt),
+ MEMBER_TO_FPTR(Perl_pp_i_lt),
+ MEMBER_TO_FPTR(Perl_pp_gt),
+ MEMBER_TO_FPTR(Perl_pp_i_gt),
+ MEMBER_TO_FPTR(Perl_pp_le),
+ MEMBER_TO_FPTR(Perl_pp_i_le),
+ MEMBER_TO_FPTR(Perl_pp_ge),
+ MEMBER_TO_FPTR(Perl_pp_i_ge),
+ MEMBER_TO_FPTR(Perl_pp_eq),
+ MEMBER_TO_FPTR(Perl_pp_i_eq),
+ MEMBER_TO_FPTR(Perl_pp_ne),
+ MEMBER_TO_FPTR(Perl_pp_i_ne),
+ MEMBER_TO_FPTR(Perl_pp_ncmp),
+ MEMBER_TO_FPTR(Perl_pp_i_ncmp),
+ MEMBER_TO_FPTR(Perl_pp_sle), /* Perl_pp_slt */
+ MEMBER_TO_FPTR(Perl_pp_sle), /* Perl_pp_sgt */
+ MEMBER_TO_FPTR(Perl_pp_sle),
+ MEMBER_TO_FPTR(Perl_pp_sle), /* Perl_pp_sge */
+ MEMBER_TO_FPTR(Perl_pp_seq),
+ MEMBER_TO_FPTR(Perl_pp_sne),
+ MEMBER_TO_FPTR(Perl_pp_scmp),
+ MEMBER_TO_FPTR(Perl_pp_bit_and),
+ MEMBER_TO_FPTR(Perl_pp_bit_or), /* Perl_pp_bit_xor */
+ MEMBER_TO_FPTR(Perl_pp_bit_or),
+ MEMBER_TO_FPTR(Perl_pp_negate),
+ MEMBER_TO_FPTR(Perl_pp_i_negate),
+ MEMBER_TO_FPTR(Perl_pp_not),
+ MEMBER_TO_FPTR(Perl_pp_complement),
+ MEMBER_TO_FPTR(Perl_pp_smartmatch),
+ MEMBER_TO_FPTR(Perl_pp_atan2),
+ MEMBER_TO_FPTR(Perl_pp_sin),
+ MEMBER_TO_FPTR(Perl_pp_sin), /* Perl_pp_cos */
+ MEMBER_TO_FPTR(Perl_pp_rand),
+ MEMBER_TO_FPTR(Perl_pp_srand),
+ MEMBER_TO_FPTR(Perl_pp_sin), /* Perl_pp_exp */
+ MEMBER_TO_FPTR(Perl_pp_sin), /* Perl_pp_log */
+ MEMBER_TO_FPTR(Perl_pp_sin), /* Perl_pp_sqrt */
+ MEMBER_TO_FPTR(Perl_pp_int),
+ MEMBER_TO_FPTR(Perl_pp_oct), /* Perl_pp_hex */
+ MEMBER_TO_FPTR(Perl_pp_oct),
+ MEMBER_TO_FPTR(Perl_pp_abs),
+ MEMBER_TO_FPTR(Perl_pp_length),
+ MEMBER_TO_FPTR(Perl_pp_substr),
+ MEMBER_TO_FPTR(Perl_pp_vec),
+ MEMBER_TO_FPTR(Perl_pp_index),
+ MEMBER_TO_FPTR(Perl_pp_index), /* Perl_pp_rindex */
+ MEMBER_TO_FPTR(Perl_pp_sprintf),
+ MEMBER_TO_FPTR(Perl_pp_formline),
+ MEMBER_TO_FPTR(Perl_pp_ord),
+ MEMBER_TO_FPTR(Perl_pp_chr),
+ MEMBER_TO_FPTR(Perl_pp_crypt),
+ MEMBER_TO_FPTR(Perl_pp_ucfirst),
+ MEMBER_TO_FPTR(Perl_pp_ucfirst), /* Perl_pp_lcfirst */
+ MEMBER_TO_FPTR(Perl_pp_uc),
+ MEMBER_TO_FPTR(Perl_pp_lc),
+ MEMBER_TO_FPTR(Perl_pp_quotemeta),
+ MEMBER_TO_FPTR(Perl_pp_rv2av),
+ MEMBER_TO_FPTR(Perl_pp_aelemfast),
+ MEMBER_TO_FPTR(Perl_pp_aelem),
+ MEMBER_TO_FPTR(Perl_pp_aslice),
+ MEMBER_TO_FPTR(Perl_pp_aeach),
+ MEMBER_TO_FPTR(Perl_pp_akeys),
+ MEMBER_TO_FPTR(Perl_pp_akeys), /* Perl_pp_avalues */
+ MEMBER_TO_FPTR(Perl_pp_each),
+ MEMBER_TO_FPTR(Perl_do_kv), /* Perl_pp_values */
+ MEMBER_TO_FPTR(Perl_do_kv), /* Perl_pp_keys */
+ MEMBER_TO_FPTR(Perl_pp_delete),
+ MEMBER_TO_FPTR(Perl_pp_exists),
+ MEMBER_TO_FPTR(Perl_pp_rv2av), /* Perl_pp_rv2hv */
+ MEMBER_TO_FPTR(Perl_pp_helem),
+ MEMBER_TO_FPTR(Perl_pp_hslice),
+ MEMBER_TO_FPTR(Perl_pp_boolkeys),
+ MEMBER_TO_FPTR(Perl_pp_unpack),
+ MEMBER_TO_FPTR(Perl_pp_pack),
+ MEMBER_TO_FPTR(Perl_pp_split),
+ MEMBER_TO_FPTR(Perl_pp_join),
+ MEMBER_TO_FPTR(Perl_pp_list),
+ MEMBER_TO_FPTR(Perl_pp_lslice),
+ MEMBER_TO_FPTR(Perl_pp_anonlist),
+ MEMBER_TO_FPTR(Perl_pp_anonhash),
+ MEMBER_TO_FPTR(Perl_pp_splice),
+ MEMBER_TO_FPTR(Perl_pp_push),
+ MEMBER_TO_FPTR(Perl_pp_shift), /* Perl_pp_pop */
+ MEMBER_TO_FPTR(Perl_pp_shift),
+ MEMBER_TO_FPTR(Perl_pp_unshift),
+ MEMBER_TO_FPTR(Perl_pp_sort),
+ MEMBER_TO_FPTR(Perl_pp_reverse),
+ MEMBER_TO_FPTR(Perl_pp_grepstart),
+ MEMBER_TO_FPTR(Perl_pp_grepwhile),
+ MEMBER_TO_FPTR(Perl_unimplemented_op), /* Perl_pp_mapstart */
+ MEMBER_TO_FPTR(Perl_pp_mapwhile),
+ MEMBER_TO_FPTR(Perl_pp_range),
+ MEMBER_TO_FPTR(Perl_pp_flip),
+ MEMBER_TO_FPTR(Perl_pp_flop),
+ MEMBER_TO_FPTR(Perl_pp_and),
+ MEMBER_TO_FPTR(Perl_pp_or),
+ MEMBER_TO_FPTR(Perl_pp_xor),
+ MEMBER_TO_FPTR(Perl_pp_defined), /* Perl_pp_dor */
+ MEMBER_TO_FPTR(Perl_pp_cond_expr),
+ MEMBER_TO_FPTR(Perl_pp_and), /* Perl_pp_andassign */
+ MEMBER_TO_FPTR(Perl_pp_or), /* Perl_pp_orassign */
+ MEMBER_TO_FPTR(Perl_pp_defined), /* Perl_pp_dorassign */
+ MEMBER_TO_FPTR(Perl_pp_method),
+ MEMBER_TO_FPTR(Perl_pp_entersub),
+ MEMBER_TO_FPTR(Perl_pp_leavesub),
+ MEMBER_TO_FPTR(Perl_pp_leavesublv),
+ MEMBER_TO_FPTR(Perl_pp_caller),
+ MEMBER_TO_FPTR(Perl_pp_warn),
+ MEMBER_TO_FPTR(Perl_pp_die),
+ MEMBER_TO_FPTR(Perl_pp_reset),
+ MEMBER_TO_FPTR(Perl_pp_null), /* Perl_pp_lineseq */
+ MEMBER_TO_FPTR(Perl_pp_nextstate),
+ MEMBER_TO_FPTR(Perl_pp_dbstate),
+ MEMBER_TO_FPTR(Perl_pp_unstack),
+ MEMBER_TO_FPTR(Perl_pp_enter),
+ MEMBER_TO_FPTR(Perl_pp_leave),
+ MEMBER_TO_FPTR(Perl_pp_null), /* Perl_pp_scope */
+ MEMBER_TO_FPTR(Perl_pp_enteriter),
+ MEMBER_TO_FPTR(Perl_pp_iter),
+ MEMBER_TO_FPTR(Perl_pp_enterloop),
+ MEMBER_TO_FPTR(Perl_pp_leaveloop),
+ MEMBER_TO_FPTR(Perl_pp_return),
+ MEMBER_TO_FPTR(Perl_pp_last),
+ MEMBER_TO_FPTR(Perl_pp_next),
+ MEMBER_TO_FPTR(Perl_pp_redo),
+ MEMBER_TO_FPTR(Perl_pp_goto), /* Perl_pp_dump */
+ MEMBER_TO_FPTR(Perl_pp_goto),
+ MEMBER_TO_FPTR(Perl_pp_exit),
+ MEMBER_TO_FPTR(Perl_pp_method_named),
+ MEMBER_TO_FPTR(Perl_pp_entergiven),
+ MEMBER_TO_FPTR(Perl_pp_leavegiven),
+ MEMBER_TO_FPTR(Perl_pp_enterwhen),
+ MEMBER_TO_FPTR(Perl_pp_leavewhen),
+ MEMBER_TO_FPTR(Perl_pp_break),
+ MEMBER_TO_FPTR(Perl_pp_continue),
+ MEMBER_TO_FPTR(Perl_pp_open),
+ MEMBER_TO_FPTR(Perl_pp_close),
+ MEMBER_TO_FPTR(Perl_pp_pipe_op),
+ MEMBER_TO_FPTR(Perl_pp_fileno),
+ MEMBER_TO_FPTR(Perl_pp_umask),
+ MEMBER_TO_FPTR(Perl_pp_binmode),
+ MEMBER_TO_FPTR(Perl_pp_tie),
+ MEMBER_TO_FPTR(Perl_pp_untie),
+ MEMBER_TO_FPTR(Perl_pp_tied),
+ MEMBER_TO_FPTR(Perl_pp_dbmopen),
+ MEMBER_TO_FPTR(Perl_pp_untie), /* Perl_pp_dbmclose */
+ MEMBER_TO_FPTR(Perl_pp_sselect),
+ MEMBER_TO_FPTR(Perl_pp_select),
+ MEMBER_TO_FPTR(Perl_pp_getc),
+ MEMBER_TO_FPTR(Perl_pp_sysread), /* Perl_pp_read */
+ MEMBER_TO_FPTR(Perl_pp_enterwrite),
+ MEMBER_TO_FPTR(Perl_pp_leavewrite),
+ MEMBER_TO_FPTR(Perl_pp_prtf),
+ MEMBER_TO_FPTR(Perl_pp_print),
+ MEMBER_TO_FPTR(Perl_pp_print), /* Perl_pp_say */
+ MEMBER_TO_FPTR(Perl_pp_sysopen),
+ MEMBER_TO_FPTR(Perl_pp_sysseek),
+ MEMBER_TO_FPTR(Perl_pp_sysread),
+ MEMBER_TO_FPTR(Perl_pp_send), /* Perl_pp_syswrite */
+ MEMBER_TO_FPTR(Perl_pp_eof),
+ MEMBER_TO_FPTR(Perl_pp_tell),
+ MEMBER_TO_FPTR(Perl_pp_sysseek), /* Perl_pp_seek */
+ MEMBER_TO_FPTR(Perl_pp_truncate),
+ MEMBER_TO_FPTR(Perl_pp_ioctl), /* Perl_pp_fcntl */
+ MEMBER_TO_FPTR(Perl_pp_ioctl),
+ MEMBER_TO_FPTR(Perl_pp_flock),
+ MEMBER_TO_FPTR(Perl_pp_send),
+ MEMBER_TO_FPTR(Perl_pp_sysread), /* Perl_pp_recv */
+ MEMBER_TO_FPTR(Perl_pp_socket),
+ MEMBER_TO_FPTR(Perl_pp_sockpair),
+ MEMBER_TO_FPTR(Perl_pp_bind),
+ MEMBER_TO_FPTR(Perl_pp_connect),
+ MEMBER_TO_FPTR(Perl_pp_listen),
+ MEMBER_TO_FPTR(Perl_pp_accept),
+ MEMBER_TO_FPTR(Perl_pp_shutdown),
+ MEMBER_TO_FPTR(Perl_pp_ssockopt), /* Perl_pp_gsockopt */
+ MEMBER_TO_FPTR(Perl_pp_ssockopt),
+ MEMBER_TO_FPTR(Perl_pp_getpeername), /* Perl_pp_getsockname */
+ MEMBER_TO_FPTR(Perl_pp_getpeername),
+ MEMBER_TO_FPTR(Perl_pp_stat), /* Perl_pp_lstat */
+ MEMBER_TO_FPTR(Perl_pp_stat),
+ MEMBER_TO_FPTR(Perl_pp_ftrread),
+ MEMBER_TO_FPTR(Perl_pp_ftrread), /* Perl_pp_ftrwrite */
+ MEMBER_TO_FPTR(Perl_pp_ftrread), /* Perl_pp_ftrexec */
+ MEMBER_TO_FPTR(Perl_pp_ftrread), /* Perl_pp_fteread */
+ MEMBER_TO_FPTR(Perl_pp_ftrread), /* Perl_pp_ftewrite */
+ MEMBER_TO_FPTR(Perl_pp_ftrread), /* Perl_pp_fteexec */
+ MEMBER_TO_FPTR(Perl_pp_ftis),
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftsize */
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftmtime */
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftatime */
+ MEMBER_TO_FPTR(Perl_pp_ftis), /* Perl_pp_ftctime */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned),
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_fteowned */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftzero */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftsock */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftchr */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftblk */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftfile */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftdir */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftpipe */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftsuid */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftsgid */
+ MEMBER_TO_FPTR(Perl_pp_ftrowned), /* Perl_pp_ftsvtx */
+ MEMBER_TO_FPTR(Perl_pp_ftlink),
+ MEMBER_TO_FPTR(Perl_pp_fttty),
+ MEMBER_TO_FPTR(Perl_pp_fttext),
+ MEMBER_TO_FPTR(Perl_pp_fttext), /* Perl_pp_ftbinary */
+ MEMBER_TO_FPTR(Perl_pp_chdir),
+ MEMBER_TO_FPTR(Perl_pp_chown),
+ MEMBER_TO_FPTR(Perl_pp_chroot),
+ MEMBER_TO_FPTR(Perl_pp_chown), /* Perl_pp_unlink */
+ MEMBER_TO_FPTR(Perl_pp_chown), /* Perl_pp_chmod */
+ MEMBER_TO_FPTR(Perl_pp_chown), /* Perl_pp_utime */
+ MEMBER_TO_FPTR(Perl_pp_rename),
+ MEMBER_TO_FPTR(Perl_pp_link),
+ MEMBER_TO_FPTR(Perl_pp_link), /* Perl_pp_symlink */
+ MEMBER_TO_FPTR(Perl_pp_readlink),
+ MEMBER_TO_FPTR(Perl_pp_mkdir),
+ MEMBER_TO_FPTR(Perl_pp_rmdir),
+ MEMBER_TO_FPTR(Perl_pp_open_dir),
+ MEMBER_TO_FPTR(Perl_pp_readdir),
+ MEMBER_TO_FPTR(Perl_pp_telldir),
+ MEMBER_TO_FPTR(Perl_pp_seekdir),
+ MEMBER_TO_FPTR(Perl_pp_rewinddir),
+ MEMBER_TO_FPTR(Perl_pp_closedir),
+ MEMBER_TO_FPTR(Perl_pp_fork),
+ MEMBER_TO_FPTR(Perl_pp_wait),
+ MEMBER_TO_FPTR(Perl_pp_waitpid),
+ MEMBER_TO_FPTR(Perl_pp_system),
+ MEMBER_TO_FPTR(Perl_pp_exec),
+ MEMBER_TO_FPTR(Perl_pp_chown), /* Perl_pp_kill */
+ MEMBER_TO_FPTR(Perl_pp_getppid),
+ MEMBER_TO_FPTR(Perl_pp_getpgrp),
+ MEMBER_TO_FPTR(Perl_pp_setpgrp),
+ MEMBER_TO_FPTR(Perl_pp_getpriority),
+ MEMBER_TO_FPTR(Perl_pp_setpriority),
+ MEMBER_TO_FPTR(Perl_pp_time),
+ MEMBER_TO_FPTR(Perl_pp_tms),
+ MEMBER_TO_FPTR(Perl_pp_gmtime), /* Perl_pp_localtime */
+ MEMBER_TO_FPTR(Perl_pp_gmtime),
+ MEMBER_TO_FPTR(Perl_pp_alarm),
+ MEMBER_TO_FPTR(Perl_pp_sleep),
+ MEMBER_TO_FPTR(Perl_pp_semget), /* Perl_pp_shmget */
+ MEMBER_TO_FPTR(Perl_pp_semctl), /* Perl_pp_shmctl */
+ MEMBER_TO_FPTR(Perl_pp_shmwrite), /* Perl_pp_shmread */
+ MEMBER_TO_FPTR(Perl_pp_shmwrite),
+ MEMBER_TO_FPTR(Perl_pp_semget), /* Perl_pp_msgget */
+ MEMBER_TO_FPTR(Perl_pp_semctl), /* Perl_pp_msgctl */
+ MEMBER_TO_FPTR(Perl_pp_shmwrite), /* Perl_pp_msgsnd */
+ MEMBER_TO_FPTR(Perl_pp_shmwrite), /* Perl_pp_msgrcv */
+ MEMBER_TO_FPTR(Perl_pp_shmwrite), /* Perl_pp_semop */
+ MEMBER_TO_FPTR(Perl_pp_semget),
+ MEMBER_TO_FPTR(Perl_pp_semctl),
+ MEMBER_TO_FPTR(Perl_pp_require),
+ MEMBER_TO_FPTR(Perl_pp_require), /* Perl_pp_dofile */
+ MEMBER_TO_FPTR(Perl_pp_hintseval),
+ MEMBER_TO_FPTR(Perl_pp_entereval),
+ MEMBER_TO_FPTR(Perl_pp_leaveeval),
+ MEMBER_TO_FPTR(Perl_pp_entertry),
+ MEMBER_TO_FPTR(Perl_pp_leavetry),
+ MEMBER_TO_FPTR(Perl_pp_ghostent), /* Perl_pp_ghbyname */
+ MEMBER_TO_FPTR(Perl_pp_ghostent), /* Perl_pp_ghbyaddr */
+ MEMBER_TO_FPTR(Perl_pp_ghostent),
+ MEMBER_TO_FPTR(Perl_pp_gnetent), /* Perl_pp_gnbyname */
+ MEMBER_TO_FPTR(Perl_pp_gnetent), /* Perl_pp_gnbyaddr */
+ MEMBER_TO_FPTR(Perl_pp_gnetent),
+ MEMBER_TO_FPTR(Perl_pp_gprotoent), /* Perl_pp_gpbyname */
+ MEMBER_TO_FPTR(Perl_pp_gprotoent), /* Perl_pp_gpbynumber */
+ MEMBER_TO_FPTR(Perl_pp_gprotoent),
+ MEMBER_TO_FPTR(Perl_pp_gservent), /* Perl_pp_gsbyname */
+ MEMBER_TO_FPTR(Perl_pp_gservent), /* Perl_pp_gsbyport */
+ MEMBER_TO_FPTR(Perl_pp_gservent),
+ MEMBER_TO_FPTR(Perl_pp_shostent),
+ MEMBER_TO_FPTR(Perl_pp_snetent),
+ MEMBER_TO_FPTR(Perl_pp_sprotoent),
+ MEMBER_TO_FPTR(Perl_pp_sservent),
+ MEMBER_TO_FPTR(Perl_pp_ehostent),
+ MEMBER_TO_FPTR(Perl_pp_enetent),
+ MEMBER_TO_FPTR(Perl_pp_eprotoent),
+ MEMBER_TO_FPTR(Perl_pp_eservent),
+ MEMBER_TO_FPTR(Perl_pp_gpwent), /* Perl_pp_gpwnam */
+ MEMBER_TO_FPTR(Perl_pp_gpwent), /* Perl_pp_gpwuid */
+ MEMBER_TO_FPTR(Perl_pp_gpwent),
+ MEMBER_TO_FPTR(Perl_pp_spwent),
+ MEMBER_TO_FPTR(Perl_pp_epwent),
+ MEMBER_TO_FPTR(Perl_pp_ggrent), /* Perl_pp_ggrnam */
+ MEMBER_TO_FPTR(Perl_pp_ggrent), /* Perl_pp_ggrgid */
+ MEMBER_TO_FPTR(Perl_pp_ggrent),
+ MEMBER_TO_FPTR(Perl_pp_sgrent),
+ MEMBER_TO_FPTR(Perl_pp_egrent),
+ MEMBER_TO_FPTR(Perl_pp_getlogin),
+ MEMBER_TO_FPTR(Perl_pp_syscall),
+ MEMBER_TO_FPTR(Perl_pp_lock),
+ MEMBER_TO_FPTR(Perl_pp_once),
+ MEMBER_TO_FPTR(Perl_unimplemented_op), /* Perl_pp_custom */
+}
+#endif
+#ifdef PERL_PPADDR_INITED
+;
+#endif
+
+#ifdef PERL_GLOBAL_STRUCT_INIT
+# define PERL_CHECK_INITED
+static const Perl_check_t Gcheck[]
+#else
+# ifndef PERL_GLOBAL_STRUCT
+# define PERL_CHECK_INITED
+EXT Perl_check_t PL_check[] /* or perlvars.h */
+# endif
+#endif
+#if (defined(DOINIT) && !defined(PERL_GLOBAL_STRUCT)) || defined(PERL_GLOBAL_STRUCT_INIT)
+# define PERL_CHECK_INITED
+= {
+ MEMBER_TO_FPTR(Perl_ck_null), /* null */
+ MEMBER_TO_FPTR(Perl_ck_null), /* stub */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* scalar */
+ MEMBER_TO_FPTR(Perl_ck_null), /* pushmark */
+ MEMBER_TO_FPTR(Perl_ck_null), /* wantarray */
+ MEMBER_TO_FPTR(Perl_ck_svconst), /* const */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gvsv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gelem */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padsv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padav */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padhv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* padany */
+ MEMBER_TO_FPTR(Perl_ck_null), /* pushre */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2gv */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2sv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* av2arylen */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2cv */
+ MEMBER_TO_FPTR(Perl_ck_anoncode), /* anoncode */
+ MEMBER_TO_FPTR(Perl_ck_null), /* prototype */
+ MEMBER_TO_FPTR(Perl_ck_spair), /* refgen */
+ MEMBER_TO_FPTR(Perl_ck_null), /* srefgen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ref */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* bless */
+ MEMBER_TO_FPTR(Perl_ck_open), /* backtick */
+ MEMBER_TO_FPTR(Perl_ck_glob), /* glob */
+ MEMBER_TO_FPTR(Perl_ck_readline), /* readline */
+ MEMBER_TO_FPTR(Perl_ck_null), /* rcatline */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* regcmaybe */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* regcreset */
+ MEMBER_TO_FPTR(Perl_ck_null), /* regcomp */
+ MEMBER_TO_FPTR(Perl_ck_match), /* match */
+ MEMBER_TO_FPTR(Perl_ck_match), /* qr */
+ MEMBER_TO_FPTR(Perl_ck_match), /* subst */
+ MEMBER_TO_FPTR(Perl_ck_null), /* substcont */
+ MEMBER_TO_FPTR(Perl_ck_match), /* trans */
+ MEMBER_TO_FPTR(Perl_ck_sassign), /* sassign */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aassign */
+ MEMBER_TO_FPTR(Perl_ck_spair), /* chop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* schop */
+ MEMBER_TO_FPTR(Perl_ck_spair), /* chomp */
+ MEMBER_TO_FPTR(Perl_ck_null), /* schomp */
+ MEMBER_TO_FPTR(Perl_ck_defined), /* defined */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* undef */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* study */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* pos */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* preinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_preinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* predec */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_predec */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* postinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_postinc */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* postdec */
+ MEMBER_TO_FPTR(Perl_ck_lfun), /* i_postdec */
+ MEMBER_TO_FPTR(Perl_ck_null), /* pow */
+ MEMBER_TO_FPTR(Perl_ck_null), /* multiply */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_multiply */
+ MEMBER_TO_FPTR(Perl_ck_null), /* divide */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_divide */
+ MEMBER_TO_FPTR(Perl_ck_null), /* modulo */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_modulo */
+ MEMBER_TO_FPTR(Perl_ck_repeat), /* repeat */
+ MEMBER_TO_FPTR(Perl_ck_null), /* add */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_add */
+ MEMBER_TO_FPTR(Perl_ck_null), /* subtract */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_subtract */
+ MEMBER_TO_FPTR(Perl_ck_concat), /* concat */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* stringify */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* left_shift */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* right_shift */
+ MEMBER_TO_FPTR(Perl_ck_null), /* lt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_lt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_gt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* le */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_le */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ge */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_ge */
+ MEMBER_TO_FPTR(Perl_ck_null), /* eq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_eq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ne */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_ne */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ncmp */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_ncmp */
+ MEMBER_TO_FPTR(Perl_ck_null), /* slt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sgt */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sle */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sge */
+ MEMBER_TO_FPTR(Perl_ck_null), /* seq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sne */
+ MEMBER_TO_FPTR(Perl_ck_null), /* scmp */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* bit_and */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* bit_xor */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* bit_or */
+ MEMBER_TO_FPTR(Perl_ck_null), /* negate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* i_negate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* not */
+ MEMBER_TO_FPTR(Perl_ck_bitop), /* complement */
+ MEMBER_TO_FPTR(Perl_ck_smartmatch), /* smartmatch */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* atan2 */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sin */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* cos */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rand */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* srand */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* exp */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* log */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sqrt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* int */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* hex */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* oct */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* abs */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* length */
+ MEMBER_TO_FPTR(Perl_ck_substr), /* substr */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* vec */
+ MEMBER_TO_FPTR(Perl_ck_index), /* index */
+ MEMBER_TO_FPTR(Perl_ck_index), /* rindex */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sprintf */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* formline */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ord */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chr */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* crypt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ucfirst */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* lcfirst */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* uc */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* lc */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* quotemeta */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2av */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aelemfast */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aelem */
+ MEMBER_TO_FPTR(Perl_ck_null), /* aslice */
+ MEMBER_TO_FPTR(Perl_ck_each), /* aeach */
+ MEMBER_TO_FPTR(Perl_ck_each), /* akeys */
+ MEMBER_TO_FPTR(Perl_ck_each), /* avalues */
+ MEMBER_TO_FPTR(Perl_ck_each), /* each */
+ MEMBER_TO_FPTR(Perl_ck_each), /* values */
+ MEMBER_TO_FPTR(Perl_ck_each), /* keys */
+ MEMBER_TO_FPTR(Perl_ck_delete), /* delete */
+ MEMBER_TO_FPTR(Perl_ck_exists), /* exists */
+ MEMBER_TO_FPTR(Perl_ck_rvconst), /* rv2hv */
+ MEMBER_TO_FPTR(Perl_ck_null), /* helem */
+ MEMBER_TO_FPTR(Perl_ck_null), /* hslice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* boolkeys */
+ MEMBER_TO_FPTR(Perl_ck_unpack), /* unpack */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* pack */
+ MEMBER_TO_FPTR(Perl_ck_split), /* split */
+ MEMBER_TO_FPTR(Perl_ck_join), /* join */
+ MEMBER_TO_FPTR(Perl_ck_null), /* list */
+ MEMBER_TO_FPTR(Perl_ck_null), /* lslice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* anonlist */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* anonhash */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* splice */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* push */
+ MEMBER_TO_FPTR(Perl_ck_shift), /* pop */
+ MEMBER_TO_FPTR(Perl_ck_shift), /* shift */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* unshift */
+ MEMBER_TO_FPTR(Perl_ck_sort), /* sort */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* reverse */
+ MEMBER_TO_FPTR(Perl_ck_grep), /* grepstart */
+ MEMBER_TO_FPTR(Perl_ck_null), /* grepwhile */
+ MEMBER_TO_FPTR(Perl_ck_grep), /* mapstart */
+ MEMBER_TO_FPTR(Perl_ck_null), /* mapwhile */
+ MEMBER_TO_FPTR(Perl_ck_null), /* range */
+ MEMBER_TO_FPTR(Perl_ck_null), /* flip */
+ MEMBER_TO_FPTR(Perl_ck_null), /* flop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* and */
+ MEMBER_TO_FPTR(Perl_ck_null), /* or */
+ MEMBER_TO_FPTR(Perl_ck_null), /* xor */
+ MEMBER_TO_FPTR(Perl_ck_null), /* dor */
+ MEMBER_TO_FPTR(Perl_ck_null), /* cond_expr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* andassign */
+ MEMBER_TO_FPTR(Perl_ck_null), /* orassign */
+ MEMBER_TO_FPTR(Perl_ck_null), /* dorassign */
+ MEMBER_TO_FPTR(Perl_ck_method), /* method */
+ MEMBER_TO_FPTR(Perl_ck_subr), /* entersub */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavesub */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavesublv */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* caller */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* warn */
+ MEMBER_TO_FPTR(Perl_ck_die), /* die */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* reset */
+ MEMBER_TO_FPTR(Perl_ck_null), /* lineseq */
+ MEMBER_TO_FPTR(Perl_ck_null), /* nextstate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* dbstate */
+ MEMBER_TO_FPTR(Perl_ck_null), /* unstack */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enter */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leave */
+ MEMBER_TO_FPTR(Perl_ck_null), /* scope */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enteriter */
+ MEMBER_TO_FPTR(Perl_ck_null), /* iter */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enterloop */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leaveloop */
+ MEMBER_TO_FPTR(Perl_ck_return), /* return */
+ MEMBER_TO_FPTR(Perl_ck_null), /* last */
+ MEMBER_TO_FPTR(Perl_ck_null), /* next */
+ MEMBER_TO_FPTR(Perl_ck_null), /* redo */
+ MEMBER_TO_FPTR(Perl_ck_null), /* dump */
+ MEMBER_TO_FPTR(Perl_ck_null), /* goto */
+ MEMBER_TO_FPTR(Perl_ck_exit), /* exit */
+ MEMBER_TO_FPTR(Perl_ck_null), /* method_named */
+ MEMBER_TO_FPTR(Perl_ck_null), /* entergiven */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavegiven */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enterwhen */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavewhen */
+ MEMBER_TO_FPTR(Perl_ck_null), /* break */
+ MEMBER_TO_FPTR(Perl_ck_null), /* continue */
+ MEMBER_TO_FPTR(Perl_ck_open), /* open */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* close */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* pipe_op */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* fileno */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* umask */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* binmode */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* tie */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* untie */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* tied */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* dbmopen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* dbmclose */
+ MEMBER_TO_FPTR(Perl_ck_select), /* sselect */
+ MEMBER_TO_FPTR(Perl_ck_select), /* select */
+ MEMBER_TO_FPTR(Perl_ck_eof), /* getc */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* read */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* enterwrite */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavewrite */
+ MEMBER_TO_FPTR(Perl_ck_listiob), /* prtf */
+ MEMBER_TO_FPTR(Perl_ck_listiob), /* print */
+ MEMBER_TO_FPTR(Perl_ck_listiob), /* say */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sysopen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sysseek */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sysread */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* syswrite */
+ MEMBER_TO_FPTR(Perl_ck_eof), /* eof */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* tell */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* seek */
+ MEMBER_TO_FPTR(Perl_ck_trunc), /* truncate */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* fcntl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ioctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* flock */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* send */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* recv */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* socket */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sockpair */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* bind */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* connect */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* listen */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* accept */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shutdown */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gsockopt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ssockopt */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getsockname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getpeername */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* lstat */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* stat */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrread */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrwrite */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrexec */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fteread */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftewrite */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fteexec */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftis */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsize */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftmtime */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftatime */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftctime */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftrowned */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fteowned */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftzero */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsock */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftchr */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftblk */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftfile */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftdir */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftpipe */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsuid */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsgid */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftsvtx */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftlink */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fttty */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* fttext */
+ MEMBER_TO_FPTR(Perl_ck_ftst), /* ftbinary */
+ MEMBER_TO_FPTR(Perl_ck_chdir), /* chdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chown */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chroot */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* unlink */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* chmod */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* utime */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rename */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* link */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* symlink */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* readlink */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* mkdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rmdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* open_dir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* readdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* telldir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* seekdir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* rewinddir */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* closedir */
+ MEMBER_TO_FPTR(Perl_ck_null), /* fork */
+ MEMBER_TO_FPTR(Perl_ck_null), /* wait */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* waitpid */
+ MEMBER_TO_FPTR(Perl_ck_exec), /* system */
+ MEMBER_TO_FPTR(Perl_ck_exec), /* exec */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* kill */
+ MEMBER_TO_FPTR(Perl_ck_null), /* getppid */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getpgrp */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* setpgrp */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* getpriority */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* setpriority */
+ MEMBER_TO_FPTR(Perl_ck_null), /* time */
+ MEMBER_TO_FPTR(Perl_ck_null), /* tms */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* localtime */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gmtime */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* alarm */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sleep */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmget */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmread */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shmwrite */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgget */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgctl */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgsnd */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* msgrcv */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* semop */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* semget */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* semctl */
+ MEMBER_TO_FPTR(Perl_ck_require), /* require */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* dofile */
+ MEMBER_TO_FPTR(Perl_ck_svconst), /* hintseval */
+ MEMBER_TO_FPTR(Perl_ck_eval), /* entereval */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leaveeval */
+ MEMBER_TO_FPTR(Perl_ck_eval), /* entertry */
+ MEMBER_TO_FPTR(Perl_ck_null), /* leavetry */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ghbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ghbyaddr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ghostent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gnbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gnbyaddr */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gnetent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpbynumber */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gprotoent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gsbyname */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gsbyport */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gservent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* shostent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* snetent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sprotoent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* sservent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ehostent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* enetent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* eprotoent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* eservent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpwnam */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* gpwuid */
+ MEMBER_TO_FPTR(Perl_ck_null), /* gpwent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* spwent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* epwent */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ggrnam */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* ggrgid */
+ MEMBER_TO_FPTR(Perl_ck_null), /* ggrent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* sgrent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* egrent */
+ MEMBER_TO_FPTR(Perl_ck_null), /* getlogin */
+ MEMBER_TO_FPTR(Perl_ck_fun), /* syscall */
+ MEMBER_TO_FPTR(Perl_ck_rfun), /* lock */
+ MEMBER_TO_FPTR(Perl_ck_null), /* once */
+ MEMBER_TO_FPTR(Perl_ck_null), /* custom */
+}
+#endif
+#ifdef PERL_CHECK_INITED
+;
+#endif /* #ifdef PERL_CHECK_INITED */
+
+#ifndef PERL_GLOBAL_STRUCT_INIT
+
+#ifndef DOINIT
+EXTCONST U32 PL_opargs[];
+#else
+EXTCONST U32 PL_opargs[] = {
+ 0x00000000, /* null */
+ 0x00000000, /* stub */
+ 0x00003604, /* scalar */
+ 0x00000004, /* pushmark */
+ 0x00000014, /* wantarray */
+ 0x00000c04, /* const */
+ 0x00000c44, /* gvsv */
+ 0x00000c44, /* gv */
+ 0x00022440, /* gelem */
+ 0x00000044, /* padsv */
+ 0x00000040, /* padav */
+ 0x00000040, /* padhv */
+ 0x00000040, /* padany */
+ 0x00000a40, /* pushre */
+ 0x00000244, /* rv2gv */
+ 0x00000244, /* rv2sv */
+ 0x00000214, /* av2arylen */
+ 0x00000240, /* rv2cv */
+ 0x00000c00, /* anoncode */
+ 0x00003604, /* prototype */
+ 0x00004201, /* refgen */
+ 0x00002206, /* srefgen */
+ 0x0001368c, /* ref */
+ 0x00122804, /* bless */
+ 0x00013688, /* backtick */
+ 0x00012808, /* glob */
+ 0x0001d608, /* readline */
+ 0x00000c08, /* rcatline */
+ 0x00002204, /* regcmaybe */
+ 0x00002204, /* regcreset */
+ 0x00002604, /* regcomp */
+ 0x00000a40, /* match */
+ 0x00000a04, /* qr */
+ 0x00002a54, /* subst */
+ 0x00000654, /* substcont */
+ 0x00003014, /* trans */
+ 0x00000004, /* sassign */
+ 0x00044408, /* aassign */
+ 0x0000560d, /* chop */
+ 0x0001368c, /* schop */
+ 0x0000570d, /* chomp */
+ 0x0001378c, /* schomp */
+ 0x00013694, /* defined */
+ 0x00013604, /* undef */
+ 0x00013684, /* study */
+ 0x0001368c, /* pos */
+ 0x00002264, /* preinc */
+ 0x00002254, /* i_preinc */
+ 0x00002264, /* predec */
+ 0x00002254, /* i_predec */
+ 0x0000226c, /* postinc */
+ 0x0000235c, /* i_postinc */
+ 0x0000226c, /* postdec */
+ 0x0000235c, /* i_postdec */
+ 0x0002250e, /* pow */
+ 0x0002252e, /* multiply */
+ 0x0002251e, /* i_multiply */
+ 0x0002252e, /* divide */
+ 0x0002251e, /* i_divide */
+ 0x0002253e, /* modulo */
+ 0x0002251e, /* i_modulo */
+ 0x00024409, /* repeat */
+ 0x0002252e, /* add */
+ 0x0002251e, /* i_add */
+ 0x0002252e, /* subtract */
+ 0x0002251e, /* i_subtract */
+ 0x0002250e, /* concat */
+ 0x0000290e, /* stringify */
+ 0x0002250e, /* left_shift */
+ 0x0002250e, /* right_shift */
+ 0x00022436, /* lt */
+ 0x00022416, /* i_lt */
+ 0x00022436, /* gt */
+ 0x00022416, /* i_gt */
+ 0x00022436, /* le */
+ 0x00022416, /* i_le */
+ 0x00022436, /* ge */
+ 0x00022416, /* i_ge */
+ 0x00022436, /* eq */
+ 0x00022416, /* i_eq */
+ 0x00022436, /* ne */
+ 0x00022416, /* i_ne */
+ 0x0002243e, /* ncmp */
+ 0x0002241e, /* i_ncmp */
+ 0x00022416, /* slt */
+ 0x00022416, /* sgt */
+ 0x00022416, /* sle */
+ 0x00022416, /* sge */
+ 0x00022416, /* seq */
+ 0x00022416, /* sne */
+ 0x0002241e, /* scmp */
+ 0x0002240e, /* bit_and */
+ 0x0002240e, /* bit_xor */
+ 0x0002240e, /* bit_or */
+ 0x0000222e, /* negate */
+ 0x0000231e, /* i_negate */
+ 0x00002216, /* not */
+ 0x0000220e, /* complement */
+ 0x00000404, /* smartmatch */
+ 0x0002290e, /* atan2 */
+ 0x0001378e, /* sin */
+ 0x0001378e, /* cos */
+ 0x0001370c, /* rand */
+ 0x00013604, /* srand */
+ 0x0001378e, /* exp */
+ 0x0001378e, /* log */
+ 0x0001378e, /* sqrt */
+ 0x0001378e, /* int */
+ 0x0001378e, /* hex */
+ 0x0001378e, /* oct */
+ 0x0001378e, /* abs */
+ 0x0001379e, /* length */
+ 0x1322280c, /* substr */
+ 0x0022281c, /* vec */
+ 0x0122291c, /* index */
+ 0x0122291c, /* rindex */
+ 0x0004280f, /* sprintf */
+ 0x00042805, /* formline */
+ 0x0001379e, /* ord */
+ 0x0001378e, /* chr */
+ 0x0002290e, /* crypt */
+ 0x0001368e, /* ucfirst */
+ 0x0001368e, /* lcfirst */
+ 0x0001368e, /* uc */
+ 0x0001368e, /* lc */
+ 0x0001368e, /* quotemeta */
+ 0x00000248, /* rv2av */
+ 0x00026c04, /* aelemfast */
+ 0x00026404, /* aelem */
+ 0x00046801, /* aslice */
+ 0x00007600, /* aeach */
+ 0x00007608, /* akeys */
+ 0x00007608, /* avalues */
+ 0x00009600, /* each */
+ 0x00009608, /* values */
+ 0x00009608, /* keys */
+ 0x00003600, /* delete */
+ 0x00003614, /* exists */
+ 0x00000248, /* rv2hv */
+ 0x00028404, /* helem */
+ 0x00048801, /* hslice */
+ 0x00009600, /* boolkeys */
+ 0x00122800, /* unpack */
+ 0x0004280d, /* pack */
+ 0x00222808, /* split */
+ 0x0004280d, /* join */
+ 0x00004801, /* list */
+ 0x00448400, /* lslice */
+ 0x00004805, /* anonlist */
+ 0x00004805, /* anonhash */
+ 0x05326801, /* splice */
+ 0x0004691d, /* push */
+ 0x00017604, /* pop */
+ 0x00017604, /* shift */
+ 0x0004691d, /* unshift */
+ 0x0005a841, /* sort */
+ 0x00004809, /* reverse */
+ 0x0004a841, /* grepstart */
+ 0x00000648, /* grepwhile */
+ 0x0004a841, /* mapstart */
+ 0x00000648, /* mapwhile */
+ 0x00022600, /* range */
+ 0x00022200, /* flip */
+ 0x00000200, /* flop */
+ 0x00000600, /* and */
+ 0x00000600, /* or */
+ 0x00022406, /* xor */
+ 0x00000600, /* dor */
+ 0x00000640, /* cond_expr */
+ 0x00000604, /* andassign */
+ 0x00000604, /* orassign */
+ 0x00000604, /* dorassign */
+ 0x00000240, /* method */
+ 0x00004249, /* entersub */
+ 0x00000200, /* leavesub */
+ 0x00000200, /* leavesublv */
+ 0x00013608, /* caller */
+ 0x0000481d, /* warn */
+ 0x0000485d, /* die */
+ 0x00013614, /* reset */
+ 0x00000800, /* lineseq */
+ 0x00001404, /* nextstate */
+ 0x00001404, /* dbstate */
+ 0x00000004, /* unstack */
+ 0x00000000, /* enter */
+ 0x00000800, /* leave */
+ 0x00000800, /* scope */
+ 0x00001240, /* enteriter */
+ 0x00000000, /* iter */
+ 0x00001240, /* enterloop */
+ 0x00000400, /* leaveloop */
+ 0x00004841, /* return */
+ 0x00001a44, /* last */
+ 0x00001a44, /* next */
+ 0x00001a44, /* redo */
+ 0x00001a44, /* dump */
+ 0x00001a44, /* goto */
+ 0x00013644, /* exit */
+ 0x00000c40, /* method_named */
+ 0x00000640, /* entergiven */
+ 0x00000200, /* leavegiven */
+ 0x00000640, /* enterwhen */
+ 0x00000200, /* leavewhen */
+ 0x00000000, /* break */
+ 0x00000000, /* continue */
+ 0x0052c81d, /* open */
+ 0x0001d614, /* close */
+ 0x000cc814, /* pipe_op */
+ 0x0000d61c, /* fileno */
+ 0x0001361c, /* umask */
+ 0x0012c804, /* binmode */
+ 0x0042e855, /* tie */
+ 0x0000f614, /* untie */
+ 0x0000f604, /* tied */
+ 0x00228814, /* dbmopen */
+ 0x00009614, /* dbmclose */
+ 0x02222808, /* sselect */
+ 0x0001c80c, /* select */
+ 0x0001d60c, /* getc */
+ 0x122ec81d, /* read */
+ 0x0001d654, /* enterwrite */
+ 0x00000200, /* leavewrite */
+ 0x0005c815, /* prtf */
+ 0x0005c815, /* print */
+ 0x0005c815, /* say */
+ 0x1222c804, /* sysopen */
+ 0x0022c804, /* sysseek */
+ 0x122ec81d, /* sysread */
+ 0x1322c81d, /* syswrite */
+ 0x0001d614, /* eof */
+ 0x0001d60c, /* tell */
+ 0x0022c804, /* seek */
+ 0x00022814, /* truncate */
+ 0x0022c80c, /* fcntl */
+ 0x0022c80c, /* ioctl */
+ 0x0002c91c, /* flock */
+ 0x1222c81d, /* send */
+ 0x022ec81d, /* recv */
+ 0x0222c814, /* socket */
+ 0x222cc814, /* sockpair */
+ 0x0002c814, /* bind */
+ 0x0002c814, /* connect */
+ 0x0002c814, /* listen */
+ 0x000cc81c, /* accept */
+ 0x0002c81c, /* shutdown */
+ 0x0022c814, /* gsockopt */
+ 0x0222c814, /* ssockopt */
+ 0x0000d614, /* getsockname */
+ 0x0000d614, /* getpeername */
+ 0x0000d880, /* lstat */
+ 0x0000d880, /* stat */
+ 0x0000d894, /* ftrread */
+ 0x0000d894, /* ftrwrite */
+ 0x0000d894, /* ftrexec */
+ 0x0000d894, /* fteread */
+ 0x0000d894, /* ftewrite */
+ 0x0000d894, /* fteexec */
+ 0x0000d894, /* ftis */
+ 0x0000d89c, /* ftsize */
+ 0x0000d88c, /* ftmtime */
+ 0x0000d88c, /* ftatime */
+ 0x0000d88c, /* ftctime */
+ 0x0000d894, /* ftrowned */
+ 0x0000d894, /* fteowned */
+ 0x0000d894, /* ftzero */
+ 0x0000d894, /* ftsock */
+ 0x0000d894, /* ftchr */
+ 0x0000d894, /* ftblk */
+ 0x0000d894, /* ftfile */
+ 0x0000d894, /* ftdir */
+ 0x0000d894, /* ftpipe */
+ 0x0000d894, /* ftsuid */
+ 0x0000d894, /* ftsgid */
+ 0x0000d894, /* ftsvtx */
+ 0x0000d894, /* ftlink */
+ 0x0000d814, /* fttty */
+ 0x0000d894, /* fttext */
+ 0x0000d894, /* ftbinary */
+ 0x0001371c, /* chdir */
+ 0x0000491d, /* chown */
+ 0x0001379c, /* chroot */
+ 0x0000499d, /* unlink */
+ 0x0000491d, /* chmod */
+ 0x0000491d, /* utime */
+ 0x0002291c, /* rename */
+ 0x0002291c, /* link */
+ 0x0002291c, /* symlink */
+ 0x0001368c, /* readlink */
+ 0x0013299c, /* mkdir */
+ 0x0001379c, /* rmdir */
+ 0x0002c814, /* open_dir */
+ 0x0000d600, /* readdir */
+ 0x0000d60c, /* telldir */
+ 0x0002c804, /* seekdir */
+ 0x0000d604, /* rewinddir */
+ 0x0000d614, /* closedir */
+ 0x0000001c, /* fork */
+ 0x0000011c, /* wait */
+ 0x0002291c, /* waitpid */
+ 0x0005291d, /* system */
+ 0x0005295d, /* exec */
+ 0x0000495d, /* kill */
+ 0x0000011c, /* getppid */
+ 0x0001371c, /* getpgrp */
+ 0x0013291c, /* setpgrp */
+ 0x0002291c, /* getpriority */
+ 0x0022291c, /* setpriority */
+ 0x0000011c, /* time */
+ 0x00000000, /* tms */
+ 0x00013608, /* localtime */
+ 0x00013608, /* gmtime */
+ 0x0001369c, /* alarm */
+ 0x0001371c, /* sleep */
+ 0x0022281d, /* shmget */
+ 0x0022281d, /* shmctl */
+ 0x0222281d, /* shmread */
+ 0x0222281d, /* shmwrite */
+ 0x0002281d, /* msgget */
+ 0x0022281d, /* msgctl */
+ 0x0022281d, /* msgsnd */
+ 0x2222281d, /* msgrcv */
+ 0x0002281d, /* semop */
+ 0x0022281d, /* semget */
+ 0x0222281d, /* semctl */
+ 0x000136c0, /* require */
+ 0x00002240, /* dofile */
+ 0x00000c04, /* hintseval */
+ 0x00003640, /* entereval */
+ 0x00002200, /* leaveeval */
+ 0x00001640, /* entertry */
+ 0x00000800, /* leavetry */
+ 0x00003600, /* ghbyname */
+ 0x00022800, /* ghbyaddr */
+ 0x00000000, /* ghostent */
+ 0x00003600, /* gnbyname */
+ 0x00022800, /* gnbyaddr */
+ 0x00000000, /* gnetent */
+ 0x00003600, /* gpbyname */
+ 0x00002800, /* gpbynumber */
+ 0x00000000, /* gprotoent */
+ 0x00022800, /* gsbyname */
+ 0x00022800, /* gsbyport */
+ 0x00000000, /* gservent */
+ 0x00003614, /* shostent */
+ 0x00003614, /* snetent */
+ 0x00003614, /* sprotoent */
+ 0x00003614, /* sservent */
+ 0x00000014, /* ehostent */
+ 0x00000014, /* enetent */
+ 0x00000014, /* eprotoent */
+ 0x00000014, /* eservent */
+ 0x00003600, /* gpwnam */
+ 0x00003600, /* gpwuid */
+ 0x00000000, /* gpwent */
+ 0x00000014, /* spwent */
+ 0x00000014, /* epwent */
+ 0x00003600, /* ggrnam */
+ 0x00003600, /* ggrgid */
+ 0x00000000, /* ggrent */
+ 0x00000014, /* sgrent */
+ 0x00000014, /* egrent */
+ 0x0000000c, /* getlogin */
+ 0x0004281d, /* syscall */
+ 0x0000f604, /* lock */
+ 0x00000600, /* once */
+ 0x00000000, /* custom */
+};
+#endif
+
+#endif /* !PERL_GLOBAL_STRUCT_INIT */
+
+END_EXTERN_C
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/opnames.h b/Master/tlpkg/tlperl/lib/CORE/opnames.h
new file mode 100644
index 00000000000..d63e548bdef
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/opnames.h
@@ -0,0 +1,405 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * opnames.h
+ *
+ * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ * 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by opcode.pl from its data. Any changes made here
+ * will be lost!
+ */
+
+typedef enum opcode {
+ OP_NULL = 0,
+ OP_STUB = 1,
+ OP_SCALAR = 2,
+ OP_PUSHMARK = 3,
+ OP_WANTARRAY = 4,
+ OP_CONST = 5,
+ OP_GVSV = 6,
+ OP_GV = 7,
+ OP_GELEM = 8,
+ OP_PADSV = 9,
+ OP_PADAV = 10,
+ OP_PADHV = 11,
+ OP_PADANY = 12,
+ OP_PUSHRE = 13,
+ OP_RV2GV = 14,
+ OP_RV2SV = 15,
+ OP_AV2ARYLEN = 16,
+ OP_RV2CV = 17,
+ OP_ANONCODE = 18,
+ OP_PROTOTYPE = 19,
+ OP_REFGEN = 20,
+ OP_SREFGEN = 21,
+ OP_REF = 22,
+ OP_BLESS = 23,
+ OP_BACKTICK = 24,
+ OP_GLOB = 25,
+ OP_READLINE = 26,
+ OP_RCATLINE = 27,
+ OP_REGCMAYBE = 28,
+ OP_REGCRESET = 29,
+ OP_REGCOMP = 30,
+ OP_MATCH = 31,
+ OP_QR = 32,
+ OP_SUBST = 33,
+ OP_SUBSTCONT = 34,
+ OP_TRANS = 35,
+ OP_SASSIGN = 36,
+ OP_AASSIGN = 37,
+ OP_CHOP = 38,
+ OP_SCHOP = 39,
+ OP_CHOMP = 40,
+ OP_SCHOMP = 41,
+ OP_DEFINED = 42,
+ OP_UNDEF = 43,
+ OP_STUDY = 44,
+ OP_POS = 45,
+ OP_PREINC = 46,
+ OP_I_PREINC = 47,
+ OP_PREDEC = 48,
+ OP_I_PREDEC = 49,
+ OP_POSTINC = 50,
+ OP_I_POSTINC = 51,
+ OP_POSTDEC = 52,
+ OP_I_POSTDEC = 53,
+ OP_POW = 54,
+ OP_MULTIPLY = 55,
+ OP_I_MULTIPLY = 56,
+ OP_DIVIDE = 57,
+ OP_I_DIVIDE = 58,
+ OP_MODULO = 59,
+ OP_I_MODULO = 60,
+ OP_REPEAT = 61,
+ OP_ADD = 62,
+ OP_I_ADD = 63,
+ OP_SUBTRACT = 64,
+ OP_I_SUBTRACT = 65,
+ OP_CONCAT = 66,
+ OP_STRINGIFY = 67,
+ OP_LEFT_SHIFT = 68,
+ OP_RIGHT_SHIFT = 69,
+ OP_LT = 70,
+ OP_I_LT = 71,
+ OP_GT = 72,
+ OP_I_GT = 73,
+ OP_LE = 74,
+ OP_I_LE = 75,
+ OP_GE = 76,
+ OP_I_GE = 77,
+ OP_EQ = 78,
+ OP_I_EQ = 79,
+ OP_NE = 80,
+ OP_I_NE = 81,
+ OP_NCMP = 82,
+ OP_I_NCMP = 83,
+ OP_SLT = 84,
+ OP_SGT = 85,
+ OP_SLE = 86,
+ OP_SGE = 87,
+ OP_SEQ = 88,
+ OP_SNE = 89,
+ OP_SCMP = 90,
+ OP_BIT_AND = 91,
+ OP_BIT_XOR = 92,
+ OP_BIT_OR = 93,
+ OP_NEGATE = 94,
+ OP_I_NEGATE = 95,
+ OP_NOT = 96,
+ OP_COMPLEMENT = 97,
+ OP_SMARTMATCH = 98,
+ OP_ATAN2 = 99,
+ OP_SIN = 100,
+ OP_COS = 101,
+ OP_RAND = 102,
+ OP_SRAND = 103,
+ OP_EXP = 104,
+ OP_LOG = 105,
+ OP_SQRT = 106,
+ OP_INT = 107,
+ OP_HEX = 108,
+ OP_OCT = 109,
+ OP_ABS = 110,
+ OP_LENGTH = 111,
+ OP_SUBSTR = 112,
+ OP_VEC = 113,
+ OP_INDEX = 114,
+ OP_RINDEX = 115,
+ OP_SPRINTF = 116,
+ OP_FORMLINE = 117,
+ OP_ORD = 118,
+ OP_CHR = 119,
+ OP_CRYPT = 120,
+ OP_UCFIRST = 121,
+ OP_LCFIRST = 122,
+ OP_UC = 123,
+ OP_LC = 124,
+ OP_QUOTEMETA = 125,
+ OP_RV2AV = 126,
+ OP_AELEMFAST = 127,
+ OP_AELEM = 128,
+ OP_ASLICE = 129,
+ OP_AEACH = 130,
+ OP_AKEYS = 131,
+ OP_AVALUES = 132,
+ OP_EACH = 133,
+ OP_VALUES = 134,
+ OP_KEYS = 135,
+ OP_DELETE = 136,
+ OP_EXISTS = 137,
+ OP_RV2HV = 138,
+ OP_HELEM = 139,
+ OP_HSLICE = 140,
+ OP_BOOLKEYS = 141,
+ OP_UNPACK = 142,
+ OP_PACK = 143,
+ OP_SPLIT = 144,
+ OP_JOIN = 145,
+ OP_LIST = 146,
+ OP_LSLICE = 147,
+ OP_ANONLIST = 148,
+ OP_ANONHASH = 149,
+ OP_SPLICE = 150,
+ OP_PUSH = 151,
+ OP_POP = 152,
+ OP_SHIFT = 153,
+ OP_UNSHIFT = 154,
+ OP_SORT = 155,
+ OP_REVERSE = 156,
+ OP_GREPSTART = 157,
+ OP_GREPWHILE = 158,
+ OP_MAPSTART = 159,
+ OP_MAPWHILE = 160,
+ OP_RANGE = 161,
+ OP_FLIP = 162,
+ OP_FLOP = 163,
+ OP_AND = 164,
+ OP_OR = 165,
+ OP_XOR = 166,
+ OP_DOR = 167,
+ OP_COND_EXPR = 168,
+ OP_ANDASSIGN = 169,
+ OP_ORASSIGN = 170,
+ OP_DORASSIGN = 171,
+ OP_METHOD = 172,
+ OP_ENTERSUB = 173,
+ OP_LEAVESUB = 174,
+ OP_LEAVESUBLV = 175,
+ OP_CALLER = 176,
+ OP_WARN = 177,
+ OP_DIE = 178,
+ OP_RESET = 179,
+ OP_LINESEQ = 180,
+ OP_NEXTSTATE = 181,
+ OP_DBSTATE = 182,
+ OP_UNSTACK = 183,
+ OP_ENTER = 184,
+ OP_LEAVE = 185,
+ OP_SCOPE = 186,
+ OP_ENTERITER = 187,
+ OP_ITER = 188,
+ OP_ENTERLOOP = 189,
+ OP_LEAVELOOP = 190,
+ OP_RETURN = 191,
+ OP_LAST = 192,
+ OP_NEXT = 193,
+ OP_REDO = 194,
+ OP_DUMP = 195,
+ OP_GOTO = 196,
+ OP_EXIT = 197,
+ OP_METHOD_NAMED = 198,
+ OP_ENTERGIVEN = 199,
+ OP_LEAVEGIVEN = 200,
+ OP_ENTERWHEN = 201,
+ OP_LEAVEWHEN = 202,
+ OP_BREAK = 203,
+ OP_CONTINUE = 204,
+ OP_OPEN = 205,
+ OP_CLOSE = 206,
+ OP_PIPE_OP = 207,
+ OP_FILENO = 208,
+ OP_UMASK = 209,
+ OP_BINMODE = 210,
+ OP_TIE = 211,
+ OP_UNTIE = 212,
+ OP_TIED = 213,
+ OP_DBMOPEN = 214,
+ OP_DBMCLOSE = 215,
+ OP_SSELECT = 216,
+ OP_SELECT = 217,
+ OP_GETC = 218,
+ OP_READ = 219,
+ OP_ENTERWRITE = 220,
+ OP_LEAVEWRITE = 221,
+ OP_PRTF = 222,
+ OP_PRINT = 223,
+ OP_SAY = 224,
+ OP_SYSOPEN = 225,
+ OP_SYSSEEK = 226,
+ OP_SYSREAD = 227,
+ OP_SYSWRITE = 228,
+ OP_EOF = 229,
+ OP_TELL = 230,
+ OP_SEEK = 231,
+ OP_TRUNCATE = 232,
+ OP_FCNTL = 233,
+ OP_IOCTL = 234,
+ OP_FLOCK = 235,
+ OP_SEND = 236,
+ OP_RECV = 237,
+ OP_SOCKET = 238,
+ OP_SOCKPAIR = 239,
+ OP_BIND = 240,
+ OP_CONNECT = 241,
+ OP_LISTEN = 242,
+ OP_ACCEPT = 243,
+ OP_SHUTDOWN = 244,
+ OP_GSOCKOPT = 245,
+ OP_SSOCKOPT = 246,
+ OP_GETSOCKNAME = 247,
+ OP_GETPEERNAME = 248,
+ OP_LSTAT = 249,
+ OP_STAT = 250,
+ OP_FTRREAD = 251,
+ OP_FTRWRITE = 252,
+ OP_FTREXEC = 253,
+ OP_FTEREAD = 254,
+ OP_FTEWRITE = 255,
+ OP_FTEEXEC = 256,
+ OP_FTIS = 257,
+ OP_FTSIZE = 258,
+ OP_FTMTIME = 259,
+ OP_FTATIME = 260,
+ OP_FTCTIME = 261,
+ OP_FTROWNED = 262,
+ OP_FTEOWNED = 263,
+ OP_FTZERO = 264,
+ OP_FTSOCK = 265,
+ OP_FTCHR = 266,
+ OP_FTBLK = 267,
+ OP_FTFILE = 268,
+ OP_FTDIR = 269,
+ OP_FTPIPE = 270,
+ OP_FTSUID = 271,
+ OP_FTSGID = 272,
+ OP_FTSVTX = 273,
+ OP_FTLINK = 274,
+ OP_FTTTY = 275,
+ OP_FTTEXT = 276,
+ OP_FTBINARY = 277,
+ OP_CHDIR = 278,
+ OP_CHOWN = 279,
+ OP_CHROOT = 280,
+ OP_UNLINK = 281,
+ OP_CHMOD = 282,
+ OP_UTIME = 283,
+ OP_RENAME = 284,
+ OP_LINK = 285,
+ OP_SYMLINK = 286,
+ OP_READLINK = 287,
+ OP_MKDIR = 288,
+ OP_RMDIR = 289,
+ OP_OPEN_DIR = 290,
+ OP_READDIR = 291,
+ OP_TELLDIR = 292,
+ OP_SEEKDIR = 293,
+ OP_REWINDDIR = 294,
+ OP_CLOSEDIR = 295,
+ OP_FORK = 296,
+ OP_WAIT = 297,
+ OP_WAITPID = 298,
+ OP_SYSTEM = 299,
+ OP_EXEC = 300,
+ OP_KILL = 301,
+ OP_GETPPID = 302,
+ OP_GETPGRP = 303,
+ OP_SETPGRP = 304,
+ OP_GETPRIORITY = 305,
+ OP_SETPRIORITY = 306,
+ OP_TIME = 307,
+ OP_TMS = 308,
+ OP_LOCALTIME = 309,
+ OP_GMTIME = 310,
+ OP_ALARM = 311,
+ OP_SLEEP = 312,
+ OP_SHMGET = 313,
+ OP_SHMCTL = 314,
+ OP_SHMREAD = 315,
+ OP_SHMWRITE = 316,
+ OP_MSGGET = 317,
+ OP_MSGCTL = 318,
+ OP_MSGSND = 319,
+ OP_MSGRCV = 320,
+ OP_SEMOP = 321,
+ OP_SEMGET = 322,
+ OP_SEMCTL = 323,
+ OP_REQUIRE = 324,
+ OP_DOFILE = 325,
+ OP_HINTSEVAL = 326,
+ OP_ENTEREVAL = 327,
+ OP_LEAVEEVAL = 328,
+ OP_ENTERTRY = 329,
+ OP_LEAVETRY = 330,
+ OP_GHBYNAME = 331,
+ OP_GHBYADDR = 332,
+ OP_GHOSTENT = 333,
+ OP_GNBYNAME = 334,
+ OP_GNBYADDR = 335,
+ OP_GNETENT = 336,
+ OP_GPBYNAME = 337,
+ OP_GPBYNUMBER = 338,
+ OP_GPROTOENT = 339,
+ OP_GSBYNAME = 340,
+ OP_GSBYPORT = 341,
+ OP_GSERVENT = 342,
+ OP_SHOSTENT = 343,
+ OP_SNETENT = 344,
+ OP_SPROTOENT = 345,
+ OP_SSERVENT = 346,
+ OP_EHOSTENT = 347,
+ OP_ENETENT = 348,
+ OP_EPROTOENT = 349,
+ OP_ESERVENT = 350,
+ OP_GPWNAM = 351,
+ OP_GPWUID = 352,
+ OP_GPWENT = 353,
+ OP_SPWENT = 354,
+ OP_EPWENT = 355,
+ OP_GGRNAM = 356,
+ OP_GGRGID = 357,
+ OP_GGRENT = 358,
+ OP_SGRENT = 359,
+ OP_EGRENT = 360,
+ OP_GETLOGIN = 361,
+ OP_SYSCALL = 362,
+ OP_LOCK = 363,
+ OP_ONCE = 364,
+ OP_CUSTOM = 365,
+ OP_max
+} opcode;
+
+#define MAXO 366
+#define OP_phoney_INPUT_ONLY -1
+#define OP_phoney_OUTPUT_ONLY -2
+
+
+/* the OP_IS_(SOCKET|FILETEST) macros are optimized to a simple range
+ check because all the member OPs are contiguous in opcode.pl
+ <DATA> table. opcode.pl verifies the range contiguity. */
+
+#define OP_IS_SOCKET(op) \
+ ((op) >= OP_SEND && (op) <= OP_GETPEERNAME)
+
+#define OP_IS_FILETEST(op) \
+ ((op) >= OP_FTRREAD && (op) <= OP_FTBINARY)
+
+#define OP_IS_FILETEST_ACCESS(op) \
+ ((op) >= OP_FTRREAD && (op) <= OP_FTEEXEC)
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/overload.h b/Master/tlpkg/tlperl/lib/CORE/overload.h
new file mode 100644
index 00000000000..bbef5cb9a0c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/overload.h
@@ -0,0 +1,90 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * overload.h
+ *
+ * Copyright (C) 1997, 1998, 2000, 2001, 2005, 2006, 2007 by Larry Wall
+ * and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by overload.pl
+ */
+
+enum {
+ fallback_amg,
+ to_sv_amg,
+ to_av_amg,
+ to_hv_amg,
+ to_gv_amg,
+ to_cv_amg,
+ inc_amg,
+ dec_amg,
+ bool__amg,
+ numer_amg,
+ string_amg,
+ not_amg,
+ copy_amg,
+ abs_amg,
+ neg_amg,
+ iter_amg,
+ int_amg,
+ lt_amg,
+ le_amg,
+ gt_amg,
+ ge_amg,
+ eq_amg,
+ ne_amg,
+ slt_amg,
+ sle_amg,
+ sgt_amg,
+ sge_amg,
+ seq_amg,
+ sne_amg,
+ nomethod_amg,
+ add_amg,
+ add_ass_amg,
+ subtr_amg,
+ subtr_ass_amg,
+ mult_amg,
+ mult_ass_amg,
+ div_amg,
+ div_ass_amg,
+ modulo_amg,
+ modulo_ass_amg,
+ pow_amg,
+ pow_ass_amg,
+ lshift_amg,
+ lshift_ass_amg,
+ rshift_amg,
+ rshift_ass_amg,
+ band_amg,
+ band_ass_amg,
+ bor_amg,
+ bor_ass_amg,
+ bxor_amg,
+ bxor_ass_amg,
+ ncmp_amg,
+ scmp_amg,
+ compl_amg,
+ atan2_amg,
+ cos_amg,
+ sin_amg,
+ exp_amg,
+ log_amg,
+ sqrt_amg,
+ repeat_amg,
+ repeat_ass_amg,
+ concat_amg,
+ concat_ass_amg,
+ smart_amg,
+ ftest_amg,
+ regexp_amg,
+ DESTROY_amg,
+ max_amg_code
+ /* Do not leave a trailing comma here. C9X allows it, C89 doesn't. */
+};
+
+#define NofAMmeth max_amg_code
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/pad.h b/Master/tlpkg/tlperl/lib/CORE/pad.h
new file mode 100644
index 00000000000..8602eda7f78
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/pad.h
@@ -0,0 +1,371 @@
+/* pad.h
+ *
+ * Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * This file defines the types and macros associated with the API for
+ * manipulating scratchpads, which are used by perl to store lexical
+ * variables, op targets and constants.
+ */
+
+
+
+
+/* a padlist is currently just an AV; but that might change,
+ * so hide the type. Ditto a pad. */
+
+typedef AV PADLIST;
+typedef AV PAD;
+
+
+/* offsets within a pad */
+
+#if PTRSIZE == 4
+typedef U32TYPE PADOFFSET;
+#else
+# if PTRSIZE == 8
+typedef U64TYPE PADOFFSET;
+# endif
+#endif
+#define NOT_IN_PAD ((PADOFFSET) -1)
+
+/* B.xs needs these for the benefit of B::Deparse */
+/* Low range end is exclusive (valid from the cop seq after this one) */
+/* High range end is inclusive (valid up to this cop seq) */
+
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define COP_SEQ_RANGE_LOW(sv) \
+ (({ const SV *const _sv_cop_seq_range_low = (const SV *) (sv); \
+ assert(SvTYPE(_sv_cop_seq_range_low) == SVt_NV \
+ || SvTYPE(_sv_cop_seq_range_low) >= SVt_PVNV); \
+ assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVAV); \
+ assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVHV); \
+ assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVCV); \
+ assert(SvTYPE(_sv_cop_seq_range_low) != SVt_PVFM); \
+ assert(!isGV_with_GP(_sv_cop_seq_range_low)); \
+ ((XPVNV*) MUTABLE_PTR(SvANY(_sv_cop_seq_range_low)))->xnv_u.xpad_cop_seq.xlow; \
+ }))
+# define COP_SEQ_RANGE_HIGH(sv) \
+ (({ const SV *const _sv_cop_seq_range_high = (const SV *) (sv); \
+ assert(SvTYPE(_sv_cop_seq_range_high) == SVt_NV \
+ || SvTYPE(_sv_cop_seq_range_high) >= SVt_PVNV); \
+ assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVAV); \
+ assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVHV); \
+ assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVCV); \
+ assert(SvTYPE(_sv_cop_seq_range_high) != SVt_PVFM); \
+ assert(!isGV_with_GP(_sv_cop_seq_range_high)); \
+ ((XPVNV*) MUTABLE_PTR(SvANY(_sv_cop_seq_range_high)))->xnv_u.xpad_cop_seq.xhigh; \
+ }))
+# define PARENT_PAD_INDEX(sv) \
+ (({ const SV *const _sv_parent_pad_index = (const SV *) (sv); \
+ assert(SvTYPE(_sv_parent_pad_index) == SVt_NV \
+ || SvTYPE(_sv_parent_pad_index) >= SVt_PVNV); \
+ assert(SvTYPE(_sv_parent_pad_index) != SVt_PVAV); \
+ assert(SvTYPE(_sv_parent_pad_index) != SVt_PVHV); \
+ assert(SvTYPE(_sv_parent_pad_index) != SVt_PVCV); \
+ assert(SvTYPE(_sv_parent_pad_index) != SVt_PVFM); \
+ assert(!isGV_with_GP(_sv_parent_pad_index)); \
+ ((XPVNV*) MUTABLE_PTR(SvANY(_sv_parent_pad_index)))->xnv_u.xpad_cop_seq.xlow; \
+ }))
+# define PARENT_FAKELEX_FLAGS(sv) \
+ (({ const SV *const _sv_parent_fakelex_flags = (const SV *) (sv); \
+ assert(SvTYPE(_sv_parent_fakelex_flags) == SVt_NV \
+ || SvTYPE(_sv_parent_fakelex_flags) >= SVt_PVNV); \
+ assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVAV); \
+ assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVHV); \
+ assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVCV); \
+ assert(SvTYPE(_sv_parent_fakelex_flags) != SVt_PVFM); \
+ assert(!isGV_with_GP(_sv_parent_fakelex_flags)); \
+ ((XPVNV*) MUTABLE_PTR(SvANY(_sv_parent_fakelex_flags)))->xnv_u.xpad_cop_seq.xhigh; \
+ }))
+#else
+# define COP_SEQ_RANGE_LOW(sv) \
+ (0 + (((XPVNV*) SvANY(sv))->xnv_u.xpad_cop_seq.xlow))
+# define COP_SEQ_RANGE_HIGH(sv) \
+ (0 + (((XPVNV*) SvANY(sv))->xnv_u.xpad_cop_seq.xhigh))
+
+
+# define PARENT_PAD_INDEX(sv) \
+ (0 + (((XPVNV*) SvANY(sv))->xnv_u.xpad_cop_seq.xlow))
+# define PARENT_FAKELEX_FLAGS(sv) \
+ (0 + (((XPVNV*) SvANY(sv))->xnv_u.xpad_cop_seq.xhigh))
+#endif
+
+/* Flags set in the SvIVX field of FAKE namesvs */
+
+#define PAD_FAKELEX_ANON 1 /* the lex is declared in an ANON, or ... */
+#define PAD_FAKELEX_MULTI 2 /* the lex can be instantiated multiple times */
+
+/* flags for the pad_new() function */
+
+#define padnew_CLONE 1 /* this pad is for a cloned CV */
+#define padnew_SAVE 2 /* save old globals */
+#define padnew_SAVESUB 4 /* also save extra stuff for start of sub */
+
+/* values for the pad_tidy() function */
+
+typedef enum {
+ padtidy_SUB, /* tidy up a pad for a sub, */
+ padtidy_SUBCLONE, /* a cloned sub, */
+ padtidy_FORMAT /* or a format */
+} padtidy_type;
+
+#ifdef PERL_CORE
+
+/* flags for pad_add_name. SVf_UTF8 will also be valid in the future. */
+
+# define padadd_OUR 0x01 /* our declaration. */
+# define padadd_STATE 0x02 /* state declaration. */
+# define padadd_NO_DUP_CHECK 0x04 /* skip warning on dups. */
+
+#endif
+
+/* ASSERT_CURPAD_LEGAL and ASSERT_CURPAD_ACTIVE respectively determine
+ * whether PL_comppad and PL_curpad are consistent and whether they have
+ * active values */
+
+#ifndef PERL_MAD
+# define pad_peg(label)
+#endif
+
+#ifdef DEBUGGING
+# define ASSERT_CURPAD_LEGAL(label) \
+ pad_peg(label); \
+ if (PL_comppad ? (AvARRAY(PL_comppad) != PL_curpad) : (PL_curpad != 0)) \
+ Perl_croak(aTHX_ "panic: illegal pad in %s: 0x%"UVxf"[0x%"UVxf"]",\
+ label, PTR2UV(PL_comppad), PTR2UV(PL_curpad));
+
+
+# define ASSERT_CURPAD_ACTIVE(label) \
+ pad_peg(label); \
+ if (!PL_comppad || (AvARRAY(PL_comppad) != PL_curpad)) \
+ Perl_croak(aTHX_ "panic: invalid pad in %s: 0x%"UVxf"[0x%"UVxf"]",\
+ label, PTR2UV(PL_comppad), PTR2UV(PL_curpad));
+#else
+# define ASSERT_CURPAD_LEGAL(label)
+# define ASSERT_CURPAD_ACTIVE(label)
+#endif
+
+
+
+/* Note: the following three macros are actually defined in scope.h, but
+ * they are documented here for completeness, since they directly or
+ * indirectly affect pads.
+
+=for apidoc m|void|SAVEPADSV |PADOFFSET po
+Save a pad slot (used to restore after an iteration)
+
+XXX DAPM it would make more sense to make the arg a PADOFFSET
+=for apidoc m|void|SAVECLEARSV |SV **svp
+Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my')
+
+=for apidoc m|void|SAVECOMPPAD
+save PL_comppad and PL_curpad
+
+
+
+
+
+=for apidoc m|SV *|PAD_SETSV |PADOFFSET po|SV* sv
+Set the slot at offset C<po> in the current pad to C<sv>
+
+=for apidoc m|void|PAD_SV |PADOFFSET po
+Get the value at offset C<po> in the current pad
+
+=for apidoc m|SV *|PAD_SVl |PADOFFSET po
+Lightweight and lvalue version of C<PAD_SV>.
+Get or set the value at offset C<po> in the current pad.
+Unlike C<PAD_SV>, does not print diagnostics with -DX.
+For internal use only.
+
+=for apidoc m|SV *|PAD_BASE_SV |PADLIST padlist|PADOFFSET po
+Get the value from slot C<po> in the base (DEPTH=1) pad of a padlist
+
+=for apidoc m|void|PAD_SET_CUR |PADLIST padlist|I32 n
+Set the current pad to be pad C<n> in the padlist, saving
+the previous current pad. NB currently this macro expands to a string too
+long for some compilers, so it's best to replace it with
+
+ SAVECOMPPAD();
+ PAD_SET_CUR_NOSAVE(padlist,n);
+
+
+=for apidoc m|void|PAD_SET_CUR_NOSAVE |PADLIST padlist|I32 n
+like PAD_SET_CUR, but without the save
+
+=for apidoc m|void|PAD_SAVE_SETNULLPAD
+Save the current pad then set it to null.
+
+=for apidoc m|void|PAD_SAVE_LOCAL|PAD *opad|PAD *npad
+Save the current pad to the local variable opad, then make the
+current pad equal to npad
+
+=for apidoc m|void|PAD_RESTORE_LOCAL|PAD *opad
+Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
+
+=cut
+*/
+
+#ifdef DEBUGGING
+# define PAD_SV(po) pad_sv(po)
+# define PAD_SETSV(po,sv) pad_setsv(po,sv)
+#else
+# define PAD_SV(po) (PL_curpad[po])
+# define PAD_SETSV(po,sv) PL_curpad[po] = (sv)
+#endif
+
+#define PAD_SVl(po) (PL_curpad[po])
+
+#define PAD_BASE_SV(padlist, po) \
+ (AvARRAY(padlist)[1]) \
+ ? AvARRAY(MUTABLE_AV((AvARRAY(padlist)[1])))[po] : NULL;
+
+
+#define PAD_SET_CUR_NOSAVE(padlist,nth) \
+ PL_comppad = (PAD*) (AvARRAY(padlist)[nth]); \
+ PL_curpad = AvARRAY(PL_comppad); \
+ DEBUG_Xv(PerlIO_printf(Perl_debug_log, \
+ "Pad 0x%"UVxf"[0x%"UVxf"] set_cur depth=%d\n", \
+ PTR2UV(PL_comppad), PTR2UV(PL_curpad), (int)(nth)));
+
+
+#define PAD_SET_CUR(padlist,nth) \
+ SAVECOMPPAD(); \
+ PAD_SET_CUR_NOSAVE(padlist,nth);
+
+
+#define PAD_SAVE_SETNULLPAD() SAVECOMPPAD(); \
+ PL_comppad = NULL; PL_curpad = NULL; \
+ DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad set_null\n"));
+
+#define PAD_SAVE_LOCAL(opad,npad) \
+ opad = PL_comppad; \
+ PL_comppad = (npad); \
+ PL_curpad = PL_comppad ? AvARRAY(PL_comppad) : NULL; \
+ DEBUG_Xv(PerlIO_printf(Perl_debug_log, \
+ "Pad 0x%"UVxf"[0x%"UVxf"] save_local\n", \
+ PTR2UV(PL_comppad), PTR2UV(PL_curpad)));
+
+#define PAD_RESTORE_LOCAL(opad) \
+ assert(!opad || !SvIS_FREED(opad)); \
+ PL_comppad = opad; \
+ PL_curpad = PL_comppad ? AvARRAY(PL_comppad) : NULL; \
+ DEBUG_Xv(PerlIO_printf(Perl_debug_log, \
+ "Pad 0x%"UVxf"[0x%"UVxf"] restore_local\n", \
+ PTR2UV(PL_comppad), PTR2UV(PL_curpad)));
+
+
+/*
+=for apidoc m|void|CX_CURPAD_SAVE|struct context
+Save the current pad in the given context block structure.
+
+=for apidoc m|SV *|CX_CURPAD_SV|struct context|PADOFFSET po
+Access the SV at offset po in the saved current pad in the given
+context block structure (can be used as an lvalue).
+
+=cut
+*/
+
+#define CX_CURPAD_SAVE(block) (block).oldcomppad = PL_comppad
+#define CX_CURPAD_SV(block,po) (AvARRAY(MUTABLE_AV(((block).oldcomppad)))[po])
+
+
+/*
+=for apidoc m|U32|PAD_COMPNAME_FLAGS|PADOFFSET po
+Return the flags for the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+=for apidoc m|char *|PAD_COMPNAME_PV|PADOFFSET po
+Return the name of the current compiling pad name
+at offset C<po>. Assumes a valid slot entry.
+
+=for apidoc m|HV *|PAD_COMPNAME_TYPE|PADOFFSET po
+Return the type (stash) of the current compiling pad name at offset
+C<po>. Must be a valid name. Returns null if not typed.
+
+=for apidoc m|HV *|PAD_COMPNAME_OURSTASH|PADOFFSET po
+Return the stash associated with an C<our> variable.
+Assumes the slot entry is a valid C<our> lexical.
+
+=for apidoc m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
+The generation number of the name at offset C<po> in the current
+compiling pad (lvalue). Note that C<SvUVX> is hijacked for this purpose.
+
+=for apidoc m|STRLEN|PAD_COMPNAME_GEN_set|PADOFFSET po|int gen
+Sets the generation number of the name at offset C<po> in the current
+ling pad (lvalue) to C<gen>. Note that C<SvUV_set> is hijacked for this purpose.
+
+=cut
+
+*/
+
+#define PAD_COMPNAME_SV(po) (*av_fetch(PL_comppad_name, (po), FALSE))
+#define PAD_COMPNAME_FLAGS(po) SvFLAGS(PAD_COMPNAME_SV(po))
+#define PAD_COMPNAME_FLAGS_isOUR(po) \
+ ((PAD_COMPNAME_FLAGS(po) & (SVpad_NAME|SVpad_OUR)) == (SVpad_NAME|SVpad_OUR))
+#define PAD_COMPNAME_PV(po) SvPV_nolen(PAD_COMPNAME_SV(po))
+
+#define PAD_COMPNAME_TYPE(po) pad_compname_type(po)
+
+#define PAD_COMPNAME_OURSTASH(po) \
+ (SvOURSTASH(PAD_COMPNAME_SV(po)))
+
+#define PAD_COMPNAME_GEN(po) ((STRLEN)SvUVX(AvARRAY(PL_comppad_name)[po]))
+
+#define PAD_COMPNAME_GEN_set(po, gen) SvUV_set(AvARRAY(PL_comppad_name)[po], (UV)(gen))
+
+
+/*
+=for apidoc m|void|PAD_DUP|PADLIST dstpad|PADLIST srcpad|CLONE_PARAMS* param
+Clone a padlist.
+
+=for apidoc m|void|PAD_CLONE_VARS|PerlInterpreter *proto_perl|CLONE_PARAMS* param
+Clone the state variables associated with running and compiling pads.
+
+=cut
+*/
+
+
+#define PAD_DUP(dstpad, srcpad, param) \
+ if ((srcpad) && !AvREAL(srcpad)) { \
+ /* XXX padlists are real, but pretend to be not */ \
+ AvREAL_on(srcpad); \
+ (dstpad) = av_dup_inc((srcpad), param); \
+ AvREAL_off(srcpad); \
+ AvREAL_off(dstpad); \
+ } \
+ else \
+ (dstpad) = av_dup_inc((srcpad), param);
+
+/* NB - we set PL_comppad to null unless it points at a value that
+ * has already been dup'ed, ie it points to part of an active padlist.
+ * Otherwise PL_comppad ends up being a leaked scalar in code like
+ * the following:
+ * threads->create(sub { threads->create(sub {...} ) } );
+ * where the second thread dups the outer sub's comppad but not the
+ * sub's CV or padlist. */
+
+#define PAD_CLONE_VARS(proto_perl, param) \
+ PL_comppad = MUTABLE_AV(ptr_table_fetch(PL_ptr_table, proto_perl->Icomppad)); \
+ PL_curpad = PL_comppad ? AvARRAY(PL_comppad) : NULL; \
+ PL_comppad_name = av_dup(proto_perl->Icomppad_name, param); \
+ PL_comppad_name_fill = proto_perl->Icomppad_name_fill; \
+ PL_comppad_name_floor = proto_perl->Icomppad_name_floor; \
+ PL_min_intro_pending = proto_perl->Imin_intro_pending; \
+ PL_max_intro_pending = proto_perl->Imax_intro_pending; \
+ PL_padix = proto_perl->Ipadix; \
+ PL_padix_floor = proto_perl->Ipadix_floor; \
+ PL_pad_reset_pending = proto_perl->Ipad_reset_pending; \
+ PL_cop_seqmax = proto_perl->Icop_seqmax;
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/parser.h b/Master/tlpkg/tlperl/lib/CORE/parser.h
new file mode 100644
index 00000000000..4ef460836cc
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/parser.h
@@ -0,0 +1,122 @@
+/* parser.h
+ *
+ * Copyright (c) 2006, 2007, Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * This file defines the layout of the parser object used by the parser
+ * and lexer (perly.c, toke,c).
+ */
+
+#define YYEMPTY (-2)
+
+typedef struct {
+ YYSTYPE val; /* semantic value */
+ short state;
+ I32 savestack_ix; /* size of savestack at this state */
+ CV *compcv; /* value of PL_compcv when this value was created */
+#ifdef DEBUGGING
+ const char *name; /* token/rule name for -Dpv */
+#endif
+} yy_stack_frame;
+
+typedef struct yy_parser {
+
+ /* parser state */
+
+ struct yy_parser *old_parser; /* previous value of PL_parser */
+ YYSTYPE yylval; /* value of lookahead symbol, set by yylex() */
+ int yychar; /* The lookahead symbol. */
+
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+
+ int stack_size;
+ int yylen; /* length of active reduction */
+ yy_stack_frame *stack; /* base of stack */
+ yy_stack_frame *ps; /* current stack frame */
+
+ /* lexer state */
+
+ I32 lex_brackets; /* bracket count */
+ I32 lex_casemods; /* casemod count */
+ char *lex_brackstack;/* what kind of brackets to pop */
+ char *lex_casestack; /* what kind of case mods in effect */
+ U8 lex_defer; /* state after determined token */
+ bool lex_dojoin; /* doing an array interpolation */
+ U8 lex_expect; /* expect after determined token */
+ U8 expect; /* how to interpret ambiguous tokens */
+ I32 lex_formbrack; /* bracket count at outer format level */
+ OP *lex_inpat; /* in pattern $) and $| are special */
+ OP *lex_op; /* extra info to pass back on op */
+ SV *lex_repl; /* runtime replacement from s/// */
+ U16 lex_inwhat; /* what kind of quoting are we in */
+ OPCODE last_lop_op; /* last list operator */
+ I32 lex_starts; /* how many interps done on level */
+ SV *lex_stuff; /* runtime pattern from m// or s/// */
+ I32 multi_start; /* 1st line of multi-line string */
+ I32 multi_end; /* last line of multi-line string */
+ char multi_open; /* delimiter of said string */
+ char multi_close; /* delimiter of said string */
+ char pending_ident; /* pending identifier lookup */
+ bool preambled;
+ /* XXX I32 space */
+ SUBLEXINFO sublex_info;
+ SV *linestr; /* current chunk of src text */
+ char *bufptr;
+ char *oldbufptr;
+ char *oldoldbufptr;
+ char *bufend;
+ char *linestart; /* beginning of most recently read line */
+ char *last_uni; /* position of last named-unary op */
+ char *last_lop; /* position of last list operator */
+ line_t copline; /* current line number */
+ U16 in_my; /* we're compiling a "my"/"our" declaration */
+ U8 lex_state; /* next token is determined */
+ U8 error_count; /* how many compile errors so far, max 10 */
+ HV *in_my_stash; /* declared class of this "my" declaration */
+ PerlIO *rsfp; /* current source file pointer */
+ AV *rsfp_filters; /* holds chain of active source filters */
+
+#ifdef PERL_MAD
+ SV *endwhite;
+ I32 faketokens;
+ I32 lasttoke;
+ SV *nextwhite;
+ I32 realtokenstart;
+ SV *skipwhite;
+ SV *thisclose;
+ MADPROP * thismad;
+ SV *thisopen;
+ SV *thisstuff;
+ SV *thistoken;
+ SV *thiswhite;
+
+/* What we know when we're in LEX_KNOWNEXT state. */
+ NEXTTOKE nexttoke[5]; /* value of next token, if any */
+ I32 curforce;
+#else
+ YYSTYPE nextval[5]; /* value of next token, if any */
+ I32 nexttype[5]; /* type of next token */
+ I32 nexttoke;
+#endif
+
+ COP *saved_curcop; /* the previous PL_curcop */
+ char tokenbuf[256];
+
+} yy_parser;
+
+/* flags for lexer API */
+#define LEX_STUFF_UTF8 0x00000001
+#define LEX_KEEP_PREVIOUS 0x00000002
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/patchlevel.h b/Master/tlpkg/tlperl/lib/CORE/patchlevel.h
new file mode 100644
index 00000000000..af54dc98daf
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/patchlevel.h
@@ -0,0 +1,147 @@
+/* patchlevel.h
+ *
+ * Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+ * 2003, 2004, 2005, 2006, 2007, 2008, 2009, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef __PATCHLEVEL_H_INCLUDED__
+
+/* do not adjust the whitespace! Configure expects the numbers to be
+ * exactly on the third column */
+
+#define PERL_REVISION 5 /* age */
+#define PERL_VERSION 12 /* epoch */
+#define PERL_SUBVERSION 3 /* generation */
+
+/* The following numbers describe the earliest compatible version of
+ Perl ("compatibility" here being defined as sufficient binary/API
+ compatibility to run XS code built with the older version).
+ Normally this should not change across maintenance releases.
+
+ Note that this only refers to an out-of-the-box build. Many non-default
+ options such as usemultiplicity tend to break binary compatibility
+ more often.
+
+ This is used by Configure et al to figure out
+ PERL_INC_VERSION_LIST, which lists version libraries
+ to include in @INC. See INSTALL for how this works.
+*/
+#define PERL_API_REVISION 5 /* Adjust manually as needed. */
+#define PERL_API_VERSION 12 /* Adjust manually as needed. */
+#define PERL_API_SUBVERSION 0 /* Adjust manually as needed. */
+/*
+ XXX Note: The selection of non-default Configure options, such
+ as -Duselonglong may invalidate these settings. Currently, Configure
+ does not adequately test for this. A.D. Jan 13, 2000
+*/
+
+#define __PATCHLEVEL_H_INCLUDED__
+#endif
+
+/*
+ local_patches -- list of locally applied less-than-subversion patches.
+ If you're distributing such a patch, please give it a name and a
+ one-line description, placed just before the last NULL in the array
+ below. If your patch fixes a bug in the perlbug database, please
+ mention the bugid. If your patch *IS* dependent on a prior patch,
+ please place your applied patch line after its dependencies. This
+ will help tracking of patch dependencies.
+
+ Please either use 'diff --unified=0' if your diff supports
+ that or edit the hunk of the diff output which adds your patch
+ to this list, to remove context lines which would give patch
+ problems. For instance, if the original context diff is
+
+ *** patchlevel.h.orig <date here>
+ --- patchlevel.h <date here>
+ *** 38,43 ***
+ --- 38,44 ---
+ ,"FOO1235 - some patch"
+ ,"BAR3141 - another patch"
+ ,"BAZ2718 - and another patch"
+ + ,"MINE001 - my new patch"
+ ,NULL
+ };
+
+ please change it to
+ *** patchlevel.h.orig <date here>
+ --- patchlevel.h <date here>
+ *** 41,43 ***
+ --- 41,44 ---
+ + ,"MINE001 - my new patch"
+ ,NULL
+ };
+
+ (Note changes to line numbers as well as removal of context lines.)
+ This will prevent patch from choking if someone has previously
+ applied different patches than you.
+
+ History has shown that nobody distributes patches that also
+ modify patchlevel.h. Do it yourself. The following perl
+ program can be used to add a comment to patchlevel.h:
+
+#!perl
+die "Usage: perl -x patchlevel.h comment ..." unless @ARGV;
+open PLIN, "patchlevel.h" or die "Couldn't open patchlevel.h : $!";
+open PLOUT, ">patchlevel.new" or die "Couldn't write on patchlevel.new : $!";
+my $seen=0;
+while (<PLIN>) {
+ if (/\t,NULL/ and $seen) {
+ while (my $c = shift @ARGV){
+ print PLOUT qq{\t,"$c"\n};
+ }
+ }
+ $seen++ if /local_patches\[\]/;
+ print PLOUT;
+}
+close PLOUT or die "Couldn't close filehandle writing to patchlevel.new : $!";
+close PLIN or die "Couldn't close filehandle reading from patchlevel.h : $!";
+close DATA; # needed to allow unlink to work win32.
+unlink "patchlevel.bak" or warn "Couldn't unlink patchlevel.bak : $!"
+ if -e "patchlevel.bak";
+rename "patchlevel.h", "patchlevel.bak" or
+ die "Couldn't rename patchlevel.h to patchlevel.bak : $!";
+rename "patchlevel.new", "patchlevel.h" or
+ die "Couldn't rename patchlevel.new to patchlevel.h : $!";
+__END__
+
+Please keep empty lines below so that context diffs of this file do
+not ever collect the lines belonging to local_patches() into the same
+hunk.
+
+ */
+
+#if !defined(PERL_PATCHLEVEL_H_IMPLICIT) && !defined(LOCAL_PATCH_COUNT)
+# if defined(PERL_IS_MINIPERL)
+# define PERL_PATCHNUM "UNKNOWN-miniperl"
+# define PERL_GIT_UNPUSHED_COMMITS /*leave-this-comment*/
+# elif defined(PERL_MICRO)
+# define PERL_PATCHNUM "UNKNOWN-microperl"
+# define PERL_GIT_UNPUSHED_COMMITS /*leave-this-comment*/
+# else
+#include "git_version.h"
+# endif
+static const char * const local_patches[] = {
+ NULL
+#ifdef PERL_GIT_UNCOMMITTED_CHANGES
+ ,"uncommitted-changes"
+#endif
+ PERL_GIT_UNPUSHED_COMMITS /* do not remove this line */
+ ,NULL
+};
+
+
+
+/* Initial space prevents this variable from being inserted in config.sh */
+# define LOCAL_PATCH_COUNT \
+ ((int)(sizeof(local_patches)/sizeof(local_patches[0])-2))
+
+/* the old terms of reference, add them only when explicitly included */
+#define PATCHLEVEL PERL_VERSION
+#undef SUBVERSION /* OS/390 has a SUBVERSION in a system header */
+#define SUBVERSION PERL_SUBVERSION
+#endif
diff --git a/Master/tlpkg/tlperl/lib/CORE/perl.h b/Master/tlpkg/tlperl/lib/CORE/perl.h
new file mode 100644
index 00000000000..5988e7845a8
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perl.h
@@ -0,0 +1,6158 @@
+/* perl.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+ * 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef H_PERL
+#define H_PERL 1
+
+#ifdef PERL_FOR_X2P
+/*
+ * This file is being used for x2p stuff.
+ * Above symbol is defined via -D in 'x2p/Makefile.SH'
+ * Decouple x2p stuff from some of perls more extreme eccentricities.
+ */
+#undef MULTIPLICITY
+#undef USE_STDIO
+#define USE_STDIO
+#endif /* PERL_FOR_X2P */
+
+#if defined(DGUX)
+#include <sys/fcntl.h>
+#endif
+
+#ifdef VOIDUSED
+# undef VOIDUSED
+#endif
+#define VOIDUSED 1
+
+#ifdef PERL_MICRO
+# include "uconfig.h"
+#else
+# ifndef USE_CROSS_COMPILE
+# include "config.h"
+# else
+# include "xconfig.h"
+# endif
+#endif
+
+/* See L<perlguts/"The Perl API"> for detailed notes on
+ * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
+
+/* Note that from here --> to <-- the same logic is
+ * repeated in makedef.pl, so be certain to update
+ * both places when editing. */
+
+#ifdef PERL_IMPLICIT_SYS
+/* PERL_IMPLICIT_SYS implies PerlMemShared != PerlMem
+ so use slab allocator to avoid lots of MUTEX overhead
+ */
+# ifndef PL_OP_SLAB_ALLOC
+# define PL_OP_SLAB_ALLOC
+# endif
+#endif
+
+#ifdef USE_ITHREADS
+# if !defined(MULTIPLICITY)
+# define MULTIPLICITY
+# endif
+#endif
+
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+# ifndef PERL_GLOBAL_STRUCT
+# define PERL_GLOBAL_STRUCT
+# endif
+#endif
+
+#ifdef PERL_GLOBAL_STRUCT
+# ifndef MULTIPLICITY
+# define MULTIPLICITY
+# endif
+#endif
+
+#ifdef MULTIPLICITY
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+#endif
+
+/* undef WIN32 when building on Cygwin (for libwin32) - gph */
+#ifdef __CYGWIN__
+# undef WIN32
+# undef _WIN32
+#endif
+
+#if defined(__SYMBIAN32__) || (defined(__VC32__) && defined(WINS))
+# ifndef SYMBIAN
+# define SYMBIAN
+# endif
+#endif
+
+#ifdef __SYMBIAN32__
+# include "symbian/symbian_proto.h"
+#endif
+
+/* Any stack-challenged places. The limit varies (and often
+ * is configurable), but using more than a kilobyte of stack
+ * is usually dubious in these systems. */
+#if defined(EPOC) || defined(__SYMBIAN32__)
+/* EPOC/Symbian: need to work around the SDK features. *
+ * On WINS: MS VC5 generates calls to _chkstk, *
+ * if a "large" stack frame is allocated. *
+ * gcc on MARM does not generate calls like these. */
+# define USE_HEAP_INSTEAD_OF_STACK
+#endif
+
+#/* Use the reentrant APIs like localtime_r and getpwent_r */
+/* Win32 has naturally threadsafe libraries, no need to use any _r variants. */
+#if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(NETWARE) && !defined(WIN32) && !defined(PERL_DARWIN)
+# define USE_REENTRANT_API
+#endif
+
+/* <--- here ends the logic shared by perl.h and makedef.pl */
+
+/*
+ * PERL_DARWIN for MacOSX (__APPLE__ exists but is not officially sanctioned)
+ * (The -DPERL_DARWIN comes from the hints/darwin.sh.)
+ * __bsdi__ for BSD/OS
+ */
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(PERL_DARWIN) || defined(__bsdi__) || defined(BSD41) || defined(BSD42) || defined(BSD43) || defined(BSD44)
+# ifndef BSDish
+# define BSDish
+# endif
+#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
+
+#ifdef PERL_GLOBAL_STRUCT
+# ifndef PERL_GET_VARS
+# ifdef PERL_GLOBAL_STRUCT_PRIVATE
+ EXTERN_C struct perl_vars* Perl_GetVarsPrivate();
+# define PERL_GET_VARS() Perl_GetVarsPrivate() /* see miniperlmain.c */
+# ifndef PERLIO_FUNCS_CONST
+# define PERLIO_FUNCS_CONST /* Can't have these lying around. */
+# endif
+# else
+# define PERL_GET_VARS() PL_VarsPtr
+# endif
+# endif
+#endif
+
+#define pVAR register struct perl_vars* my_vars PERL_UNUSED_DECL
+
+#ifdef PERL_GLOBAL_STRUCT
+# define dVAR pVAR = (struct perl_vars*)PERL_GET_VARS()
+#else
+# define dVAR dNOOP
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+# ifndef MULTIPLICITY
+# define MULTIPLICITY
+# endif
+# define tTHX PerlInterpreter*
+# define pTHX register tTHX my_perl PERL_UNUSED_DECL
+# define aTHX my_perl
+# ifdef PERL_GLOBAL_STRUCT
+# define dTHXa(a) dVAR; pTHX = (tTHX)a
+# else
+# define dTHXa(a) pTHX = (tTHX)a
+# endif
+# ifdef PERL_GLOBAL_STRUCT
+# define dTHX dVAR; pTHX = PERL_GET_THX
+# else
+# define dTHX pTHX = PERL_GET_THX
+# endif
+# define pTHX_ pTHX,
+# define aTHX_ aTHX,
+# define pTHX_1 2
+# define pTHX_2 3
+# define pTHX_3 4
+# define pTHX_4 5
+# define pTHX_5 6
+# define pTHX_6 7
+# define pTHX_7 8
+# define pTHX_8 9
+# define pTHX_9 10
+# if defined(DEBUGGING) && !defined(PERL_TRACK_MEMPOOL)
+# define PERL_TRACK_MEMPOOL
+# endif
+#else
+# undef PERL_TRACK_MEMPOOL
+#endif
+
+#define STATIC static
+#define CPERLscope(x) x
+#define CPERLarg void
+#define CPERLarg_
+#define _CPERLarg
+#define PERL_OBJECT_THIS
+#define _PERL_OBJECT_THIS
+#define PERL_OBJECT_THIS_
+#define CALL_FPTR(fptr) (*fptr)
+
+#define CALLRUNOPS CALL_FPTR(PL_runops)
+
+#define CALLREGCOMP(sv, flags) Perl_pregcomp(aTHX_ (sv),(flags))
+
+#define CALLREGCOMP_ENG(prog, sv, flags) \
+ CALL_FPTR(((prog)->comp))(aTHX_ sv, flags)
+#define CALLREGEXEC(prog,stringarg,strend,strbeg,minend,screamer,data,flags) \
+ CALL_FPTR(RX_ENGINE(prog)->exec)(aTHX_ (prog),(stringarg),(strend), \
+ (strbeg),(minend),(screamer),(data),(flags))
+#define CALLREG_INTUIT_START(prog,sv,strpos,strend,flags,data) \
+ CALL_FPTR(RX_ENGINE(prog)->intuit)(aTHX_ (prog), (sv), (strpos), \
+ (strend),(flags),(data))
+#define CALLREG_INTUIT_STRING(prog) \
+ CALL_FPTR(RX_ENGINE(prog)->checkstr)(aTHX_ (prog))
+
+#define CALLREGFREE(prog) \
+ Perl_pregfree(aTHX_ (prog))
+
+#define CALLREGFREE_PVT(prog) \
+ if(prog) CALL_FPTR(RX_ENGINE(prog)->free)(aTHX_ (prog))
+
+#define CALLREG_NUMBUF_FETCH(rx,paren,usesv) \
+ CALL_FPTR(RX_ENGINE(rx)->numbered_buff_FETCH)(aTHX_ (rx),(paren),(usesv))
+
+#define CALLREG_NUMBUF_STORE(rx,paren,value) \
+ CALL_FPTR(RX_ENGINE(rx)->numbered_buff_STORE)(aTHX_ (rx),(paren),(value))
+
+#define CALLREG_NUMBUF_LENGTH(rx,sv,paren) \
+ CALL_FPTR(RX_ENGINE(rx)->numbered_buff_LENGTH)(aTHX_ (rx),(sv),(paren))
+
+#define CALLREG_NAMED_BUFF_FETCH(rx, key, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), (key), NULL, ((flags) | RXapif_FETCH))
+
+#define CALLREG_NAMED_BUFF_STORE(rx, key, value, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), (key), (value), ((flags) | RXapif_STORE))
+
+#define CALLREG_NAMED_BUFF_DELETE(rx, key, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx),(key), NULL, ((flags) | RXapif_DELETE))
+
+#define CALLREG_NAMED_BUFF_CLEAR(rx, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), NULL, NULL, ((flags) | RXapif_CLEAR))
+
+#define CALLREG_NAMED_BUFF_EXISTS(rx, key, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), (key), NULL, ((flags) | RXapif_EXISTS))
+
+#define CALLREG_NAMED_BUFF_FIRSTKEY(rx, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff_iter)(aTHX_ (rx), NULL, ((flags) | RXapif_FIRSTKEY))
+
+#define CALLREG_NAMED_BUFF_NEXTKEY(rx, lastkey, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff_iter)(aTHX_ (rx), (lastkey), ((flags) | RXapif_NEXTKEY))
+
+#define CALLREG_NAMED_BUFF_SCALAR(rx, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), NULL, NULL, ((flags) | RXapif_SCALAR))
+
+#define CALLREG_NAMED_BUFF_COUNT(rx) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), NULL, NULL, RXapif_REGNAMES_COUNT)
+
+#define CALLREG_NAMED_BUFF_ALL(rx, flags) \
+ CALL_FPTR(RX_ENGINE(rx)->named_buff)(aTHX_ (rx), NULL, NULL, flags)
+
+#define CALLREG_PACKAGE(rx) \
+ CALL_FPTR(RX_ENGINE(rx)->qr_package)(aTHX_ (rx))
+
+#if defined(USE_ITHREADS)
+#define CALLREGDUPE(prog,param) \
+ Perl_re_dup(aTHX_ (prog),(param))
+
+#define CALLREGDUPE_PVT(prog,param) \
+ (prog ? CALL_FPTR(RX_ENGINE(prog)->dupe)(aTHX_ (prog),(param)) \
+ : (REGEXP *)NULL)
+#endif
+
+
+
+
+
+/*
+ * Because of backward compatibility reasons the PERL_UNUSED_DECL
+ * cannot be changed from postfix to PERL_UNUSED_DECL(x). Sigh.
+ *
+ * Note that there are C compilers such as MetroWerks CodeWarrior
+ * which do not have an "inlined" way (like the gcc __attribute__) of
+ * marking unused variables (they need e.g. a #pragma) and therefore
+ * cpp macros like PERL_UNUSED_DECL cannot work for this purpose, even
+ * if it were PERL_UNUSED_DECL(x), which it cannot be (see above).
+ *
+ */
+
+#if defined(__SYMBIAN32__) && defined(__GNUC__)
+# ifdef __cplusplus
+# define PERL_UNUSED_DECL
+# else
+# define PERL_UNUSED_DECL __attribute__((unused))
+# endif
+#endif
+
+#ifndef PERL_UNUSED_DECL
+# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
+# define PERL_UNUSED_DECL __attribute__unused__
+# else
+# define PERL_UNUSED_DECL
+# endif
+#endif
+
+/* gcc -Wall:
+ * for silencing unused variables that are actually used most of the time,
+ * but we cannot quite get rid of, such as "ax" in PPCODE+noargs xsubs
+ */
+#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
+
+#ifdef USE_ITHREADS
+# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+#else
+# define PERL_UNUSED_CONTEXT
+#endif
+
+#define NOOP /*EMPTY*/(void)0
+#if !defined(HASATTRIBUTE_UNUSED) && defined(__cplusplus)
+#define dNOOP /*EMPTY*/(void)0 /* Older g++ has no __attribute((unused))__ */
+#else
+#define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef pTHX
+/* Don't bother defining tTHX and sTHX; using them outside
+ * code guarded by PERL_IMPLICIT_CONTEXT is an error.
+ */
+# define pTHX void
+# define pTHX_
+# define aTHX
+# define aTHX_
+# define dTHXa(a) dNOOP
+# define dTHX dNOOP
+# define pTHX_1 1
+# define pTHX_2 2
+# define pTHX_3 3
+# define pTHX_4 4
+# define pTHX_5 5
+# define pTHX_6 6
+# define pTHX_7 7
+# define pTHX_8 8
+# define pTHX_9 9
+#endif
+
+#ifndef dVAR
+# define dVAR dNOOP
+#endif
+
+/* these are only defined for compatibility; should not be used internally */
+#if !defined(pTHXo) && !defined(PERL_CORE)
+# define pTHXo pTHX
+# define pTHXo_ pTHX_
+# define aTHXo aTHX
+# define aTHXo_ aTHX_
+# define dTHXo dTHX
+# define dTHXoa(x) dTHXa(x)
+#endif
+
+#ifndef pTHXx
+# define pTHXx register PerlInterpreter *my_perl
+# define pTHXx_ pTHXx,
+# define aTHXx my_perl
+# define aTHXx_ aTHXx,
+# define dTHXx dTHX
+#endif
+
+/* Under PERL_IMPLICIT_SYS (used in Windows for fork emulation)
+ * PerlIO_foo() expands to PL_StdIO->pFOO(PL_StdIO, ...).
+ * dTHXs is therefore needed for all functions using PerlIO_foo(). */
+#ifdef PERL_IMPLICIT_SYS
+# ifdef PERL_GLOBAL_STRUCT_PRIVATE
+# define dTHXs dVAR; dTHX
+# else
+# define dTHXs dTHX
+# endif
+#else
+# ifdef PERL_GLOBAL_STRUCT_PRIVATE
+# define dTHXs dVAR
+# else
+# define dTHXs dNOOP
+# endif
+#endif
+
+/* Some platforms require marking function declarations
+ * for them to be exportable. Used in perlio.h, proto.h
+ * is handled either by the makedef.pl or by defining the
+ * PERL_CALLCONV to be something special. See also the
+ * definition of XS() in XSUB.h. */
+#ifndef PERL_EXPORT_C
+# ifdef __cplusplus
+# define PERL_EXPORT_C extern "C"
+# else
+# define PERL_EXPORT_C extern
+# endif
+#endif
+#ifndef PERL_XS_EXPORT_C
+# ifdef __cplusplus
+# define PERL_XS_EXPORT_C extern "C"
+# else
+# define PERL_XS_EXPORT_C
+# endif
+#endif
+
+#ifdef OP_IN_REGISTER
+# ifdef __GNUC__
+# define stringify_immed(s) #s
+# define stringify(s) stringify_immed(s)
+register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
+# endif
+#endif
+
+/* gcc (-ansi) -pedantic doesn't allow gcc statement expressions,
+ * g++ allows them but seems to have problems with them
+ * (insane errors ensue).
+ * g++ does not give insane errors now (RMB 2008-01-30, gcc 4.2.2).
+ */
+#if defined(PERL_GCC_PEDANTIC) || \
+ (defined(__GNUC__) && defined(__cplusplus) && \
+ ((__GNUC__ < 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ < 2))))
+# 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
+
+/*
+ * STMT_START { statements; } STMT_END;
+ * can be used as a single statement, as in
+ * if (x) STMT_START { ... } STMT_END; else ...
+ *
+ * Trying to select a version that gives no warnings...
+ */
+#if !(defined(STMT_START) && defined(STMT_END))
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define STMT_START (void)( /* gcc supports "({ STATEMENTS; })" */
+# define STMT_END )
+# else
+ /* Now which other defined()s do we need here ??? */
+# if (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
+#endif
+
+#define WITH_THX(s) STMT_START { dTHX; s; } STMT_END
+#define WITH_THR(s) WITH_THX(s)
+
+#ifndef BYTEORDER /* Should never happen -- byteorder is in config.h */
+# define BYTEORDER 0x1234
+#endif
+
+/* Overall memory policy? */
+#ifndef CONSERVATIVE
+# define LIBERAL 1
+#endif
+
+#if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90
+#define ASCIIish
+#else
+#undef ASCIIish
+#endif
+
+/*
+ * The following contortions are brought to you on behalf of all the
+ * standards, semi-standards, de facto standards, not-so-de-facto standards
+ * of the world, as well as all the other botches anyone ever thought of.
+ * The basic theory is that if we work hard enough here, the rest of the
+ * code can be a lot prettier. Well, so much for theory. Sorry, Henry...
+ */
+
+/* define this once if either system, instead of cluttering up the src */
+#if defined(MSDOS) || defined(atarist) || defined(WIN32) || defined(NETWARE)
+#define DOSISH 1
+#endif
+
+#if defined(__STDC__) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined(EPOC) || defined(NETWARE) || defined(__SYMBIAN32__)
+# define STANDARD_C 1
+#endif
+
+#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(__EMX__) || defined(__DGUX) || defined(EPOC) || defined(__QNX__) || defined(NETWARE) || defined(PERL_MICRO)
+# define DONT_DECLARE_STD 1
+#endif
+
+#if defined(HASVOLATILE) || defined(STANDARD_C)
+# define VOL volatile
+#else
+# define VOL
+#endif
+
+#define TAINT (PL_tainted = TRUE)
+#define TAINT_NOT (PL_tainted = FALSE)
+#define TAINT_IF(c) if (c) { PL_tainted = TRUE; }
+#define TAINT_ENV() if (PL_tainting) { taint_env(); }
+#define TAINT_PROPER(s) if (PL_tainting) { taint_proper(NULL, s); }
+
+/* XXX All process group stuff is handled in pp_sys.c. Should these
+ defines move there? If so, I could simplify this a lot. --AD 9/96.
+*/
+/* Process group stuff changed from traditional BSD to POSIX.
+ perlfunc.pod documents the traditional BSD-style syntax, so we'll
+ try to preserve that, if possible.
+*/
+#ifdef HAS_SETPGID
+# define BSD_SETPGRP(pid, pgrp) setpgid((pid), (pgrp))
+#else
+# if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
+# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
+# else
+# ifdef HAS_SETPGRP2 /* DG/UX */
+# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
+# endif
+# endif
+#endif
+#if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
+# define HAS_SETPGRP /* Well, effectively it does . . . */
+#endif
+
+/* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
+ our life easier :-) so we'll try it.
+*/
+#ifdef HAS_GETPGID
+# define BSD_GETPGRP(pid) getpgid((pid))
+#else
+# if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
+# define BSD_GETPGRP(pid) getpgrp((pid))
+# else
+# ifdef HAS_GETPGRP2 /* DG/UX */
+# define BSD_GETPGRP(pid) getpgrp2((pid))
+# endif
+# endif
+#endif
+#if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
+# define HAS_GETPGRP /* Well, effectively it does . . . */
+#endif
+
+/* These are not exact synonyms, since setpgrp() and getpgrp() may
+ have different behaviors, but perl.h used to define USE_BSDPGRP
+ (prior to 5.003_05) so some extension might depend on it.
+*/
+#if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
+# ifndef USE_BSDPGRP
+# define USE_BSDPGRP
+# endif
+#endif
+
+/* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
+ pthread.h must be included before all other header files.
+*/
+#if defined(USE_ITHREADS) && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD)
+# include <pthread.h>
+#endif
+
+#ifndef _TYPES_ /* If types.h defines this it's easy. */
+# ifndef major /* Does everyone's types.h define this? */
+# include <sys/types.h>
+# endif
+#endif
+
+#ifdef __cplusplus
+# ifndef I_STDARG
+# define I_STDARG 1
+# endif
+#endif
+
+#ifdef I_STDARG
+# include <stdarg.h>
+#else
+# ifdef I_VARARGS
+# include <varargs.h>
+# endif
+#endif
+
+#ifdef USE_NEXT_CTYPE
+
+#if NX_CURRENT_COMPILER_RELEASE >= 500
+# include <bsd/ctypes.h>
+#else
+# if NX_CURRENT_COMPILER_RELEASE >= 400
+# include <objc/NXCType.h>
+# else /* NX_CURRENT_COMPILER_RELEASE < 400 */
+# include <appkit/NXCType.h>
+# endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
+#endif /* NX_CURRENT_COMPILER_RELEASE >= 500 */
+
+#else /* !USE_NEXT_CTYPE */
+#include <ctype.h>
+#endif /* USE_NEXT_CTYPE */
+
+#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
+#undef METHOD
+#endif
+
+#ifdef PERL_MICRO
+# define NO_LOCALE
+#endif
+
+#ifdef I_LOCALE
+# include <locale.h>
+#endif
+
+#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
+# define USE_LOCALE
+# if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
+ && defined(HAS_STRXFRM)
+# define USE_LOCALE_COLLATE
+# endif
+# if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
+# define USE_LOCALE_CTYPE
+# endif
+# if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
+# define USE_LOCALE_NUMERIC
+# endif
+#endif /* !NO_LOCALE && HAS_SETLOCALE */
+
+#include <setjmp.h>
+
+#ifdef I_SYS_PARAM
+# ifdef PARAM_NEEDS_TYPES
+# include <sys/types.h>
+# endif
+# include <sys/param.h>
+#endif
+
+/* Use all the "standard" definitions? */
+#if defined(STANDARD_C) && defined(I_STDLIB)
+# include <stdlib.h>
+#endif
+
+/* If this causes problems, set i_unistd=undef in the hint file. */
+#ifdef I_UNISTD
+# include <unistd.h>
+#endif
+
+/* for WCOREDUMP */
+#ifdef I_SYS_WAIT
+# include <sys/wait.h>
+#endif
+
+#ifdef __SYMBIAN32__
+# undef _SC_ARG_MAX /* Symbian has _SC_ARG_MAX but no sysconf() */
+#endif
+
+#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO)
+EXTERN_C int syscall(int, ...);
+#endif
+
+#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO)
+EXTERN_C int usleep(unsigned int);
+#endif
+
+/* Funky places that do not have socket stuff. */
+#if defined(__LIBCATAMOUNT__)
+# define MYSWAP
+#endif
+
+#ifdef PERL_MICRO /* Last chance to export Perl_my_swap */
+# define MYSWAP
+#endif
+
+#ifdef PERL_CORE
+
+/* macros for correct constant construction */
+# if INTSIZE >= 2
+# define U16_CONST(x) ((U16)x##U)
+# else
+# define U16_CONST(x) ((U16)x##UL)
+# endif
+
+# if INTSIZE >= 4
+# define U32_CONST(x) ((U32)x##U)
+# else
+# define U32_CONST(x) ((U32)x##UL)
+# endif
+
+# ifdef HAS_QUAD
+# if INTSIZE >= 8
+# define U64_CONST(x) ((U64)x##U)
+# elif LONGSIZE >= 8
+# define U64_CONST(x) ((U64)x##UL)
+# elif QUADKIND == QUAD_IS_LONG_LONG
+# define U64_CONST(x) ((U64)x##ULL)
+# else /* best guess we can make */
+# define U64_CONST(x) ((U64)x##UL)
+# endif
+# endif
+
+/* byte-swapping functions for big-/little-endian conversion */
+# define _swab_16_(x) ((U16)( \
+ (((U16)(x) & U16_CONST(0x00ff)) << 8) | \
+ (((U16)(x) & U16_CONST(0xff00)) >> 8) ))
+
+# define _swab_32_(x) ((U32)( \
+ (((U32)(x) & U32_CONST(0x000000ff)) << 24) | \
+ (((U32)(x) & U32_CONST(0x0000ff00)) << 8) | \
+ (((U32)(x) & U32_CONST(0x00ff0000)) >> 8) | \
+ (((U32)(x) & U32_CONST(0xff000000)) >> 24) ))
+
+# ifdef HAS_QUAD
+# define _swab_64_(x) ((U64)( \
+ (((U64)(x) & U64_CONST(0x00000000000000ff)) << 56) | \
+ (((U64)(x) & U64_CONST(0x000000000000ff00)) << 40) | \
+ (((U64)(x) & U64_CONST(0x0000000000ff0000)) << 24) | \
+ (((U64)(x) & U64_CONST(0x00000000ff000000)) << 8) | \
+ (((U64)(x) & U64_CONST(0x000000ff00000000)) >> 8) | \
+ (((U64)(x) & U64_CONST(0x0000ff0000000000)) >> 24) | \
+ (((U64)(x) & U64_CONST(0x00ff000000000000)) >> 40) | \
+ (((U64)(x) & U64_CONST(0xff00000000000000)) >> 56) ))
+# endif
+
+/*----------------------------------------------------------------------------*/
+# if BYTEORDER == 0x1234 || BYTEORDER == 0x12345678 /* little-endian */
+/*----------------------------------------------------------------------------*/
+# define my_htole16(x) (x)
+# define my_letoh16(x) (x)
+# define my_htole32(x) (x)
+# define my_letoh32(x) (x)
+# define my_htobe16(x) _swab_16_(x)
+# define my_betoh16(x) _swab_16_(x)
+# define my_htobe32(x) _swab_32_(x)
+# define my_betoh32(x) _swab_32_(x)
+# ifdef HAS_QUAD
+# define my_htole64(x) (x)
+# define my_letoh64(x) (x)
+# define my_htobe64(x) _swab_64_(x)
+# define my_betoh64(x) _swab_64_(x)
+# endif
+# define my_htoles(x) (x)
+# define my_letohs(x) (x)
+# define my_htolei(x) (x)
+# define my_letohi(x) (x)
+# define my_htolel(x) (x)
+# define my_letohl(x) (x)
+# if SHORTSIZE == 1
+# define my_htobes(x) (x)
+# define my_betohs(x) (x)
+# elif SHORTSIZE == 2
+# define my_htobes(x) _swab_16_(x)
+# define my_betohs(x) _swab_16_(x)
+# elif SHORTSIZE == 4
+# define my_htobes(x) _swab_32_(x)
+# define my_betohs(x) _swab_32_(x)
+# elif SHORTSIZE == 8
+# define my_htobes(x) _swab_64_(x)
+# define my_betohs(x) _swab_64_(x)
+# else
+# define PERL_NEED_MY_HTOBES
+# define PERL_NEED_MY_BETOHS
+# endif
+# if INTSIZE == 1
+# define my_htobei(x) (x)
+# define my_betohi(x) (x)
+# elif INTSIZE == 2
+# define my_htobei(x) _swab_16_(x)
+# define my_betohi(x) _swab_16_(x)
+# elif INTSIZE == 4
+# define my_htobei(x) _swab_32_(x)
+# define my_betohi(x) _swab_32_(x)
+# elif INTSIZE == 8
+# define my_htobei(x) _swab_64_(x)
+# define my_betohi(x) _swab_64_(x)
+# else
+# define PERL_NEED_MY_HTOBEI
+# define PERL_NEED_MY_BETOHI
+# endif
+# if LONGSIZE == 1
+# define my_htobel(x) (x)
+# define my_betohl(x) (x)
+# elif LONGSIZE == 2
+# define my_htobel(x) _swab_16_(x)
+# define my_betohl(x) _swab_16_(x)
+# elif LONGSIZE == 4
+# define my_htobel(x) _swab_32_(x)
+# define my_betohl(x) _swab_32_(x)
+# elif LONGSIZE == 8
+# define my_htobel(x) _swab_64_(x)
+# define my_betohl(x) _swab_64_(x)
+# else
+# define PERL_NEED_MY_HTOBEL
+# define PERL_NEED_MY_BETOHL
+# endif
+# define my_htolen(p,n) NOOP
+# define my_letohn(p,n) NOOP
+# define my_htoben(p,n) my_swabn(p,n)
+# define my_betohn(p,n) my_swabn(p,n)
+/*----------------------------------------------------------------------------*/
+# elif BYTEORDER == 0x4321 || BYTEORDER == 0x87654321 /* big-endian */
+/*----------------------------------------------------------------------------*/
+# define my_htobe16(x) (x)
+# define my_betoh16(x) (x)
+# define my_htobe32(x) (x)
+# define my_betoh32(x) (x)
+# define my_htole16(x) _swab_16_(x)
+# define my_letoh16(x) _swab_16_(x)
+# define my_htole32(x) _swab_32_(x)
+# define my_letoh32(x) _swab_32_(x)
+# ifdef HAS_QUAD
+# define my_htobe64(x) (x)
+# define my_betoh64(x) (x)
+# define my_htole64(x) _swab_64_(x)
+# define my_letoh64(x) _swab_64_(x)
+# endif
+# define my_htobes(x) (x)
+# define my_betohs(x) (x)
+# define my_htobei(x) (x)
+# define my_betohi(x) (x)
+# define my_htobel(x) (x)
+# define my_betohl(x) (x)
+# if SHORTSIZE == 1
+# define my_htoles(x) (x)
+# define my_letohs(x) (x)
+# elif SHORTSIZE == 2
+# define my_htoles(x) _swab_16_(x)
+# define my_letohs(x) _swab_16_(x)
+# elif SHORTSIZE == 4
+# define my_htoles(x) _swab_32_(x)
+# define my_letohs(x) _swab_32_(x)
+# elif SHORTSIZE == 8
+# define my_htoles(x) _swab_64_(x)
+# define my_letohs(x) _swab_64_(x)
+# else
+# define PERL_NEED_MY_HTOLES
+# define PERL_NEED_MY_LETOHS
+# endif
+# if INTSIZE == 1
+# define my_htolei(x) (x)
+# define my_letohi(x) (x)
+# elif INTSIZE == 2
+# define my_htolei(x) _swab_16_(x)
+# define my_letohi(x) _swab_16_(x)
+# elif INTSIZE == 4
+# define my_htolei(x) _swab_32_(x)
+# define my_letohi(x) _swab_32_(x)
+# elif INTSIZE == 8
+# define my_htolei(x) _swab_64_(x)
+# define my_letohi(x) _swab_64_(x)
+# else
+# define PERL_NEED_MY_HTOLEI
+# define PERL_NEED_MY_LETOHI
+# endif
+# if LONGSIZE == 1
+# define my_htolel(x) (x)
+# define my_letohl(x) (x)
+# elif LONGSIZE == 2
+# define my_htolel(x) _swab_16_(x)
+# define my_letohl(x) _swab_16_(x)
+# elif LONGSIZE == 4
+# define my_htolel(x) _swab_32_(x)
+# define my_letohl(x) _swab_32_(x)
+# elif LONGSIZE == 8
+# define my_htolel(x) _swab_64_(x)
+# define my_letohl(x) _swab_64_(x)
+# else
+# define PERL_NEED_MY_HTOLEL
+# define PERL_NEED_MY_LETOHL
+# endif
+# define my_htolen(p,n) my_swabn(p,n)
+# define my_letohn(p,n) my_swabn(p,n)
+# define my_htoben(p,n) NOOP
+# define my_betohn(p,n) NOOP
+/*----------------------------------------------------------------------------*/
+# else /* all other byte-orders */
+/*----------------------------------------------------------------------------*/
+# define PERL_NEED_MY_HTOLE16
+# define PERL_NEED_MY_LETOH16
+# define PERL_NEED_MY_HTOBE16
+# define PERL_NEED_MY_BETOH16
+# define PERL_NEED_MY_HTOLE32
+# define PERL_NEED_MY_LETOH32
+# define PERL_NEED_MY_HTOBE32
+# define PERL_NEED_MY_BETOH32
+# ifdef HAS_QUAD
+# define PERL_NEED_MY_HTOLE64
+# define PERL_NEED_MY_LETOH64
+# define PERL_NEED_MY_HTOBE64
+# define PERL_NEED_MY_BETOH64
+# endif
+# define PERL_NEED_MY_HTOLES
+# define PERL_NEED_MY_LETOHS
+# define PERL_NEED_MY_HTOBES
+# define PERL_NEED_MY_BETOHS
+# define PERL_NEED_MY_HTOLEI
+# define PERL_NEED_MY_LETOHI
+# define PERL_NEED_MY_HTOBEI
+# define PERL_NEED_MY_BETOHI
+# define PERL_NEED_MY_HTOLEL
+# define PERL_NEED_MY_LETOHL
+# define PERL_NEED_MY_HTOBEL
+# define PERL_NEED_MY_BETOHL
+/*----------------------------------------------------------------------------*/
+# endif /* end of byte-order macros */
+/*----------------------------------------------------------------------------*/
+
+/* The old value was hard coded at 1008. (4096-16) seems to be a bit faster,
+ at least on FreeBSD. YMMV, so experiment. */
+#ifndef PERL_ARENA_SIZE
+#define PERL_ARENA_SIZE 4080
+#endif
+
+/* Maximum level of recursion */
+#ifndef PERL_SUB_DEPTH_WARN
+#define PERL_SUB_DEPTH_WARN 100
+#endif
+
+#endif /* PERL_CORE */
+
+/* We no longer default to creating a new SV for GvSV.
+ Do this before embed. */
+#ifndef PERL_CREATE_GVSV
+# ifndef PERL_DONT_CREATE_GVSV
+# define PERL_DONT_CREATE_GVSV
+# endif
+#endif
+
+#if !defined(HAS_WAITPID) && !defined(HAS_WAIT4) || defined(HAS_WAITPID_RUNTIME)
+#define PERL_USES_PL_PIDSTATUS
+#endif
+
+#if !defined(OS2) && !defined(WIN32) && !defined(DJGPP) && !defined(EPOC) && !defined(__SYMBIAN32__)
+#define PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
+#endif
+
+/* Cannot include embed.h here on Win32 as win32.h has not
+ yet been included and defines some config variables e.g. HAVE_INTERP_INTERN
+ */
+#if !defined(PERL_FOR_X2P) && !(defined(WIN32)||defined(VMS))
+# include "embed.h"
+# ifndef PERL_MAD
+# undef op_getmad
+# define op_getmad(arg,pegop,slot) NOOP
+# endif
+#endif
+
+#define MEM_SIZE Size_t
+
+/* Round all values passed to malloc up, by default to a multiple of
+ sizeof(size_t)
+*/
+#ifndef PERL_STRLEN_ROUNDUP_QUANTUM
+#define PERL_STRLEN_ROUNDUP_QUANTUM Size_t_size
+#endif
+
+#if defined(STANDARD_C) && defined(I_STDDEF)
+# include <stddef.h>
+# define STRUCT_OFFSET(s,m) offsetof(s,m)
+#else
+# define STRUCT_OFFSET(s,m) (Size_t)(&(((s *)0)->m))
+#endif
+
+#ifndef __SYMBIAN32__
+# if defined(I_STRING) || defined(__cplusplus)
+# include <string.h>
+# else
+# include <strings.h>
+# endif
+#endif
+
+/* This comes after <stdlib.h> so we don't try to change the standard
+ * library prototypes; we'll use our own in proto.h instead. */
+
+#ifdef MYMALLOC
+# ifdef PERL_POLLUTE_MALLOC
+# ifndef PERL_EXTMALLOC_DEF
+# define Perl_malloc malloc
+# define Perl_calloc calloc
+# define Perl_realloc realloc
+# define Perl_mfree free
+# endif
+# else
+# define EMBEDMYMALLOC /* for compatibility */
+# endif
+
+# define safemalloc Perl_malloc
+# define safecalloc Perl_calloc
+# define saferealloc Perl_realloc
+# define safefree Perl_mfree
+# define CHECK_MALLOC_TOO_LATE_FOR_(code) STMT_START { \
+ if (!PL_tainting && MallocCfg_ptr[MallocCfg_cfg_env_read]) \
+ code; \
+ } STMT_END
+# define CHECK_MALLOC_TOO_LATE_FOR(ch) \
+ CHECK_MALLOC_TOO_LATE_FOR_(MALLOC_TOO_LATE_FOR(ch))
+# define panic_write2(s) write(2, s, strlen(s))
+# define CHECK_MALLOC_TAINT(newval) \
+ CHECK_MALLOC_TOO_LATE_FOR_( \
+ if (newval) { \
+ panic_write2("panic: tainting with $ENV{PERL_MALLOC_OPT}\n");\
+ exit(1); })
+# define MALLOC_CHECK_TAINT(argc,argv,env) STMT_START { \
+ if (doing_taint(argc,argv,env)) { \
+ MallocCfg_ptr[MallocCfg_skip_cfg_env] = 1; \
+ }} STMT_END;
+#else /* MYMALLOC */
+# define safemalloc safesysmalloc
+# define safecalloc safesyscalloc
+# define saferealloc safesysrealloc
+# define safefree safesysfree
+# define CHECK_MALLOC_TOO_LATE_FOR(ch) ((void)0)
+# define CHECK_MALLOC_TAINT(newval) ((void)0)
+# define MALLOC_CHECK_TAINT(argc,argv,env)
+#endif /* MYMALLOC */
+
+/* diag_listed_as: "-T" is on the #! line, it must also be used on the command line */
+#define TOO_LATE_FOR_(ch,what) Perl_croak(aTHX_ "\"-%c\" is on the #! line, it must also be used on the command line%s", (char)(ch), what)
+#define TOO_LATE_FOR(ch) TOO_LATE_FOR_(ch, "")
+#define MALLOC_TOO_LATE_FOR(ch) TOO_LATE_FOR_(ch, " with $ENV{PERL_MALLOC_OPT}")
+#define MALLOC_CHECK_TAINT2(argc,argv) MALLOC_CHECK_TAINT(argc,argv,NULL)
+
+#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
+#define strchr index
+#define strrchr rindex
+#endif
+
+#ifdef I_MEMORY
+# include <memory.h>
+#endif
+
+#ifdef HAS_MEMCPY
+# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+# ifndef memcpy
+ extern char * memcpy (char*, char*, int);
+# endif
+# endif
+#else
+# ifndef memcpy
+# ifdef HAS_BCOPY
+# define memcpy(d,s,l) bcopy(s,d,l)
+# else
+# define memcpy(d,s,l) my_bcopy(s,d,l)
+# endif
+# endif
+#endif /* HAS_MEMCPY */
+
+#ifdef HAS_MEMSET
+# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+# ifndef memset
+ extern char *memset (char*, int, int);
+# endif
+# endif
+#else
+# undef memset
+# define memset(d,c,l) my_memset(d,c,l)
+#endif /* HAS_MEMSET */
+
+#if !defined(HAS_MEMMOVE) && !defined(memmove)
+# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
+# define memmove(d,s,l) bcopy(s,d,l)
+# else
+# if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
+# define memmove(d,s,l) memcpy(d,s,l)
+# else
+# define memmove(d,s,l) my_bcopy(s,d,l)
+# endif
+# endif
+#endif
+
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
+# undef HAS_MEMCMP
+#endif
+
+#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
+# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+# ifndef memcmp
+ extern int memcmp (char*, char*, int);
+# endif
+# endif
+# ifdef BUGGY_MSC
+# pragma function(memcmp)
+# endif
+#else
+# ifndef memcmp
+# define memcmp my_memcmp
+# endif
+#endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
+
+#ifndef memzero
+# ifdef HAS_MEMSET
+# define memzero(d,l) memset(d,0,l)
+# else
+# ifdef HAS_BZERO
+# define memzero(d,l) bzero(d,l)
+# else
+# define memzero(d,l) my_bzero(d,l)
+# endif
+# endif
+#endif
+
+#ifndef PERL_MICRO
+#ifndef memchr
+# ifndef HAS_MEMCHR
+# define memchr(s,c,n) ninstr((char*)(s), ((char*)(s)) + n, &(c), &(c) + 1)
+# endif
+#endif
+#endif
+
+#ifndef HAS_BCMP
+# ifndef bcmp
+# define bcmp(s1,s2,l) memcmp(s1,s2,l)
+# endif
+#endif /* !HAS_BCMP */
+
+#ifdef I_NETINET_IN
+# include <netinet/in.h>
+#endif
+
+#ifdef I_ARPA_INET
+# include <arpa/inet.h>
+#endif
+
+#if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
+/* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
+ * (the neo-BSD seem to do this). */
+# undef SF_APPEND
+#endif
+
+#ifdef I_SYS_STAT
+# include <sys/stat.h>
+#endif
+
+/* Microsoft VC's sys/stat.h defines all S_Ixxx macros except S_IFIFO.
+ This definition should ideally go into win32/win32.h, but S_IFIFO is
+ used later here in perl.h before win32/win32.h is being included. */
+#if !defined(S_IFIFO) && defined(_S_IFIFO)
+# define S_IFIFO _S_IFIFO
+#endif
+
+/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
+ like UTekV) are broken, sometimes giving false positives. Undefine
+ them here and let the code below set them to proper values.
+
+ The ghs macro stands for GreenHills Software C-1.8.5 which
+ is the C compiler for sysV88 and the various derivatives.
+ This header file bug is corrected in gcc-2.5.8 and later versions.
+ --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94. */
+
+#if defined(uts) || (defined(m88k) && defined(ghs))
+# undef S_ISDIR
+# undef S_ISCHR
+# undef S_ISBLK
+# undef S_ISREG
+# undef S_ISFIFO
+# undef S_ISLNK
+#endif
+
+#ifdef I_TIME
+# include <time.h>
+#endif
+
+#ifdef I_SYS_TIME
+# ifdef I_SYS_TIME_KERNEL
+# define KERNEL
+# endif
+# include <sys/time.h>
+# ifdef I_SYS_TIME_KERNEL
+# undef KERNEL
+# endif
+#endif
+
+#if defined(HAS_TIMES) && defined(I_SYS_TIMES)
+# include <sys/times.h>
+#endif
+
+#if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
+# undef HAS_STRERROR
+#endif
+
+#include <errno.h>
+
+#if defined(WIN32) && defined(PERL_IMPLICIT_SYS)
+# define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */
+#endif
+
+/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one.
+ * This is important for using IPv6.
+ * For OSF/1 3.2, however, defining _SOCKADDR_LEN would be
+ * a bad idea since it breaks send() and recv(). */
+#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN) && !defined(DEC_OSF1_3_X)
+# define _SOCKADDR_LEN
+#endif
+
+#if defined(HAS_SOCKET) && !defined(VMS) && !defined(WIN32) /* VMS/WIN32 handle sockets via vmsish.h/win32.h */
+# include <sys/socket.h>
+# if defined(USE_SOCKS) && defined(I_SOCKS)
+# if !defined(INCLUDE_PROTOTYPES)
+# define INCLUDE_PROTOTYPES /* for <socks.h> */
+# define PERL_SOCKS_NEED_PROTOTYPES
+# endif
+# include <socks.h>
+# ifdef PERL_SOCKS_NEED_PROTOTYPES /* keep cpp space clean */
+# undef INCLUDE_PROTOTYPES
+# undef PERL_SOCKS_NEED_PROTOTYPES
+# endif
+# endif
+# ifdef I_NETDB
+# ifdef NETWARE
+# include<stdio.h>
+# endif
+# include <netdb.h>
+# endif
+# ifndef ENOTSOCK
+# ifdef I_NET_ERRNO
+# include <net/errno.h>
+# endif
+# endif
+#endif
+
+/* sockatmark() is so new (2001) that many places might have it hidden
+ * behind some -D_BLAH_BLAH_SOURCE guard. The __THROW magic is required
+ * e.g. in Gentoo, see http://bugs.gentoo.org/show_bug.cgi?id=12605 */
+#if defined(HAS_SOCKATMARK) && !defined(HAS_SOCKATMARK_PROTO)
+# if defined(__THROW) && defined(__GLIBC__)
+int sockatmark(int) __THROW;
+# else
+int sockatmark(int);
+# endif
+#endif
+
+#if defined(__osf__) && defined(__cplusplus) && !defined(_XOPEN_SOURCE_EXTENDED) /* Tru64 "cxx" (C++), see hints/dec_osf.sh for why the _XOPEN_SOURCE_EXTENDED cannot be defined. */
+EXTERN_C int fchdir(int);
+EXTERN_C int flock(int, int);
+EXTERN_C int fseeko(FILE *, off_t, int);
+EXTERN_C off_t ftello(FILE *);
+#endif
+
+#if defined(__SUNPRO_CC) /* SUNWspro CC (C++) */
+EXTERN_C char *crypt(const char *, const char *);
+EXTERN_C char **environ;
+#endif
+
+#if defined(__cplusplus)
+# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+EXTERN_C char **environ;
+# elif defined(__CYGWIN__)
+EXTERN_C char *crypt(const char *, const char *);
+#endif
+#endif
+
+#ifdef SETERRNO
+# undef SETERRNO /* SOCKS might have defined this */
+#endif
+
+#ifdef VMS
+# define SETERRNO(errcode,vmserrcode) \
+ STMT_START { \
+ set_errno(errcode); \
+ set_vaxc_errno(vmserrcode); \
+ } STMT_END
+# define dSAVEDERRNO int saved_errno; unsigned saved_vms_errno
+# define dSAVE_ERRNO int saved_errno = errno; unsigned saved_vms_errno = vaxc$errno
+# define SAVE_ERRNO ( saved_errno = errno, saved_vms_errno = vaxc$errno )
+# define RESTORE_ERRNO SETERRNO(saved_errno, saved_vms_errno)
+
+# define LIB_INVARG LIB$_INVARG
+# define RMS_DIR RMS$_DIR
+# define RMS_FAC RMS$_FAC
+# define RMS_FEX RMS$_FEX
+# define RMS_FNF RMS$_FNF
+# define RMS_IFI RMS$_IFI
+# define RMS_ISI RMS$_ISI
+# define RMS_PRV RMS$_PRV
+# define SS_ACCVIO SS$_ACCVIO
+# define SS_DEVOFFLINE SS$_DEVOFFLINE
+# define SS_IVCHAN SS$_IVCHAN
+# define SS_NORMAL SS$_NORMAL
+#else
+# define SETERRNO(errcode,vmserrcode) (errno = (errcode))
+# define dSAVEDERRNO int saved_errno
+# define dSAVE_ERRNO int saved_errno = errno
+# define SAVE_ERRNO (saved_errno = errno)
+# define RESTORE_ERRNO (errno = saved_errno)
+
+# define LIB_INVARG 0
+# define RMS_DIR 0
+# define RMS_FAC 0
+# define RMS_FEX 0
+# define RMS_FNF 0
+# define RMS_IFI 0
+# define RMS_ISI 0
+# define RMS_PRV 0
+# define SS_ACCVIO 0
+# define SS_DEVOFFLINE 0
+# define SS_IVCHAN 0
+# define SS_NORMAL 0
+#endif
+
+#define ERRSV GvSVn(PL_errgv)
+
+#define CLEAR_ERRSV() STMT_START { \
+ if (!GvSV(PL_errgv)) { \
+ sv_setpvs(GvSV(gv_add_by_type(PL_errgv, SVt_PV)), ""); \
+ } else if (SvREADONLY(GvSV(PL_errgv))) { \
+ SvREFCNT_dec(GvSV(PL_errgv)); \
+ GvSV(PL_errgv) = newSVpvs(""); \
+ } else { \
+ SV *const errsv = GvSV(PL_errgv); \
+ sv_setpvs(errsv, ""); \
+ if (SvMAGICAL(errsv)) { \
+ mg_free(errsv); \
+ } \
+ SvPOK_only(errsv); \
+ } \
+ } STMT_END
+
+
+#ifdef PERL_CORE
+# define DEFSV (0 + GvSVn(PL_defgv))
+#else
+# define DEFSV GvSVn(PL_defgv)
+#endif
+#define DEFSV_set(sv) (GvSV(PL_defgv) = (sv))
+#define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
+
+#define ERRHV GvHV(PL_errgv) /* XXX unused, here for compatibility */
+
+#ifndef errno
+ extern int errno; /* ANSI allows errno to be an lvalue expr.
+ * For example in multithreaded environments
+ * something like this might happen:
+ * extern int *_errno(void);
+ * #define errno (*_errno()) */
+#endif
+
+#ifdef HAS_STRERROR
+# ifdef VMS
+ char *strerror (int,...);
+# else
+#ifndef DONT_DECLARE_STD
+ char *strerror (int);
+#endif
+# endif
+# ifndef Strerror
+# define Strerror strerror
+# endif
+#else
+# ifdef HAS_SYS_ERRLIST
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+# ifndef Strerror
+# define Strerror(e) \
+ ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
+# endif
+# endif
+#endif
+
+#ifdef I_SYS_IOCTL
+# ifndef _IOCTL_
+# include <sys/ioctl.h>
+# endif
+#endif
+
+#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
+# ifdef HAS_SOCKETPAIR
+# undef HAS_SOCKETPAIR
+# endif
+# ifdef I_NDBM
+# undef I_NDBM
+# endif
+#endif
+
+#ifndef HAS_SOCKETPAIR
+# ifdef HAS_SOCKET
+# define socketpair Perl_my_socketpair
+# endif
+#endif
+
+#if INTSIZE == 2
+# define htoni htons
+# define ntohi ntohs
+#else
+# define htoni htonl
+# define ntohi ntohl
+#endif
+
+/* Configure already sets Direntry_t */
+#if defined(I_DIRENT)
+# include <dirent.h>
+ /* NeXT needs dirent + sys/dir.h */
+# if defined(I_SYS_DIR) && (defined(NeXT) || defined(__NeXT__))
+# include <sys/dir.h>
+# endif
+#else
+# ifdef I_SYS_NDIR
+# include <sys/ndir.h>
+# else
+# ifdef I_SYS_DIR
+# ifdef hp9000s500
+# include <ndir.h> /* may be wrong in the future */
+# else
+# include <sys/dir.h>
+# endif
+# endif
+# endif
+#endif
+
+#ifdef PERL_MICRO
+# ifndef DIR
+# define DIR void
+# endif
+#endif
+
+#ifdef FPUTS_BOTCH
+/* work around botch in SunOS 4.0.1 and 4.0.2 */
+# ifndef fputs
+# define fputs(sv,fp) fprintf(fp,"%s",sv)
+# endif
+#endif
+
+/*
+ * The following gobbledygook brought to you on behalf of __STDC__.
+ * (I could just use #ifndef __STDC__, but this is more bulletproof
+ * in the face of half-implementations.)
+ */
+
+#if defined(I_SYSMODE) && !defined(PERL_MICRO)
+#include <sys/mode.h>
+#endif
+
+#ifndef S_IFMT
+# ifdef _S_IFMT
+# define S_IFMT _S_IFMT
+# else
+# define S_IFMT 0170000
+# endif
+#endif
+
+#ifndef S_ISDIR
+# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
+#endif
+
+#ifndef S_ISCHR
+# define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR)
+#endif
+
+#ifndef S_ISBLK
+# ifdef S_IFBLK
+# define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK)
+# else
+# define S_ISBLK(m) (0)
+# endif
+#endif
+
+#ifndef S_ISREG
+# define S_ISREG(m) ((m & S_IFMT) == S_IFREG)
+#endif
+
+#ifndef S_ISFIFO
+# ifdef S_IFIFO
+# define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO)
+# else
+# define S_ISFIFO(m) (0)
+# endif
+#endif
+
+#ifndef S_ISLNK
+# ifdef _S_ISLNK
+# define S_ISLNK(m) _S_ISLNK(m)
+# else
+# ifdef _S_IFLNK
+# define S_ISLNK(m) ((m & S_IFMT) == _S_IFLNK)
+# else
+# ifdef S_IFLNK
+# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK)
+# else
+# define S_ISLNK(m) (0)
+# endif
+# endif
+# endif
+#endif
+
+#ifndef S_ISSOCK
+# ifdef _S_ISSOCK
+# define S_ISSOCK(m) _S_ISSOCK(m)
+# else
+# ifdef _S_IFSOCK
+# define S_ISSOCK(m) ((m & S_IFMT) == _S_IFSOCK)
+# else
+# ifdef S_IFSOCK
+# define S_ISSOCK(m) ((m & S_IFMT) == S_IFSOCK)
+# else
+# define S_ISSOCK(m) (0)
+# endif
+# endif
+# endif
+#endif
+
+#ifndef S_IRUSR
+# ifdef S_IREAD
+# define S_IRUSR S_IREAD
+# define S_IWUSR S_IWRITE
+# define S_IXUSR S_IEXEC
+# else
+# define S_IRUSR 0400
+# define S_IWUSR 0200
+# define S_IXUSR 0100
+# endif
+#endif
+
+#ifndef S_IRGRP
+# ifdef S_IRUSR
+# define S_IRGRP (S_IRUSR>>3)
+# define S_IWGRP (S_IWUSR>>3)
+# define S_IXGRP (S_IXUSR>>3)
+# else
+# define S_IRGRP 0040
+# define S_IWGRP 0020
+# define S_IXGRP 0010
+# endif
+#endif
+
+#ifndef S_IROTH
+# ifdef S_IRUSR
+# define S_IROTH (S_IRUSR>>6)
+# define S_IWOTH (S_IWUSR>>6)
+# define S_IXOTH (S_IXUSR>>6)
+# else
+# define S_IROTH 0040
+# define S_IWOTH 0020
+# define S_IXOTH 0010
+# endif
+#endif
+
+#ifndef S_ISUID
+# define S_ISUID 04000
+#endif
+
+#ifndef S_ISGID
+# define S_ISGID 02000
+#endif
+
+#ifndef S_IRWXU
+# define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
+#endif
+
+#ifndef S_IRWXG
+# define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
+#endif
+
+#ifndef S_IRWXO
+# define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
+#endif
+
+/* BeOS 5.0 and Haiku R1 seem to define S_IREAD and S_IWRITE in <posix/fcntl.h>
+ * which would get included through <sys/file.h >, but that is 3000
+ * lines in the future. --jhi */
+
+#if !defined(S_IREAD) && !(defined(__BEOS__) || defined(__HAIKU__))
+# define S_IREAD S_IRUSR
+#endif
+
+#if !defined(S_IWRITE) && !(defined(__BEOS__) || defined(__HAIKU__))
+# define S_IWRITE S_IWUSR
+#endif
+
+#ifndef S_IEXEC
+# define S_IEXEC S_IXUSR
+#endif
+
+#ifdef ff_next
+# undef ff_next
+#endif
+
+#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
+# define SLOPPYDIVIDE
+#endif
+
+#ifdef UV
+#undef UV
+#endif
+
+#ifdef SPRINTF_E_BUG
+# define sprintf UTS_sprintf_wrap
+#endif
+
+/* For the times when you want the return value of sprintf, and you want it
+ to be the length. Can't have a thread variable passed in, because C89 has
+ no varargs macros.
+*/
+#ifdef SPRINTF_RETURNS_STRLEN
+# define my_sprintf sprintf
+#else
+# define my_sprintf Perl_my_sprintf
+#endif
+
+/*
+ * If we have v?snprintf() and the C99 variadic macros, we can just
+ * use just the v?snprintf(). It is nice to try to trap the buffer
+ * overflow, however, so if we are DEBUGGING, and we cannot use the
+ * gcc statement expressions, then use the function wrappers which try
+ * to trap the overflow. If we can use the gcc statement expressions,
+ * we can try that even with the version that uses the C99 variadic
+ * macros.
+ */
+
+/* Note that we do not check against snprintf()/vsnprintf() returning
+ * negative values because that is non-standard behaviour and we use
+ * snprintf/vsnprintf only iff HAS_VSNPRINTF has been defined, and
+ * that should be true only if the snprintf()/vsnprintf() are true
+ * to the standard. */
+
+#if defined(HAS_SNPRINTF) && defined(HAS_C99_VARIADIC_MACROS) && !(defined(DEBUGGING) && !defined(PERL_USE_GCC_BRACE_GROUPS)) && !defined(PERL_GCC_PEDANTIC)
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define my_snprintf(buffer, len, ...) ({ int __len__ = snprintf(buffer, len, __VA_ARGS__); if ((len) > 0 && (Size_t)__len__ >= (len)) Perl_croak_nocontext("panic: snprintf buffer overflow"); __len__; })
+# define PERL_MY_SNPRINTF_GUARDED
+# else
+# define my_snprintf(buffer, len, ...) snprintf(buffer, len, __VA_ARGS__)
+# endif
+#else
+# define my_snprintf Perl_my_snprintf
+# define PERL_MY_SNPRINTF_GUARDED
+#endif
+
+#if defined(HAS_VSNPRINTF) && defined(HAS_C99_VARIADIC_MACROS) && !(defined(DEBUGGING) && !defined(PERL_USE_GCC_BRACE_GROUPS)) && !defined(PERL_GCC_PEDANTIC)
+# ifdef PERL_USE_GCC_BRACE_GROUPS
+# define my_vsnprintf(buffer, len, ...) ({ int __len__ = vsnprintf(buffer, len, __VA_ARGS__); if ((len) > 0 && (Size_t)__len__ >= (len)) Perl_croak_nocontext("panic: vsnprintf buffer overflow"); __len__; })
+# define PERL_MY_VSNPRINTF_GUARDED
+# else
+# define my_vsnprintf(buffer, len, ...) vsnprintf(buffer, len, __VA_ARGS__)
+# endif
+#else
+# define my_vsnprintf Perl_my_vsnprintf
+# define PERL_MY_VSNPRINTF_GUARDED
+#endif
+
+#ifdef HAS_STRLCAT
+# define my_strlcat strlcat
+#else
+# define my_strlcat Perl_my_strlcat
+#endif
+
+#ifdef HAS_STRLCPY
+# define my_strlcpy strlcpy
+#else
+# define my_strlcpy Perl_my_strlcpy
+#endif
+
+/* Configure gets this right but the UTS compiler gets it wrong.
+ -- Hal Morris <hom00@utsglobal.com> */
+#ifdef UTS
+# undef UVTYPE
+# define UVTYPE unsigned
+#endif
+
+/*
+ The IV type is supposed to be long enough to hold any integral
+ value or a pointer.
+ --Andy Dougherty August 1996
+*/
+
+typedef IVTYPE IV;
+typedef UVTYPE UV;
+
+#if defined(USE_64_BIT_INT) && defined(HAS_QUAD)
+# if QUADKIND == QUAD_IS_INT64_T && defined(INT64_MAX)
+# define IV_MAX INT64_MAX
+# define IV_MIN INT64_MIN
+# define UV_MAX UINT64_MAX
+# ifndef UINT64_MIN
+# define UINT64_MIN 0
+# endif
+# define UV_MIN UINT64_MIN
+# else
+# define IV_MAX PERL_QUAD_MAX
+# define IV_MIN PERL_QUAD_MIN
+# define UV_MAX PERL_UQUAD_MAX
+# define UV_MIN PERL_UQUAD_MIN
+# endif
+# define IV_IS_QUAD
+# define UV_IS_QUAD
+#else
+# if defined(INT32_MAX) && IVSIZE == 4
+# define IV_MAX INT32_MAX
+# define IV_MIN INT32_MIN
+# ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */
+# define UV_MAX UINT32_MAX
+# else
+# define UV_MAX 4294967295U
+# endif
+# ifndef UINT32_MIN
+# define UINT32_MIN 0
+# endif
+# define UV_MIN UINT32_MIN
+# else
+# define IV_MAX PERL_LONG_MAX
+# define IV_MIN PERL_LONG_MIN
+# define UV_MAX PERL_ULONG_MAX
+# define UV_MIN PERL_ULONG_MIN
+# endif
+# if IVSIZE == 8
+# define IV_IS_QUAD
+# define UV_IS_QUAD
+# ifndef HAS_QUAD
+# define HAS_QUAD
+# endif
+# else
+# undef IV_IS_QUAD
+# undef UV_IS_QUAD
+# undef HAS_QUAD
+# endif
+#endif
+
+#ifndef HAS_QUAD
+# undef PERL_NEED_MY_HTOLE64
+# undef PERL_NEED_MY_LETOH64
+# undef PERL_NEED_MY_HTOBE64
+# undef PERL_NEED_MY_BETOH64
+#endif
+
+#if defined(uts) || defined(UTS)
+# undef UV_MAX
+# define UV_MAX (4294967295u)
+#endif
+
+#define IV_DIG (BIT_DIGITS(IVSIZE * 8))
+#define UV_DIG (BIT_DIGITS(UVSIZE * 8))
+
+#ifndef NO_PERL_PRESERVE_IVUV
+#define PERL_PRESERVE_IVUV /* We like our integers to stay integers. */
+#endif
+
+/*
+ * The macros INT2PTR and NUM2PTR are (despite their names)
+ * bi-directional: they will convert int/float to or from pointers.
+ * However the conversion to int/float are named explicitly:
+ * PTR2IV, PTR2UV, PTR2NV.
+ *
+ * For int conversions we do not need two casts if pointers are
+ * the same size as IV and UV. Otherwise we need an explicit
+ * cast (PTRV) to avoid compiler warnings.
+ */
+#if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+# define PTRV UV
+# define INT2PTR(any,d) (any)(d)
+#else
+# if PTRSIZE == LONGSIZE
+# define PTRV unsigned long
+# define PTR2ul(p) (unsigned long)(p)
+# else
+# define PTRV unsigned
+# endif
+#endif
+
+#ifndef INT2PTR
+# define INT2PTR(any,d) (any)(PTRV)(d)
+#endif
+
+#ifndef PTR2ul
+# define PTR2ul(p) INT2PTR(unsigned long,p)
+#endif
+
+#define NUM2PTR(any,d) (any)(PTRV)(d)
+#define PTR2IV(p) INT2PTR(IV,p)
+#define PTR2UV(p) INT2PTR(UV,p)
+#define PTR2NV(p) NUM2PTR(NV,p)
+#define PTR2nat(p) (PTRV)(p) /* pointer to integer of PTRSIZE */
+
+/* According to strict ANSI C89 one cannot freely cast between
+ * data pointers and function (code) pointers. There are at least
+ * two ways around this. One (used below) is to do two casts,
+ * first the other pointer to an (unsigned) integer, and then
+ * the integer to the other pointer. The other way would be
+ * to use unions to "overlay" the pointers. For an example of
+ * the latter technique, see union dirpu in struct xpvio in sv.h.
+ * The only feasible use is probably temporarily storing
+ * function pointers in a data pointer (such as a void pointer). */
+
+#define DPTR2FPTR(t,p) ((t)PTR2nat(p)) /* data pointer to function pointer */
+#define FPTR2DPTR(t,p) ((t)PTR2nat(p)) /* function pointer to data pointer */
+
+#ifdef USE_LONG_DOUBLE
+# if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE == DOUBLESIZE
+# define LONG_DOUBLE_EQUALS_DOUBLE
+# endif
+# if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
+# undef USE_LONG_DOUBLE /* Ouch! */
+# endif
+#endif
+
+#ifdef OVR_DBL_DIG
+/* Use an overridden DBL_DIG */
+# ifdef DBL_DIG
+# undef DBL_DIG
+# endif
+# define DBL_DIG OVR_DBL_DIG
+#else
+/* The following is all to get DBL_DIG, in order to pick a nice
+ default value for printing floating point numbers in Gconvert
+ (see config.h). (It also has other uses, such as figuring out if
+ a given precision of printing can be done with a double instead of
+ a long double - Allen).
+*/
+#ifdef I_LIMITS
+#include <limits.h>
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifndef HAS_DBL_DIG
+#define DBL_DIG 15 /* A guess that works lots of places */
+#endif
+#endif
+
+#ifdef OVR_LDBL_DIG
+/* Use an overridden LDBL_DIG */
+# ifdef LDBL_DIG
+# undef LDBL_DIG
+# endif
+# define LDBL_DIG OVR_LDBL_DIG
+#else
+/* The following is all to get LDBL_DIG, in order to pick a nice
+ default value for printing floating point numbers in Gconvert.
+ (see config.h)
+*/
+# ifdef I_LIMITS
+# include <limits.h>
+# endif
+# ifdef I_FLOAT
+# include <float.h>
+# endif
+# ifndef HAS_LDBL_DIG
+# if LONG_DOUBLESIZE == 10
+# define LDBL_DIG 18 /* assume IEEE */
+# else
+# if LONG_DOUBLESIZE == 12
+# define LDBL_DIG 18 /* gcc? */
+# else
+# if LONG_DOUBLESIZE == 16
+# define LDBL_DIG 33 /* assume IEEE */
+# else
+# if LONG_DOUBLESIZE == DOUBLESIZE
+# define LDBL_DIG DBL_DIG /* bummer */
+# endif
+# endif
+# endif
+# endif
+# endif
+#endif
+
+/*
+ * This is for making sure we have a good DBL_MAX value, if possible,
+ * either for usage as NV_MAX or for usage in figuring out if we can
+ * fit a given long double into a double, if bug-fixing makes it
+ * necessary to do so. - Allen <allens@cpan.org>
+ */
+
+#ifdef I_LIMITS
+# include <limits.h>
+#endif
+
+#ifdef I_VALUES
+# if !(defined(DBL_MIN) && defined(DBL_MAX) && defined(I_LIMITS))
+# include <values.h>
+# if defined(MAXDOUBLE) && !defined(DBL_MAX)
+# define DBL_MAX MAXDOUBLE
+# endif
+# if defined(MINDOUBLE) && !defined(DBL_MIN)
+# define DBL_MIN MINDOUBLE
+# endif
+# endif
+#endif /* defined(I_VALUES) */
+
+typedef NVTYPE NV;
+
+#ifdef I_IEEEFP
+# include <ieeefp.h>
+#endif
+
+#ifdef USE_LONG_DOUBLE
+# ifdef I_SUNMATH
+# include <sunmath.h>
+# endif
+# define NV_DIG LDBL_DIG
+# ifdef LDBL_MANT_DIG
+# define NV_MANT_DIG LDBL_MANT_DIG
+# endif
+# ifdef LDBL_MIN
+# define NV_MIN LDBL_MIN
+# endif
+# ifdef LDBL_MAX
+# define NV_MAX LDBL_MAX
+# endif
+# ifdef LDBL_MIN_10_EXP
+# define NV_MIN_10_EXP LDBL_MIN_10_EXP
+# endif
+# ifdef LDBL_MAX_10_EXP
+# define NV_MAX_10_EXP LDBL_MAX_10_EXP
+# endif
+# ifdef LDBL_EPSILON
+# define NV_EPSILON LDBL_EPSILON
+# endif
+# ifdef LDBL_MAX
+# define NV_MAX LDBL_MAX
+/* Having LDBL_MAX doesn't necessarily mean that we have LDBL_MIN... -Allen */
+# else
+# ifdef HUGE_VALL
+# define NV_MAX HUGE_VALL
+# else
+# ifdef HUGE_VAL
+# define NV_MAX ((NV)HUGE_VAL)
+# endif
+# endif
+# endif
+# ifdef HAS_SQRTL
+# define Perl_cos cosl
+# define Perl_sin sinl
+# define Perl_sqrt sqrtl
+# define Perl_exp expl
+# define Perl_log logl
+# define Perl_atan2 atan2l
+# define Perl_pow powl
+# define Perl_floor floorl
+# define Perl_ceil ceill
+# define Perl_fmod fmodl
+# endif
+/* e.g. libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
+# ifdef HAS_MODFL
+# define Perl_modf(x,y) modfl(x,y)
+/* eg glibc 2.2 series seems to provide modfl on ppc and arm, but has no
+ prototype in <math.h> */
+# ifndef HAS_MODFL_PROTO
+EXTERN_C long double modfl(long double, long double *);
+# endif
+# else
+# if defined(HAS_AINTL) && defined(HAS_COPYSIGNL)
+ extern long double Perl_my_modfl(long double x, long double *ip);
+# define Perl_modf(x,y) Perl_my_modfl(x,y)
+# endif
+# endif
+# ifdef HAS_FREXPL
+# define Perl_frexp(x,y) frexpl(x,y)
+# else
+# if defined(HAS_ILOGBL) && defined(HAS_SCALBNL)
+ extern long double Perl_my_frexpl(long double x, int *e);
+# define Perl_frexp(x,y) Perl_my_frexpl(x,y)
+# endif
+# endif
+# ifndef Perl_isnan
+# ifdef HAS_ISNANL
+# define Perl_isnan(x) isnanl(x)
+# endif
+# endif
+# ifndef Perl_isinf
+# ifdef HAS_FINITEL
+# define Perl_isinf(x) !(finitel(x)||Perl_isnan(x))
+# endif
+# endif
+#else
+# define NV_DIG DBL_DIG
+# ifdef DBL_MANT_DIG
+# define NV_MANT_DIG DBL_MANT_DIG
+# endif
+# ifdef DBL_MIN
+# define NV_MIN DBL_MIN
+# endif
+# ifdef DBL_MAX
+# define NV_MAX DBL_MAX
+# endif
+# ifdef DBL_MIN_10_EXP
+# define NV_MIN_10_EXP DBL_MIN_10_EXP
+# endif
+# ifdef DBL_MAX_10_EXP
+# define NV_MAX_10_EXP DBL_MAX_10_EXP
+# endif
+# ifdef DBL_EPSILON
+# define NV_EPSILON DBL_EPSILON
+# endif
+# ifdef DBL_MAX /* XXX Does DBL_MAX imply having DBL_MIN? */
+# define NV_MAX DBL_MAX
+# define NV_MIN DBL_MIN
+# else
+# ifdef HUGE_VAL
+# define NV_MAX HUGE_VAL
+# endif
+# endif
+# define Perl_cos cos
+# define Perl_sin sin
+# define Perl_sqrt sqrt
+# define Perl_exp exp
+# define Perl_log log
+# define Perl_atan2 atan2
+# define Perl_pow pow
+# define Perl_floor floor
+# define Perl_ceil ceil
+# define Perl_fmod fmod
+# define Perl_modf(x,y) modf(x,y)
+# define Perl_frexp(x,y) frexp(x,y)
+#endif
+
+/* rumor has it that Win32 has _fpclass() */
+
+/* SGI has fpclassl... but not with the same result values,
+ * and it's via a typedef (not via #define), so will need to redo Configure
+ * to use. Not worth the trouble, IMO, at least until the below is used
+ * more places. Also has fp_class_l, BTW, via fp_class.h. Feel free to check
+ * with me for the SGI manpages, SGI testing, etcetera, if you want to
+ * try getting this to work with IRIX. - Allen <allens@cpan.org> */
+
+#if !defined(Perl_fp_class) && (defined(HAS_FPCLASS)||defined(HAS_FPCLASSL))
+# ifdef I_IEEFP
+# include <ieeefp.h>
+# endif
+# ifdef I_FP
+# include <fp.h>
+# endif
+# if defined(USE_LONG_DOUBLE) && defined(HAS_FPCLASSL)
+# define Perl_fp_class() fpclassl(x)
+# else
+# define Perl_fp_class() fpclass(x)
+# endif
+# define Perl_fp_class_snan(x) (Perl_fp_class(x)==FP_CLASS_SNAN)
+# define Perl_fp_class_qnan(x) (Perl_fp_class(x)==FP_CLASS_QNAN)
+# define Perl_fp_class_nan(x) (Perl_fp_class(x)==FP_CLASS_SNAN||Perl_fp_class(x)==FP_CLASS_QNAN)
+# define Perl_fp_class_ninf(x) (Perl_fp_class(x)==FP_CLASS_NINF)
+# define Perl_fp_class_pinf(x) (Perl_fp_class(x)==FP_CLASS_PINF)
+# define Perl_fp_class_inf(x) (Perl_fp_class(x)==FP_CLASS_NINF||Perl_fp_class(x)==FP_CLASS_PINF)
+# define Perl_fp_class_nnorm(x) (Perl_fp_class(x)==FP_CLASS_NNORM)
+# define Perl_fp_class_pnorm(x) (Perl_fp_class(x)==FP_CLASS_PNORM)
+# define Perl_fp_class_norm(x) (Perl_fp_class(x)==FP_CLASS_NNORM||Perl_fp_class(x)==FP_CLASS_PNORM)
+# define Perl_fp_class_ndenorm(x) (Perl_fp_class(x)==FP_CLASS_NDENORM)
+# define Perl_fp_class_pdenorm(x) (Perl_fp_class(x)==FP_CLASS_PDENORM)
+# define Perl_fp_class_denorm(x) (Perl_fp_class(x)==FP_CLASS_NDENORM||Perl_fp_class(x)==FP_CLASS_PDENORM)
+# define Perl_fp_class_nzero(x) (Perl_fp_class(x)==FP_CLASS_NZERO)
+# define Perl_fp_class_pzero(x) (Perl_fp_class(x)==FP_CLASS_PZERO)
+# define Perl_fp_class_zero(x) (Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) && !defined(PERL_MICRO)
+# include <math.h>
+# if !defined(FP_SNAN) && defined(I_FP_CLASS)
+# include <fp_class.h>
+# endif
+# define Perl_fp_class(x) fp_class(x)
+# define Perl_fp_class_snan(x) (fp_class(x)==FP_SNAN)
+# define Perl_fp_class_qnan(x) (fp_class(x)==FP_QNAN)
+# define Perl_fp_class_nan(x) (fp_class(x)==FP_SNAN||fp_class(x)==FP_QNAN)
+# define Perl_fp_class_ninf(x) (fp_class(x)==FP_NEG_INF)
+# define Perl_fp_class_pinf(x) (fp_class(x)==FP_POS_INF)
+# define Perl_fp_class_inf(x) (fp_class(x)==FP_NEG_INF||fp_class(x)==FP_POS_INF)
+# define Perl_fp_class_nnorm(x) (fp_class(x)==FP_NEG_NORM)
+# define Perl_fp_class_pnorm(x) (fp_class(x)==FP_POS_NORM)
+# define Perl_fp_class_norm(x) (fp_class(x)==FP_NEG_NORM||fp_class(x)==FP_POS_NORM)
+# define Perl_fp_class_ndenorm(x) (fp_class(x)==FP_NEG_DENORM)
+# define Perl_fp_class_pdenorm(x) (fp_class(x)==FP_POS_DENORM)
+# define Perl_fp_class_denorm(x) (fp_class(x)==FP_NEG_DENORM||fp_class(x)==FP_POS_DENORM)
+# define Perl_fp_class_nzero(x) (fp_class(x)==FP_NEG_ZERO)
+# define Perl_fp_class_pzero(x) (fp_class(x)==FP_POS_ZERO)
+# define Perl_fp_class_zero(x) (fp_class(x)==FP_NEG_ZERO||fp_class(x)==FP_POS_ZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_FPCLASSIFY)
+# include <math.h>
+# define Perl_fp_class(x) fpclassify(x)
+# define Perl_fp_class_nan(x) (fp_classify(x)==FP_SNAN||fp_classify(x)==FP_QNAN)
+# define Perl_fp_class_inf(x) (fp_classify(x)==FP_INFINITE)
+# define Perl_fp_class_norm(x) (fp_classify(x)==FP_NORMAL)
+# define Perl_fp_class_denorm(x) (fp_classify(x)==FP_SUBNORMAL)
+# define Perl_fp_class_zero(x) (fp_classify(x)==FP_ZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_CLASS)
+# include <math.h>
+# ifndef _cplusplus
+# define Perl_fp_class(x) class(x)
+# else
+# define Perl_fp_class(x) _class(x)
+# endif
+# define Perl_fp_class_snan(x) (Perl_fp_class(x)==FP_NANS)
+# define Perl_fp_class_qnan(x) (Perl_fp_class(x)==FP_NANQ)
+# define Perl_fp_class_nan(x) (Perl_fp_class(x)==FP_SNAN||Perl_fp_class(x)==FP_QNAN)
+# define Perl_fp_class_ninf(x) (Perl_fp_class(x)==FP_MINUS_INF)
+# define Perl_fp_class_pinf(x) (Perl_fp_class(x)==FP_PLUS_INF)
+# define Perl_fp_class_inf(x) (Perl_fp_class(x)==FP_MINUS_INF||Perl_fp_class(x)==FP_PLUS_INF)
+# define Perl_fp_class_nnorm(x) (Perl_fp_class(x)==FP_MINUS_NORM)
+# define Perl_fp_class_pnorm(x) (Perl_fp_class(x)==FP_PLUS_NORM)
+# define Perl_fp_class_norm(x) (Perl_fp_class(x)==FP_MINUS_NORM||Perl_fp_class(x)==FP_PLUS_NORM)
+# define Perl_fp_class_ndenorm(x) (Perl_fp_class(x)==FP_MINUS_DENORM)
+# define Perl_fp_class_pdenorm(x) (Perl_fp_class(x)==FP_PLUS_DENORM)
+# define Perl_fp_class_denorm(x) (Perl_fp_class(x)==FP_MINUS_DENORM||Perl_fp_class(x)==FP_PLUS_DENORM)
+# define Perl_fp_class_nzero(x) (Perl_fp_class(x)==FP_MINUS_ZERO)
+# define Perl_fp_class_pzero(x) (Perl_fp_class(x)==FP_PLUS_ZERO)
+# define Perl_fp_class_zero(x) (Perl_fp_class(x)==FP_MINUS_ZERO||Perl_fp_class(x)==FP_PLUS_ZERO)
+#endif
+
+/* rumor has it that Win32 has _isnan() */
+
+#ifndef Perl_isnan
+# ifdef HAS_ISNAN
+# define Perl_isnan(x) isnan((NV)x)
+# else
+# ifdef Perl_fp_class_nan
+# define Perl_isnan(x) Perl_fp_class_nan(x)
+# else
+# ifdef HAS_UNORDERED
+# define Perl_isnan(x) unordered((x), 0.0)
+# else
+# define Perl_isnan(x) ((x)!=(x))
+# endif
+# endif
+# endif
+#endif
+
+#ifdef UNDER_CE
+int isnan(double d);
+#endif
+
+#ifndef Perl_isinf
+# ifdef HAS_ISINF
+# define Perl_isinf(x) isinf((NV)x)
+# else
+# ifdef Perl_fp_class_inf
+# define Perl_isinf(x) Perl_fp_class_inf(x)
+# else
+# define Perl_isinf(x) ((x)==NV_INF)
+# endif
+# endif
+#endif
+
+#ifndef Perl_isfinite
+# ifdef HAS_FINITE
+# define Perl_isfinite(x) finite((NV)x)
+# else
+# ifdef HAS_ISFINITE
+# define Perl_isfinite(x) isfinite(x)
+# else
+# ifdef Perl_fp_class_finite
+# define Perl_isfinite(x) Perl_fp_class_finite(x)
+# else
+# define Perl_isfinite(x) !(Perl_is_inf(x)||Perl_is_nan(x))
+# endif
+# endif
+# endif
+#endif
+
+/* The default is to use Perl's own atof() implementation (in numeric.c).
+ * Usually that is the one to use but for some platforms (e.g. UNICOS)
+ * it is however best to use the native implementation of atof.
+ * You can experiment with using your native one by -DUSE_PERL_ATOF=0.
+ * Some good tests to try out with either setting are t/base/num.t,
+ * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles
+ * you may need to be using a different function than atof! */
+
+#ifndef USE_PERL_ATOF
+# ifndef _UNICOS
+# define USE_PERL_ATOF
+# endif
+#else
+# if USE_PERL_ATOF == 0
+# undef USE_PERL_ATOF
+# endif
+#endif
+
+#ifdef USE_PERL_ATOF
+# define Perl_atof(s) Perl_my_atof(s)
+# define Perl_atof2(s, n) Perl_my_atof2(aTHX_ (s), &(n))
+#else
+# define Perl_atof(s) (NV)atof(s)
+# define Perl_atof2(s, n) ((n) = atof(s))
+#endif
+
+/* Previously these definitions used hardcoded figures.
+ * It is hoped these formula are more portable, although
+ * no data one way or another is presently known to me.
+ * The "PERL_" names are used because these calculated constants
+ * do not meet the ANSI requirements for LONG_MAX, etc., which
+ * need to be constants acceptable to #if - kja
+ * define PERL_LONG_MAX 2147483647L
+ * define PERL_LONG_MIN (-LONG_MAX - 1)
+ * define PERL ULONG_MAX 4294967295L
+ */
+
+#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
+# include <limits.h>
+#endif
+/* Included values.h above if necessary; still including limits.h down here,
+ * despite doing above, because math.h might have overriden... XXX - Allen */
+
+/*
+ * Try to figure out max and min values for the integral types. THE CORRECT
+ * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE. The
+ * following hacks are used if neither limits.h or values.h provide them:
+ * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
+ * for types < int: (unsigned TYPE)~(unsigned)0
+ * The argument to ~ must be unsigned so that later signed->unsigned
+ * conversion can't modify the value's bit pattern (e.g. -0 -> +0),
+ * and it must not be smaller than int because ~ does integral promotion.
+ * <type>_MAX: (<type>) (U<type>_MAX >> 1)
+ * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
+ * The latter is a hack which happens to work on some machines but
+ * does *not* catch any random system, or things like integer types
+ * with NaN if that is possible.
+ *
+ * All of the types are explicitly cast to prevent accidental loss of
+ * numeric range, and in the hope that they will be less likely to confuse
+ * over-eager optimizers.
+ *
+ */
+
+#define PERL_UCHAR_MIN ((unsigned char)0)
+
+#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
+
+/*
+ * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
+ * ambiguous. It may be equivalent to (signed char) or (unsigned char)
+ * depending on local options. Until Configure detects this (or at least
+ * detects whether the "signed" keyword is available) the CHAR ranges
+ * will not be included. UCHAR functions normally.
+ * - kja
+ */
+
+#define PERL_USHORT_MIN ((unsigned short)0)
+
+#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
+
+#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
+
+#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
+
+#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
+
+#define PERL_UINT_MIN ((unsigned int)0)
+
+#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
+
+#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
+
+#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
+
+#define PERL_ULONG_MIN ((unsigned long)0L)
+
+#ifdef LONG_MAX
+# define PERL_LONG_MAX ((long)LONG_MAX)
+#else
+# ifdef MAXLONG /* Often used in <values.h> */
+# define PERL_LONG_MAX ((long)MAXLONG)
+# else
+# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+# endif
+#endif
+
+#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
+
+#ifdef UV_IS_QUAD
+
+# define PERL_UQUAD_MAX (~(UV)0)
+# define PERL_UQUAD_MIN ((UV)0)
+# define PERL_QUAD_MAX ((IV) (PERL_UQUAD_MAX >> 1))
+# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+
+#endif
+
+#ifdef MYMALLOC
+# include "malloc_ctl.h"
+#endif
+
+struct RExC_state_t;
+struct _reg_trie_data;
+
+typedef MEM_SIZE STRLEN;
+
+#ifdef PERL_MAD
+typedef struct token TOKEN;
+typedef struct madprop MADPROP;
+typedef struct nexttoken NEXTTOKE;
+#endif
+typedef struct op OP;
+typedef struct cop COP;
+typedef struct unop UNOP;
+typedef struct binop BINOP;
+typedef struct listop LISTOP;
+typedef struct logop LOGOP;
+typedef struct pmop PMOP;
+typedef struct svop SVOP;
+typedef struct padop PADOP;
+typedef struct pvop PVOP;
+typedef struct loop LOOP;
+
+typedef struct interpreter PerlInterpreter;
+
+/* Amdahl's <ksync.h> has struct sv */
+/* SGI's <sys/sema.h> has struct sv */
+#if defined(UTS) || defined(__sgi)
+# define STRUCT_SV perl_sv
+#else
+# define STRUCT_SV sv
+#endif
+typedef struct STRUCT_SV SV;
+typedef struct av AV;
+typedef struct hv HV;
+typedef struct cv CV;
+typedef struct regexp ORANGE; /* This is the body structure. */
+typedef struct p5rx REGEXP;
+typedef struct gp GP;
+typedef struct gv GV;
+typedef struct io IO;
+typedef struct context PERL_CONTEXT;
+typedef struct block BLOCK;
+
+typedef struct magic MAGIC;
+typedef struct xpv XPV;
+typedef struct xpviv XPVIV;
+typedef struct xpvuv XPVUV;
+typedef struct xpvnv XPVNV;
+typedef struct xpvmg XPVMG;
+typedef struct xpvlv XPVLV;
+typedef struct xpvav XPVAV;
+typedef struct xpvhv XPVHV;
+typedef struct xpvgv XPVGV;
+typedef struct xpvcv XPVCV;
+typedef struct xpvbm XPVBM;
+typedef struct xpvfm XPVFM;
+typedef struct xpvio XPVIO;
+typedef struct mgvtbl MGVTBL;
+typedef union any ANY;
+typedef struct ptr_tbl_ent PTR_TBL_ENT_t;
+typedef struct ptr_tbl PTR_TBL_t;
+typedef struct clone_params CLONE_PARAMS;
+
+#include "handy.h"
+
+#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_RAWIO)
+# if LSEEKSIZE == 8 && !defined(USE_64_BIT_RAWIO)
+# define USE_64_BIT_RAWIO /* implicit */
+# endif
+#endif
+
+/* Notice the use of HAS_FSEEKO: now we are obligated to always use
+ * fseeko/ftello if possible. Don't go #defining ftell to ftello yourself,
+ * however, because operating systems like to do that themself. */
+#ifndef FSEEKSIZE
+# ifdef HAS_FSEEKO
+# define FSEEKSIZE LSEEKSIZE
+# else
+# define FSEEKSIZE LONGSIZE
+# endif
+#endif
+
+#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_STDIO)
+# if FSEEKSIZE == 8 && !defined(USE_64_BIT_STDIO)
+# define USE_64_BIT_STDIO /* implicit */
+# endif
+#endif
+
+#ifdef USE_64_BIT_RAWIO
+# ifdef HAS_OFF64_T
+# undef Off_t
+# define Off_t off64_t
+# undef LSEEKSIZE
+# define LSEEKSIZE 8
+# endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below. Some 64-bit environments,
+ * however, do not. Therefore we have to explicitly mix and match. */
+# if defined(USE_OPEN64)
+# define open open64
+# endif
+# if defined(USE_LSEEK64)
+# define lseek lseek64
+# else
+# if defined(USE_LLSEEK)
+# define lseek llseek
+# endif
+# endif
+# if defined(USE_STAT64)
+# define stat stat64
+# endif
+# if defined(USE_FSTAT64)
+# define fstat fstat64
+# endif
+# if defined(USE_LSTAT64)
+# define lstat lstat64
+# endif
+# if defined(USE_FLOCK64)
+# define flock flock64
+# endif
+# if defined(USE_LOCKF64)
+# define lockf lockf64
+# endif
+# if defined(USE_FCNTL64)
+# define fcntl fcntl64
+# endif
+# if defined(USE_TRUNCATE64)
+# define truncate truncate64
+# endif
+# if defined(USE_FTRUNCATE64)
+# define ftruncate ftruncate64
+# endif
+#endif
+
+#ifdef USE_64_BIT_STDIO
+# ifdef HAS_FPOS64_T
+# undef Fpos_t
+# define Fpos_t fpos64_t
+# endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below. Some 64-bit environments,
+ * however, do not. */
+# if defined(USE_FOPEN64)
+# define fopen fopen64
+# endif
+# if defined(USE_FSEEK64)
+# define fseek fseek64 /* don't do fseeko here, see perlio.c */
+# endif
+# if defined(USE_FTELL64)
+# define ftell ftell64 /* don't do ftello here, see perlio.c */
+# endif
+# if defined(USE_FSETPOS64)
+# define fsetpos fsetpos64
+# endif
+# if defined(USE_FGETPOS64)
+# define fgetpos fgetpos64
+# endif
+# if defined(USE_TMPFILE64)
+# define tmpfile tmpfile64
+# endif
+# if defined(USE_FREOPEN64)
+# define freopen freopen64
+# endif
+#endif
+
+#if defined(OS2)
+# include "iperlsys.h"
+#endif
+
+#if defined(__OPEN_VM)
+# include "vmesa/vmesaish.h"
+# define ISHISH "vmesa"
+#endif
+
+#ifdef DOSISH
+# if defined(OS2)
+# include "os2ish.h"
+# else
+# include "dosish.h"
+# endif
+# define ISHISH "dos"
+#endif
+
+#if defined(VMS)
+# include "vmsish.h"
+# include "embed.h"
+# ifndef PERL_MAD
+# undef op_getmad
+# define op_getmad(arg,pegop,slot) NOOP
+# endif
+# define ISHISH "vms"
+#endif
+
+#if defined(PLAN9)
+# include "./plan9/plan9ish.h"
+# define ISHISH "plan9"
+#endif
+
+#if defined(MPE)
+# include "mpeix/mpeixish.h"
+# define ISHISH "mpeix"
+#endif
+
+#if defined(__VOS__)
+# ifdef __GNUC__
+# include "./vos/vosish.h"
+# else
+# include "vos/vosish.h"
+# endif
+# define ISHISH "vos"
+#endif
+
+#if defined(EPOC)
+# include "epocish.h"
+# define ISHISH "epoc"
+#endif
+
+#ifdef __SYMBIAN32__
+# include "symbian/symbianish.h"
+# include "embed.h"
+# ifndef PERL_MAD
+# undef op_getmad
+# define op_getmad(arg,pegop,slot) NOOP
+# endif
+# define ISHISH "symbian"
+#endif
+
+
+#if defined(__HAIKU__)
+# include "haiku/haikuish.h"
+# define ISHISH "haiku"
+#elif defined(__BEOS__)
+# include "beos/beosish.h"
+# define ISHISH "beos"
+#endif
+
+#ifndef ISHISH
+# include "unixish.h"
+# define ISHISH "unix"
+#endif
+
+/* NSIG logic from Configure --> */
+/* Strange style to avoid deeply-nested #if/#else/#endif */
+#ifndef NSIG
+# ifdef _NSIG
+# define NSIG (_NSIG)
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef SIGMAX
+# define NSIG (SIGMAX+1)
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef SIG_MAX
+# define NSIG (SIG_MAX+1)
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef _SIG_MAX
+# define NSIG (_SIG_MAX+1)
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef MAXSIG
+# define NSIG (MAXSIG+1)
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef MAX_SIG
+# define NSIG (MAX_SIG+1)
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef SIGARRAYSIZE
+# define NSIG SIGARRAYSIZE /* Assume ary[SIGARRAYSIZE] */
+# endif
+#endif
+
+#ifndef NSIG
+# ifdef _sys_nsig
+# define NSIG (_sys_nsig) /* Solaris 2.5 */
+# endif
+#endif
+
+/* Default to some arbitrary number that's big enough to get most
+ of the common signals.
+*/
+#ifndef NSIG
+# define NSIG 50
+#endif
+/* <-- NSIG logic from Configure */
+
+#ifndef NO_ENVIRON_ARRAY
+# define USE_ENVIRON_ARRAY
+#endif
+
+/*
+ * initialise to avoid floating-point exceptions from overflow, etc
+ */
+#ifndef PERL_FPU_INIT
+# ifdef HAS_FPSETMASK
+# if HAS_FLOATINGPOINT_H
+# include <floatingpoint.h>
+# endif
+/* Some operating systems have this as a macro, which in turn expands to a comma
+ expression, and the last sub-expression is something that gets calculated,
+ and then they have the gall to warn that a value computed is not used. Hence
+ cast to void. */
+# define PERL_FPU_INIT (void)fpsetmask(0)
+# else
+# if defined(SIGFPE) && defined(SIG_IGN) && !defined(PERL_MICRO)
+# define PERL_FPU_INIT PL_sigfpe_saved = (Sighandler_t) signal(SIGFPE, SIG_IGN)
+# define PERL_FPU_PRE_EXEC { Sigsave_t xfpe; rsignal_save(SIGFPE, PL_sigfpe_saved, &xfpe);
+# define PERL_FPU_POST_EXEC rsignal_restore(SIGFPE, &xfpe); }
+# else
+# define PERL_FPU_INIT
+
+# endif
+# endif
+#endif
+#ifndef PERL_FPU_PRE_EXEC
+# define PERL_FPU_PRE_EXEC {
+# define PERL_FPU_POST_EXEC }
+#endif
+
+#ifndef PERL_SYS_INIT3_BODY
+# define PERL_SYS_INIT3_BODY(argvp,argcp,envp) PERL_SYS_INIT_BODY(argvp,argcp)
+#endif
+
+/*
+=for apidoc Am|void|PERL_SYS_INIT|int argc|char** argv
+Provides system-specific tune up of the C runtime environment necessary to
+run Perl interpreters. This should be called only once, before creating
+any Perl interpreters.
+
+=for apidoc Am|void|PERL_SYS_INIT3|int argc|char** argv|char** env
+Provides system-specific tune up of the C runtime environment necessary to
+run Perl interpreters. This should be called only once, before creating
+any Perl interpreters.
+
+=for apidoc Am|void|PERL_SYS_TERM|
+Provides system-specific clean up of the C runtime environment after
+running Perl interpreters. This should be called only once, after
+freeing any remaining Perl interpreters.
+
+=cut
+ */
+
+#define PERL_SYS_INIT(argc, argv) Perl_sys_init(argc, argv)
+#define PERL_SYS_INIT3(argc, argv, env) Perl_sys_init3(argc, argv, env)
+#define PERL_SYS_TERM() Perl_sys_term()
+
+#ifndef PERL_WRITE_MSG_TO_CONSOLE
+# define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) PerlIO_write(io, msg, len)
+#endif
+
+#ifndef MAXPATHLEN
+# ifdef PATH_MAX
+# ifdef _POSIX_PATH_MAX
+# if PATH_MAX > _POSIX_PATH_MAX
+/* POSIX 1990 (and pre) was ambiguous about whether PATH_MAX
+ * included the null byte or not. Later amendments of POSIX,
+ * XPG4, the Austin Group, and the Single UNIX Specification
+ * all explicitly include the null byte in the PATH_MAX.
+ * Ditto for _POSIX_PATH_MAX. */
+# define MAXPATHLEN PATH_MAX
+# else
+# define MAXPATHLEN _POSIX_PATH_MAX
+# endif
+# else
+# define MAXPATHLEN (PATH_MAX+1)
+# endif
+# else
+# ifdef _POSIX_PATH_MAX
+# define MAXPATHLEN _POSIX_PATH_MAX
+# else
+# define MAXPATHLEN 1024 /* Err on the large side. */
+# endif
+# endif
+#endif
+
+/* In case Configure was not used (we are using a "canned config"
+ * such as Win32, or a cross-compilation setup, for example) try going
+ * by the gcc major and minor versions. One useful URL is
+ * http://www.ohse.de/uwe/articles/gcc-attributes.html,
+ * but contrary to this information warn_unused_result seems
+ * not to be in gcc 3.3.5, at least. --jhi
+ * Also, when building extensions with an installed perl, this allows
+ * the user to upgrade gcc and get the right attributes, rather than
+ * relying on the list generated at Configure time. --AD
+ * Set these up now otherwise we get confused when some of the <*thread.h>
+ * includes below indirectly pull in <perlio.h> (which needs to know if we
+ * have HASATTRIBUTE_FORMAT).
+ */
+
+#ifndef PERL_MICRO
+#if defined __GNUC__ && !defined(__INTEL_COMPILER)
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 1 || __GNUC__ > 3 /* 3.1 -> */
+# define HASATTRIBUTE_DEPRECATED
+# endif
+# if __GNUC__ >= 3 /* 3.0 -> */ /* XXX Verify this version */
+# define HASATTRIBUTE_FORMAT
+# if defined __MINGW32__
+# define PRINTF_FORMAT_NULL_OK
+# endif
+# endif
+# if __GNUC__ >= 3 /* 3.0 -> */
+# define HASATTRIBUTE_MALLOC
+# endif
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || __GNUC__ > 3 /* 3.3 -> */
+# define HASATTRIBUTE_NONNULL
+# endif
+# if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 || __GNUC__ > 2 /* 2.5 -> */
+# define HASATTRIBUTE_NORETURN
+# endif
+# if __GNUC__ >= 3 /* gcc 3.0 -> */
+# define HASATTRIBUTE_PURE
+# endif
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */
+# define HASATTRIBUTE_UNUSED
+# endif
+# if __GNUC__ == 3 && __GNUC_MINOR__ == 3 && !defined(__cplusplus)
+# define HASATTRIBUTE_UNUSED /* gcc-3.3, but not g++-3.3. */
+# endif
+# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */
+# define HASATTRIBUTE_WARN_UNUSED_RESULT
+# endif
+#endif
+#endif /* #ifndef PERL_MICRO */
+
+/* USE_5005THREADS needs to be after unixish.h as <pthread.h> includes
+ * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
+ * this results in many functions being undeclared which bothers C++
+ * May make sense to have threads after "*ish.h" anyway
+ */
+
+#if defined(USE_ITHREADS)
+# ifdef NETWARE
+# include <nw5thread.h>
+# else
+# ifdef FAKE_THREADS
+# include "fakethr.h"
+# else
+# ifdef WIN32
+# include <win32thread.h>
+# else
+# ifdef OS2
+# include "os2thread.h"
+# else
+# ifdef I_MACH_CTHREADS
+# include <mach/cthreads.h>
+# if (defined(NeXT) || defined(__NeXT__)) && defined(PERL_POLLUTE_MALLOC)
+# define MUTEX_INIT_CALLS_MALLOC
+# endif
+typedef cthread_t perl_os_thread;
+typedef mutex_t perl_mutex;
+typedef condition_t perl_cond;
+typedef void * perl_key;
+# else /* Posix threads */
+# ifdef I_PTHREAD
+# include <pthread.h>
+# endif
+typedef pthread_t perl_os_thread;
+typedef pthread_mutex_t perl_mutex;
+typedef pthread_cond_t perl_cond;
+typedef pthread_key_t perl_key;
+# endif /* I_MACH_CTHREADS */
+# endif /* OS2 */
+# endif /* WIN32 */
+# endif /* FAKE_THREADS */
+#endif /* NETWARE */
+#endif /* USE_ITHREADS */
+
+#if defined(WIN32)
+# include "win32.h"
+#endif
+
+#ifdef NETWARE
+# include "netware.h"
+#endif
+
+#define STATUS_UNIX PL_statusvalue
+#ifdef VMS
+# define STATUS_NATIVE PL_statusvalue_vms
+/*
+ * vaxc$errno is only guaranteed to be valid if errno == EVMSERR, otherwise
+ * its contents can not be trusted. Unfortunately, Perl seems to check
+ * it on exit, so it when PL_statusvalue_vms is updated, vaxc$errno should
+ * be updated also.
+ */
+# include <stsdef.h>
+# include <ssdef.h>
+/* Presume this because if VMS changes it, it will require a new
+ * set of APIs for waiting on children for binary compatibility.
+ */
+# define child_offset_bits (8)
+# ifndef C_FAC_POSIX
+# define C_FAC_POSIX 0x35A000
+# endif
+
+/* STATUS_EXIT - validates and returns a NATIVE exit status code for the
+ * platform from the existing UNIX or Native status values.
+ */
+
+# define STATUS_EXIT \
+ (((I32)PL_statusvalue_vms == -1 ? SS$_ABORT : PL_statusvalue_vms) | \
+ (VMSISH_HUSHED ? STS$M_INHIB_MSG : 0))
+
+
+/* STATUS_NATIVE_CHILD_SET - Calculate UNIX status that matches the child
+ * exit code and shifts the UNIX value over the correct number of bits to
+ * be a child status. Usually the number of bits is 8, but that could be
+ * platform dependent. The NATIVE status code is presumed to have either
+ * from a child process.
+ */
+
+/* This is complicated. The child processes return a true native VMS
+ status which must be saved. But there is an assumption in Perl that
+ the UNIX child status has some relationship to errno values, so
+ Perl tries to translate it to text in some of the tests.
+ In order to get the string translation correct, for the error, errno
+ must be EVMSERR, but that generates a different text message
+ than what the test programs are expecting. So an errno value must
+ be derived from the native status value when an error occurs.
+ That will hide the true native status message. With this version of
+ perl, the true native child status can always be retrieved so that
+ is not a problem. But in this case, Pl_statusvalue and errno may
+ have different values in them.
+ */
+
+# define STATUS_NATIVE_CHILD_SET(n) \
+ STMT_START { \
+ I32 evalue = (I32)n; \
+ if (evalue == EVMSERR) { \
+ PL_statusvalue_vms = vaxc$errno; \
+ PL_statusvalue = evalue; \
+ } else { \
+ PL_statusvalue_vms = evalue; \
+ if (evalue == -1) { \
+ PL_statusvalue = -1; \
+ PL_statusvalue_vms = SS$_ABORT; /* Should not happen */ \
+ } else \
+ PL_statusvalue = Perl_vms_status_to_unix(evalue, 1); \
+ set_vaxc_errno(evalue); \
+ if ((PL_statusvalue_vms & C_FAC_POSIX) == C_FAC_POSIX) \
+ set_errno(EVMSERR); \
+ else set_errno(Perl_vms_status_to_unix(evalue, 0)); \
+ PL_statusvalue = PL_statusvalue << child_offset_bits; \
+ } \
+ } STMT_END
+
+# ifdef VMSISH_STATUS
+# define STATUS_CURRENT (VMSISH_STATUS ? STATUS_NATIVE : STATUS_UNIX)
+# else
+# define STATUS_CURRENT STATUS_UNIX
+# endif
+
+ /* STATUS_UNIX_SET - takes a UNIX/POSIX errno value and attempts to update
+ * the NATIVE status to an equivalent value. Can not be used to translate
+ * exit code values as exit code values are not guaranteed to have any
+ * relationship at all to errno values.
+ * This is used when Perl is forcing errno to have a specific value.
+ */
+# define STATUS_UNIX_SET(n) \
+ STMT_START { \
+ I32 evalue = (I32)n; \
+ PL_statusvalue = evalue; \
+ if (PL_statusvalue != -1) { \
+ if (PL_statusvalue != EVMSERR) { \
+ PL_statusvalue &= 0xFFFF; \
+ if (MY_POSIX_EXIT) \
+ PL_statusvalue_vms=PL_statusvalue ? SS$_ABORT : SS$_NORMAL;\
+ else PL_statusvalue_vms = Perl_unix_status_to_vms(evalue); \
+ } \
+ else { \
+ PL_statusvalue_vms = vaxc$errno; \
+ } \
+ } \
+ else PL_statusvalue_vms = SS$_ABORT; \
+ set_vaxc_errno(PL_statusvalue_vms); \
+ } STMT_END
+
+ /* STATUS_UNIX_EXIT_SET - Takes a UNIX/POSIX exit code and sets
+ * the NATIVE error status based on it.
+ *
+ * When in the default mode to comply with the Perl VMS documentation,
+ * 0 is a success and any other code sets the NATIVE status to a failure
+ * code of SS$_ABORT.
+ *
+ * In the new POSIX EXIT mode, native status will be set so that the
+ * actual exit code will can be retrieved by the calling program or
+ * shell.
+ *
+ * If the exit code is not clearly a UNIX parent or child exit status,
+ * it will be passed through as a VMS status.
+ */
+
+# define STATUS_UNIX_EXIT_SET(n) \
+ STMT_START { \
+ I32 evalue = (I32)n; \
+ PL_statusvalue = evalue; \
+ if (MY_POSIX_EXIT) { \
+ if (evalue <= 0xFF00) { \
+ if (evalue > 0xFF) \
+ evalue = (evalue >> child_offset_bits) & 0xFF; \
+ PL_statusvalue_vms = \
+ (C_FAC_POSIX | (evalue << 3 ) | \
+ ((evalue == 1) ? (STS$K_ERROR | STS$M_INHIB_MSG) : 1)); \
+ } else /* forgive them Perl, for they have sinned */ \
+ PL_statusvalue_vms = evalue; \
+ } else { \
+ if (evalue == 0) \
+ PL_statusvalue_vms = SS$_NORMAL; \
+ else if (evalue <= 0xFF00) \
+ PL_statusvalue_vms = SS$_ABORT; \
+ else { /* forgive them Perl, for they have sinned */ \
+ if (evalue != EVMSERR) PL_statusvalue_vms = evalue; \
+ else PL_statusvalue_vms = vaxc$errno; \
+ /* And obviously used a VMS status value instead of UNIX */ \
+ PL_statusvalue = EVMSERR; \
+ } \
+ set_vaxc_errno(PL_statusvalue_vms); \
+ } \
+ } STMT_END
+
+
+ /* STATUS_EXIT_SET - Takes a NATIVE/UNIX/POSIX exit code
+ * and sets the NATIVE error status based on it. This special case
+ * is needed to maintain compatibility with past VMS behavior.
+ *
+ * In the default mode on VMS, this number is passed through as
+ * both the NATIVE and UNIX status. Which makes it different
+ * that the STATUS_UNIX_EXIT_SET.
+ *
+ * In the new POSIX EXIT mode, native status will be set so that the
+ * actual exit code will can be retrieved by the calling program or
+ * shell.
+ *
+ * A POSIX exit code is from 0 to 255. If the exit code is higher
+ * than this, it needs to be assumed that it is a VMS exit code and
+ * passed through.
+ */
+
+# define STATUS_EXIT_SET(n) \
+ STMT_START { \
+ I32 evalue = (I32)n; \
+ PL_statusvalue = evalue; \
+ if (MY_POSIX_EXIT) \
+ if (evalue > 255) PL_statusvalue_vms = evalue; else { \
+ PL_statusvalue_vms = \
+ (C_FAC_POSIX | (evalue << 3 ) | \
+ ((evalue == 1) ? (STS$K_ERROR | STS$M_INHIB_MSG) : 1));} \
+ else \
+ PL_statusvalue_vms = evalue ? evalue : SS$_NORMAL; \
+ set_vaxc_errno(PL_statusvalue_vms); \
+ } STMT_END
+
+
+ /* This macro forces a success status */
+# define STATUS_ALL_SUCCESS \
+ (PL_statusvalue = 0, PL_statusvalue_vms = SS$_NORMAL)
+
+ /* This macro forces a failure status */
+# define STATUS_ALL_FAILURE (PL_statusvalue = 1, \
+ vaxc$errno = PL_statusvalue_vms = MY_POSIX_EXIT ? \
+ (C_FAC_POSIX | (1 << 3) | STS$K_ERROR | STS$M_INHIB_MSG) : SS$_ABORT)
+
+#else
+# define STATUS_NATIVE PL_statusvalue_posix
+# if defined(WCOREDUMP)
+# define STATUS_NATIVE_CHILD_SET(n) \
+ STMT_START { \
+ PL_statusvalue_posix = (n); \
+ if (PL_statusvalue_posix == -1) \
+ PL_statusvalue = -1; \
+ else { \
+ PL_statusvalue = \
+ (WIFEXITED(PL_statusvalue_posix) ? (WEXITSTATUS(PL_statusvalue_posix) << 8) : 0) | \
+ (WIFSIGNALED(PL_statusvalue_posix) ? (WTERMSIG(PL_statusvalue_posix) & 0x7F) : 0) | \
+ (WIFSIGNALED(PL_statusvalue_posix) && WCOREDUMP(PL_statusvalue_posix) ? 0x80 : 0); \
+ } \
+ } STMT_END
+# elif defined(WIFEXITED)
+# define STATUS_NATIVE_CHILD_SET(n) \
+ STMT_START { \
+ PL_statusvalue_posix = (n); \
+ if (PL_statusvalue_posix == -1) \
+ PL_statusvalue = -1; \
+ else { \
+ PL_statusvalue = \
+ (WIFEXITED(PL_statusvalue_posix) ? (WEXITSTATUS(PL_statusvalue_posix) << 8) : 0) | \
+ (WIFSIGNALED(PL_statusvalue_posix) ? (WTERMSIG(PL_statusvalue_posix) & 0x7F) : 0); \
+ } \
+ } STMT_END
+# else
+# define STATUS_NATIVE_CHILD_SET(n) \
+ STMT_START { \
+ PL_statusvalue_posix = (n); \
+ if (PL_statusvalue_posix == -1) \
+ PL_statusvalue = -1; \
+ else { \
+ PL_statusvalue = \
+ PL_statusvalue_posix & 0xFFFF; \
+ } \
+ } STMT_END
+# endif
+# define STATUS_UNIX_SET(n) \
+ STMT_START { \
+ PL_statusvalue = (n); \
+ if (PL_statusvalue != -1) \
+ PL_statusvalue &= 0xFFFF; \
+ } STMT_END
+# define STATUS_UNIX_EXIT_SET(n) STATUS_UNIX_SET(n)
+# define STATUS_EXIT_SET(n) STATUS_UNIX_SET(n)
+# define STATUS_CURRENT STATUS_UNIX
+# define STATUS_EXIT STATUS_UNIX
+# define STATUS_ALL_SUCCESS (PL_statusvalue = 0, PL_statusvalue_posix = 0)
+# define STATUS_ALL_FAILURE (PL_statusvalue = 1, PL_statusvalue_posix = 1)
+#endif
+
+/* flags in PL_exit_flags for nature of exit() */
+#define PERL_EXIT_EXPECTED 0x01
+#define PERL_EXIT_DESTRUCT_END 0x02 /* Run END in perl_destruct */
+
+#ifndef MEMBER_TO_FPTR
+# define MEMBER_TO_FPTR(name) name
+#endif
+
+#ifndef PERL_CORE
+/* format to use for version numbers in file/directory names */
+/* XXX move to Configure? */
+/* This was only ever used for the current version, and that can be done at
+ compile time, as PERL_FS_VERSION, so should we just delete it? */
+# ifndef PERL_FS_VER_FMT
+# define PERL_FS_VER_FMT "%d.%d.%d"
+# endif
+#endif
+
+#ifndef PERL_FS_VERSION
+# define PERL_FS_VERSION PERL_VERSION_STRING
+#endif
+
+/* This defines a way to flush all output buffers. This may be a
+ * performance issue, so we allow people to disable it. Also, if
+ * we are using stdio, there are broken implementations of fflush(NULL)
+ * out there, Solaris being the most prominent.
+ */
+#ifndef PERL_FLUSHALL_FOR_CHILD
+# if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
+# define PERL_FLUSHALL_FOR_CHILD PerlIO_flush((PerlIO*)NULL)
+# else
+# ifdef FFLUSH_ALL
+# define PERL_FLUSHALL_FOR_CHILD my_fflush_all()
+# else
+# define PERL_FLUSHALL_FOR_CHILD NOOP
+# endif
+# endif
+#endif
+
+#ifndef PERL_WAIT_FOR_CHILDREN
+# define PERL_WAIT_FOR_CHILDREN NOOP
+#endif
+
+/* the traditional thread-unsafe notion of "current interpreter". */
+#ifndef PERL_SET_INTERP
+# define PERL_SET_INTERP(i) (PL_curinterp = (PerlInterpreter*)(i))
+#endif
+
+#ifndef PERL_GET_INTERP
+# define PERL_GET_INTERP (PL_curinterp)
+#endif
+
+#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_GET_THX)
+# ifdef MULTIPLICITY
+# define PERL_GET_THX ((PerlInterpreter *)PERL_GET_CONTEXT)
+# endif
+# define PERL_SET_THX(t) PERL_SET_CONTEXT(t)
+#endif
+
+/*
+ This replaces the previous %_ "hack" by the "%p" hacks.
+ All that is required is that the perl source does not
+ use "%-p" or "%-<number>p" or "%<number>p" formats.
+ These formats will still work in perl code.
+ See comments in sv.c for futher details.
+
+ Robin Barker 2005-07-14
+
+ No longer use %1p for VDf = %vd. RMB 2007-10-19
+*/
+
+#ifndef SVf_
+# define SVf_(n) "-" STRINGIFY(n) "p"
+#endif
+
+#ifndef SVf
+# define SVf "-p"
+#endif
+
+#ifndef SVf32
+# define SVf32 SVf_(32)
+#endif
+
+#ifndef SVf256
+# define SVf256 SVf_(256)
+#endif
+
+#define SVfARG(p) ((void*)(p))
+
+#ifdef PERL_CORE
+/* not used; but needed for backward compatibilty with XS code? - RMB */
+# undef VDf
+#else
+# ifndef VDf
+# define VDf "vd"
+# endif
+#endif
+
+#ifdef PERL_CORE
+/* not used; but needed for backward compatibilty with XS code? - RMB */
+# undef UVf
+#else
+# ifndef UVf
+# define UVf UVuf
+# endif
+#endif
+
+#if !defined(PERL_CORE) && !defined(PERL_NO_SHORT_NAMES)
+# if defined(PERL_IMPLICIT_CONTEXT)
+# define pmflag(a,b) Perl_pmflag(aTHX_ a,b)
+# else
+# define pmflag Perl_pmflag
+# endif
+#endif
+
+#ifdef HASATTRIBUTE_DEPRECATED
+# define __attribute__deprecated__ __attribute__((deprecated))
+#endif
+#ifdef HASATTRIBUTE_FORMAT
+# define __attribute__format__(x,y,z) __attribute__((format(x,y,z)))
+#endif
+#ifdef HASATTRIBUTE_MALLOC
+# define __attribute__malloc__ __attribute__((__malloc__))
+#endif
+#ifdef HASATTRIBUTE_NONNULL
+# define __attribute__nonnull__(a) __attribute__((nonnull(a)))
+#endif
+#ifdef HASATTRIBUTE_NORETURN
+# define __attribute__noreturn__ __attribute__((noreturn))
+#endif
+#ifdef HASATTRIBUTE_PURE
+# define __attribute__pure__ __attribute__((pure))
+#endif
+#ifdef HASATTRIBUTE_UNUSED
+# define __attribute__unused__ __attribute__((unused))
+#endif
+#ifdef HASATTRIBUTE_WARN_UNUSED_RESULT
+# define __attribute__warn_unused_result__ __attribute__((warn_unused_result))
+#endif
+
+/* If we haven't defined the attributes yet, define them to blank. */
+#ifndef __attribute__deprecated__
+# define __attribute__deprecated__
+#endif
+#ifndef __attribute__format__
+# define __attribute__format__(x,y,z)
+#endif
+#ifndef __attribute__malloc__
+# define __attribute__malloc__
+#endif
+#ifndef __attribute__nonnull__
+# define __attribute__nonnull__(a)
+#endif
+#ifndef __attribute__noreturn__
+# define __attribute__noreturn__
+#endif
+#ifndef __attribute__pure__
+# define __attribute__pure__
+#endif
+#ifndef __attribute__unused__
+# define __attribute__unused__
+#endif
+#ifndef __attribute__warn_unused_result__
+# define __attribute__warn_unused_result__
+#endif
+
+/* For functions that are marked as __attribute__noreturn__, it's not
+ appropriate to call return. In either case, include the lint directive.
+ */
+#ifdef HASATTRIBUTE_NORETURN
+# define NORETURN_FUNCTION_END /* NOTREACHED */
+#else
+# define NORETURN_FUNCTION_END /* NOTREACHED */ return 0
+#endif
+
+/* Some OS warn on NULL format to printf */
+#ifdef PRINTF_FORMAT_NULL_OK
+# define __attribute__format__null_ok__(x,y,z) __attribute__format__(x,y,z)
+#else
+# define __attribute__format__null_ok__(x,y,z)
+#endif
+
+#ifdef HAS_BUILTIN_EXPECT
+# define EXPECT(expr,val) __builtin_expect(expr,val)
+#else
+# define EXPECT(expr,val) (expr)
+#endif
+#define LIKELY(cond) EXPECT(cond,1)
+#define UNLIKELY(cond) EXPECT(cond,0)
+#ifdef HAS_BUILTIN_CHOOSE_EXPR
+/* placeholder */
+#endif
+
+/* Some unistd.h's give a prototype for pause() even though
+ HAS_PAUSE ends up undefined. This causes the #define
+ below to be rejected by the compiler. Sigh.
+*/
+#ifdef HAS_PAUSE
+#define Pause pause
+#else
+#define Pause() sleep((32767<<16)+32767)
+#endif
+
+#ifndef IOCPARM_LEN
+# ifdef IOCPARM_MASK
+ /* on BSDish systems we're safe */
+# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
+# else
+# if defined(_IOC_SIZE) && defined(__GLIBC__)
+ /* on Linux systems we're safe; except when we're not [perl #38223] */
+# define IOCPARM_LEN(x) (_IOC_SIZE(x) < 256 ? 256 : _IOC_SIZE(x))
+# else
+ /* otherwise guess at what's safe */
+# define IOCPARM_LEN(x) 256
+# endif
+# endif
+#endif
+
+#if defined(__CYGWIN__)
+/* USEMYBINMODE
+ * This symbol, if defined, indicates that the program should
+ * use the routine my_binmode(FILE *fp, char iotype, int mode) to insure
+ * that a file is in "binary" mode -- that is, that no translation
+ * of bytes occurs on read or write operations.
+ */
+# define USEMYBINMODE /**/
+# include <io.h> /* for setmode() prototype */
+# define my_binmode(fp, iotype, mode) \
+ (PerlLIO_setmode(fileno(fp), mode) != -1 ? TRUE : FALSE)
+#endif
+
+#ifdef __CYGWIN__
+void init_os_extras(void);
+#endif
+
+#ifdef UNION_ANY_DEFINITION
+UNION_ANY_DEFINITION;
+#else
+union any {
+ void* any_ptr;
+ I32 any_i32;
+ IV any_iv;
+ long any_long;
+ bool any_bool;
+ void (*any_dptr) (void*);
+ void (*any_dxptr) (pTHX_ void*);
+};
+#endif
+
+typedef I32 (*filter_t) (pTHX_ int, SV *, int);
+
+#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
+#define FILTER_DATA(idx) \
+ (PL_parser ? AvARRAY(PL_parser->rsfp_filters)[idx] : NULL)
+#define FILTER_ISREADER(idx) \
+ (PL_parser && PL_parser->rsfp_filters \
+ && idx >= AvFILLp(PL_parser->rsfp_filters))
+#define PERL_FILTER_EXISTS(i) \
+ (PL_parser && PL_parser->rsfp_filters \
+ && (i) <= av_len(PL_parser->rsfp_filters))
+
+#if defined(_AIX) && !defined(_AIX43)
+#if defined(USE_REENTRANT) || defined(_REENTRANT) || defined(_THREAD_SAFE)
+/* We cannot include <crypt.h> to get the struct crypt_data
+ * because of setkey prototype problems when threading */
+typedef struct crypt_data { /* straight from /usr/include/crypt.h */
+ /* From OSF, Not needed in AIX
+ char C[28], D[28];
+ */
+ char E[48];
+ char KS[16][48];
+ char block[66];
+ char iobuf[16];
+} CRYPTD;
+#endif /* threading */
+#endif /* AIX */
+
+#if !defined(OS2)
+# include "iperlsys.h"
+#endif
+
+#ifdef __LIBCATAMOUNT__
+#undef HAS_PASSWD /* unixish.h but not unixish enough. */
+#undef HAS_GROUP
+#define FAKE_BIT_BUCKET
+#endif
+
+/* [perl #22371] Algorimic Complexity Attack on Perl 5.6.1, 5.8.0.
+ * Note that the USE_HASH_SEED and USE_HASH_SEED_EXPLICIT are *NOT*
+ * defined by Configure, despite their names being similar to the
+ * other defines like USE_ITHREADS. Configure in fact knows nothing
+ * about the randomised hashes. Therefore to enable/disable the hash
+ * randomisation defines use the Configure -Accflags=... instead. */
+#if !defined(NO_HASH_SEED) && !defined(USE_HASH_SEED) && !defined(USE_HASH_SEED_EXPLICIT)
+# define USE_HASH_SEED
+#endif
+
+/* Win32 defines a type 'WORD' in windef.h. This conflicts with the enumerator
+ * 'WORD' defined in perly.h. The yytokentype enum is only a debugging aid, so
+ * it's not really needed.
+ */
+#if defined(WIN32)
+# define YYTOKENTYPE
+#endif
+#include "perly.h"
+
+#ifdef PERL_MAD
+struct nexttoken {
+ YYSTYPE next_val; /* value of next token, if any */
+ I32 next_type; /* type of next token */
+ MADPROP *next_mad; /* everything else about that token */
+};
+#endif
+
+/* macros to define bit-fields in structs. */
+#ifndef PERL_BITFIELD8
+# define PERL_BITFIELD8 unsigned
+#endif
+#ifndef PERL_BITFIELD16
+# define PERL_BITFIELD16 unsigned
+#endif
+#ifndef PERL_BITFIELD32
+# define PERL_BITFIELD32 unsigned
+#endif
+
+#include "sv.h"
+#include "regexp.h"
+#include "util.h"
+#include "form.h"
+#include "gv.h"
+#include "pad.h"
+#include "cv.h"
+#include "opnames.h"
+#include "op.h"
+#include "hv.h"
+#include "cop.h"
+#include "av.h"
+#include "mg.h"
+#include "scope.h"
+#include "warnings.h"
+#include "utf8.h"
+
+/* defined in sv.c, but also used in [ach]v.c */
+#undef _XPV_HEAD
+#undef _XPVMG_HEAD
+#undef _XPVCV_COMMON
+
+typedef struct _sublex_info SUBLEXINFO;
+struct _sublex_info {
+ U8 super_state; /* lexer state to save */
+ U16 sub_inwhat; /* "lex_inwhat" to use */
+ OP *sub_op; /* "lex_op" to use */
+ char *super_bufptr; /* PL_parser->bufptr that was */
+ char *super_bufend; /* PL_parser->bufend that was */
+};
+
+#include "parser.h"
+
+typedef struct magic_state MGS; /* struct magic_state defined in mg.c */
+
+struct scan_data_t; /* Used in S_* functions in regcomp.c */
+struct regnode_charclass_class; /* Used in S_* functions in regcomp.c */
+
+/* Keep next first in this structure, because sv_free_arenas take
+ advantage of this to share code between the pte arenas and the SV
+ body arenas */
+struct ptr_tbl_ent {
+ struct ptr_tbl_ent* next;
+ const void* oldval;
+ void* newval;
+};
+
+struct ptr_tbl {
+ struct ptr_tbl_ent** tbl_ary;
+ UV tbl_max;
+ UV tbl_items;
+};
+
+#if defined(iAPX286) || defined(M_I286) || defined(I80286)
+# define I286
+#endif
+
+#if defined(htonl) && !defined(HAS_HTONL)
+#define HAS_HTONL
+#endif
+#if defined(htons) && !defined(HAS_HTONS)
+#define HAS_HTONS
+#endif
+#if defined(ntohl) && !defined(HAS_NTOHL)
+#define HAS_NTOHL
+#endif
+#if defined(ntohs) && !defined(HAS_NTOHS)
+#define HAS_NTOHS
+#endif
+#ifndef HAS_HTONL
+#if (BYTEORDER & 0xffff) != 0x4321
+#define HAS_HTONS
+#define HAS_HTONL
+#define HAS_NTOHS
+#define HAS_NTOHL
+#define MYSWAP
+#define htons my_swap
+#define htonl my_htonl
+#define ntohs my_swap
+#define ntohl my_ntohl
+#endif
+#else
+#if (BYTEORDER & 0xffff) == 0x4321
+#undef HAS_HTONS
+#undef HAS_HTONL
+#undef HAS_NTOHS
+#undef HAS_NTOHL
+#endif
+#endif
+
+/*
+ * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
+ * -DWS
+ */
+#if BYTEORDER != 0x1234
+# define HAS_VTOHL
+# define HAS_VTOHS
+# define HAS_HTOVL
+# define HAS_HTOVS
+# if BYTEORDER == 0x4321 || BYTEORDER == 0x87654321
+# define vtohl(x) ((((x)&0xFF)<<24) \
+ +(((x)>>24)&0xFF) \
+ +(((x)&0x0000FF00)<<8) \
+ +(((x)&0x00FF0000)>>8) )
+# define vtohs(x) ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
+# define htovl(x) vtohl(x)
+# define htovs(x) vtohs(x)
+# endif
+ /* otherwise default to functions in util.c */
+#ifndef htovs
+short htovs(short n);
+short vtohs(short n);
+long htovl(long n);
+long vtohl(long n);
+#endif
+#endif
+
+/* *MAX Plus 1. A floating point value.
+ Hopefully expressed in a way that dodgy floating point can't mess up.
+ >> 2 rather than 1, so that value is safely less than I32_MAX after 1
+ is added to it
+ May find that some broken compiler will want the value cast to I32.
+ [after the shift, as signed >> may not be as secure as unsigned >>]
+*/
+#define I32_MAX_P1 (2.0 * (1 + (((U32)I32_MAX) >> 1)))
+#define U32_MAX_P1 (4.0 * (1 + ((U32_MAX) >> 2)))
+/* For compilers that can't correctly cast NVs over 0x7FFFFFFF (or
+ 0x7FFFFFFFFFFFFFFF) to an unsigned integer. In the future, sizeof(UV)
+ may be greater than sizeof(IV), so don't assume that half max UV is max IV.
+*/
+#define U32_MAX_P1_HALF (2.0 * (1 + ((U32_MAX) >> 2)))
+
+#define UV_MAX_P1 (4.0 * (1 + ((UV_MAX) >> 2)))
+#define IV_MAX_P1 (2.0 * (1 + (((UV)IV_MAX) >> 1)))
+#define UV_MAX_P1_HALF (2.0 * (1 + ((UV_MAX) >> 2)))
+
+/* This may look like unnecessary jumping through hoops, but converting
+ out of range floating point values to integers *is* undefined behaviour,
+ and it is starting to bite.
+*/
+#ifndef CAST_INLINE
+#define I_32(what) (cast_i32((NV)(what)))
+#define U_32(what) (cast_ulong((NV)(what)))
+#define I_V(what) (cast_iv((NV)(what)))
+#define U_V(what) (cast_uv((NV)(what)))
+#else
+#define I_32(n) ((n) < I32_MAX_P1 ? ((n) < I32_MIN ? I32_MIN : (I32) (n)) \
+ : ((n) < U32_MAX_P1 ? (I32)(U32) (n) \
+ : ((n) > 0 ? (I32) U32_MAX : 0 /* NaN */)))
+#define U_32(n) ((n) < 0.0 ? ((n) < I32_MIN ? (UV) I32_MIN : (U32)(I32) (n)) \
+ : ((n) < U32_MAX_P1 ? (U32) (n) \
+ : ((n) > 0 ? U32_MAX : 0 /* NaN */)))
+#define I_V(n) ((n) < IV_MAX_P1 ? ((n) < IV_MIN ? IV_MIN : (IV) (n)) \
+ : ((n) < UV_MAX_P1 ? (IV)(UV) (n) \
+ : ((n) > 0 ? (IV)UV_MAX : 0 /* NaN */)))
+#define U_V(n) ((n) < 0.0 ? ((n) < IV_MIN ? (UV) IV_MIN : (UV)(IV) (n)) \
+ : ((n) < UV_MAX_P1 ? (UV) (n) \
+ : ((n) > 0 ? UV_MAX : 0 /* NaN */)))
+#endif
+
+#define U_S(what) ((U16)U_32(what))
+#define U_I(what) ((unsigned int)U_32(what))
+#define U_L(what) U_32(what)
+
+#ifdef HAS_SIGNBIT
+# define Perl_signbit signbit
+#endif
+
+/* These do not care about the fractional part, only about the range. */
+#define NV_WITHIN_IV(nv) (I_V(nv) >= IV_MIN && I_V(nv) <= IV_MAX)
+#define NV_WITHIN_UV(nv) ((nv)>=0.0 && U_V(nv) >= UV_MIN && U_V(nv) <= UV_MAX)
+
+/* Used with UV/IV arguments: */
+ /* XXXX: need to speed it up */
+#define CLUMP_2UV(iv) ((iv) < 0 ? 0 : (UV)(iv))
+#define CLUMP_2IV(uv) ((uv) > (UV)IV_MAX ? IV_MAX : (IV)(uv))
+
+#ifndef MAXSYSFD
+# define MAXSYSFD 2
+#endif
+
+#ifndef __cplusplus
+#if !(defined(UNDER_CE) || defined(SYMBIAN))
+Uid_t getuid (void);
+Uid_t geteuid (void);
+Gid_t getgid (void);
+Gid_t getegid (void);
+#endif
+#endif
+
+#ifndef Perl_debug_log
+# define Perl_debug_log PerlIO_stderr()
+#endif
+
+#ifndef Perl_error_log
+# define Perl_error_log (PL_stderrgv \
+ && isGV(PL_stderrgv) \
+ && GvIOp(PL_stderrgv) \
+ && IoOFP(GvIOp(PL_stderrgv)) \
+ ? IoOFP(GvIOp(PL_stderrgv)) \
+ : PerlIO_stderr())
+#endif
+
+
+#define DEBUG_p_FLAG 0x00000001 /* 1 */
+#define DEBUG_s_FLAG 0x00000002 /* 2 */
+#define DEBUG_l_FLAG 0x00000004 /* 4 */
+#define DEBUG_t_FLAG 0x00000008 /* 8 */
+#define DEBUG_o_FLAG 0x00000010 /* 16 */
+#define DEBUG_c_FLAG 0x00000020 /* 32 */
+#define DEBUG_P_FLAG 0x00000040 /* 64 */
+#define DEBUG_m_FLAG 0x00000080 /* 128 */
+#define DEBUG_f_FLAG 0x00000100 /* 256 */
+#define DEBUG_r_FLAG 0x00000200 /* 512 */
+#define DEBUG_x_FLAG 0x00000400 /* 1024 */
+#define DEBUG_u_FLAG 0x00000800 /* 2048 */
+/* U is reserved for Unofficial, exploratory hacking */
+#define DEBUG_U_FLAG 0x00001000 /* 4096 */
+#define DEBUG_H_FLAG 0x00002000 /* 8192 */
+#define DEBUG_X_FLAG 0x00004000 /* 16384 */
+#define DEBUG_D_FLAG 0x00008000 /* 32768 */
+/* 0x00010000 is unused, used to be S */
+#define DEBUG_T_FLAG 0x00020000 /* 131072 */
+#define DEBUG_R_FLAG 0x00040000 /* 262144 */
+#define DEBUG_J_FLAG 0x00080000 /* 524288 */
+#define DEBUG_v_FLAG 0x00100000 /*1048576 */
+#define DEBUG_C_FLAG 0x00200000 /*2097152 */
+#define DEBUG_A_FLAG 0x00400000 /*4194304 */
+#define DEBUG_q_FLAG 0x00800000 /*8388608 */
+#define DEBUG_M_FLAG 0x01000000 /*16777216*/
+#define DEBUG_B_FLAG 0x02000000 /*33554432*/
+#define DEBUG_MASK 0x03FEEFFF /* mask of all the standard flags */
+
+#define DEBUG_DB_RECURSE_FLAG 0x40000000
+#define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? Signal
+ that something was done? */
+
+# define DEBUG_p_TEST_ (PL_debug & DEBUG_p_FLAG)
+# define DEBUG_s_TEST_ (PL_debug & DEBUG_s_FLAG)
+# define DEBUG_l_TEST_ (PL_debug & DEBUG_l_FLAG)
+# define DEBUG_t_TEST_ (PL_debug & DEBUG_t_FLAG)
+# define DEBUG_o_TEST_ (PL_debug & DEBUG_o_FLAG)
+# define DEBUG_c_TEST_ (PL_debug & DEBUG_c_FLAG)
+# define DEBUG_P_TEST_ (PL_debug & DEBUG_P_FLAG)
+# define DEBUG_m_TEST_ (PL_debug & DEBUG_m_FLAG)
+# define DEBUG_f_TEST_ (PL_debug & DEBUG_f_FLAG)
+# define DEBUG_r_TEST_ (PL_debug & DEBUG_r_FLAG)
+# define DEBUG_x_TEST_ (PL_debug & DEBUG_x_FLAG)
+# define DEBUG_u_TEST_ (PL_debug & DEBUG_u_FLAG)
+# define DEBUG_U_TEST_ (PL_debug & DEBUG_U_FLAG)
+# define DEBUG_H_TEST_ (PL_debug & DEBUG_H_FLAG)
+# define DEBUG_X_TEST_ (PL_debug & DEBUG_X_FLAG)
+# define DEBUG_D_TEST_ (PL_debug & DEBUG_D_FLAG)
+# define DEBUG_T_TEST_ (PL_debug & DEBUG_T_FLAG)
+# define DEBUG_R_TEST_ (PL_debug & DEBUG_R_FLAG)
+# define DEBUG_J_TEST_ (PL_debug & DEBUG_J_FLAG)
+# define DEBUG_v_TEST_ (PL_debug & DEBUG_v_FLAG)
+# define DEBUG_C_TEST_ (PL_debug & DEBUG_C_FLAG)
+# define DEBUG_A_TEST_ (PL_debug & DEBUG_A_FLAG)
+# define DEBUG_q_TEST_ (PL_debug & DEBUG_q_FLAG)
+# define DEBUG_M_TEST_ (PL_debug & DEBUG_M_FLAG)
+# define DEBUG_B_TEST_ (PL_debug & DEBUG_B_FLAG)
+# define DEBUG_Xv_TEST_ (DEBUG_X_TEST_ && DEBUG_v_TEST_)
+# define DEBUG_Uv_TEST_ (DEBUG_U_TEST_ && DEBUG_v_TEST_)
+
+#ifdef DEBUGGING
+
+# define DEBUG_p_TEST DEBUG_p_TEST_
+# define DEBUG_s_TEST DEBUG_s_TEST_
+# define DEBUG_l_TEST DEBUG_l_TEST_
+# define DEBUG_t_TEST DEBUG_t_TEST_
+# define DEBUG_o_TEST DEBUG_o_TEST_
+# define DEBUG_c_TEST DEBUG_c_TEST_
+# define DEBUG_P_TEST DEBUG_P_TEST_
+# define DEBUG_m_TEST DEBUG_m_TEST_
+# define DEBUG_f_TEST DEBUG_f_TEST_
+# define DEBUG_r_TEST DEBUG_r_TEST_
+# define DEBUG_x_TEST DEBUG_x_TEST_
+# define DEBUG_u_TEST DEBUG_u_TEST_
+# define DEBUG_U_TEST DEBUG_U_TEST_
+# define DEBUG_H_TEST DEBUG_H_TEST_
+# define DEBUG_X_TEST DEBUG_X_TEST_
+# define DEBUG_D_TEST DEBUG_D_TEST_
+# define DEBUG_T_TEST DEBUG_T_TEST_
+# define DEBUG_R_TEST DEBUG_R_TEST_
+# define DEBUG_J_TEST DEBUG_J_TEST_
+# define DEBUG_v_TEST DEBUG_v_TEST_
+# define DEBUG_C_TEST DEBUG_C_TEST_
+# define DEBUG_A_TEST DEBUG_A_TEST_
+# define DEBUG_q_TEST DEBUG_q_TEST_
+# define DEBUG_M_TEST DEBUG_M_TEST_
+# define DEBUG_B_TEST DEBUG_B_TEST_
+# define DEBUG_Xv_TEST DEBUG_Xv_TEST_
+# define DEBUG_Uv_TEST DEBUG_Uv_TEST_
+
+# define PERL_DEB(a) a
+# define PERL_DEBUG(a) if (PL_debug) a
+# define DEBUG_p(a) if (DEBUG_p_TEST) a
+# define DEBUG_s(a) if (DEBUG_s_TEST) a
+# define DEBUG_l(a) if (DEBUG_l_TEST) a
+# define DEBUG_t(a) if (DEBUG_t_TEST) a
+# define DEBUG_o(a) if (DEBUG_o_TEST) a
+# define DEBUG_c(a) if (DEBUG_c_TEST) a
+# define DEBUG_P(a) if (DEBUG_P_TEST) a
+
+ /* Temporarily turn off memory debugging in case the a
+ * does memory allocation, either directly or indirectly. */
+# define DEBUG_m(a) \
+ STMT_START { \
+ if (PERL_GET_INTERP) { dTHX; if (DEBUG_m_TEST) {PL_debug&=~DEBUG_m_FLAG; a; PL_debug|=DEBUG_m_FLAG;} } \
+ } STMT_END
+
+# define DEBUG__(t, a) \
+ STMT_START { \
+ if (t) STMT_START {a;} STMT_END; \
+ } STMT_END
+
+# define DEBUG_f(a) DEBUG__(DEBUG_f_TEST, a)
+#ifndef PERL_EXT_RE_BUILD
+# define DEBUG_r(a) DEBUG__(DEBUG_r_TEST, a)
+#else
+# define DEBUG_r(a) STMT_START {a;} STMT_END
+#endif /* PERL_EXT_RE_BUILD */
+# define DEBUG_x(a) DEBUG__(DEBUG_x_TEST, a)
+# define DEBUG_u(a) DEBUG__(DEBUG_u_TEST, a)
+# define DEBUG_U(a) DEBUG__(DEBUG_U_TEST, a)
+# define DEBUG_H(a) DEBUG__(DEBUG_H_TEST, a)
+# define DEBUG_X(a) DEBUG__(DEBUG_X_TEST, a)
+# define DEBUG_D(a) DEBUG__(DEBUG_D_TEST, a)
+# define DEBUG_Xv(a) DEBUG__(DEBUG_Xv_TEST, a)
+# define DEBUG_Uv(a) DEBUG__(DEBUG_Uv_TEST, a)
+
+# define DEBUG_T(a) DEBUG__(DEBUG_T_TEST, a)
+# define DEBUG_R(a) DEBUG__(DEBUG_R_TEST, a)
+# define DEBUG_v(a) DEBUG__(DEBUG_v_TEST, a)
+# define DEBUG_C(a) DEBUG__(DEBUG_C_TEST, a)
+# define DEBUG_A(a) DEBUG__(DEBUG_A_TEST, a)
+# define DEBUG_q(a) DEBUG__(DEBUG_q_TEST, a)
+# define DEBUG_M(a) DEBUG__(DEBUG_M_TEST, a)
+# define DEBUG_B(a) DEBUG__(DEBUG_B_TEST, a)
+
+#else /* DEBUGGING */
+
+# define DEBUG_p_TEST (0)
+# define DEBUG_s_TEST (0)
+# define DEBUG_l_TEST (0)
+# define DEBUG_t_TEST (0)
+# define DEBUG_o_TEST (0)
+# define DEBUG_c_TEST (0)
+# define DEBUG_P_TEST (0)
+# define DEBUG_m_TEST (0)
+# define DEBUG_f_TEST (0)
+# define DEBUG_r_TEST (0)
+# define DEBUG_x_TEST (0)
+# define DEBUG_u_TEST (0)
+# define DEBUG_U_TEST (0)
+# define DEBUG_H_TEST (0)
+# define DEBUG_X_TEST (0)
+# define DEBUG_D_TEST (0)
+# define DEBUG_T_TEST (0)
+# define DEBUG_R_TEST (0)
+# define DEBUG_J_TEST (0)
+# define DEBUG_v_TEST (0)
+# define DEBUG_C_TEST (0)
+# define DEBUG_A_TEST (0)
+# define DEBUG_q_TEST (0)
+# define DEBUG_M_TEST (0)
+# define DEBUG_B_TEST (0)
+# define DEBUG_Xv_TEST (0)
+# define DEBUG_Uv_TEST (0)
+
+# define PERL_DEB(a)
+# define PERL_DEBUG(a)
+# define DEBUG_p(a)
+# define DEBUG_s(a)
+# define DEBUG_l(a)
+# define DEBUG_t(a)
+# define DEBUG_o(a)
+# define DEBUG_c(a)
+# define DEBUG_P(a)
+# define DEBUG_m(a)
+# define DEBUG_f(a)
+# define DEBUG_r(a)
+# define DEBUG_x(a)
+# define DEBUG_u(a)
+# define DEBUG_U(a)
+# define DEBUG_H(a)
+# define DEBUG_X(a)
+# define DEBUG_D(a)
+# define DEBUG_T(a)
+# define DEBUG_R(a)
+# define DEBUG_v(a)
+# define DEBUG_C(a)
+# define DEBUG_A(a)
+# define DEBUG_q(a)
+# define DEBUG_M(a)
+# define DEBUG_B(a)
+# define DEBUG_Xv(a)
+# define DEBUG_Uv(a)
+#endif /* DEBUGGING */
+
+
+#define DEBUG_SCOPE(where) \
+ DEBUG_l(WITH_THR(Perl_deb(aTHX_ "%s scope %ld at %s:%d\n", \
+ where, (long)PL_scopestack_ix, __FILE__, __LINE__)));
+
+
+
+
+/* These constants should be used in preference to raw characters
+ * when using magic. Note that some perl guts still assume
+ * certain character properties of these constants, namely that
+ * isUPPER() and toLOWER() may do useful mappings.
+ *
+ * Update the magic_names table in dump.c when adding/amending these
+ */
+
+#define PERL_MAGIC_sv '\0' /* Special scalar variable */
+#define PERL_MAGIC_overload 'A' /* %OVERLOAD hash */
+#define PERL_MAGIC_overload_elem 'a' /* %OVERLOAD hash element */
+#define PERL_MAGIC_overload_table 'c' /* Holds overload table (AMT) on stash */
+#define PERL_MAGIC_bm 'B' /* Boyer-Moore (fast string search) */
+#define PERL_MAGIC_regdata 'D' /* Regex match position data
+ (@+ and @- vars) */
+#define PERL_MAGIC_regdatum 'd' /* Regex match position data element */
+#define PERL_MAGIC_env 'E' /* %ENV hash */
+#define PERL_MAGIC_envelem 'e' /* %ENV hash element */
+#define PERL_MAGIC_fm 'f' /* Formline ('compiled' format) */
+#define PERL_MAGIC_regex_global 'g' /* m//g target / study()ed string */
+#define PERL_MAGIC_hints 'H' /* %^H hash */
+#define PERL_MAGIC_hintselem 'h' /* %^H hash element */
+#define PERL_MAGIC_isa 'I' /* @ISA array */
+#define PERL_MAGIC_isaelem 'i' /* @ISA array element */
+#define PERL_MAGIC_nkeys 'k' /* scalar(keys()) lvalue */
+#define PERL_MAGIC_dbfile 'L' /* Debugger %_<filename */
+#define PERL_MAGIC_dbline 'l' /* Debugger %_<filename element */
+#define PERL_MAGIC_shared 'N' /* Shared between threads */
+#define PERL_MAGIC_shared_scalar 'n' /* Shared between threads */
+#define PERL_MAGIC_collxfrm 'o' /* Locale transformation */
+#define PERL_MAGIC_tied 'P' /* Tied array or hash */
+#define PERL_MAGIC_tiedelem 'p' /* Tied array or hash element */
+#define PERL_MAGIC_tiedscalar 'q' /* Tied scalar or handle */
+#define PERL_MAGIC_qr 'r' /* precompiled qr// regex */
+#define PERL_MAGIC_sig 'S' /* %SIG hash */
+#define PERL_MAGIC_sigelem 's' /* %SIG hash element */
+#define PERL_MAGIC_taint 't' /* Taintedness */
+#define PERL_MAGIC_uvar 'U' /* Available for use by extensions */
+#define PERL_MAGIC_uvar_elem 'u' /* Reserved for use by extensions */
+#define PERL_MAGIC_vec 'v' /* vec() lvalue */
+#define PERL_MAGIC_vstring 'V' /* SV was vstring literal */
+#define PERL_MAGIC_utf8 'w' /* Cached UTF-8 information */
+#define PERL_MAGIC_substr 'x' /* substr() lvalue */
+#define PERL_MAGIC_defelem 'y' /* Shadow "foreach" iterator variable /
+ smart parameter vivification */
+#define PERL_MAGIC_arylen '#' /* Array length ($#ary) */
+#define PERL_MAGIC_pos '.' /* pos() lvalue */
+#define PERL_MAGIC_backref '<' /* for weak ref data */
+#define PERL_MAGIC_symtab ':' /* extra data for symbol tables */
+#define PERL_MAGIC_rhash '%' /* extra data for restricted hashes */
+#define PERL_MAGIC_arylen_p '@' /* to move arylen out of XPVAV */
+#define PERL_MAGIC_ext '~' /* Available for use by extensions */
+
+#if defined(DEBUGGING) && defined(I_ASSERT)
+# include <assert.h>
+#endif
+
+/* Keep the old croak based assert for those who want it, and as a fallback if
+ the platform is so heretically non-ANSI that it can't assert. */
+
+#define Perl_assert(what) PERL_DEB( \
+ ((what) ? ((void) 0) : \
+ (Perl_croak_nocontext("Assertion %s failed: file \"" __FILE__ \
+ "\", line %d", STRINGIFY(what), __LINE__), \
+ (void) 0)))
+
+#ifndef assert
+# define assert(what) Perl_assert(what)
+#endif
+
+struct ufuncs {
+ I32 (*uf_val)(pTHX_ IV, SV*);
+ I32 (*uf_set)(pTHX_ IV, SV*);
+ IV uf_index;
+};
+
+/* In pre-5.7-Perls the PERL_MAGIC_uvar magic didn't get the thread context.
+ * XS code wanting to be backward compatible can do something
+ * like the following:
+
+#ifndef PERL_MG_UFUNC
+#define PERL_MG_UFUNC(name,ix,sv) I32 name(IV ix, SV *sv)
+#endif
+
+static PERL_MG_UFUNC(foo_get, index, val)
+{
+ sv_setsv(val, ...);
+ return TRUE;
+}
+
+-- Doug MacEachern
+
+*/
+
+#ifndef PERL_MG_UFUNC
+#define PERL_MG_UFUNC(name,ix,sv) I32 name(pTHX_ IV ix, SV *sv)
+#endif
+
+/* Fix these up for __STDC__ */
+#ifndef DONT_DECLARE_STD
+char *mktemp (char*);
+#ifndef atof
+double atof (const char*);
+#endif
+#endif
+
+#ifndef STANDARD_C
+/* All of these are in stdlib.h or time.h for ANSI C */
+Time_t time();
+struct tm *gmtime(), *localtime();
+#if defined(OEMVS) || defined(__OPEN_VM)
+char *(strchr)(), *(strrchr)();
+char *(strcpy)(), *(strcat)();
+#else
+char *strchr(), *strrchr();
+char *strcpy(), *strcat();
+#endif
+#endif /* ! STANDARD_C */
+
+
+#ifdef I_MATH
+# include <math.h>
+#else
+START_EXTERN_C
+ double exp (double);
+ double log (double);
+ double log10 (double);
+ double sqrt (double);
+ double frexp (double,int*);
+ double ldexp (double,int);
+ double modf (double,double*);
+ double sin (double);
+ double cos (double);
+ double atan2 (double,double);
+ double pow (double,double);
+END_EXTERN_C
+#endif
+
+#if !defined(NV_INF) && defined(USE_LONG_DOUBLE) && defined(LDBL_INFINITY)
+# define NV_INF LDBL_INFINITY
+#endif
+#if !defined(NV_INF) && defined(DBL_INFINITY)
+# define NV_INF (NV)DBL_INFINITY
+#endif
+#if !defined(NV_INF) && defined(INFINITY)
+# define NV_INF (NV)INFINITY
+#endif
+#if !defined(NV_INF) && defined(INF)
+# define NV_INF (NV)INF
+#endif
+#if !defined(NV_INF) && defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
+# define NV_INF (NV)HUGE_VALL
+#endif
+#if !defined(NV_INF) && defined(HUGE_VAL)
+# define NV_INF (NV)HUGE_VAL
+#endif
+
+#if !defined(NV_NAN) && defined(USE_LONG_DOUBLE)
+# if !defined(NV_NAN) && defined(LDBL_NAN)
+# define NV_NAN LDBL_NAN
+# endif
+# if !defined(NV_NAN) && defined(LDBL_QNAN)
+# define NV_NAN LDBL_QNAN
+# endif
+# if !defined(NV_NAN) && defined(LDBL_SNAN)
+# define NV_NAN LDBL_SNAN
+# endif
+#endif
+#if !defined(NV_NAN) && defined(DBL_NAN)
+# define NV_NAN (NV)DBL_NAN
+#endif
+#if !defined(NV_NAN) && defined(DBL_QNAN)
+# define NV_NAN (NV)DBL_QNAN
+#endif
+#if !defined(NV_NAN) && defined(DBL_SNAN)
+# define NV_NAN (NV)DBL_SNAN
+#endif
+#if !defined(NV_NAN) && defined(QNAN)
+# define NV_NAN (NV)QNAN
+#endif
+#if !defined(NV_NAN) && defined(SNAN)
+# define NV_NAN (NV)SNAN
+#endif
+#if !defined(NV_NAN) && defined(NAN)
+# define NV_NAN (NV)NAN
+#endif
+
+#ifndef __cplusplus
+# if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
+char *crypt (); /* Maybe more hosts will need the unprototyped version */
+# else
+# if !defined(WIN32) && !defined(VMS)
+#ifndef crypt
+char *crypt (const char*, const char*);
+#endif
+# endif /* !WIN32 */
+# endif /* !NeXT && !__NeXT__ */
+# ifndef DONT_DECLARE_STD
+# ifndef getenv
+char *getenv (const char*);
+# endif /* !getenv */
+# if !defined(HAS_LSEEK_PROTO) && !defined(EPOC) && !defined(__hpux)
+# ifdef _FILE_OFFSET_BITS
+# if _FILE_OFFSET_BITS == 64
+Off_t lseek (int,Off_t,int);
+# endif
+# endif
+# endif
+# endif /* !DONT_DECLARE_STD */
+#ifndef getlogin
+char *getlogin (void);
+#endif
+#endif /* !__cplusplus */
+
+/* Fixme on VMS. This needs to be a run-time, not build time options */
+/* Also rename() is affected by this */
+#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
+#define UNLINK unlnk
+I32 unlnk (pTHX_ const char*);
+#else
+#define UNLINK PerlLIO_unlink
+#endif
+
+/* some versions of glibc are missing the setresuid() proto */
+#if defined(HAS_SETRESUID) && !defined(HAS_SETRESUID_PROTO)
+int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+#endif
+/* some versions of glibc are missing the setresgid() proto */
+#if defined(HAS_SETRESGID) && !defined(HAS_SETRESGID_PROTO)
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
+#endif
+
+#ifndef HAS_SETREUID
+# ifdef HAS_SETRESUID
+# define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
+# define HAS_SETREUID
+# endif
+#endif
+#ifndef HAS_SETREGID
+# ifdef HAS_SETRESGID
+# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
+# define HAS_SETREGID
+# endif
+#endif
+
+/* Sighandler_t defined in iperlsys.h */
+
+#ifdef HAS_SIGACTION
+typedef struct sigaction Sigsave_t;
+#else
+typedef Sighandler_t Sigsave_t;
+#endif
+
+#define SCAN_DEF 0
+#define SCAN_TR 1
+#define SCAN_REPL 2
+
+#ifdef DEBUGGING
+# ifndef register
+# define register
+# endif
+# define RUNOPS_DEFAULT Perl_runops_debug
+#else
+# define RUNOPS_DEFAULT Perl_runops_standard
+#endif
+
+#ifdef USE_PERLIO
+EXTERN_C void PerlIO_teardown(void);
+# ifdef USE_ITHREADS
+# define PERLIO_INIT MUTEX_INIT(&PL_perlio_mutex)
+# define PERLIO_TERM \
+ STMT_START { \
+ PerlIO_teardown(); \
+ MUTEX_DESTROY(&PL_perlio_mutex);\
+ } STMT_END
+# else
+# define PERLIO_INIT
+# define PERLIO_TERM PerlIO_teardown()
+# endif
+#else
+# define PERLIO_INIT
+# define PERLIO_TERM
+#endif
+
+#ifdef MYMALLOC
+# ifdef MUTEX_INIT_CALLS_MALLOC
+# define MALLOC_INIT \
+ STMT_START { \
+ PL_malloc_mutex = NULL; \
+ MUTEX_INIT(&PL_malloc_mutex); \
+ } STMT_END
+# define MALLOC_TERM \
+ STMT_START { \
+ perl_mutex tmp = PL_malloc_mutex; \
+ PL_malloc_mutex = NULL; \
+ MUTEX_DESTROY(&tmp); \
+ } STMT_END
+# else
+# define MALLOC_INIT MUTEX_INIT(&PL_malloc_mutex)
+# define MALLOC_TERM MUTEX_DESTROY(&PL_malloc_mutex)
+# endif
+#else
+# define MALLOC_INIT
+# define MALLOC_TERM
+#endif
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+
+struct perl_memory_debug_header;
+struct perl_memory_debug_header {
+ tTHX interpreter;
+# ifdef PERL_POISON
+ MEM_SIZE size;
+# endif
+ struct perl_memory_debug_header *prev;
+ struct perl_memory_debug_header *next;
+};
+
+# define sTHX (sizeof(struct perl_memory_debug_header) + \
+ (MEM_ALIGNBYTES - sizeof(struct perl_memory_debug_header) \
+ %MEM_ALIGNBYTES) % MEM_ALIGNBYTES)
+
+#else
+# define sTHX 0
+#endif
+
+#ifdef PERL_TRACK_MEMPOOL
+# define INIT_TRACK_MEMPOOL(header, interp) \
+ STMT_START { \
+ (header).interpreter = (interp); \
+ (header).prev = (header).next = &(header); \
+ } STMT_END
+# else
+# define INIT_TRACK_MEMPOOL(header, interp)
+#endif
+
+#ifdef I_MALLOCMALLOC
+/* Needed for malloc_size(), malloc_good_size() on some systems */
+# include <malloc/malloc.h>
+#endif
+
+#ifdef MYMALLOC
+# define Perl_safesysmalloc_size(where) Perl_malloced_size(where)
+#else
+# ifdef HAS_MALLOC_SIZE
+# ifdef PERL_TRACK_MEMPOOL
+# define Perl_safesysmalloc_size(where) \
+ (malloc_size(((char *)(where)) - sTHX) - sTHX)
+# else
+# define Perl_safesysmalloc_size(where) malloc_size(where)
+# endif
+# endif
+# ifdef HAS_MALLOC_GOOD_SIZE
+# ifdef PERL_TRACK_MEMPOOL
+# define Perl_malloc_good_size(how_much) \
+ (malloc_good_size((how_much) + sTHX) - sTHX)
+# else
+# define Perl_malloc_good_size(how_much) malloc_good_size(how_much)
+# endif
+# else
+/* Having this as the identity operation makes some code simpler. */
+# define Perl_malloc_good_size(how_much) (how_much)
+# endif
+#endif
+
+typedef int (CPERLscope(*runops_proc_t)) (pTHX);
+typedef void (CPERLscope(*share_proc_t)) (pTHX_ SV *sv);
+typedef int (CPERLscope(*thrhook_proc_t)) (pTHX);
+typedef OP* (CPERLscope(*PPADDR_t)[]) (pTHX);
+typedef bool (CPERLscope(*destroyable_proc_t)) (pTHX_ SV *sv);
+
+/* _ (for $_) must be first in the following list (DEFSV requires it) */
+#define THREADSV_NAMES "_123456789&`'+/.,\\\";^-%=|~:\001\005!@"
+
+/* NeXT has problems with crt0.o globals */
+#if defined(__DYNAMIC__) && \
+ (defined(NeXT) || defined(__NeXT__) || defined(PERL_DARWIN))
+# if defined(NeXT) || defined(__NeXT)
+# include <mach-o/dyld.h>
+# define environ (*environ_pointer)
+EXT char *** environ_pointer;
+# else
+# if defined(PERL_DARWIN) && defined(PERL_CORE)
+# include <crt_externs.h> /* for the env array */
+# define environ (*_NSGetEnviron())
+# endif
+# endif
+#else
+ /* VMS and some other platforms don't use the environ array */
+# ifdef USE_ENVIRON_ARRAY
+# if !defined(DONT_DECLARE_STD) || \
+ (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
+ defined(__sgi) || \
+ defined(__DGUX)
+extern char ** environ; /* environment variables supplied via exec */
+# endif
+# endif
+#endif
+
+START_EXTERN_C
+
+/* handy constants */
+EXTCONST char PL_warn_uninit[]
+ INIT("Use of uninitialized value%s%s%s");
+EXTCONST char PL_warn_nosemi[]
+ INIT("Semicolon seems to be missing");
+EXTCONST char PL_warn_reserved[]
+ INIT("Unquoted string \"%s\" may clash with future reserved word");
+EXTCONST char PL_warn_nl[]
+ INIT("Unsuccessful %s on filename containing newline");
+EXTCONST char PL_no_wrongref[]
+ INIT("Can't use %s ref as %s ref");
+/* The core no longer needs these here. If you require the string constant,
+ please inline a copy into your own code. */
+EXTCONST char PL_no_symref[] __attribute__deprecated__
+ INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
+EXTCONST char PL_no_symref_sv[] __attribute__deprecated__
+ INIT("Can't use string (\"%" SVf32 "\") as %s ref while \"strict refs\" in use");
+EXTCONST char PL_no_usym[]
+ INIT("Can't use an undefined value as %s reference");
+EXTCONST char PL_no_aelem[]
+ INIT("Modification of non-creatable array value attempted, subscript %d");
+EXTCONST char PL_no_helem_sv[]
+ INIT("Modification of non-creatable hash value attempted, subscript \"%"SVf"\"");
+EXTCONST char PL_no_modify[]
+ INIT("Modification of a read-only value attempted");
+EXTCONST char PL_no_mem[]
+ INIT("Out of memory!\n");
+EXTCONST char PL_no_security[]
+ INIT("Insecure dependency in %s%s");
+EXTCONST char PL_no_sock_func[]
+ INIT("Unsupported socket function \"%s\" called");
+EXTCONST char PL_no_dir_func[]
+ INIT("Unsupported directory function \"%s\" called");
+EXTCONST char PL_no_func[]
+ INIT("The %s function is unimplemented");
+EXTCONST char PL_no_myglob[]
+ INIT("\"%s\" variable %s can't be in a package");
+EXTCONST char PL_no_localize_ref[]
+ INIT("Can't localize through a reference");
+EXTCONST char PL_memory_wrap[]
+ INIT("panic: memory wrap");
+
+#ifdef CSH
+EXTCONST char PL_cshname[]
+ INIT(CSH);
+# define PL_cshlen (sizeof(CSH "") - 1)
+#endif
+
+EXTCONST char PL_uuemap[65]
+ INIT("`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_");
+
+#ifdef DOINIT
+EXTCONST char PL_uudmap[256] =
+#include "uudmap.h"
+;
+EXTCONST char PL_bitcount[256] =
+# include "bitcount.h"
+;
+EXTCONST char* const PL_sig_name[] = { SIG_NAME };
+EXTCONST int PL_sig_num[] = { SIG_NUM };
+#else
+EXTCONST char PL_uudmap[256];
+EXTCONST char PL_bitcount[256];
+EXTCONST char* const PL_sig_name[];
+EXTCONST int PL_sig_num[];
+#endif
+
+/* fast conversion and case folding tables */
+
+#ifdef DOINIT
+#ifdef EBCDIC
+EXTCONST unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 138, 139, 140, 141, 142, 143,
+ 144, 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 154, 155, 156, 157, 158, 159,
+ 160, 161, 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z', 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 202, 203, 204, 205, 206, 207,
+ 208, 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+ 'q', 'r', 218, 219, 220, 221, 222, 223,
+ 224, 225, 's', 't', 'u', 'v', 'w', 'x',
+ 'y', 'z', 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255
+};
+#else /* ascii rather than ebcdic */
+EXTCONST unsigned char PL_fold[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 91, 92, 93, 94, 95,
+ 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255
+};
+#endif /* !EBCDIC, but still in DOINIT */
+
+/* If these tables are accessed through ebcdic, the access will be converted to
+ * latin1 first */
+EXTCONST unsigned char PL_latin1_lc[] = { /* lowercasing */
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 192+32, 193+32, 194+32, 195+32, 196+32, 197+32, 198+32, 199+32,
+ 200+32, 201+32, 202+32, 203+32, 204+32, 205+32, 206+32, 207+32,
+ 208+32, 209+32, 210+32, 211+32, 212+32, 213+32, 214+32, 215,
+ 216+32, 217+32, 218+32, 219+32, 220+32, 221+32, 222+32, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255
+};
+
+/* upper and title case of latin1 characters, modified so that the three tricky
+ * ones are mapped to 255 (which is one of the three) */
+EXTCONST unsigned char PL_mod_latin1_uc[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 255 /*micro*/, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 218, 219, 220, 221, 222, 255 /*sharp s*/,
+ 224-32, 225-32, 226-32, 227-32, 228-32, 229-32, 230-32, 231-32,
+ 232-32, 233-32, 234-32, 235-32, 236-32, 237-32, 238-32, 239-32,
+ 240-32, 241-32, 242-32, 243-32, 244-32, 245-32, 246-32, 247,
+ 248-32, 249-32, 250-32, 251-32, 252-32, 253-32, 254-32, 255
+};
+#else /* ! DOINIT */
+EXTCONST unsigned char PL_fold[];
+EXTCONST unsigned char PL_mod_latin1_uc[];
+EXTCONST unsigned char PL_latin1_lc[];
+#endif
+
+#ifndef PERL_GLOBAL_STRUCT /* or perlvars.h */
+#ifdef DOINIT
+EXT unsigned char PL_fold_locale[] = { /* Unfortunately not EXTCONST. */
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 91, 92, 93, 94, 95,
+ 96, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231,
+ 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247,
+ 248, 249, 250, 251, 252, 253, 254, 255
+};
+#else
+EXT unsigned char PL_fold_locale[]; /* Unfortunately not EXTCONST. */
+#endif
+#endif /* !PERL_GLOBAL_STRUCT */
+
+#ifdef DOINIT
+#ifdef EBCDIC
+EXTCONST unsigned char PL_freq[] = {/* EBCDIC frequencies for mixed English/C */
+ 1, 2, 84, 151, 154, 155, 156, 157,
+ 165, 246, 250, 3, 158, 7, 18, 29,
+ 40, 51, 62, 73, 85, 96, 107, 118,
+ 129, 140, 147, 148, 149, 150, 152, 153,
+ 255, 6, 8, 9, 10, 11, 12, 13,
+ 14, 15, 24, 25, 26, 27, 28, 226,
+ 29, 30, 31, 32, 33, 43, 44, 45,
+ 46, 47, 48, 49, 50, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86,
+ 87, 94, 95, 234, 181, 233, 187, 190,
+ 180, 96, 97, 98, 99, 100, 101, 102,
+ 104, 112, 182, 174, 236, 232, 229, 103,
+ 228, 226, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 235, 176, 230, 194, 162,
+ 130, 131, 132, 133, 134, 135, 136, 137,
+ 138, 139, 201, 205, 163, 217, 220, 224,
+ 5, 248, 227, 244, 242, 255, 241, 231,
+ 240, 253, 16, 197, 19, 20, 21, 187,
+ 23, 169, 210, 245, 237, 249, 247, 239,
+ 168, 252, 34, 196, 36, 37, 38, 39,
+ 41, 42, 251, 254, 238, 223, 221, 213,
+ 225, 177, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 63, 64, 65, 66,
+ 67, 68, 69, 70, 71, 72, 74, 75,
+ 205, 208, 186, 202, 200, 218, 198, 179,
+ 178, 214, 88, 89, 90, 91, 92, 93,
+ 217, 166, 170, 207, 199, 209, 206, 204,
+ 160, 212, 105, 106, 108, 109, 110, 111,
+ 203, 113, 216, 215, 192, 175, 193, 243,
+ 172, 161, 123, 124, 125, 126, 127, 128,
+ 222, 219, 211, 195, 188, 193, 185, 184,
+ 191, 183, 141, 142, 143, 144, 145, 146
+};
+#else /* ascii rather than ebcdic */
+EXTCONST unsigned char PL_freq[] = { /* letter frequencies for mixed English/C */
+ 1, 2, 84, 151, 154, 155, 156, 157,
+ 165, 246, 250, 3, 158, 7, 18, 29,
+ 40, 51, 62, 73, 85, 96, 107, 118,
+ 129, 140, 147, 148, 149, 150, 152, 153,
+ 255, 182, 224, 205, 174, 176, 180, 217,
+ 233, 232, 236, 187, 235, 228, 234, 226,
+ 222, 219, 211, 195, 188, 193, 185, 184,
+ 191, 183, 201, 229, 181, 220, 194, 162,
+ 163, 208, 186, 202, 200, 218, 198, 179,
+ 178, 214, 166, 170, 207, 199, 209, 206,
+ 204, 160, 212, 216, 215, 192, 175, 173,
+ 243, 172, 161, 190, 203, 189, 164, 230,
+ 167, 248, 227, 244, 242, 255, 241, 231,
+ 240, 253, 169, 210, 245, 237, 249, 247,
+ 239, 168, 252, 251, 254, 238, 223, 221,
+ 213, 225, 177, 197, 171, 196, 159, 4,
+ 5, 6, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 19, 20, 21, 22,
+ 23, 24, 25, 26, 27, 28, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 52, 53, 54, 55, 56, 57,
+ 58, 59, 60, 61, 63, 64, 65, 66,
+ 67, 68, 69, 70, 71, 72, 74, 75,
+ 76, 77, 78, 79, 80, 81, 82, 83,
+ 86, 87, 88, 89, 90, 91, 92, 93,
+ 94, 95, 97, 98, 99, 100, 101, 102,
+ 103, 104, 105, 106, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128,
+ 130, 131, 132, 133, 134, 135, 136, 137,
+ 138, 139, 141, 142, 143, 144, 145, 146
+};
+#endif
+#else
+EXTCONST unsigned char PL_freq[];
+#endif
+
+#ifdef DEBUGGING
+#ifdef DOINIT
+EXTCONST char* const PL_block_type[] = {
+ "NULL",
+ "WHEN",
+ "BLOCK",
+ "GIVEN",
+ "LOOP_FOR",
+ "LOOP_PLAIN",
+ "LOOP_LAZYSV",
+ "LOOP_LAZYIV",
+ "SUB",
+ "FORMAT",
+ "EVAL",
+ "SUBST"
+};
+#else
+EXTCONST char* PL_block_type[];
+#endif
+#endif
+
+/* These are all the compile time options that affect binary compatibility.
+ Other compile time options that are binary compatible are in perl.c
+ Both are combined for the output of perl -V
+ However, this string will be embedded in any shared perl library, which will
+ allow us add a comparison check in perlmain.c in the near future. */
+#ifdef DOINIT
+EXTCONST char PL_bincompat_options[] =
+# ifdef DEBUG_LEAKING_SCALARS
+ " DEBUG_LEAKING_SCALARS"
+# endif
+# ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+ " DEBUG_LEAKING_SCALARS_FORK_DUMP"
+# endif
+# ifdef FAKE_THREADS
+ " FAKE_THREADS"
+# endif
+# ifdef MULTIPLICITY
+ " MULTIPLICITY"
+# endif
+# ifdef MYMALLOC
+ " MYMALLOC"
+# endif
+# ifdef PERL_DEBUG_READONLY_OPS
+ " PERL_DEBUG_READONLY_OPS"
+# endif
+# ifdef PERL_GLOBAL_STRUCT
+ " PERL_GLOBAL_STRUCT"
+# endif
+# ifdef PERL_IMPLICIT_CONTEXT
+ " PERL_IMPLICIT_CONTEXT"
+# endif
+# ifdef PERL_IMPLICIT_SYS
+ " PERL_IMPLICIT_SYS"
+# endif
+# ifdef PERL_MAD
+ " PERL_MAD"
+# endif
+# ifdef PERL_NEED_APPCTX
+ " PERL_NEED_APPCTX"
+# endif
+# ifdef PERL_NEED_TIMESBASE
+ " PERL_NEED_TIMESBASE"
+# endif
+# ifdef PERL_OLD_COPY_ON_WRITE
+ " PERL_OLD_COPY_ON_WRITE"
+# endif
+# ifdef PERL_POISON
+ " PERL_POISON"
+# endif
+# ifdef PERL_TRACK_MEMPOOL
+ " PERL_TRACK_MEMPOOL"
+# endif
+# ifdef PERL_USES_PL_PIDSTATUS
+ " PERL_USES_PL_PIDSTATUS"
+# endif
+# ifdef PL_OP_SLAB_ALLOC
+ " PL_OP_SLAB_ALLOC"
+# endif
+# ifdef THREADS_HAVE_PIDS
+ " THREADS_HAVE_PIDS"
+# endif
+# ifdef USE_64_BIT_ALL
+ " USE_64_BIT_ALL"
+# endif
+# ifdef USE_64_BIT_INT
+ " USE_64_BIT_INT"
+# endif
+# ifdef USE_IEEE
+ " USE_IEEE"
+# endif
+# ifdef USE_ITHREADS
+ " USE_ITHREADS"
+# endif
+# ifdef USE_LARGE_FILES
+ " USE_LARGE_FILES"
+# endif
+# ifdef USE_LONG_DOUBLE
+ " USE_LONG_DOUBLE"
+# endif
+# ifdef USE_PERLIO
+ " USE_PERLIO"
+# endif
+# ifdef USE_REENTRANT_API
+ " USE_REENTRANT_API"
+# endif
+# ifdef USE_SFIO
+ " USE_SFIO"
+# endif
+# ifdef USE_SOCKS
+ " USE_SOCKS"
+# endif
+# ifdef VMS_DO_SOCKETS
+ " VMS_DO_SOCKETS"
+# ifdef DECCRTL_SOCKETS
+ " DECCRTL_SOCKETS"
+# endif
+# endif
+# ifdef VMS_WE_ARE_CASE_SENSITIVE
+ " VMS_SYMBOL_CASE_AS_IS"
+# endif
+ "";
+#else
+EXTCONST char PL_bincompat_options[];
+#endif
+
+END_EXTERN_C
+
+/*****************************************************************************/
+/* This lexer/parser stuff is currently global since yacc is hard to reenter */
+/*****************************************************************************/
+/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
+
+#ifdef __Lynx__
+/* LynxOS defines these in scsi.h which is included via ioctl.h */
+#ifdef FORMAT
+#undef FORMAT
+#endif
+#ifdef SPACE
+#undef SPACE
+#endif
+#endif
+
+#define LEX_NOTPARSING 11 /* borrowed from toke.c */
+
+typedef enum {
+ XOPERATOR,
+ XTERM,
+ XREF,
+ XSTATE,
+ XBLOCK,
+ XATTRBLOCK,
+ XATTRTERM,
+ XTERMBLOCK,
+ XTERMORDORDOR /* evil hack */
+ /* update exp_name[] in toke.c if adding to this enum */
+} expectation;
+
+enum { /* pass one of these to get_vtbl */
+ want_vtbl_sv,
+ want_vtbl_env,
+ want_vtbl_envelem,
+ want_vtbl_sig,
+ want_vtbl_sigelem,
+ want_vtbl_pack,
+ want_vtbl_packelem,
+ want_vtbl_dbline,
+ want_vtbl_isa,
+ want_vtbl_isaelem,
+ want_vtbl_arylen,
+ want_vtbl_glob,
+ want_vtbl_mglob,
+ want_vtbl_nkeys,
+ want_vtbl_taint,
+ want_vtbl_substr,
+ want_vtbl_vec,
+ want_vtbl_pos,
+ want_vtbl_bm,
+ want_vtbl_fm,
+ want_vtbl_uvar,
+ want_vtbl_defelem,
+ want_vtbl_regexp,
+ want_vtbl_collxfrm,
+ want_vtbl_amagic,
+ want_vtbl_amagicelem,
+ want_vtbl_regdata,
+ want_vtbl_regdatum,
+ want_vtbl_backref,
+ want_vtbl_utf8,
+ want_vtbl_symtab,
+ want_vtbl_arylen_p,
+ want_vtbl_hintselem,
+ want_vtbl_hints
+};
+
+
+/* Hints are now stored in a dedicated U32, so the bottom 8 bits are no longer
+ special and there is no need for HINT_PRIVATE_MASK for COPs
+ However, bitops store HINT_INTEGER in their op_private. */
+#define HINT_INTEGER 0x00000001 /* integer pragma */
+#define HINT_STRICT_REFS 0x00000002 /* strict pragma */
+#define HINT_LOCALE 0x00000004 /* locale pragma */
+#define HINT_BYTES 0x00000008 /* bytes pragma */
+#define HINT_ARYBASE 0x00000010 /* $[ is non-zero */
+ /* Note: 20,40,80 used for NATIVE_HINTS */
+ /* currently defined by vms/vmsish.h */
+
+#define HINT_BLOCK_SCOPE 0x00000100
+#define HINT_STRICT_SUBS 0x00000200 /* strict pragma */
+#define HINT_STRICT_VARS 0x00000400 /* strict pragma */
+#define HINT_UNI_8_BIT 0x00000800 /* unicode_strings feature */
+
+/* The HINT_NEW_* constants are used by the overload pragma */
+#define HINT_NEW_INTEGER 0x00001000
+#define HINT_NEW_FLOAT 0x00002000
+#define HINT_NEW_BINARY 0x00004000
+#define HINT_NEW_STRING 0x00008000
+#define HINT_NEW_RE 0x00010000
+#define HINT_LOCALIZE_HH 0x00020000 /* %^H needs to be copied */
+#define HINT_LEXICAL_IO_IN 0x00040000 /* ${^OPEN} is set for input */
+#define HINT_LEXICAL_IO_OUT 0x00080000 /* ${^OPEN} is set for output */
+
+#define HINT_RE_TAINT 0x00100000 /* re pragma */
+#define HINT_RE_EVAL 0x00200000 /* re pragma */
+
+#define HINT_FILETEST_ACCESS 0x00400000 /* filetest pragma */
+#define HINT_UTF8 0x00800000 /* utf8 pragma */
+
+#define HINT_NO_AMAGIC 0x01000000 /* overloading pragma */
+
+/* The following are stored in $^H{sort}, not in PL_hints */
+#define HINT_SORT_SORT_BITS 0x000000FF /* allow 256 different ones */
+#define HINT_SORT_QUICKSORT 0x00000001
+#define HINT_SORT_MERGESORT 0x00000002
+#define HINT_SORT_STABLE 0x00000100 /* sort styles (currently one) */
+
+/* Various states of the input record separator SV (rs) */
+#define RsSNARF(sv) (! SvOK(sv))
+#define RsSIMPLE(sv) (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))
+#define RsPARA(sv) (SvPOK(sv) && ! SvCUR(sv))
+#define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
+
+/* A struct for keeping various DEBUGGING related stuff,
+ * neatly packed. Currently only scratch variables for
+ * constructing debug output are included. Needed always,
+ * not just when DEBUGGING, though, because of the re extension. c*/
+struct perl_debug_pad {
+ SV pad[3];
+};
+
+#define PERL_DEBUG_PAD(i) &(PL_debug_pad.pad[i])
+#define PERL_DEBUG_PAD_ZERO(i) (SvPVX(PERL_DEBUG_PAD(i))[0] = 0, \
+ (((XPV*) SvANY(PERL_DEBUG_PAD(i)))->xpv_cur = 0), \
+ PERL_DEBUG_PAD(i))
+
+/* Enable variables which are pointers to functions */
+typedef void (CPERLscope(*peep_t))(pTHX_ OP* o);
+typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm);
+typedef I32 (CPERLscope(*regexec_t)) (pTHX_ regexp* prog, char* stringarg,
+ char* strend, char* strbeg, I32 minend,
+ SV* screamer, void* data, U32 flags);
+typedef char* (CPERLscope(*re_intuit_start_t)) (pTHX_ regexp *prog, SV *sv,
+ char *strpos, char *strend,
+ U32 flags,
+ re_scream_pos_data *d);
+typedef SV* (CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog);
+typedef void (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
+typedef regexp*(CPERLscope(*regdupe_t)) (pTHX_ const regexp* r, CLONE_PARAMS *param);
+
+typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
+typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*);
+typedef void (*SVFUNC_t) (pTHX_ SV* const);
+typedef I32 (*SVCOMPARE_t) (pTHX_ SV* const, SV* const);
+typedef void (*XSINIT_t) (pTHX);
+typedef void (*ATEXIT_t) (pTHX_ void*);
+typedef void (*XSUBADDR_t) (pTHX_ CV *);
+
+/* Set up PERLVAR macros for populating structs */
+#define PERLVAR(var,type) type var;
+#define PERLVARA(var,n,type) type var[n];
+#define PERLVARI(var,type,init) type var;
+#define PERLVARIC(var,type,init) type var;
+#define PERLVARISC(var,init) const char var[sizeof(init)];
+
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
+typedef void(CPERLscope(*Perl_ophook_t))(pTHX_ OP*);
+typedef int (CPERLscope(*Perl_keyword_plugin_t))(pTHX_ char*, STRLEN, OP**);
+
+#define KEYWORD_PLUGIN_DECLINE 0
+#define KEYWORD_PLUGIN_STMT 1
+#define KEYWORD_PLUGIN_EXPR 2
+
+/* Interpreter exitlist entry */
+typedef struct exitlistentry {
+ void (*fn) (pTHX_ void*);
+ void *ptr;
+} PerlExitListEntry;
+
+/* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
+/* These have to be before perlvars.h */
+#if !defined(HAS_SIGACTION) && defined(VMS)
+# define FAKE_PERSISTENT_SIGNAL_HANDLERS
+#endif
+/* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
+#if defined(KILL_BY_SIGPRC)
+# define FAKE_DEFAULT_SIGNAL_HANDLERS
+#endif
+
+#define PERL_PATCHLEVEL_H_IMPLICIT
+#include "patchlevel.h"
+#undef PERL_PATCHLEVEL_H_IMPLICIT
+
+#define PERL_VERSION_STRING STRINGIFY(PERL_REVISION) "." \
+ STRINGIFY(PERL_VERSION) "." \
+ STRINGIFY(PERL_SUBVERSION)
+
+#ifdef PERL_GLOBAL_STRUCT
+struct perl_vars {
+# include "perlvars.h"
+};
+
+# ifdef PERL_CORE
+# ifndef PERL_GLOBAL_STRUCT_PRIVATE
+EXT struct perl_vars PL_Vars;
+EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
+# undef PERL_GET_VARS
+# define PERL_GET_VARS() PL_VarsPtr
+# endif /* !PERL_GLOBAL_STRUCT_PRIVATE */
+# else /* PERL_CORE */
+# if !defined(__GNUC__) || !defined(WIN32)
+EXT
+# endif /* WIN32 */
+struct perl_vars *PL_VarsPtr;
+# define PL_Vars (*((PL_VarsPtr) \
+ ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars(aTHX))))
+# endif /* PERL_CORE */
+#endif /* PERL_GLOBAL_STRUCT */
+
+#if defined(MULTIPLICITY)
+/* If we have multiple interpreters define a struct
+ holding variables which must be per-interpreter
+ If we don't have threads anything that would have
+ be per-thread is per-interpreter.
+*/
+
+struct interpreter {
+# include "intrpvar.h"
+};
+
+#else
+struct interpreter {
+ char broiled;
+};
+#endif /* MULTIPLICITY */
+
+/* Done with PERLVAR macros for now ... */
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#undef PERLVARISC
+
+struct tempsym; /* defined in pp_pack.c */
+
+#include "thread.h"
+#include "pp.h"
+
+#ifndef PERL_CALLCONV
+# ifdef __cplusplus
+# define PERL_CALLCONV extern "C"
+# else
+# define PERL_CALLCONV
+# endif
+#endif
+#undef PERL_CKDEF
+#undef PERL_PPDEF
+#define PERL_CKDEF(s) PERL_CALLCONV OP *s (pTHX_ OP *o);
+#define PERL_PPDEF(s) PERL_CALLCONV OP *s (pTHX);
+
+#include "proto.h"
+
+/* this has structure inits, so it cannot be included before here */
+#include "opcode.h"
+
+/* The following must follow proto.h as #defines mess up syntax */
+
+#if !defined(PERL_FOR_X2P)
+# include "embedvar.h"
+#endif
+#ifndef PERL_MAD
+# undef PL_madskills
+# undef PL_xmlfp
+# define PL_madskills 0
+# define PL_xmlfp 0
+#endif
+
+/* Now include all the 'global' variables
+ * If we don't have threads or multiple interpreters
+ * these include variables that would have been their struct-s
+ */
+
+#define PERLVAR(var,type) EXT type PL_##var;
+#define PERLVARA(var,n,type) EXT type PL_##var[n];
+#define PERLVARI(var,type,init) EXT type PL_##var INIT(init);
+#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
+#define PERLVARISC(var,init) EXTCONST char PL_##var[sizeof(init)] INIT(init);
+
+#if !defined(MULTIPLICITY)
+START_EXTERN_C
+# include "intrpvar.h"
+END_EXTERN_C
+#endif
+
+#ifdef PERL_CORE
+/* All core uses now exterminated. Ensure no zombies can return: */
+# undef PL_na
+#endif
+
+#if defined(WIN32)
+/* Now all the config stuff is setup we can include embed.h */
+# include "embed.h"
+# ifndef PERL_MAD
+# undef op_getmad
+# define op_getmad(arg,pegop,slot) NOOP
+# endif
+#endif
+
+#ifndef PERL_GLOBAL_STRUCT
+START_EXTERN_C
+
+# include "perlvars.h"
+
+END_EXTERN_C
+#endif
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+
+START_EXTERN_C
+
+/* PERL_GLOBAL_STRUCT_PRIVATE wants to keep global data like the
+ * magic vtables const, but this is incompatible with SWIG which
+ * does want to modify the vtables. */
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+# define EXT_MGVTBL EXTCONST MGVTBL
+#else
+# define EXT_MGVTBL EXT MGVTBL
+#endif
+
+#ifdef DOINIT
+# define MGVTBL_SET(var,a,b,c,d,e,f,g,h) EXT_MGVTBL var = {a,b,c,d,e,f,g,h}
+/* Like MGVTBL_SET but with the get magic having a const MG* */
+# define MGVTBL_SET_CONST_MAGIC_GET(var,a,b,c,d,e,f,g,h) EXT_MGVTBL var \
+ = {(int (*)(pTHX_ SV *, MAGIC *))a,b,c,d,e,f,g,h}
+#else
+# define MGVTBL_SET(var,a,b,c,d,e,f,g,h) EXT_MGVTBL var
+# define MGVTBL_SET_CONST_MAGIC_GET(var,a,b,c,d,e,f,g,h) EXT_MGVTBL var
+#endif
+
+/* These all need to be 0, not NULL, as NULL can be (void*)0, which is a
+ * pointer to data, whereas we're assigning pointers to functions, which are
+ * not the same beast. ANSI doesn't allow the assignment from one to the other.
+ * (although most, but not all, compilers are prepared to do it)
+ */
+MGVTBL_SET(
+ PL_vtbl_sv,
+ MEMBER_TO_FPTR(Perl_magic_get),
+ MEMBER_TO_FPTR(Perl_magic_set),
+ MEMBER_TO_FPTR(Perl_magic_len),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_env,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_set_all_env),
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clear_all_env),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_envelem,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setenv),
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clearenv),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_sig,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+#ifdef PERL_MICRO
+MGVTBL_SET(
+ PL_vtbl_sigelem,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+#else
+MGVTBL_SET(
+ PL_vtbl_sigelem,
+ MEMBER_TO_FPTR(Perl_magic_getsig),
+ MEMBER_TO_FPTR(Perl_magic_setsig),
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clearsig),
+ 0,
+ 0,
+ 0,
+ 0
+);
+#endif
+
+MGVTBL_SET(
+ PL_vtbl_pack,
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_sizepack),
+ MEMBER_TO_FPTR(Perl_magic_wipepack),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_packelem,
+ MEMBER_TO_FPTR(Perl_magic_getpack),
+ MEMBER_TO_FPTR(Perl_magic_setpack),
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clearpack),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_dbline,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setdbline),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_isa,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setisa),
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clearisa),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_isaelem,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setisa),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET_CONST_MAGIC_GET(
+ PL_vtbl_arylen,
+ MEMBER_TO_FPTR(Perl_magic_getarylen),
+ MEMBER_TO_FPTR(Perl_magic_setarylen),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_arylen_p,
+ 0,
+ 0,
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_freearylen_p),
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_mglob,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setmglob),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_nkeys,
+ MEMBER_TO_FPTR(Perl_magic_getnkeys),
+ MEMBER_TO_FPTR(Perl_magic_setnkeys),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_taint,
+ MEMBER_TO_FPTR(Perl_magic_gettaint),
+ MEMBER_TO_FPTR(Perl_magic_settaint),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_substr,
+ MEMBER_TO_FPTR(Perl_magic_getsubstr),
+ MEMBER_TO_FPTR(Perl_magic_setsubstr),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_vec,
+ MEMBER_TO_FPTR(Perl_magic_getvec),
+ MEMBER_TO_FPTR(Perl_magic_setvec),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_pos,
+ MEMBER_TO_FPTR(Perl_magic_getpos),
+ MEMBER_TO_FPTR(Perl_magic_setpos),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_bm,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setregexp),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_fm,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setregexp),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_uvar,
+ MEMBER_TO_FPTR(Perl_magic_getuvar),
+ MEMBER_TO_FPTR(Perl_magic_setuvar),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_defelem,
+ MEMBER_TO_FPTR(Perl_magic_getdefelem),
+ MEMBER_TO_FPTR(Perl_magic_setdefelem),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_regexp,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setregexp),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_regdata,
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_regdata_cnt),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_regdatum,
+ MEMBER_TO_FPTR(Perl_magic_regdatum_get),
+ MEMBER_TO_FPTR(Perl_magic_regdatum_set),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_amagic,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setamagic),
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setamagic),
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_amagicelem,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setamagic),
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setamagic),
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_backref,
+ 0,
+ 0,
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_killbackrefs),
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_ovrld,
+ 0,
+ 0,
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_freeovrld),
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_utf8,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setutf8),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+#ifdef USE_LOCALE_COLLATE
+MGVTBL_SET(
+ PL_vtbl_collxfrm,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_setcollxfrm),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+);
+#endif
+
+MGVTBL_SET(
+ PL_vtbl_hintselem,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_sethint),
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clearhint),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+MGVTBL_SET(
+ PL_vtbl_hints,
+ 0,
+ 0,
+ 0,
+ MEMBER_TO_FPTR(Perl_magic_clearhints),
+ 0,
+ 0,
+ 0,
+ 0
+);
+
+#include "overload.h"
+
+END_EXTERN_C
+
+struct am_table {
+ U32 flags;
+ U32 was_ok_sub;
+ long was_ok_am;
+ long fallback;
+ CV* table[NofAMmeth];
+};
+struct am_table_short {
+ U32 flags;
+ U32 was_ok_sub;
+ long was_ok_am;
+};
+typedef struct am_table AMT;
+typedef struct am_table_short AMTS;
+
+#define AMGfallNEVER 1
+#define AMGfallNO 2
+#define AMGfallYES 3
+
+#define AMTf_AMAGIC 1
+#define AMTf_OVERLOADED 2
+#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
+#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
+#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
+#define AMT_OVERLOADED(amt) ((amt)->flags & AMTf_OVERLOADED)
+#define AMT_OVERLOADED_on(amt) ((amt)->flags |= AMTf_OVERLOADED)
+#define AMT_OVERLOADED_off(amt) ((amt)->flags &= ~AMTf_OVERLOADED)
+
+#define StashHANDLER(stash,meth) gv_handler((stash),CAT2(meth,_amg))
+
+/*
+ * some compilers like to redefine cos et alia as faster
+ * (and less accurate?) versions called F_cos et cetera (Quidquid
+ * latine dictum sit, altum viditur.) This trick collides with
+ * the Perl overloading (amg). The following #defines fool both.
+ */
+
+#ifdef _FASTMATH
+# ifdef atan2
+# define F_atan2_amg atan2_amg
+# endif
+# ifdef cos
+# define F_cos_amg cos_amg
+# endif
+# ifdef exp
+# define F_exp_amg exp_amg
+# endif
+# ifdef log
+# define F_log_amg log_amg
+# endif
+# ifdef pow
+# define F_pow_amg pow_amg
+# endif
+# ifdef sin
+# define F_sin_amg sin_amg
+# endif
+# ifdef sqrt
+# define F_sqrt_amg sqrt_amg
+# endif
+#endif /* _FASTMATH */
+
+#define PERLDB_ALL (PERLDBf_SUB | PERLDBf_LINE | \
+ PERLDBf_NOOPT | PERLDBf_INTER | \
+ PERLDBf_SUBLINE| PERLDBf_SINGLE| \
+ PERLDBf_NAMEEVAL| PERLDBf_NAMEANON | \
+ PERLDBf_SAVESRC)
+ /* No _NONAME, _GOTO */
+#define PERLDBf_SUB 0x01 /* Debug sub enter/exit */
+#define PERLDBf_LINE 0x02 /* Keep line # */
+#define PERLDBf_NOOPT 0x04 /* Switch off optimizations */
+#define PERLDBf_INTER 0x08 /* Preserve more data for
+ later inspections */
+#define PERLDBf_SUBLINE 0x10 /* Keep subr source lines */
+#define PERLDBf_SINGLE 0x20 /* Start with single-step on */
+#define PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr */
+#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto */
+#define PERLDBf_NAMEEVAL 0x100 /* Informative names for evals */
+#define PERLDBf_NAMEANON 0x200 /* Informative names for anon subs */
+#define PERLDBf_SAVESRC 0x400 /* Save source lines into @{"_<$filename"} */
+#define PERLDBf_SAVESRC_NOSUBS 0x800 /* Including evals that generate no subrouties */
+#define PERLDBf_SAVESRC_INVALID 0x1000 /* Save source that did not compile */
+
+#define PERLDB_SUB (PL_perldb && (PL_perldb & PERLDBf_SUB))
+#define PERLDB_LINE (PL_perldb && (PL_perldb & PERLDBf_LINE))
+#define PERLDB_NOOPT (PL_perldb && (PL_perldb & PERLDBf_NOOPT))
+#define PERLDB_INTER (PL_perldb && (PL_perldb & PERLDBf_INTER))
+#define PERLDB_SUBLINE (PL_perldb && (PL_perldb & PERLDBf_SUBLINE))
+#define PERLDB_SINGLE (PL_perldb && (PL_perldb & PERLDBf_SINGLE))
+#define PERLDB_SUB_NN (PL_perldb && (PL_perldb & (PERLDBf_NONAME)))
+#define PERLDB_GOTO (PL_perldb && (PL_perldb & PERLDBf_GOTO))
+#define PERLDB_NAMEEVAL (PL_perldb && (PL_perldb & PERLDBf_NAMEEVAL))
+#define PERLDB_NAMEANON (PL_perldb && (PL_perldb & PERLDBf_NAMEANON))
+#define PERLDB_SAVESRC (PL_perldb && (PL_perldb & PERLDBf_SAVESRC))
+#define PERLDB_SAVESRC_NOSUBS (PL_perldb && (PL_perldb & PERLDBf_SAVESRC_NOSUBS))
+#define PERLDB_SAVESRC_INVALID (PL_perldb && (PL_perldb & PERLDBf_SAVESRC_INVALID))
+
+#ifdef USE_LOCALE_NUMERIC
+
+#define SET_NUMERIC_STANDARD() \
+ set_numeric_standard();
+
+#define SET_NUMERIC_LOCAL() \
+ set_numeric_local();
+
+#define IN_LOCALE_RUNTIME (CopHINTS_get(PL_curcop) & HINT_LOCALE)
+#define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
+
+#define IN_LOCALE \
+ (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+
+#define STORE_NUMERIC_LOCAL_SET_STANDARD() \
+ bool was_local = PL_numeric_local && IN_LOCALE; \
+ if (was_local) SET_NUMERIC_STANDARD();
+
+#define STORE_NUMERIC_STANDARD_SET_LOCAL() \
+ bool was_standard = PL_numeric_standard && IN_LOCALE; \
+ if (was_standard) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_LOCAL() \
+ if (was_local) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_STANDARD() \
+ if (was_standard) SET_NUMERIC_STANDARD();
+
+#define Atof my_atof
+
+#else /* !USE_LOCALE_NUMERIC */
+
+#define SET_NUMERIC_STANDARD() /**/
+#define SET_NUMERIC_LOCAL() /**/
+#define IS_NUMERIC_RADIX(a, b) (0)
+#define STORE_NUMERIC_LOCAL_SET_STANDARD() /**/
+#define STORE_NUMERIC_STANDARD_SET_LOCAL() /**/
+#define RESTORE_NUMERIC_LOCAL() /**/
+#define RESTORE_NUMERIC_STANDARD() /**/
+#define Atof my_atof
+#define IN_LOCALE_RUNTIME 0
+
+#endif /* !USE_LOCALE_NUMERIC */
+
+#if !defined(Strtol) && defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+# ifdef __hpux
+# define strtoll __strtoll /* secret handshake */
+# endif
+# ifdef WIN64
+# define strtoll _strtoi64 /* secret handshake */
+# endif
+# if !defined(Strtol) && defined(HAS_STRTOLL)
+# define Strtol strtoll
+# endif
+# if !defined(Strtol) && defined(HAS_STRTOQ)
+# define Strtol strtoq
+# endif
+/* is there atoq() anywhere? */
+#endif
+#if !defined(Strtol) && defined(HAS_STRTOL)
+# define Strtol strtol
+#endif
+#ifndef Atol
+/* It would be more fashionable to use Strtol() to define atol()
+ * (as is done for Atoul(), see below) but for backward compatibility
+ * we just assume atol(). */
+# if defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG && defined(HAS_ATOLL)
+# ifdef WIN64
+# define atoll _atoi64 /* secret handshake */
+# endif
+# define Atol atoll
+# else
+# define Atol atol
+# endif
+#endif
+
+#if !defined(Strtoul) && defined(USE_64_BIT_INT) && defined(UV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+# ifdef __hpux
+# define strtoull __strtoull /* secret handshake */
+# endif
+# ifdef WIN64
+# define strtoull _strtoui64 /* secret handshake */
+# endif
+# if !defined(Strtoul) && defined(HAS_STRTOULL)
+# define Strtoul strtoull
+# endif
+# if !defined(Strtoul) && defined(HAS_STRTOUQ)
+# define Strtoul strtouq
+# endif
+/* is there atouq() anywhere? */
+#endif
+#if !defined(Strtoul) && defined(HAS_STRTOUL)
+# define Strtoul strtoul
+#endif
+#if !defined(Strtoul) && defined(HAS_STRTOL) /* Last resort. */
+# define Strtoul(s, e, b) strchr((s), '-') ? ULONG_MAX : (unsigned long)strtol((s), (e), (b))
+#endif
+#ifndef Atoul
+# define Atoul(s) Strtoul(s, NULL, 10)
+#endif
+
+
+/* if these never got defined, they need defaults */
+#ifndef PERL_SET_CONTEXT
+# define PERL_SET_CONTEXT(i) PERL_SET_INTERP(i)
+#endif
+
+#ifndef PERL_GET_CONTEXT
+# define PERL_GET_CONTEXT PERL_GET_INTERP
+#endif
+
+#ifndef PERL_GET_THX
+# define PERL_GET_THX ((void*)NULL)
+#endif
+
+#ifndef PERL_SET_THX
+# define PERL_SET_THX(t) NOOP
+#endif
+
+#ifndef PERL_SCRIPT_MODE
+#define PERL_SCRIPT_MODE "r"
+#endif
+
+/*
+ * Some operating systems are stingy with stack allocation,
+ * so perl may have to guard against stack overflow.
+ */
+#ifndef PERL_STACK_OVERFLOW_CHECK
+#define PERL_STACK_OVERFLOW_CHECK() NOOP
+#endif
+
+/*
+ * Some nonpreemptive operating systems find it convenient to
+ * check for asynchronous conditions after each op execution.
+ * Keep this check simple, or it may slow down execution
+ * massively.
+ */
+
+#ifndef PERL_MICRO
+# ifndef PERL_ASYNC_CHECK
+# define PERL_ASYNC_CHECK() if (PL_sig_pending) despatch_signals()
+# endif
+#endif
+
+#ifndef PERL_ASYNC_CHECK
+# define PERL_ASYNC_CHECK() NOOP
+#endif
+
+/*
+ * On some operating systems, a memory allocation may succeed,
+ * but put the process too close to the system's comfort limit.
+ * In this case, PERL_ALLOC_CHECK frees the pointer and sets
+ * it to NULL.
+ */
+#ifndef PERL_ALLOC_CHECK
+#define PERL_ALLOC_CHECK(p) NOOP
+#endif
+
+#ifdef HAS_SEM
+# include <sys/ipc.h>
+# include <sys/sem.h>
+# ifndef HAS_UNION_SEMUN /* Provide the union semun. */
+ union semun {
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+ };
+# endif
+# ifdef USE_SEMCTL_SEMUN
+# ifdef IRIX32_SEMUN_BROKEN_BY_GCC
+ union gccbug_semun {
+ int val;
+ struct semid_ds *buf;
+ unsigned short *array;
+ char __dummy[5];
+ };
+# define semun gccbug_semun
+# endif
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
+# else
+# ifdef USE_SEMCTL_SEMID_DS
+# ifdef EXTRA_F_IN_SEMUN_BUF
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buff)
+# else
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
+# endif
+# endif
+# 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/XS/APItest/APItest.xs for an example of the use of these macros,
+ * and perlxs.pod for more.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g.
+ * "DynaLoader::_guts" XS_VERSION
+ * XXX in the current implementation, this string is ignored.
+ * 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(PERL_IMPLICIT_CONTEXT)
+
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+
+/* 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
+#define MY_CXT_INDEX Perl_my_cxt_index(aTHX_ MY_CXT_KEY)
+
+/* 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 \
+ my_cxt_t *my_cxtp = \
+ (my_cxt_t*)Perl_my_cxt_init(aTHX_ MY_CXT_KEY, sizeof(my_cxt_t))
+#define MY_CXT_INIT_INTERP(my_perl) \
+ my_cxt_t *my_cxtp = \
+ (my_cxt_t*)Perl_my_cxt_init(my_perl, MY_CXT_KEY, sizeof(my_cxt_t))
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT \
+ my_cxt_t *my_cxtp = (my_cxt_t *)PL_my_cxt_list[MY_CXT_INDEX]
+#define dMY_CXT_INTERP(my_perl) \
+ my_cxt_t *my_cxtp = (my_cxt_t *)(my_perl)->Imy_cxt_list[MY_CXT_INDEX]
+
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Copy(PL_my_cxt_list[MY_CXT_INDEX], my_cxtp, 1, my_cxt_t);\
+ PL_my_cxt_list[MY_CXT_INDEX] = my_cxtp \
+
+#else /* #ifdef PERL_GLOBAL_STRUCT_PRIVATE */
+
+/* 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 static int my_cxt_index = -1;
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT \
+ my_cxt_t *my_cxtp = (my_cxt_t *)PL_my_cxt_list[my_cxt_index]
+#define dMY_CXT_INTERP(my_perl) \
+ my_cxt_t *my_cxtp = (my_cxt_t *)(my_perl)->Imy_cxt_list[my_cxt_index]
+
+/* 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 \
+ my_cxt_t *my_cxtp = \
+ (my_cxt_t*)Perl_my_cxt_init(aTHX_ &my_cxt_index, sizeof(my_cxt_t))
+#define MY_CXT_INIT_INTERP(my_perl) \
+ my_cxt_t *my_cxtp = \
+ (my_cxt_t*)Perl_my_cxt_init(my_perl, &my_cxt_index, sizeof(my_cxt_t))
+
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+ Copy(PL_my_cxt_list[my_cxt_index], my_cxtp, 1, my_cxt_t);\
+ PL_my_cxt_list[my_cxt_index] = my_cxtp \
+
+#endif /* #ifdef PERL_GLOBAL_STRUCT_PRIVATE */
+
+/* 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
+
+#else /* PERL_IMPLICIT_CONTEXT */
+
+#define START_MY_CXT static my_cxt_t my_cxt;
+#define dMY_CXT_SV dNOOP
+#define dMY_CXT dNOOP
+#define dMY_CXT_INTERP(my_perl) dNOOP
+#define MY_CXT_INIT NOOP
+#define MY_CXT_CLONE 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 /* !defined(PERL_IMPLICIT_CONTEXT) */
+
+#ifdef I_FCNTL
+# include <fcntl.h>
+#endif
+
+#ifdef __Lynx__
+# include <fcntl.h>
+#endif
+
+#ifdef I_SYS_FILE
+# include <sys/file.h>
+#endif
+
+#if defined(HAS_FLOCK) && !defined(HAS_FLOCK_PROTO)
+int flock(int fd, int op);
+#endif
+
+#ifndef O_RDONLY
+/* Assume UNIX defaults */
+# define O_RDONLY 0000
+# define O_WRONLY 0001
+# define O_RDWR 0002
+# define O_CREAT 0100
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+#ifndef O_TEXT
+# define O_TEXT 0
+#endif
+
+#if O_TEXT != O_BINARY
+ /* If you have different O_TEXT and O_BINARY and you are a CLRF shop,
+ * that is, you are somehow DOSish. */
+# if defined(__BEOS__) || defined(__HAIKU__) || defined(__VOS__) || \
+ defined(__CYGWIN__)
+ /* BeOS/Haiku has O_TEXT != O_BINARY but O_TEXT and O_BINARY have no effect;
+ * BeOS/Haiku is always UNIXoid (LF), not DOSish (CRLF). */
+ /* VOS has O_TEXT != O_BINARY, and they have effect,
+ * but VOS always uses LF, never CRLF. */
+ /* If you have O_TEXT different from your O_BINARY but you still are
+ * not a CRLF shop. */
+# undef PERLIO_USING_CRLF
+# else
+ /* If you really are DOSish. */
+# define PERLIO_USING_CRLF 1
+# endif
+#endif
+
+#ifdef I_LIBUTIL
+# include <libutil.h> /* setproctitle() in some FreeBSDs */
+#endif
+
+#ifndef EXEC_ARGV_CAST
+#define EXEC_ARGV_CAST(x) (char **)x
+#endif
+
+#define IS_NUMBER_IN_UV 0x01 /* number within UV range (maybe not
+ int). value returned in pointed-
+ to UV */
+#define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 /* pointed to UV undefined */
+#define IS_NUMBER_NOT_INT 0x04 /* saw . or E notation */
+#define IS_NUMBER_NEG 0x08 /* leading minus sign */
+#define IS_NUMBER_INFINITY 0x10 /* this is big */
+#define IS_NUMBER_NAN 0x20 /* this is not */
+
+#define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+
+/* Input flags: */
+#define PERL_SCAN_ALLOW_UNDERSCORES 0x01 /* grok_??? accept _ in numbers */
+#define PERL_SCAN_DISALLOW_PREFIX 0x02 /* grok_??? reject 0x in hex etc */
+#define PERL_SCAN_SILENT_ILLDIGIT 0x04 /* grok_??? not warn about illegal digits */
+/* Output flags: */
+#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */
+
+/* to let user control profiling */
+#ifdef PERL_GPROF_CONTROL
+extern void moncontrol(int);
+#define PERL_GPROF_MONCONTROL(x) moncontrol(x)
+#else
+#define PERL_GPROF_MONCONTROL(x)
+#endif
+
+#ifdef UNDER_CE
+#include "wince.h"
+#endif
+
+/* ISO 6429 NEL - C1 control NExt Line */
+/* See http://www.unicode.org/unicode/reports/tr13/ */
+#ifdef EBCDIC /* In EBCDIC NEL is just an alias for LF */
+# if '^' == 95 /* CP 1047: MVS OpenEdition - OS/390 - z/OS */
+# define NEXT_LINE_CHAR 0x15
+# else /* CDRA */
+# define NEXT_LINE_CHAR 0x25
+# endif
+#else
+# define NEXT_LINE_CHAR 0x85
+#endif
+
+/* The UTF-8 bytes of the Unicode LS and PS, U+2028 and U+2029 */
+#define UNICODE_LINE_SEPA_0 0xE2
+#define UNICODE_LINE_SEPA_1 0x80
+#define UNICODE_LINE_SEPA_2 0xA8
+#define UNICODE_PARA_SEPA_0 0xE2
+#define UNICODE_PARA_SEPA_1 0x80
+#define UNICODE_PARA_SEPA_2 0xA9
+
+#ifndef PIPESOCK_MODE
+# define PIPESOCK_MODE
+#endif
+
+#ifndef SOCKET_OPEN_MODE
+# define SOCKET_OPEN_MODE PIPESOCK_MODE
+#endif
+
+#ifndef PIPE_OPEN_MODE
+# define PIPE_OPEN_MODE PIPESOCK_MODE
+#endif
+
+#define PERL_MAGIC_UTF8_CACHESIZE 2
+
+#define PERL_UNICODE_STDIN_FLAG 0x0001
+#define PERL_UNICODE_STDOUT_FLAG 0x0002
+#define PERL_UNICODE_STDERR_FLAG 0x0004
+#define PERL_UNICODE_IN_FLAG 0x0008
+#define PERL_UNICODE_OUT_FLAG 0x0010
+#define PERL_UNICODE_ARGV_FLAG 0x0020
+#define PERL_UNICODE_LOCALE_FLAG 0x0040
+#define PERL_UNICODE_WIDESYSCALLS_FLAG 0x0080 /* for Sarathy */
+#define PERL_UNICODE_UTF8CACHEASSERT_FLAG 0x0100
+
+#define PERL_UNICODE_STD_FLAG \
+ (PERL_UNICODE_STDIN_FLAG | \
+ PERL_UNICODE_STDOUT_FLAG | \
+ PERL_UNICODE_STDERR_FLAG)
+
+#define PERL_UNICODE_INOUT_FLAG \
+ (PERL_UNICODE_IN_FLAG | \
+ PERL_UNICODE_OUT_FLAG)
+
+#define PERL_UNICODE_DEFAULT_FLAGS \
+ (PERL_UNICODE_STD_FLAG | \
+ PERL_UNICODE_INOUT_FLAG | \
+ PERL_UNICODE_LOCALE_FLAG)
+
+#define PERL_UNICODE_ALL_FLAGS 0x01ff
+
+#define PERL_UNICODE_STDIN 'I'
+#define PERL_UNICODE_STDOUT 'O'
+#define PERL_UNICODE_STDERR 'E'
+#define PERL_UNICODE_STD 'S'
+#define PERL_UNICODE_IN 'i'
+#define PERL_UNICODE_OUT 'o'
+#define PERL_UNICODE_INOUT 'D'
+#define PERL_UNICODE_ARGV 'A'
+#define PERL_UNICODE_LOCALE 'L'
+#define PERL_UNICODE_WIDESYSCALLS 'W'
+#define PERL_UNICODE_UTF8CACHEASSERT 'a'
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+/* From sigaction(2) (FreeBSD man page):
+ * | Signal routines normally execute with the signal that
+ * | caused their invocation blocked, but other signals may
+ * | yet occur.
+ * Emulation of this behavior (from within Perl) is enabled
+ * by defining PERL_BLOCK_SIGNALS.
+ */
+#define PERL_BLOCK_SIGNALS
+
+#if defined(HAS_SIGPROCMASK) && defined(PERL_BLOCK_SIGNALS)
+# define PERL_BLOCKSIG_ADD(set,sig) \
+ sigset_t set; sigemptyset(&(set)); sigaddset(&(set), sig)
+# define PERL_BLOCKSIG_BLOCK(set) \
+ sigprocmask(SIG_BLOCK, &(set), NULL)
+# define PERL_BLOCKSIG_UNBLOCK(set) \
+ sigprocmask(SIG_UNBLOCK, &(set), NULL)
+#endif /* HAS_SIGPROCMASK && PERL_BLOCK_SIGNALS */
+
+/* How about the old style of sigblock()? */
+
+#ifndef PERL_BLOCKSIG_ADD
+# define PERL_BLOCKSIG_ADD(set, sig) NOOP
+#endif
+#ifndef PERL_BLOCKSIG_BLOCK
+# define PERL_BLOCKSIG_BLOCK(set) NOOP
+#endif
+#ifndef PERL_BLOCKSIG_UNBLOCK
+# define PERL_BLOCKSIG_UNBLOCK(set) NOOP
+#endif
+
+/* Use instead of abs() since abs() forces its argument to be an int,
+ * but also beware since this evaluates its argument twice, so no x++. */
+#define PERL_ABS(x) ((x) < 0 ? -(x) : (x))
+
+#if defined(__DECC) && defined(__osf__)
+#pragma message disable (mainparm) /* Perl uses the envp in main(). */
+#endif
+
+#define do_open(g, n, l, a, rm, rp, sf) \
+ do_openn(g, n, l, a, rm, rp, sf, (SV **) NULL, 0)
+#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
+# define do_exec(cmd) do_exec3(cmd,0,0)
+#endif
+#ifdef OS2
+# define do_aexec Perl_do_aexec
+#else
+# define do_aexec(really, mark,sp) do_aexec5(really, mark, sp, 0, 0)
+#endif
+
+#if defined(OEMVS)
+#define NO_ENV_ARRAY_IN_MAIN
+#endif
+
+/* These are used by Perl_pv_escape() and Perl_pv_pretty()
+ * are here so that they are available throughout the core
+ * NOTE that even though some are for _escape and some for _pretty
+ * there must not be any clashes as the flags from _pretty are
+ * passed straight through to _escape.
+ */
+
+#define PERL_PV_ESCAPE_QUOTE 0x0001
+#define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE
+
+#define PERL_PV_PRETTY_ELLIPSES 0x0002
+#define PERL_PV_PRETTY_LTGT 0x0004
+
+#define PERL_PV_ESCAPE_FIRSTCHAR 0x0008
+
+#define PERL_PV_ESCAPE_UNI 0x0100
+#define PERL_PV_ESCAPE_UNI_DETECT 0x0200
+
+#define PERL_PV_ESCAPE_ALL 0x1000
+#define PERL_PV_ESCAPE_NOBACKSLASH 0x2000
+#define PERL_PV_ESCAPE_NOCLEAR 0x4000
+#define PERL_PV_ESCAPE_RE 0x8000
+
+#define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR
+
+/* used by pv_display in dump.c*/
+#define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
+#define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
+
+/*
+
+ (KEEP THIS LAST IN perl.h!)
+
+ Mention
+
+ NV_PRESERVES_UV
+
+ HAS_MKSTEMP
+ HAS_MKSTEMPS
+ HAS_MKDTEMP
+
+ HAS_GETCWD
+
+ HAS_MMAP
+ HAS_MPROTECT
+ HAS_MSYNC
+ HAS_MADVISE
+ HAS_MUNMAP
+ I_SYSMMAN
+ Mmap_t
+
+ NVef
+ NVff
+ NVgf
+
+ HAS_UALARM
+ HAS_USLEEP
+
+ HAS_SETITIMER
+ HAS_GETITIMER
+
+ HAS_SENDMSG
+ HAS_RECVMSG
+ HAS_READV
+ HAS_WRITEV
+ I_SYSUIO
+ HAS_STRUCT_MSGHDR
+ HAS_STRUCT_CMSGHDR
+
+ HAS_NL_LANGINFO
+
+ HAS_DIRFD
+
+ so that Configure picks them up.
+
+ (KEEP THIS LAST IN perl.h!)
+
+*/
+
+#endif /* Include guard */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perlapi.h b/Master/tlpkg/tlperl/lib/CORE/perlapi.h
new file mode 100644
index 00000000000..54ddab03108
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perlapi.h
@@ -0,0 +1,861 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * perlapi.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, and perlvars.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+/* declare accessor functions for Perl variables */
+#ifndef __perlapi_h__
+#define __perlapi_h__
+
+#if defined (MULTIPLICITY)
+
+START_EXTERN_C
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#undef PERLVARISC
+#define PERLVAR(v,t) EXTERN_C t* Perl_##v##_ptr(pTHX);
+#define PERLVARA(v,n,t) typedef t PL_##v##_t[n]; \
+ EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v, const t)
+#define PERLVARISC(v,i) typedef const char PL_##v##_t[sizeof(i)]; \
+ EXTERN_C PL_##v##_t* Perl_##v##_ptr(pTHX);
+
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#undef PERLVARISC
+
+#ifndef PERL_GLOBAL_STRUCT
+EXTERN_C Perl_ppaddr_t** Perl_Gppaddr_ptr(pTHX);
+EXTERN_C Perl_check_t** Perl_Gcheck_ptr(pTHX);
+EXTERN_C unsigned char** Perl_Gfold_locale_ptr(pTHX);
+#define Perl_ppaddr_ptr Perl_Gppaddr_ptr
+#define Perl_check_ptr Perl_Gcheck_ptr
+#define Perl_fold_locale_ptr Perl_Gfold_locale_ptr
+#endif
+
+END_EXTERN_C
+
+#if defined(PERL_CORE)
+
+/* accessor functions for Perl variables (provide binary compatibility) */
+
+/* these need to be mentioned here, or most linkers won't put them in
+ the perl executable */
+
+#ifndef PERL_NO_FORCE_LINK
+
+START_EXTERN_C
+
+#ifndef DOINIT
+EXTCONST void * const PL_force_link_funcs[];
+#else
+EXTCONST void * const PL_force_link_funcs[] = {
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#define PERLVAR(v,t) (void*)Perl_##v##_ptr,
+#define PERLVARA(v,n,t) PERLVAR(v,t)
+#define PERLVARI(v,t,i) PERLVAR(v,t)
+#define PERLVARIC(v,t,i) PERLVAR(v,t)
+#define PERLVARISC(v,i) PERLVAR(v,char)
+
+/* In Tru64 (__DEC && __osf__) the cc option -std1 causes that one
+ * cannot cast between void pointers and function pointers without
+ * info level warnings. The PL_force_link_funcs[] would cause a few
+ * hundred of those warnings. In code one can circumnavigate this by using
+ * unions that overlay the different pointers, but in declarations one
+ * cannot use this trick. Therefore we just disable the warning here
+ * for the duration of the PL_force_link_funcs[] declaration. */
+
+#if defined(__DECC) && defined(__osf__)
+#pragma message save
+#pragma message disable (nonstandcast)
+#endif
+
+#include "intrpvar.h"
+#include "perlvars.h"
+
+#if defined(__DECC) && defined(__osf__)
+#pragma message restore
+#endif
+
+#undef PERLVAR
+#undef PERLVARA
+#undef PERLVARI
+#undef PERLVARIC
+#undef PERLVARISC
+};
+#endif /* DOINIT */
+
+END_EXTERN_C
+
+#endif /* PERL_NO_FORCE_LINK */
+
+#else /* !PERL_CORE */
+
+#undef PL_Argv
+#define PL_Argv (*Perl_IArgv_ptr(aTHX))
+#undef PL_Cmd
+#define PL_Cmd (*Perl_ICmd_ptr(aTHX))
+#undef PL_DBcv
+#define PL_DBcv (*Perl_IDBcv_ptr(aTHX))
+#undef PL_DBgv
+#define PL_DBgv (*Perl_IDBgv_ptr(aTHX))
+#undef PL_DBline
+#define PL_DBline (*Perl_IDBline_ptr(aTHX))
+#undef PL_DBsignal
+#define PL_DBsignal (*Perl_IDBsignal_ptr(aTHX))
+#undef PL_DBsingle
+#define PL_DBsingle (*Perl_IDBsingle_ptr(aTHX))
+#undef PL_DBsub
+#define PL_DBsub (*Perl_IDBsub_ptr(aTHX))
+#undef PL_DBtrace
+#define PL_DBtrace (*Perl_IDBtrace_ptr(aTHX))
+#undef PL_Dir
+#define PL_Dir (*Perl_IDir_ptr(aTHX))
+#undef PL_Env
+#define PL_Env (*Perl_IEnv_ptr(aTHX))
+#undef PL_LIO
+#define PL_LIO (*Perl_ILIO_ptr(aTHX))
+#undef PL_Mem
+#define PL_Mem (*Perl_IMem_ptr(aTHX))
+#undef PL_MemParse
+#define PL_MemParse (*Perl_IMemParse_ptr(aTHX))
+#undef PL_MemShared
+#define PL_MemShared (*Perl_IMemShared_ptr(aTHX))
+#undef PL_OpPtr
+#define PL_OpPtr (*Perl_IOpPtr_ptr(aTHX))
+#undef PL_OpSlab
+#define PL_OpSlab (*Perl_IOpSlab_ptr(aTHX))
+#undef PL_OpSpace
+#define PL_OpSpace (*Perl_IOpSpace_ptr(aTHX))
+#undef PL_Proc
+#define PL_Proc (*Perl_IProc_ptr(aTHX))
+#undef PL_Sock
+#define PL_Sock (*Perl_ISock_ptr(aTHX))
+#undef PL_StdIO
+#define PL_StdIO (*Perl_IStdIO_ptr(aTHX))
+#undef PL_Sv
+#define PL_Sv (*Perl_ISv_ptr(aTHX))
+#undef PL_Xpv
+#define PL_Xpv (*Perl_IXpv_ptr(aTHX))
+#undef PL_amagic_generation
+#define PL_amagic_generation (*Perl_Iamagic_generation_ptr(aTHX))
+#undef PL_an
+#define PL_an (*Perl_Ian_ptr(aTHX))
+#undef PL_argvgv
+#define PL_argvgv (*Perl_Iargvgv_ptr(aTHX))
+#undef PL_argvout_stack
+#define PL_argvout_stack (*Perl_Iargvout_stack_ptr(aTHX))
+#undef PL_argvoutgv
+#define PL_argvoutgv (*Perl_Iargvoutgv_ptr(aTHX))
+#undef PL_basetime
+#define PL_basetime (*Perl_Ibasetime_ptr(aTHX))
+#undef PL_beginav
+#define PL_beginav (*Perl_Ibeginav_ptr(aTHX))
+#undef PL_beginav_save
+#define PL_beginav_save (*Perl_Ibeginav_save_ptr(aTHX))
+#undef PL_body_arenas
+#define PL_body_arenas (*Perl_Ibody_arenas_ptr(aTHX))
+#undef PL_body_roots
+#define PL_body_roots (*Perl_Ibody_roots_ptr(aTHX))
+#undef PL_bodytarget
+#define PL_bodytarget (*Perl_Ibodytarget_ptr(aTHX))
+#undef PL_breakable_sub_gen
+#define PL_breakable_sub_gen (*Perl_Ibreakable_sub_gen_ptr(aTHX))
+#undef PL_checkav
+#define PL_checkav (*Perl_Icheckav_ptr(aTHX))
+#undef PL_checkav_save
+#define PL_checkav_save (*Perl_Icheckav_save_ptr(aTHX))
+#undef PL_chopset
+#define PL_chopset (*Perl_Ichopset_ptr(aTHX))
+#undef PL_clocktick
+#define PL_clocktick (*Perl_Iclocktick_ptr(aTHX))
+#undef PL_collation_ix
+#define PL_collation_ix (*Perl_Icollation_ix_ptr(aTHX))
+#undef PL_collation_name
+#define PL_collation_name (*Perl_Icollation_name_ptr(aTHX))
+#undef PL_collation_standard
+#define PL_collation_standard (*Perl_Icollation_standard_ptr(aTHX))
+#undef PL_collxfrm_base
+#define PL_collxfrm_base (*Perl_Icollxfrm_base_ptr(aTHX))
+#undef PL_collxfrm_mult
+#define PL_collxfrm_mult (*Perl_Icollxfrm_mult_ptr(aTHX))
+#undef PL_colors
+#define PL_colors (*Perl_Icolors_ptr(aTHX))
+#undef PL_colorset
+#define PL_colorset (*Perl_Icolorset_ptr(aTHX))
+#undef PL_compcv
+#define PL_compcv (*Perl_Icompcv_ptr(aTHX))
+#undef PL_compiling
+#define PL_compiling (*Perl_Icompiling_ptr(aTHX))
+#undef PL_comppad
+#define PL_comppad (*Perl_Icomppad_ptr(aTHX))
+#undef PL_comppad_name
+#define PL_comppad_name (*Perl_Icomppad_name_ptr(aTHX))
+#undef PL_comppad_name_fill
+#define PL_comppad_name_fill (*Perl_Icomppad_name_fill_ptr(aTHX))
+#undef PL_comppad_name_floor
+#define PL_comppad_name_floor (*Perl_Icomppad_name_floor_ptr(aTHX))
+#undef PL_cop_seqmax
+#define PL_cop_seqmax (*Perl_Icop_seqmax_ptr(aTHX))
+#undef PL_cryptseen
+#define PL_cryptseen (*Perl_Icryptseen_ptr(aTHX))
+#undef PL_curcop
+#define PL_curcop (*Perl_Icurcop_ptr(aTHX))
+#undef PL_curcopdb
+#define PL_curcopdb (*Perl_Icurcopdb_ptr(aTHX))
+#undef PL_curpad
+#define PL_curpad (*Perl_Icurpad_ptr(aTHX))
+#undef PL_curpm
+#define PL_curpm (*Perl_Icurpm_ptr(aTHX))
+#undef PL_curstack
+#define PL_curstack (*Perl_Icurstack_ptr(aTHX))
+#undef PL_curstackinfo
+#define PL_curstackinfo (*Perl_Icurstackinfo_ptr(aTHX))
+#undef PL_curstash
+#define PL_curstash (*Perl_Icurstash_ptr(aTHX))
+#undef PL_curstname
+#define PL_curstname (*Perl_Icurstname_ptr(aTHX))
+#undef PL_custom_op_descs
+#define PL_custom_op_descs (*Perl_Icustom_op_descs_ptr(aTHX))
+#undef PL_custom_op_names
+#define PL_custom_op_names (*Perl_Icustom_op_names_ptr(aTHX))
+#undef PL_cv_has_eval
+#define PL_cv_has_eval (*Perl_Icv_has_eval_ptr(aTHX))
+#undef PL_dbargs
+#define PL_dbargs (*Perl_Idbargs_ptr(aTHX))
+#undef PL_debstash
+#define PL_debstash (*Perl_Idebstash_ptr(aTHX))
+#undef PL_debug
+#define PL_debug (*Perl_Idebug_ptr(aTHX))
+#undef PL_debug_pad
+#define PL_debug_pad (*Perl_Idebug_pad_ptr(aTHX))
+#undef PL_def_layerlist
+#define PL_def_layerlist (*Perl_Idef_layerlist_ptr(aTHX))
+#undef PL_defgv
+#define PL_defgv (*Perl_Idefgv_ptr(aTHX))
+#undef PL_defoutgv
+#define PL_defoutgv (*Perl_Idefoutgv_ptr(aTHX))
+#undef PL_defstash
+#define PL_defstash (*Perl_Idefstash_ptr(aTHX))
+#undef PL_delaymagic
+#define PL_delaymagic (*Perl_Idelaymagic_ptr(aTHX))
+#undef PL_destroyhook
+#define PL_destroyhook (*Perl_Idestroyhook_ptr(aTHX))
+#undef PL_diehook
+#define PL_diehook (*Perl_Idiehook_ptr(aTHX))
+#undef PL_dirty
+#define PL_dirty (*Perl_Idirty_ptr(aTHX))
+#undef PL_doextract
+#define PL_doextract (*Perl_Idoextract_ptr(aTHX))
+#undef PL_doswitches
+#define PL_doswitches (*Perl_Idoswitches_ptr(aTHX))
+#undef PL_dowarn
+#define PL_dowarn (*Perl_Idowarn_ptr(aTHX))
+#undef PL_dumper_fd
+#define PL_dumper_fd (*Perl_Idumper_fd_ptr(aTHX))
+#undef PL_dumpindent
+#define PL_dumpindent (*Perl_Idumpindent_ptr(aTHX))
+#undef PL_e_script
+#define PL_e_script (*Perl_Ie_script_ptr(aTHX))
+#undef PL_efloatbuf
+#define PL_efloatbuf (*Perl_Iefloatbuf_ptr(aTHX))
+#undef PL_efloatsize
+#define PL_efloatsize (*Perl_Iefloatsize_ptr(aTHX))
+#undef PL_egid
+#define PL_egid (*Perl_Iegid_ptr(aTHX))
+#undef PL_encoding
+#define PL_encoding (*Perl_Iencoding_ptr(aTHX))
+#undef PL_endav
+#define PL_endav (*Perl_Iendav_ptr(aTHX))
+#undef PL_envgv
+#define PL_envgv (*Perl_Ienvgv_ptr(aTHX))
+#undef PL_errgv
+#define PL_errgv (*Perl_Ierrgv_ptr(aTHX))
+#undef PL_errors
+#define PL_errors (*Perl_Ierrors_ptr(aTHX))
+#undef PL_euid
+#define PL_euid (*Perl_Ieuid_ptr(aTHX))
+#undef PL_eval_root
+#define PL_eval_root (*Perl_Ieval_root_ptr(aTHX))
+#undef PL_eval_start
+#define PL_eval_start (*Perl_Ieval_start_ptr(aTHX))
+#undef PL_evalseq
+#define PL_evalseq (*Perl_Ievalseq_ptr(aTHX))
+#undef PL_exit_flags
+#define PL_exit_flags (*Perl_Iexit_flags_ptr(aTHX))
+#undef PL_exitlist
+#define PL_exitlist (*Perl_Iexitlist_ptr(aTHX))
+#undef PL_exitlistlen
+#define PL_exitlistlen (*Perl_Iexitlistlen_ptr(aTHX))
+#undef PL_fdpid
+#define PL_fdpid (*Perl_Ifdpid_ptr(aTHX))
+#undef PL_filemode
+#define PL_filemode (*Perl_Ifilemode_ptr(aTHX))
+#undef PL_firstgv
+#define PL_firstgv (*Perl_Ifirstgv_ptr(aTHX))
+#undef PL_forkprocess
+#define PL_forkprocess (*Perl_Iforkprocess_ptr(aTHX))
+#undef PL_formfeed
+#define PL_formfeed (*Perl_Iformfeed_ptr(aTHX))
+#undef PL_formtarget
+#define PL_formtarget (*Perl_Iformtarget_ptr(aTHX))
+#undef PL_generation
+#define PL_generation (*Perl_Igeneration_ptr(aTHX))
+#undef PL_gensym
+#define PL_gensym (*Perl_Igensym_ptr(aTHX))
+#undef PL_gid
+#define PL_gid (*Perl_Igid_ptr(aTHX))
+#undef PL_glob_index
+#define PL_glob_index (*Perl_Iglob_index_ptr(aTHX))
+#undef PL_globalstash
+#define PL_globalstash (*Perl_Iglobalstash_ptr(aTHX))
+#undef PL_hash_seed
+#define PL_hash_seed (*Perl_Ihash_seed_ptr(aTHX))
+#undef PL_hintgv
+#define PL_hintgv (*Perl_Ihintgv_ptr(aTHX))
+#undef PL_hints
+#define PL_hints (*Perl_Ihints_ptr(aTHX))
+#undef PL_hv_fetch_ent_mh
+#define PL_hv_fetch_ent_mh (*Perl_Ihv_fetch_ent_mh_ptr(aTHX))
+#undef PL_in_clean_all
+#define PL_in_clean_all (*Perl_Iin_clean_all_ptr(aTHX))
+#undef PL_in_clean_objs
+#define PL_in_clean_objs (*Perl_Iin_clean_objs_ptr(aTHX))
+#undef PL_in_eval
+#define PL_in_eval (*Perl_Iin_eval_ptr(aTHX))
+#undef PL_in_load_module
+#define PL_in_load_module (*Perl_Iin_load_module_ptr(aTHX))
+#undef PL_incgv
+#define PL_incgv (*Perl_Iincgv_ptr(aTHX))
+#undef PL_initav
+#define PL_initav (*Perl_Iinitav_ptr(aTHX))
+#undef PL_inplace
+#define PL_inplace (*Perl_Iinplace_ptr(aTHX))
+#undef PL_isarev
+#define PL_isarev (*Perl_Iisarev_ptr(aTHX))
+#undef PL_known_layers
+#define PL_known_layers (*Perl_Iknown_layers_ptr(aTHX))
+#undef PL_last_in_gv
+#define PL_last_in_gv (*Perl_Ilast_in_gv_ptr(aTHX))
+#undef PL_last_swash_hv
+#define PL_last_swash_hv (*Perl_Ilast_swash_hv_ptr(aTHX))
+#undef PL_last_swash_key
+#define PL_last_swash_key (*Perl_Ilast_swash_key_ptr(aTHX))
+#undef PL_last_swash_klen
+#define PL_last_swash_klen (*Perl_Ilast_swash_klen_ptr(aTHX))
+#undef PL_last_swash_slen
+#define PL_last_swash_slen (*Perl_Ilast_swash_slen_ptr(aTHX))
+#undef PL_last_swash_tmps
+#define PL_last_swash_tmps (*Perl_Ilast_swash_tmps_ptr(aTHX))
+#undef PL_lastfd
+#define PL_lastfd (*Perl_Ilastfd_ptr(aTHX))
+#undef PL_lastgotoprobe
+#define PL_lastgotoprobe (*Perl_Ilastgotoprobe_ptr(aTHX))
+#undef PL_lastscream
+#define PL_lastscream (*Perl_Ilastscream_ptr(aTHX))
+#undef PL_laststatval
+#define PL_laststatval (*Perl_Ilaststatval_ptr(aTHX))
+#undef PL_laststype
+#define PL_laststype (*Perl_Ilaststype_ptr(aTHX))
+#undef PL_localizing
+#define PL_localizing (*Perl_Ilocalizing_ptr(aTHX))
+#undef PL_localpatches
+#define PL_localpatches (*Perl_Ilocalpatches_ptr(aTHX))
+#undef PL_lockhook
+#define PL_lockhook (*Perl_Ilockhook_ptr(aTHX))
+#undef PL_madskills
+#define PL_madskills (*Perl_Imadskills_ptr(aTHX))
+#undef PL_main_cv
+#define PL_main_cv (*Perl_Imain_cv_ptr(aTHX))
+#undef PL_main_root
+#define PL_main_root (*Perl_Imain_root_ptr(aTHX))
+#undef PL_main_start
+#define PL_main_start (*Perl_Imain_start_ptr(aTHX))
+#undef PL_mainstack
+#define PL_mainstack (*Perl_Imainstack_ptr(aTHX))
+#undef PL_markstack
+#define PL_markstack (*Perl_Imarkstack_ptr(aTHX))
+#undef PL_markstack_max
+#define PL_markstack_max (*Perl_Imarkstack_max_ptr(aTHX))
+#undef PL_markstack_ptr
+#define PL_markstack_ptr (*Perl_Imarkstack_ptr_ptr(aTHX))
+#undef PL_max_intro_pending
+#define PL_max_intro_pending (*Perl_Imax_intro_pending_ptr(aTHX))
+#undef PL_maxo
+#define PL_maxo (*Perl_Imaxo_ptr(aTHX))
+#undef PL_maxscream
+#define PL_maxscream (*Perl_Imaxscream_ptr(aTHX))
+#undef PL_maxsysfd
+#define PL_maxsysfd (*Perl_Imaxsysfd_ptr(aTHX))
+#undef PL_memory_debug_header
+#define PL_memory_debug_header (*Perl_Imemory_debug_header_ptr(aTHX))
+#undef PL_mess_sv
+#define PL_mess_sv (*Perl_Imess_sv_ptr(aTHX))
+#undef PL_min_intro_pending
+#define PL_min_intro_pending (*Perl_Imin_intro_pending_ptr(aTHX))
+#undef PL_minus_E
+#define PL_minus_E (*Perl_Iminus_E_ptr(aTHX))
+#undef PL_minus_F
+#define PL_minus_F (*Perl_Iminus_F_ptr(aTHX))
+#undef PL_minus_a
+#define PL_minus_a (*Perl_Iminus_a_ptr(aTHX))
+#undef PL_minus_c
+#define PL_minus_c (*Perl_Iminus_c_ptr(aTHX))
+#undef PL_minus_l
+#define PL_minus_l (*Perl_Iminus_l_ptr(aTHX))
+#undef PL_minus_n
+#define PL_minus_n (*Perl_Iminus_n_ptr(aTHX))
+#undef PL_minus_p
+#define PL_minus_p (*Perl_Iminus_p_ptr(aTHX))
+#undef PL_modcount
+#define PL_modcount (*Perl_Imodcount_ptr(aTHX))
+#undef PL_modglobal
+#define PL_modglobal (*Perl_Imodglobal_ptr(aTHX))
+#undef PL_my_cxt_keys
+#define PL_my_cxt_keys (*Perl_Imy_cxt_keys_ptr(aTHX))
+#undef PL_my_cxt_list
+#define PL_my_cxt_list (*Perl_Imy_cxt_list_ptr(aTHX))
+#undef PL_my_cxt_size
+#define PL_my_cxt_size (*Perl_Imy_cxt_size_ptr(aTHX))
+#undef PL_na
+#define PL_na (*Perl_Ina_ptr(aTHX))
+#undef PL_nice_chunk
+#define PL_nice_chunk (*Perl_Inice_chunk_ptr(aTHX))
+#undef PL_nice_chunk_size
+#define PL_nice_chunk_size (*Perl_Inice_chunk_size_ptr(aTHX))
+#undef PL_nomemok
+#define PL_nomemok (*Perl_Inomemok_ptr(aTHX))
+#undef PL_numeric_local
+#define PL_numeric_local (*Perl_Inumeric_local_ptr(aTHX))
+#undef PL_numeric_name
+#define PL_numeric_name (*Perl_Inumeric_name_ptr(aTHX))
+#undef PL_numeric_radix_sv
+#define PL_numeric_radix_sv (*Perl_Inumeric_radix_sv_ptr(aTHX))
+#undef PL_numeric_standard
+#define PL_numeric_standard (*Perl_Inumeric_standard_ptr(aTHX))
+#undef PL_ofsgv
+#define PL_ofsgv (*Perl_Iofsgv_ptr(aTHX))
+#undef PL_oldname
+#define PL_oldname (*Perl_Ioldname_ptr(aTHX))
+#undef PL_op
+#define PL_op (*Perl_Iop_ptr(aTHX))
+#undef PL_op_mask
+#define PL_op_mask (*Perl_Iop_mask_ptr(aTHX))
+#undef PL_opfreehook
+#define PL_opfreehook (*Perl_Iopfreehook_ptr(aTHX))
+#undef PL_opsave
+#define PL_opsave (*Perl_Iopsave_ptr(aTHX))
+#undef PL_origalen
+#define PL_origalen (*Perl_Iorigalen_ptr(aTHX))
+#undef PL_origargc
+#define PL_origargc (*Perl_Iorigargc_ptr(aTHX))
+#undef PL_origargv
+#define PL_origargv (*Perl_Iorigargv_ptr(aTHX))
+#undef PL_origenviron
+#define PL_origenviron (*Perl_Iorigenviron_ptr(aTHX))
+#undef PL_origfilename
+#define PL_origfilename (*Perl_Iorigfilename_ptr(aTHX))
+#undef PL_ors_sv
+#define PL_ors_sv (*Perl_Iors_sv_ptr(aTHX))
+#undef PL_osname
+#define PL_osname (*Perl_Iosname_ptr(aTHX))
+#undef PL_pad_reset_pending
+#define PL_pad_reset_pending (*Perl_Ipad_reset_pending_ptr(aTHX))
+#undef PL_padix
+#define PL_padix (*Perl_Ipadix_ptr(aTHX))
+#undef PL_padix_floor
+#define PL_padix_floor (*Perl_Ipadix_floor_ptr(aTHX))
+#undef PL_parser
+#define PL_parser (*Perl_Iparser_ptr(aTHX))
+#undef PL_patchlevel
+#define PL_patchlevel (*Perl_Ipatchlevel_ptr(aTHX))
+#undef PL_peepp
+#define PL_peepp (*Perl_Ipeepp_ptr(aTHX))
+#undef PL_perl_destruct_level
+#define PL_perl_destruct_level (*Perl_Iperl_destruct_level_ptr(aTHX))
+#undef PL_perldb
+#define PL_perldb (*Perl_Iperldb_ptr(aTHX))
+#undef PL_perlio
+#define PL_perlio (*Perl_Iperlio_ptr(aTHX))
+#undef PL_pidstatus
+#define PL_pidstatus (*Perl_Ipidstatus_ptr(aTHX))
+#undef PL_ppid
+#define PL_ppid (*Perl_Ippid_ptr(aTHX))
+#undef PL_preambleav
+#define PL_preambleav (*Perl_Ipreambleav_ptr(aTHX))
+#undef PL_profiledata
+#define PL_profiledata (*Perl_Iprofiledata_ptr(aTHX))
+#undef PL_psig_name
+#define PL_psig_name (*Perl_Ipsig_name_ptr(aTHX))
+#undef PL_psig_pend
+#define PL_psig_pend (*Perl_Ipsig_pend_ptr(aTHX))
+#undef PL_psig_ptr
+#define PL_psig_ptr (*Perl_Ipsig_ptr_ptr(aTHX))
+#undef PL_ptr_table
+#define PL_ptr_table (*Perl_Iptr_table_ptr(aTHX))
+#undef PL_reentrant_buffer
+#define PL_reentrant_buffer (*Perl_Ireentrant_buffer_ptr(aTHX))
+#undef PL_reentrant_retint
+#define PL_reentrant_retint (*Perl_Ireentrant_retint_ptr(aTHX))
+#undef PL_reg_state
+#define PL_reg_state (*Perl_Ireg_state_ptr(aTHX))
+#undef PL_regdummy
+#define PL_regdummy (*Perl_Iregdummy_ptr(aTHX))
+#undef PL_regex_pad
+#define PL_regex_pad (*Perl_Iregex_pad_ptr(aTHX))
+#undef PL_regex_padav
+#define PL_regex_padav (*Perl_Iregex_padav_ptr(aTHX))
+#undef PL_reginterp_cnt
+#define PL_reginterp_cnt (*Perl_Ireginterp_cnt_ptr(aTHX))
+#undef PL_registered_mros
+#define PL_registered_mros (*Perl_Iregistered_mros_ptr(aTHX))
+#undef PL_regmatch_slab
+#define PL_regmatch_slab (*Perl_Iregmatch_slab_ptr(aTHX))
+#undef PL_regmatch_state
+#define PL_regmatch_state (*Perl_Iregmatch_state_ptr(aTHX))
+#undef PL_rehash_seed
+#define PL_rehash_seed (*Perl_Irehash_seed_ptr(aTHX))
+#undef PL_rehash_seed_set
+#define PL_rehash_seed_set (*Perl_Irehash_seed_set_ptr(aTHX))
+#undef PL_replgv
+#define PL_replgv (*Perl_Ireplgv_ptr(aTHX))
+#undef PL_restartop
+#define PL_restartop (*Perl_Irestartop_ptr(aTHX))
+#undef PL_rs
+#define PL_rs (*Perl_Irs_ptr(aTHX))
+#undef PL_runops
+#define PL_runops (*Perl_Irunops_ptr(aTHX))
+#undef PL_savebegin
+#define PL_savebegin (*Perl_Isavebegin_ptr(aTHX))
+#undef PL_savestack
+#define PL_savestack (*Perl_Isavestack_ptr(aTHX))
+#undef PL_savestack_ix
+#define PL_savestack_ix (*Perl_Isavestack_ix_ptr(aTHX))
+#undef PL_savestack_max
+#define PL_savestack_max (*Perl_Isavestack_max_ptr(aTHX))
+#undef PL_sawampersand
+#define PL_sawampersand (*Perl_Isawampersand_ptr(aTHX))
+#undef PL_scopestack
+#define PL_scopestack (*Perl_Iscopestack_ptr(aTHX))
+#undef PL_scopestack_ix
+#define PL_scopestack_ix (*Perl_Iscopestack_ix_ptr(aTHX))
+#undef PL_scopestack_max
+#define PL_scopestack_max (*Perl_Iscopestack_max_ptr(aTHX))
+#undef PL_scopestack_name
+#define PL_scopestack_name (*Perl_Iscopestack_name_ptr(aTHX))
+#undef PL_screamfirst
+#define PL_screamfirst (*Perl_Iscreamfirst_ptr(aTHX))
+#undef PL_screamnext
+#define PL_screamnext (*Perl_Iscreamnext_ptr(aTHX))
+#undef PL_secondgv
+#define PL_secondgv (*Perl_Isecondgv_ptr(aTHX))
+#undef PL_sharehook
+#define PL_sharehook (*Perl_Isharehook_ptr(aTHX))
+#undef PL_sig_pending
+#define PL_sig_pending (*Perl_Isig_pending_ptr(aTHX))
+#undef PL_sighandlerp
+#define PL_sighandlerp (*Perl_Isighandlerp_ptr(aTHX))
+#undef PL_signals
+#define PL_signals (*Perl_Isignals_ptr(aTHX))
+#undef PL_slab_count
+#define PL_slab_count (*Perl_Islab_count_ptr(aTHX))
+#undef PL_slabs
+#define PL_slabs (*Perl_Islabs_ptr(aTHX))
+#undef PL_sort_RealCmp
+#define PL_sort_RealCmp (*Perl_Isort_RealCmp_ptr(aTHX))
+#undef PL_sortcop
+#define PL_sortcop (*Perl_Isortcop_ptr(aTHX))
+#undef PL_sortstash
+#define PL_sortstash (*Perl_Isortstash_ptr(aTHX))
+#undef PL_splitstr
+#define PL_splitstr (*Perl_Isplitstr_ptr(aTHX))
+#undef PL_srand_called
+#define PL_srand_called (*Perl_Isrand_called_ptr(aTHX))
+#undef PL_stack_base
+#define PL_stack_base (*Perl_Istack_base_ptr(aTHX))
+#undef PL_stack_max
+#define PL_stack_max (*Perl_Istack_max_ptr(aTHX))
+#undef PL_stack_sp
+#define PL_stack_sp (*Perl_Istack_sp_ptr(aTHX))
+#undef PL_start_env
+#define PL_start_env (*Perl_Istart_env_ptr(aTHX))
+#undef PL_stashcache
+#define PL_stashcache (*Perl_Istashcache_ptr(aTHX))
+#undef PL_statbuf
+#define PL_statbuf (*Perl_Istatbuf_ptr(aTHX))
+#undef PL_statcache
+#define PL_statcache (*Perl_Istatcache_ptr(aTHX))
+#undef PL_statgv
+#define PL_statgv (*Perl_Istatgv_ptr(aTHX))
+#undef PL_statname
+#define PL_statname (*Perl_Istatname_ptr(aTHX))
+#undef PL_statusvalue
+#define PL_statusvalue (*Perl_Istatusvalue_ptr(aTHX))
+#undef PL_statusvalue_posix
+#define PL_statusvalue_posix (*Perl_Istatusvalue_posix_ptr(aTHX))
+#undef PL_statusvalue_vms
+#define PL_statusvalue_vms (*Perl_Istatusvalue_vms_ptr(aTHX))
+#undef PL_stderrgv
+#define PL_stderrgv (*Perl_Istderrgv_ptr(aTHX))
+#undef PL_stdingv
+#define PL_stdingv (*Perl_Istdingv_ptr(aTHX))
+#undef PL_strtab
+#define PL_strtab (*Perl_Istrtab_ptr(aTHX))
+#undef PL_sub_generation
+#define PL_sub_generation (*Perl_Isub_generation_ptr(aTHX))
+#undef PL_subline
+#define PL_subline (*Perl_Isubline_ptr(aTHX))
+#undef PL_subname
+#define PL_subname (*Perl_Isubname_ptr(aTHX))
+#undef PL_sv_arenaroot
+#define PL_sv_arenaroot (*Perl_Isv_arenaroot_ptr(aTHX))
+#undef PL_sv_count
+#define PL_sv_count (*Perl_Isv_count_ptr(aTHX))
+#undef PL_sv_no
+#define PL_sv_no (*Perl_Isv_no_ptr(aTHX))
+#undef PL_sv_objcount
+#define PL_sv_objcount (*Perl_Isv_objcount_ptr(aTHX))
+#undef PL_sv_root
+#define PL_sv_root (*Perl_Isv_root_ptr(aTHX))
+#undef PL_sv_serial
+#define PL_sv_serial (*Perl_Isv_serial_ptr(aTHX))
+#undef PL_sv_undef
+#define PL_sv_undef (*Perl_Isv_undef_ptr(aTHX))
+#undef PL_sv_yes
+#define PL_sv_yes (*Perl_Isv_yes_ptr(aTHX))
+#undef PL_sys_intern
+#define PL_sys_intern (*Perl_Isys_intern_ptr(aTHX))
+#undef PL_taint_warn
+#define PL_taint_warn (*Perl_Itaint_warn_ptr(aTHX))
+#undef PL_tainted
+#define PL_tainted (*Perl_Itainted_ptr(aTHX))
+#undef PL_tainting
+#define PL_tainting (*Perl_Itainting_ptr(aTHX))
+#undef PL_threadhook
+#define PL_threadhook (*Perl_Ithreadhook_ptr(aTHX))
+#undef PL_timesbuf
+#define PL_timesbuf (*Perl_Itimesbuf_ptr(aTHX))
+#undef PL_tmps_floor
+#define PL_tmps_floor (*Perl_Itmps_floor_ptr(aTHX))
+#undef PL_tmps_ix
+#define PL_tmps_ix (*Perl_Itmps_ix_ptr(aTHX))
+#undef PL_tmps_max
+#define PL_tmps_max (*Perl_Itmps_max_ptr(aTHX))
+#undef PL_tmps_stack
+#define PL_tmps_stack (*Perl_Itmps_stack_ptr(aTHX))
+#undef PL_top_env
+#define PL_top_env (*Perl_Itop_env_ptr(aTHX))
+#undef PL_toptarget
+#define PL_toptarget (*Perl_Itoptarget_ptr(aTHX))
+#undef PL_uid
+#define PL_uid (*Perl_Iuid_ptr(aTHX))
+#undef PL_unicode
+#define PL_unicode (*Perl_Iunicode_ptr(aTHX))
+#undef PL_unitcheckav
+#define PL_unitcheckav (*Perl_Iunitcheckav_ptr(aTHX))
+#undef PL_unitcheckav_save
+#define PL_unitcheckav_save (*Perl_Iunitcheckav_save_ptr(aTHX))
+#undef PL_unlockhook
+#define PL_unlockhook (*Perl_Iunlockhook_ptr(aTHX))
+#undef PL_unsafe
+#define PL_unsafe (*Perl_Iunsafe_ptr(aTHX))
+#undef PL_utf8_X_L
+#define PL_utf8_X_L (*Perl_Iutf8_X_L_ptr(aTHX))
+#undef PL_utf8_X_LV
+#define PL_utf8_X_LV (*Perl_Iutf8_X_LV_ptr(aTHX))
+#undef PL_utf8_X_LVT
+#define PL_utf8_X_LVT (*Perl_Iutf8_X_LVT_ptr(aTHX))
+#undef PL_utf8_X_LV_LVT_V
+#define PL_utf8_X_LV_LVT_V (*Perl_Iutf8_X_LV_LVT_V_ptr(aTHX))
+#undef PL_utf8_X_T
+#define PL_utf8_X_T (*Perl_Iutf8_X_T_ptr(aTHX))
+#undef PL_utf8_X_V
+#define PL_utf8_X_V (*Perl_Iutf8_X_V_ptr(aTHX))
+#undef PL_utf8_X_begin
+#define PL_utf8_X_begin (*Perl_Iutf8_X_begin_ptr(aTHX))
+#undef PL_utf8_X_extend
+#define PL_utf8_X_extend (*Perl_Iutf8_X_extend_ptr(aTHX))
+#undef PL_utf8_X_non_hangul
+#define PL_utf8_X_non_hangul (*Perl_Iutf8_X_non_hangul_ptr(aTHX))
+#undef PL_utf8_X_prepend
+#define PL_utf8_X_prepend (*Perl_Iutf8_X_prepend_ptr(aTHX))
+#undef PL_utf8_alnum
+#define PL_utf8_alnum (*Perl_Iutf8_alnum_ptr(aTHX))
+#undef PL_utf8_alpha
+#define PL_utf8_alpha (*Perl_Iutf8_alpha_ptr(aTHX))
+#undef PL_utf8_ascii
+#define PL_utf8_ascii (*Perl_Iutf8_ascii_ptr(aTHX))
+#undef PL_utf8_cntrl
+#define PL_utf8_cntrl (*Perl_Iutf8_cntrl_ptr(aTHX))
+#undef PL_utf8_digit
+#define PL_utf8_digit (*Perl_Iutf8_digit_ptr(aTHX))
+#undef PL_utf8_graph
+#define PL_utf8_graph (*Perl_Iutf8_graph_ptr(aTHX))
+#undef PL_utf8_idcont
+#define PL_utf8_idcont (*Perl_Iutf8_idcont_ptr(aTHX))
+#undef PL_utf8_idstart
+#define PL_utf8_idstart (*Perl_Iutf8_idstart_ptr(aTHX))
+#undef PL_utf8_lower
+#define PL_utf8_lower (*Perl_Iutf8_lower_ptr(aTHX))
+#undef PL_utf8_mark
+#define PL_utf8_mark (*Perl_Iutf8_mark_ptr(aTHX))
+#undef PL_utf8_perl_space
+#define PL_utf8_perl_space (*Perl_Iutf8_perl_space_ptr(aTHX))
+#undef PL_utf8_perl_word
+#define PL_utf8_perl_word (*Perl_Iutf8_perl_word_ptr(aTHX))
+#undef PL_utf8_posix_digit
+#define PL_utf8_posix_digit (*Perl_Iutf8_posix_digit_ptr(aTHX))
+#undef PL_utf8_print
+#define PL_utf8_print (*Perl_Iutf8_print_ptr(aTHX))
+#undef PL_utf8_punct
+#define PL_utf8_punct (*Perl_Iutf8_punct_ptr(aTHX))
+#undef PL_utf8_space
+#define PL_utf8_space (*Perl_Iutf8_space_ptr(aTHX))
+#undef PL_utf8_tofold
+#define PL_utf8_tofold (*Perl_Iutf8_tofold_ptr(aTHX))
+#undef PL_utf8_tolower
+#define PL_utf8_tolower (*Perl_Iutf8_tolower_ptr(aTHX))
+#undef PL_utf8_totitle
+#define PL_utf8_totitle (*Perl_Iutf8_totitle_ptr(aTHX))
+#undef PL_utf8_toupper
+#define PL_utf8_toupper (*Perl_Iutf8_toupper_ptr(aTHX))
+#undef PL_utf8_upper
+#define PL_utf8_upper (*Perl_Iutf8_upper_ptr(aTHX))
+#undef PL_utf8_xdigit
+#define PL_utf8_xdigit (*Perl_Iutf8_xdigit_ptr(aTHX))
+#undef PL_utf8cache
+#define PL_utf8cache (*Perl_Iutf8cache_ptr(aTHX))
+#undef PL_utf8locale
+#define PL_utf8locale (*Perl_Iutf8locale_ptr(aTHX))
+#undef PL_warnhook
+#define PL_warnhook (*Perl_Iwarnhook_ptr(aTHX))
+#undef PL_watchaddr
+#define PL_watchaddr (*Perl_Iwatchaddr_ptr(aTHX))
+#undef PL_watchok
+#define PL_watchok (*Perl_Iwatchok_ptr(aTHX))
+#undef PL_xmlfp
+#define PL_xmlfp (*Perl_Ixmlfp_ptr(aTHX))
+#undef PL_No
+#define PL_No (*Perl_GNo_ptr(NULL))
+#undef PL_Yes
+#define PL_Yes (*Perl_GYes_ptr(NULL))
+#undef PL_appctx
+#define PL_appctx (*Perl_Gappctx_ptr(NULL))
+#undef PL_check
+#define PL_check (*Perl_Gcheck_ptr(NULL))
+#undef PL_csighandlerp
+#define PL_csighandlerp (*Perl_Gcsighandlerp_ptr(NULL))
+#undef PL_curinterp
+#define PL_curinterp (*Perl_Gcurinterp_ptr(NULL))
+#undef PL_do_undump
+#define PL_do_undump (*Perl_Gdo_undump_ptr(NULL))
+#undef PL_dollarzero_mutex
+#define PL_dollarzero_mutex (*Perl_Gdollarzero_mutex_ptr(NULL))
+#undef PL_fold_locale
+#define PL_fold_locale (*Perl_Gfold_locale_ptr(NULL))
+#undef PL_global_struct_size
+#define PL_global_struct_size (*Perl_Gglobal_struct_size_ptr(NULL))
+#undef PL_hexdigit
+#define PL_hexdigit (*Perl_Ghexdigit_ptr(NULL))
+#undef PL_hints_mutex
+#define PL_hints_mutex (*Perl_Ghints_mutex_ptr(NULL))
+#undef PL_interp_size
+#define PL_interp_size (*Perl_Ginterp_size_ptr(NULL))
+#undef PL_interp_size_5_10_0
+#define PL_interp_size_5_10_0 (*Perl_Ginterp_size_5_10_0_ptr(NULL))
+#undef PL_keyword_plugin
+#define PL_keyword_plugin (*Perl_Gkeyword_plugin_ptr(NULL))
+#undef PL_malloc_mutex
+#define PL_malloc_mutex (*Perl_Gmalloc_mutex_ptr(NULL))
+#undef PL_mmap_page_size
+#define PL_mmap_page_size (*Perl_Gmmap_page_size_ptr(NULL))
+#undef PL_my_ctx_mutex
+#define PL_my_ctx_mutex (*Perl_Gmy_ctx_mutex_ptr(NULL))
+#undef PL_my_cxt_index
+#define PL_my_cxt_index (*Perl_Gmy_cxt_index_ptr(NULL))
+#undef PL_op_mutex
+#define PL_op_mutex (*Perl_Gop_mutex_ptr(NULL))
+#undef PL_op_seq
+#define PL_op_seq (*Perl_Gop_seq_ptr(NULL))
+#undef PL_op_sequence
+#define PL_op_sequence (*Perl_Gop_sequence_ptr(NULL))
+#undef PL_patleave
+#define PL_patleave (*Perl_Gpatleave_ptr(NULL))
+#undef PL_perlio_debug_fd
+#define PL_perlio_debug_fd (*Perl_Gperlio_debug_fd_ptr(NULL))
+#undef PL_perlio_fd_refcnt
+#define PL_perlio_fd_refcnt (*Perl_Gperlio_fd_refcnt_ptr(NULL))
+#undef PL_perlio_fd_refcnt_size
+#define PL_perlio_fd_refcnt_size (*Perl_Gperlio_fd_refcnt_size_ptr(NULL))
+#undef PL_perlio_mutex
+#define PL_perlio_mutex (*Perl_Gperlio_mutex_ptr(NULL))
+#undef PL_ppaddr
+#define PL_ppaddr (*Perl_Gppaddr_ptr(NULL))
+#undef PL_revision
+#define PL_revision (*Perl_Grevision_ptr(NULL))
+#undef PL_runops_dbg
+#define PL_runops_dbg (*Perl_Grunops_dbg_ptr(NULL))
+#undef PL_runops_std
+#define PL_runops_std (*Perl_Grunops_std_ptr(NULL))
+#undef PL_sh_path
+#define PL_sh_path (*Perl_Gsh_path_ptr(NULL))
+#undef PL_sig_defaulting
+#define PL_sig_defaulting (*Perl_Gsig_defaulting_ptr(NULL))
+#undef PL_sig_handlers_initted
+#define PL_sig_handlers_initted (*Perl_Gsig_handlers_initted_ptr(NULL))
+#undef PL_sig_ignoring
+#define PL_sig_ignoring (*Perl_Gsig_ignoring_ptr(NULL))
+#undef PL_sig_sv
+#define PL_sig_sv (*Perl_Gsig_sv_ptr(NULL))
+#undef PL_sig_trapped
+#define PL_sig_trapped (*Perl_Gsig_trapped_ptr(NULL))
+#undef PL_sigfpe_saved
+#define PL_sigfpe_saved (*Perl_Gsigfpe_saved_ptr(NULL))
+#undef PL_subversion
+#define PL_subversion (*Perl_Gsubversion_ptr(NULL))
+#undef PL_sv_placeholder
+#define PL_sv_placeholder (*Perl_Gsv_placeholder_ptr(NULL))
+#undef PL_thr_key
+#define PL_thr_key (*Perl_Gthr_key_ptr(NULL))
+#undef PL_timesbase
+#define PL_timesbase (*Perl_Gtimesbase_ptr(NULL))
+#undef PL_use_safe_putenv
+#define PL_use_safe_putenv (*Perl_Guse_safe_putenv_ptr(NULL))
+#undef PL_version
+#define PL_version (*Perl_Gversion_ptr(NULL))
+#undef PL_veto_cleanup
+#define PL_veto_cleanup (*Perl_Gveto_cleanup_ptr(NULL))
+#undef PL_watch_pvx
+#define PL_watch_pvx (*Perl_Gwatch_pvx_ptr(NULL))
+
+#endif /* !PERL_CORE */
+#endif /* MULTIPLICITY */
+
+#endif /* __perlapi_h__ */
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perlhost.h b/Master/tlpkg/tlperl/lib/CORE/perlhost.h
new file mode 100644
index 00000000000..be7d61de02c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perlhost.h
@@ -0,0 +1,2469 @@
+/* perlhost.h
+ *
+ * (c) 1999 Microsoft Corporation. All rights reserved.
+ * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ */
+
+#ifndef UNDER_CE
+#define CHECK_HOST_INTERP
+#endif
+
+#ifndef ___PerlHost_H___
+#define ___PerlHost_H___
+
+#ifndef UNDER_CE
+#include <signal.h>
+#endif
+#include "iperlsys.h"
+#include "vmem.h"
+#include "vdir.h"
+
+#ifndef WC_NO_BEST_FIT_CHARS
+# define WC_NO_BEST_FIT_CHARS 0x00000400
+#endif
+
+START_EXTERN_C
+extern char * g_win32_get_privlib(const char *pl, STRLEN *const len);
+extern char * g_win32_get_sitelib(const char *pl, STRLEN *const len);
+extern char * g_win32_get_vendorlib(const char *pl,
+ STRLEN *const len);
+extern char * g_getlogin(void);
+END_EXTERN_C
+
+class CPerlHost
+{
+public:
+ /* Constructors */
+ CPerlHost(void);
+ CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
+ struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
+ struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
+ struct IPerlDir** ppDir, struct IPerlSock** ppSock,
+ struct IPerlProc** ppProc);
+ CPerlHost(CPerlHost& host);
+ ~CPerlHost(void);
+
+ static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
+ static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
+ static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
+ static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
+ static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
+ static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
+ static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
+ static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
+ static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
+
+ BOOL PerlCreate(void);
+ int PerlParse(int argc, char** argv, char** env);
+ int PerlRun(void);
+ void PerlDestroy(void);
+
+/* IPerlMem */
+ /* Locks provided but should be unnecessary as this is private pool */
+ inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
+ inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
+ inline void Free(void* ptr) { m_pVMem->Free(ptr); };
+ inline void* Calloc(size_t num, size_t size)
+ {
+ size_t count = num*size;
+ void* lpVoid = Malloc(count);
+ if (lpVoid)
+ ZeroMemory(lpVoid, count);
+ return lpVoid;
+ };
+ inline void GetLock(void) { m_pVMem->GetLock(); };
+ inline void FreeLock(void) { m_pVMem->FreeLock(); };
+ inline int IsLocked(void) { return m_pVMem->IsLocked(); };
+
+/* IPerlMemShared */
+ /* Locks used to serialize access to the pool */
+ inline void GetLockShared(void) { m_pVMemShared->GetLock(); };
+ inline void FreeLockShared(void) { m_pVMemShared->FreeLock(); };
+ inline int IsLockedShared(void) { return m_pVMemShared->IsLocked(); };
+ inline void* MallocShared(size_t size)
+ {
+ void *result;
+ GetLockShared();
+ result = m_pVMemShared->Malloc(size);
+ FreeLockShared();
+ return result;
+ };
+ inline void* ReallocShared(void* ptr, size_t size)
+ {
+ void *result;
+ GetLockShared();
+ result = m_pVMemShared->Realloc(ptr, size);
+ FreeLockShared();
+ return result;
+ };
+ inline void FreeShared(void* ptr)
+ {
+ GetLockShared();
+ m_pVMemShared->Free(ptr);
+ FreeLockShared();
+ };
+ inline void* CallocShared(size_t num, size_t size)
+ {
+ size_t count = num*size;
+ void* lpVoid = MallocShared(count);
+ if (lpVoid)
+ ZeroMemory(lpVoid, count);
+ return lpVoid;
+ };
+
+/* IPerlMemParse */
+ /* Assume something else is using locks to mangaging serialize
+ on a batch basis
+ */
+ inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
+ inline void FreeLockParse(void) { m_pVMemParse->FreeLock(); };
+ inline int IsLockedParse(void) { return m_pVMemParse->IsLocked(); };
+ inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
+ inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
+ inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
+ inline void* CallocParse(size_t num, size_t size)
+ {
+ size_t count = num*size;
+ void* lpVoid = MallocParse(count);
+ if (lpVoid)
+ ZeroMemory(lpVoid, count);
+ return lpVoid;
+ };
+
+/* IPerlEnv */
+ char *Getenv(const char *varname);
+ int Putenv(const char *envstring);
+ inline char *Getenv(const char *varname, unsigned long *len)
+ {
+ *len = 0;
+ char *e = Getenv(varname);
+ if (e)
+ *len = strlen(e);
+ return e;
+ }
+ void* CreateChildEnv(void) { return CreateLocalEnvironmentStrings(*m_pvDir); };
+ void FreeChildEnv(void* pStr) { FreeLocalEnvironmentStrings((char*)pStr); };
+ char* GetChildDir(void);
+ void FreeChildDir(char* pStr);
+ void Reset(void);
+ void Clearenv(void);
+
+ inline LPSTR GetIndex(DWORD &dwIndex)
+ {
+ if(dwIndex < m_dwEnvCount)
+ {
+ ++dwIndex;
+ return m_lppEnvList[dwIndex-1];
+ }
+ return NULL;
+ };
+
+protected:
+ LPSTR Find(LPCSTR lpStr);
+ void Add(LPCSTR lpStr);
+
+ LPSTR CreateLocalEnvironmentStrings(VDir &vDir);
+ void FreeLocalEnvironmentStrings(LPSTR lpStr);
+ LPSTR* Lookup(LPCSTR lpStr);
+ DWORD CalculateEnvironmentSpace(void);
+
+public:
+
+/* IPerlDIR */
+ virtual int Chdir(const char *dirname);
+
+/* IPerllProc */
+ void Abort(void);
+ void Exit(int status);
+ void _Exit(int status);
+ int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
+ int Execv(const char *cmdname, const char *const *argv);
+ int Execvp(const char *cmdname, const char *const *argv);
+
+ inline VMem* GetMemShared(void) { m_pVMemShared->AddRef(); return m_pVMemShared; };
+ inline VMem* GetMemParse(void) { m_pVMemParse->AddRef(); return m_pVMemParse; };
+ inline VDir* GetDir(void) { return m_pvDir; };
+
+public:
+
+ struct IPerlMem m_hostperlMem;
+ struct IPerlMem m_hostperlMemShared;
+ struct IPerlMem m_hostperlMemParse;
+ struct IPerlEnv m_hostperlEnv;
+ struct IPerlStdIO m_hostperlStdIO;
+ struct IPerlLIO m_hostperlLIO;
+ struct IPerlDir m_hostperlDir;
+ struct IPerlSock m_hostperlSock;
+ struct IPerlProc m_hostperlProc;
+
+ struct IPerlMem* m_pHostperlMem;
+ struct IPerlMem* m_pHostperlMemShared;
+ struct IPerlMem* m_pHostperlMemParse;
+ struct IPerlEnv* m_pHostperlEnv;
+ struct IPerlStdIO* m_pHostperlStdIO;
+ struct IPerlLIO* m_pHostperlLIO;
+ struct IPerlDir* m_pHostperlDir;
+ struct IPerlSock* m_pHostperlSock;
+ struct IPerlProc* m_pHostperlProc;
+
+ inline char* MapPathA(const char *pInName) { return m_pvDir->MapPathA(pInName); };
+ inline WCHAR* MapPathW(const WCHAR *pInName) { return m_pvDir->MapPathW(pInName); };
+protected:
+
+ VDir* m_pvDir;
+ VMem* m_pVMem;
+ VMem* m_pVMemShared;
+ VMem* m_pVMemParse;
+
+ DWORD m_dwEnvCount;
+ LPSTR* m_lppEnvList;
+ BOOL m_bTopLevel; // is this a toplevel host?
+ static long num_hosts;
+public:
+ inline int LastHost(void) { return num_hosts == 1L; };
+ struct interpreter *host_perl;
+};
+
+long CPerlHost::num_hosts = 0L;
+
+extern "C" void win32_checkTLS(struct interpreter *host_perl);
+
+#define STRUCT2RAWPTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
+#ifdef CHECK_HOST_INTERP
+inline CPerlHost* CheckInterp(CPerlHost *host)
+{
+ win32_checkTLS(host->host_perl);
+ return host;
+}
+#define STRUCT2PTR(x, y) CheckInterp(STRUCT2RAWPTR(x, y))
+#else
+#define STRUCT2PTR(x, y) STRUCT2RAWPTR(x, y)
+#endif
+
+inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
+{
+ return STRUCT2RAWPTR(piPerl, m_hostperlMem);
+}
+
+inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
+{
+ return STRUCT2RAWPTR(piPerl, m_hostperlMemShared);
+}
+
+inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
+{
+ return STRUCT2RAWPTR(piPerl, m_hostperlMemParse);
+}
+
+inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
+{
+ return STRUCT2PTR(piPerl, m_hostperlEnv);
+}
+
+inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
+{
+ return STRUCT2PTR(piPerl, m_hostperlStdIO);
+}
+
+inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
+{
+ return STRUCT2PTR(piPerl, m_hostperlLIO);
+}
+
+inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
+{
+ return STRUCT2PTR(piPerl, m_hostperlDir);
+}
+
+inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
+{
+ return STRUCT2PTR(piPerl, m_hostperlSock);
+}
+
+inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
+{
+ return STRUCT2PTR(piPerl, m_hostperlProc);
+}
+
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlMem2Host(x)
+
+/* IPerlMem */
+void*
+PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
+{
+ return IPERL2HOST(piPerl)->Malloc(size);
+}
+void*
+PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+ return IPERL2HOST(piPerl)->Realloc(ptr, size);
+}
+void
+PerlMemFree(struct IPerlMem* piPerl, void* ptr)
+{
+ IPERL2HOST(piPerl)->Free(ptr);
+}
+void*
+PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+ return IPERL2HOST(piPerl)->Calloc(num, size);
+}
+
+void
+PerlMemGetLock(struct IPerlMem* piPerl)
+{
+ IPERL2HOST(piPerl)->GetLock();
+}
+
+void
+PerlMemFreeLock(struct IPerlMem* piPerl)
+{
+ IPERL2HOST(piPerl)->FreeLock();
+}
+
+int
+PerlMemIsLocked(struct IPerlMem* piPerl)
+{
+ return IPERL2HOST(piPerl)->IsLocked();
+}
+
+struct IPerlMem perlMem =
+{
+ PerlMemMalloc,
+ PerlMemRealloc,
+ PerlMemFree,
+ PerlMemCalloc,
+ PerlMemGetLock,
+ PerlMemFreeLock,
+ PerlMemIsLocked,
+};
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlMemShared2Host(x)
+
+/* IPerlMemShared */
+void*
+PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
+{
+ return IPERL2HOST(piPerl)->MallocShared(size);
+}
+void*
+PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+ return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
+}
+void
+PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
+{
+ IPERL2HOST(piPerl)->FreeShared(ptr);
+}
+void*
+PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+ return IPERL2HOST(piPerl)->CallocShared(num, size);
+}
+
+void
+PerlMemSharedGetLock(struct IPerlMem* piPerl)
+{
+ IPERL2HOST(piPerl)->GetLockShared();
+}
+
+void
+PerlMemSharedFreeLock(struct IPerlMem* piPerl)
+{
+ IPERL2HOST(piPerl)->FreeLockShared();
+}
+
+int
+PerlMemSharedIsLocked(struct IPerlMem* piPerl)
+{
+ return IPERL2HOST(piPerl)->IsLockedShared();
+}
+
+struct IPerlMem perlMemShared =
+{
+ PerlMemSharedMalloc,
+ PerlMemSharedRealloc,
+ PerlMemSharedFree,
+ PerlMemSharedCalloc,
+ PerlMemSharedGetLock,
+ PerlMemSharedFreeLock,
+ PerlMemSharedIsLocked,
+};
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlMemParse2Host(x)
+
+/* IPerlMemParse */
+void*
+PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
+{
+ return IPERL2HOST(piPerl)->MallocParse(size);
+}
+void*
+PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+ return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
+}
+void
+PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
+{
+ IPERL2HOST(piPerl)->FreeParse(ptr);
+}
+void*
+PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+ return IPERL2HOST(piPerl)->CallocParse(num, size);
+}
+
+void
+PerlMemParseGetLock(struct IPerlMem* piPerl)
+{
+ IPERL2HOST(piPerl)->GetLockParse();
+}
+
+void
+PerlMemParseFreeLock(struct IPerlMem* piPerl)
+{
+ IPERL2HOST(piPerl)->FreeLockParse();
+}
+
+int
+PerlMemParseIsLocked(struct IPerlMem* piPerl)
+{
+ return IPERL2HOST(piPerl)->IsLockedParse();
+}
+
+struct IPerlMem perlMemParse =
+{
+ PerlMemParseMalloc,
+ PerlMemParseRealloc,
+ PerlMemParseFree,
+ PerlMemParseCalloc,
+ PerlMemParseGetLock,
+ PerlMemParseFreeLock,
+ PerlMemParseIsLocked,
+};
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlEnv2Host(x)
+
+/* IPerlEnv */
+char*
+PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
+{
+ return IPERL2HOST(piPerl)->Getenv(varname);
+};
+
+int
+PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
+{
+ return IPERL2HOST(piPerl)->Putenv(envstring);
+};
+
+char*
+PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
+{
+ return IPERL2HOST(piPerl)->Getenv(varname, len);
+}
+
+int
+PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
+{
+ return win32_uname(name);
+}
+
+void
+PerlEnvClearenv(struct IPerlEnv* piPerl)
+{
+ IPERL2HOST(piPerl)->Clearenv();
+}
+
+void*
+PerlEnvGetChildenv(struct IPerlEnv* piPerl)
+{
+ return IPERL2HOST(piPerl)->CreateChildEnv();
+}
+
+void
+PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
+{
+ IPERL2HOST(piPerl)->FreeChildEnv(childEnv);
+}
+
+char*
+PerlEnvGetChilddir(struct IPerlEnv* piPerl)
+{
+ return IPERL2HOST(piPerl)->GetChildDir();
+}
+
+void
+PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
+{
+ IPERL2HOST(piPerl)->FreeChildDir(childDir);
+}
+
+unsigned long
+PerlEnvOsId(struct IPerlEnv* piPerl)
+{
+ return win32_os_id();
+}
+
+char*
+PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len)
+{
+ return g_win32_get_privlib(pl, len);
+}
+
+char*
+PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len)
+{
+ return g_win32_get_sitelib(pl, len);
+}
+
+char*
+PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl,
+ STRLEN *const len)
+{
+ return g_win32_get_vendorlib(pl, len);
+}
+
+void
+PerlEnvGetChildIO(struct IPerlEnv* piPerl, child_IO_table* ptr)
+{
+ win32_get_child_IO(ptr);
+}
+
+struct IPerlEnv perlEnv =
+{
+ PerlEnvGetenv,
+ PerlEnvPutenv,
+ PerlEnvGetenv_len,
+ PerlEnvUname,
+ PerlEnvClearenv,
+ PerlEnvGetChildenv,
+ PerlEnvFreeChildenv,
+ PerlEnvGetChilddir,
+ PerlEnvFreeChilddir,
+ PerlEnvOsId,
+ PerlEnvLibPath,
+ PerlEnvSiteLibPath,
+ PerlEnvVendorLibPath,
+ PerlEnvGetChildIO,
+};
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlStdIO2Host(x)
+
+/* PerlStdIO */
+FILE*
+PerlStdIOStdin(struct IPerlStdIO* piPerl)
+{
+ return win32_stdin();
+}
+
+FILE*
+PerlStdIOStdout(struct IPerlStdIO* piPerl)
+{
+ return win32_stdout();
+}
+
+FILE*
+PerlStdIOStderr(struct IPerlStdIO* piPerl)
+{
+ return win32_stderr();
+}
+
+FILE*
+PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
+{
+ return win32_fopen(path, mode);
+}
+
+int
+PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_fclose((pf));
+}
+
+int
+PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_feof(pf);
+}
+
+int
+PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_ferror(pf);
+}
+
+void
+PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ win32_clearerr(pf);
+}
+
+int
+PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_getc(pf);
+}
+
+STDCHAR*
+PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef FILE_base
+ FILE *f = pf;
+ return FILE_base(f);
+#else
+ return NULL;
+#endif
+}
+
+int
+PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef FILE_bufsiz
+ FILE *f = pf;
+ return FILE_bufsiz(f);
+#else
+ return (-1);
+#endif
+}
+
+int
+PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef USE_STDIO_PTR
+ FILE *f = pf;
+ return FILE_cnt(f);
+#else
+ return (-1);
+#endif
+}
+
+STDCHAR*
+PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef USE_STDIO_PTR
+ FILE *f = pf;
+ return FILE_ptr(f);
+#else
+ return NULL;
+#endif
+}
+
+char*
+PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n)
+{
+ return win32_fgets(s, n, pf);
+}
+
+int
+PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
+{
+ return win32_fputc(c, pf);
+}
+
+int
+PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
+{
+ return win32_fputs(s, pf);
+}
+
+int
+PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_fflush(pf);
+}
+
+int
+PerlStdIOUngetc(struct IPerlStdIO* piPerl,int c, FILE* pf)
+{
+ return win32_ungetc(c, pf);
+}
+
+int
+PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_fileno(pf);
+}
+
+FILE*
+PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
+{
+ return win32_fdopen(fd, mode);
+}
+
+FILE*
+PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
+{
+ return win32_freopen(path, mode, (FILE*)pf);
+}
+
+SSize_t
+PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
+{
+ return win32_fread(buffer, size, count, pf);
+}
+
+SSize_t
+PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
+{
+ return win32_fwrite(buffer, size, count, pf);
+}
+
+void
+PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
+{
+ win32_setbuf(pf, buffer);
+}
+
+int
+PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
+{
+ return win32_setvbuf(pf, buffer, type, size);
+}
+
+void
+PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
+{
+#ifdef STDIO_CNT_LVALUE
+ FILE *f = pf;
+ FILE_cnt(f) = n;
+#endif
+}
+
+void
+PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, STDCHAR * ptr)
+{
+#ifdef STDIO_PTR_LVALUE
+ FILE *f = pf;
+ FILE_ptr(f) = ptr;
+#endif
+}
+
+void
+PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ win32_setvbuf(pf, NULL, _IOLBF, 0);
+}
+
+int
+PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
+{
+ va_list(arglist);
+ va_start(arglist, format);
+ return win32_vfprintf(pf, format, arglist);
+}
+
+int
+PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
+{
+ return win32_vfprintf(pf, format, arglist);
+}
+
+Off_t
+PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ return win32_ftell(pf);
+}
+
+int
+PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, Off_t offset, int origin)
+{
+ return win32_fseek(pf, offset, origin);
+}
+
+void
+PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
+{
+ win32_rewind(pf);
+}
+
+FILE*
+PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
+{
+ return win32_tmpfile();
+}
+
+int
+PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
+{
+ return win32_fgetpos(pf, p);
+}
+
+int
+PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
+{
+ return win32_fsetpos(pf, p);
+}
+void
+PerlStdIOInit(struct IPerlStdIO* piPerl)
+{
+}
+
+void
+PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
+{
+ Perl_init_os_extras();
+}
+
+int
+PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, intptr_t osfhandle, int flags)
+{
+ return win32_open_osfhandle(osfhandle, flags);
+}
+
+intptr_t
+PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
+{
+ return win32_get_osfhandle(filenum);
+}
+
+FILE*
+PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifndef UNDER_CE
+ FILE* pfdup;
+ fpos_t pos;
+ char mode[3];
+ int fileno = win32_dup(win32_fileno(pf));
+
+ /* open the file in the same mode */
+#ifdef __BORLANDC__
+ if((pf)->flags & _F_READ) {
+ mode[0] = 'r';
+ mode[1] = 0;
+ }
+ else if((pf)->flags & _F_WRIT) {
+ mode[0] = 'a';
+ mode[1] = 0;
+ }
+ else if((pf)->flags & _F_RDWR) {
+ mode[0] = 'r';
+ mode[1] = '+';
+ mode[2] = 0;
+ }
+#else
+ if((pf)->_flag & _IOREAD) {
+ mode[0] = 'r';
+ mode[1] = 0;
+ }
+ else if((pf)->_flag & _IOWRT) {
+ mode[0] = 'a';
+ mode[1] = 0;
+ }
+ else if((pf)->_flag & _IORW) {
+ mode[0] = 'r';
+ mode[1] = '+';
+ mode[2] = 0;
+ }
+#endif
+
+ /* it appears that the binmode is attached to the
+ * file descriptor so binmode files will be handled
+ * correctly
+ */
+ pfdup = win32_fdopen(fileno, mode);
+
+ /* move the file pointer to the same position */
+ if (!fgetpos(pf, &pos)) {
+ fsetpos(pfdup, &pos);
+ }
+ return pfdup;
+#else
+ return 0;
+#endif
+}
+
+struct IPerlStdIO perlStdIO =
+{
+ PerlStdIOStdin,
+ PerlStdIOStdout,
+ PerlStdIOStderr,
+ PerlStdIOOpen,
+ PerlStdIOClose,
+ PerlStdIOEof,
+ PerlStdIOError,
+ PerlStdIOClearerr,
+ PerlStdIOGetc,
+ PerlStdIOGetBase,
+ PerlStdIOGetBufsiz,
+ PerlStdIOGetCnt,
+ PerlStdIOGetPtr,
+ PerlStdIOGets,
+ PerlStdIOPutc,
+ PerlStdIOPuts,
+ PerlStdIOFlush,
+ PerlStdIOUngetc,
+ PerlStdIOFileno,
+ PerlStdIOFdopen,
+ PerlStdIOReopen,
+ PerlStdIORead,
+ PerlStdIOWrite,
+ PerlStdIOSetBuf,
+ PerlStdIOSetVBuf,
+ PerlStdIOSetCnt,
+ PerlStdIOSetPtr,
+ PerlStdIOSetlinebuf,
+ PerlStdIOPrintf,
+ PerlStdIOVprintf,
+ PerlStdIOTell,
+ PerlStdIOSeek,
+ PerlStdIORewind,
+ PerlStdIOTmpfile,
+ PerlStdIOGetpos,
+ PerlStdIOSetpos,
+ PerlStdIOInit,
+ PerlStdIOInitOSExtras,
+ PerlStdIOFdupopen,
+};
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlLIO2Host(x)
+
+/* IPerlLIO */
+int
+PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
+{
+ return win32_access(path, mode);
+}
+
+int
+PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
+{
+ return win32_chmod(filename, pmode);
+}
+
+int
+PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
+{
+ return chown(filename, owner, group);
+}
+
+int
+PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size)
+{
+ return win32_chsize(handle, size);
+}
+
+int
+PerlLIOClose(struct IPerlLIO* piPerl, int handle)
+{
+ return win32_close(handle);
+}
+
+int
+PerlLIODup(struct IPerlLIO* piPerl, int handle)
+{
+ return win32_dup(handle);
+}
+
+int
+PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
+{
+ return win32_dup2(handle1, handle2);
+}
+
+int
+PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
+{
+ return win32_flock(fd, oper);
+}
+
+int
+PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, Stat_t *buffer)
+{
+ return win32_fstat(handle, buffer);
+}
+
+int
+PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
+{
+ u_long u_long_arg;
+ int retval;
+
+ /* mauke says using memcpy avoids alignment issues */
+ memcpy(&u_long_arg, data, sizeof u_long_arg);
+ retval = win32_ioctlsocket((SOCKET)i, (long)u, &u_long_arg);
+ memcpy(data, &u_long_arg, sizeof u_long_arg);
+ return retval;
+}
+
+int
+PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
+{
+ return win32_isatty(fd);
+}
+
+int
+PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
+{
+ return win32_link(oldname, newname);
+}
+
+Off_t
+PerlLIOLseek(struct IPerlLIO* piPerl, int handle, Off_t offset, int origin)
+{
+ return win32_lseek(handle, offset, origin);
+}
+
+int
+PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
+{
+ return win32_stat(path, buffer);
+}
+
+char*
+PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
+{
+ return mktemp(Template);
+}
+
+int
+PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
+{
+ return win32_open(filename, oflag);
+}
+
+int
+PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
+{
+ return win32_open(filename, oflag, pmode);
+}
+
+int
+PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
+{
+ return win32_read(handle, buffer, count);
+}
+
+int
+PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
+{
+ return win32_rename(OldFileName, newname);
+}
+
+int
+PerlLIOSetmode(struct IPerlLIO* piPerl, int handle, int mode)
+{
+ return win32_setmode(handle, mode);
+}
+
+int
+PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
+{
+ return win32_stat(path, buffer);
+}
+
+char*
+PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
+{
+ return tmpnam(string);
+}
+
+int
+PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
+{
+ return umask(pmode);
+}
+
+int
+PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
+{
+ return win32_unlink(filename);
+}
+
+int
+PerlLIOUtime(struct IPerlLIO* piPerl, const char *filename, struct utimbuf *times)
+{
+ return win32_utime(filename, times);
+}
+
+int
+PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
+{
+ return win32_write(handle, buffer, count);
+}
+
+struct IPerlLIO perlLIO =
+{
+ PerlLIOAccess,
+ PerlLIOChmod,
+ PerlLIOChown,
+ PerlLIOChsize,
+ PerlLIOClose,
+ PerlLIODup,
+ PerlLIODup2,
+ PerlLIOFlock,
+ PerlLIOFileStat,
+ PerlLIOIOCtl,
+ PerlLIOIsatty,
+ PerlLIOLink,
+ PerlLIOLseek,
+ PerlLIOLstat,
+ PerlLIOMktemp,
+ PerlLIOOpen,
+ PerlLIOOpen3,
+ PerlLIORead,
+ PerlLIORename,
+ PerlLIOSetmode,
+ PerlLIONameStat,
+ PerlLIOTmpnam,
+ PerlLIOUmask,
+ PerlLIOUnlink,
+ PerlLIOUtime,
+ PerlLIOWrite,
+};
+
+
+#undef IPERL2HOST
+#define IPERL2HOST(x) IPerlDir2Host(x)
+
+/* IPerlDIR */
+int
+PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
+{
+ return win32_mkdir(dirname, mode);
+}
+
+int
+PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
+{
+ return IPERL2HOST(piPerl)->Chdir(dirname);
+}
+
+int
+PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
+{
+ return win32_rmdir(dirname);
+}
+
+int
+PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
+{
+ return win32_closedir(dirp);
+}
+
+DIR*
+PerlDirOpen(struct IPerlDir* piPerl, const char *filename)
+{
+ return win32_opendir(filename);
+}
+
+struct direct *
+PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
+{
+ return win32_readdir(dirp);
+}
+
+void
+PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
+{
+ win32_rewinddir(dirp);
+}
+
+void
+PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
+{
+ win32_seekdir(dirp, loc);
+}
+
+long
+PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
+{
+ return win32_telldir(dirp);
+}
+
+char*
+PerlDirMapPathA(struct IPerlDir* piPerl, const char* path)
+{
+ return IPERL2HOST(piPerl)->MapPathA(path);
+}
+
+WCHAR*
+PerlDirMapPathW(struct IPerlDir* piPerl, const WCHAR* path)
+{
+ return IPERL2HOST(piPerl)->MapPathW(path);
+}
+
+struct IPerlDir perlDir =
+{
+ PerlDirMakedir,
+ PerlDirChdir,
+ PerlDirRmdir,
+ PerlDirClose,
+ PerlDirOpen,
+ PerlDirRead,
+ PerlDirRewind,
+ PerlDirSeek,
+ PerlDirTell,
+ PerlDirMapPathA,
+ PerlDirMapPathW,
+};
+
+
+/* IPerlSock */
+u_long
+PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
+{
+ return win32_htonl(hostlong);
+}
+
+u_short
+PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
+{
+ return win32_htons(hostshort);
+}
+
+u_long
+PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
+{
+ return win32_ntohl(netlong);
+}
+
+u_short
+PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
+{
+ return win32_ntohs(netshort);
+}
+
+SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
+{
+ return win32_accept(s, addr, addrlen);
+}
+
+int
+PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
+{
+ return win32_bind(s, name, namelen);
+}
+
+int
+PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
+{
+ return win32_connect(s, name, namelen);
+}
+
+void
+PerlSockEndhostent(struct IPerlSock* piPerl)
+{
+ win32_endhostent();
+}
+
+void
+PerlSockEndnetent(struct IPerlSock* piPerl)
+{
+ win32_endnetent();
+}
+
+void
+PerlSockEndprotoent(struct IPerlSock* piPerl)
+{
+ win32_endprotoent();
+}
+
+void
+PerlSockEndservent(struct IPerlSock* piPerl)
+{
+ win32_endservent();
+}
+
+struct hostent*
+PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
+{
+ return win32_gethostbyaddr(addr, len, type);
+}
+
+struct hostent*
+PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
+{
+ return win32_gethostbyname(name);
+}
+
+struct hostent*
+PerlSockGethostent(struct IPerlSock* piPerl)
+{
+ dTHX;
+ Perl_croak(aTHX_ "gethostent not implemented!\n");
+ return NULL;
+}
+
+int
+PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
+{
+ return win32_gethostname(name, namelen);
+}
+
+struct netent *
+PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
+{
+ return win32_getnetbyaddr(net, type);
+}
+
+struct netent *
+PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
+{
+ return win32_getnetbyname((char*)name);
+}
+
+struct netent *
+PerlSockGetnetent(struct IPerlSock* piPerl)
+{
+ return win32_getnetent();
+}
+
+int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
+{
+ return win32_getpeername(s, name, namelen);
+}
+
+struct protoent*
+PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
+{
+ return win32_getprotobyname(name);
+}
+
+struct protoent*
+PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
+{
+ return win32_getprotobynumber(number);
+}
+
+struct protoent*
+PerlSockGetprotoent(struct IPerlSock* piPerl)
+{
+ return win32_getprotoent();
+}
+
+struct servent*
+PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
+{
+ return win32_getservbyname(name, proto);
+}
+
+struct servent*
+PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
+{
+ return win32_getservbyport(port, proto);
+}
+
+struct servent*
+PerlSockGetservent(struct IPerlSock* piPerl)
+{
+ return win32_getservent();
+}
+
+int
+PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
+{
+ return win32_getsockname(s, name, namelen);
+}
+
+int
+PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
+{
+ return win32_getsockopt(s, level, optname, optval, optlen);
+}
+
+unsigned long
+PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
+{
+ return win32_inet_addr(cp);
+}
+
+char*
+PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
+{
+ return win32_inet_ntoa(in);
+}
+
+int
+PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
+{
+ return win32_listen(s, backlog);
+}
+
+int
+PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
+{
+ return win32_recv(s, buffer, len, flags);
+}
+
+int
+PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
+{
+ return win32_recvfrom(s, buffer, len, flags, from, fromlen);
+}
+
+int
+PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
+{
+ return win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
+}
+
+int
+PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
+{
+ return win32_send(s, buffer, len, flags);
+}
+
+int
+PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
+{
+ return win32_sendto(s, buffer, len, flags, to, tolen);
+}
+
+void
+PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
+{
+ win32_sethostent(stayopen);
+}
+
+void
+PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
+{
+ win32_setnetent(stayopen);
+}
+
+void
+PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
+{
+ win32_setprotoent(stayopen);
+}
+
+void
+PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
+{
+ win32_setservent(stayopen);
+}
+
+int
+PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
+{
+ return win32_setsockopt(s, level, optname, optval, optlen);
+}
+
+int
+PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
+{
+ return win32_shutdown(s, how);
+}
+
+SOCKET
+PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
+{
+ return win32_socket(af, type, protocol);
+}
+
+int
+PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
+{
+ return Perl_my_socketpair(domain, type, protocol, fds);
+}
+
+int
+PerlSockClosesocket(struct IPerlSock* piPerl, SOCKET s)
+{
+ return win32_closesocket(s);
+}
+
+int
+PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
+{
+ return win32_ioctlsocket(s, cmd, argp);
+}
+
+struct IPerlSock perlSock =
+{
+ PerlSockHtonl,
+ PerlSockHtons,
+ PerlSockNtohl,
+ PerlSockNtohs,
+ PerlSockAccept,
+ PerlSockBind,
+ PerlSockConnect,
+ PerlSockEndhostent,
+ PerlSockEndnetent,
+ PerlSockEndprotoent,
+ PerlSockEndservent,
+ PerlSockGethostname,
+ PerlSockGetpeername,
+ PerlSockGethostbyaddr,
+ PerlSockGethostbyname,
+ PerlSockGethostent,
+ PerlSockGetnetbyaddr,
+ PerlSockGetnetbyname,
+ PerlSockGetnetent,
+ PerlSockGetprotobyname,
+ PerlSockGetprotobynumber,
+ PerlSockGetprotoent,
+ PerlSockGetservbyname,
+ PerlSockGetservbyport,
+ PerlSockGetservent,
+ PerlSockGetsockname,
+ PerlSockGetsockopt,
+ PerlSockInetAddr,
+ PerlSockInetNtoa,
+ PerlSockListen,
+ PerlSockRecv,
+ PerlSockRecvfrom,
+ PerlSockSelect,
+ PerlSockSend,
+ PerlSockSendto,
+ PerlSockSethostent,
+ PerlSockSetnetent,
+ PerlSockSetprotoent,
+ PerlSockSetservent,
+ PerlSockSetsockopt,
+ PerlSockShutdown,
+ PerlSockSocket,
+ PerlSockSocketpair,
+ PerlSockClosesocket,
+};
+
+
+/* IPerlProc */
+
+#define EXECF_EXEC 1
+#define EXECF_SPAWN 2
+
+void
+PerlProcAbort(struct IPerlProc* piPerl)
+{
+ win32_abort();
+}
+
+char *
+PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
+{
+ return win32_crypt(clear, salt);
+}
+
+void
+PerlProcExit(struct IPerlProc* piPerl, int status)
+{
+ exit(status);
+}
+
+void
+PerlProc_Exit(struct IPerlProc* piPerl, int status)
+{
+ _exit(status);
+}
+
+int
+PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
+{
+ return execl(cmdname, arg0, arg1, arg2, arg3);
+}
+
+int
+PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
+{
+ return win32_execvp(cmdname, argv);
+}
+
+int
+PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
+{
+ return win32_execvp(cmdname, argv);
+}
+
+uid_t
+PerlProcGetuid(struct IPerlProc* piPerl)
+{
+ return getuid();
+}
+
+uid_t
+PerlProcGeteuid(struct IPerlProc* piPerl)
+{
+ return geteuid();
+}
+
+gid_t
+PerlProcGetgid(struct IPerlProc* piPerl)
+{
+ return getgid();
+}
+
+gid_t
+PerlProcGetegid(struct IPerlProc* piPerl)
+{
+ return getegid();
+}
+
+char *
+PerlProcGetlogin(struct IPerlProc* piPerl)
+{
+ return g_getlogin();
+}
+
+int
+PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
+{
+ return win32_kill(pid, sig);
+}
+
+int
+PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
+{
+ return win32_kill(pid, -sig);
+}
+
+int
+PerlProcPauseProc(struct IPerlProc* piPerl)
+{
+ return win32_sleep((32767L << 16) + 32767);
+}
+
+PerlIO*
+PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
+{
+ dTHX;
+ PERL_FLUSHALL_FOR_CHILD;
+ return win32_popen(command, mode);
+}
+
+PerlIO*
+PerlProcPopenList(struct IPerlProc* piPerl, const char *mode, IV narg, SV **args)
+{
+ dTHX;
+ PERL_FLUSHALL_FOR_CHILD;
+ return win32_popenlist(mode, narg, args);
+}
+
+int
+PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
+{
+ return win32_pclose(stream);
+}
+
+int
+PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
+{
+ return win32_pipe(phandles, 512, O_BINARY);
+}
+
+int
+PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
+{
+ return setuid(u);
+}
+
+int
+PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
+{
+ return setgid(g);
+}
+
+int
+PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
+{
+ return win32_sleep(s);
+}
+
+int
+PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
+{
+ return win32_times(timebuf);
+}
+
+int
+PerlProcWait(struct IPerlProc* piPerl, int *status)
+{
+ return win32_wait(status);
+}
+
+int
+PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
+{
+ return win32_waitpid(pid, status, flags);
+}
+
+Sighandler_t
+PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
+{
+ return win32_signal(sig, subcode);
+}
+
+int
+PerlProcGetTimeOfDay(struct IPerlProc* piPerl, struct timeval *t, void *z)
+{
+ return win32_gettimeofday(t, z);
+}
+
+#ifdef USE_ITHREADS
+static THREAD_RET_TYPE
+win32_start_child(LPVOID arg)
+{
+ PerlInterpreter *my_perl = (PerlInterpreter*)arg;
+ GV *tmpgv;
+ int status;
+ HWND parent_message_hwnd;
+#ifdef PERL_SYNC_FORK
+ static long sync_fork_id = 0;
+ long id = ++sync_fork_id;
+#endif
+
+
+ PERL_SET_THX(my_perl);
+ win32_checkTLS(my_perl);
+
+ /* set $$ to pseudo id */
+#ifdef PERL_SYNC_FORK
+ w32_pseudo_id = id;
+#else
+ w32_pseudo_id = GetCurrentThreadId();
+ if (IsWin95()) {
+ int pid = (int)w32_pseudo_id;
+ if (pid < 0)
+ w32_pseudo_id = -pid;
+ }
+#endif
+ if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV)) {
+ SV *sv = GvSV(tmpgv);
+ SvREADONLY_off(sv);
+ sv_setiv(sv, -(IV)w32_pseudo_id);
+ SvREADONLY_on(sv);
+ }
+#ifdef PERL_USES_PL_PIDSTATUS
+ hv_clear(PL_pidstatus);
+#endif
+
+ /* create message window and tell parent about it */
+ parent_message_hwnd = w32_message_hwnd;
+ w32_message_hwnd = win32_create_message_window();
+ if (parent_message_hwnd != NULL)
+ PostMessage(parent_message_hwnd, WM_USER_MESSAGE, w32_pseudo_id, (LPARAM)w32_message_hwnd);
+
+ /* push a zero on the stack (we are the child) */
+ {
+ dSP;
+ dTARGET;
+ PUSHi(0);
+ PUTBACK;
+ }
+
+ /* continue from next op */
+ PL_op = PL_op->op_next;
+
+ {
+ dJMPENV;
+ volatile int oldscope = 1; /* We are responsible for all scopes */
+
+restart:
+ JMPENV_PUSH(status);
+ switch (status) {
+ case 0:
+ CALLRUNOPS(aTHX);
+ /* We may have additional unclosed scopes if fork() was called
+ * from within a BEGIN block. See perlfork.pod for more details.
+ * We cannot clean up these other scopes because they belong to a
+ * different interpreter, but we also cannot leave PL_scopestack_ix
+ * dangling because that can trigger an assertion in perl_destruct().
+ */
+ if (PL_scopestack_ix > oldscope) {
+ PL_scopestack[oldscope-1] = PL_scopestack[PL_scopestack_ix-1];
+ PL_scopestack_ix = oldscope;
+ }
+ status = 0;
+ break;
+ case 2:
+ while (PL_scopestack_ix > oldscope)
+ LEAVE;
+ FREETMPS;
+ PL_curstash = PL_defstash;
+ if (PL_endav && !PL_minus_c)
+ call_list(oldscope, PL_endav);
+ status = STATUS_EXIT;
+ break;
+ case 3:
+ if (PL_restartop) {
+ POPSTACK_TO(PL_mainstack);
+ PL_op = PL_restartop;
+ PL_restartop = (OP*)NULL;
+ goto restart;
+ }
+ PerlIO_printf(Perl_error_log, "panic: restartop\n");
+ FREETMPS;
+ status = 1;
+ break;
+ }
+ JMPENV_POP;
+
+ /* XXX hack to avoid perl_destruct() freeing optree */
+ win32_checkTLS(my_perl);
+ PL_main_root = (OP*)NULL;
+ }
+
+ win32_checkTLS(my_perl);
+ /* close the std handles to avoid fd leaks */
+ {
+ do_close(PL_stdingv, FALSE);
+ do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); /* PL_stdoutgv - ISAGN */
+ do_close(PL_stderrgv, FALSE);
+ }
+
+ /* destroy everything (waits for any pseudo-forked children) */
+ win32_checkTLS(my_perl);
+ perl_destruct(my_perl);
+ win32_checkTLS(my_perl);
+ perl_free(my_perl);
+
+#ifdef PERL_SYNC_FORK
+ return id;
+#else
+ return (DWORD)status;
+#endif
+}
+#endif /* USE_ITHREADS */
+
+int
+PerlProcFork(struct IPerlProc* piPerl)
+{
+ dTHX;
+#ifdef USE_ITHREADS
+ DWORD id;
+ HANDLE handle;
+ CPerlHost *h;
+
+ if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
+ errno = EAGAIN;
+ return -1;
+ }
+ h = new CPerlHost(*(CPerlHost*)w32_internal_host);
+ PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX,
+ CLONEf_COPY_STACKS,
+ h->m_pHostperlMem,
+ h->m_pHostperlMemShared,
+ h->m_pHostperlMemParse,
+ h->m_pHostperlEnv,
+ h->m_pHostperlStdIO,
+ h->m_pHostperlLIO,
+ h->m_pHostperlDir,
+ h->m_pHostperlSock,
+ h->m_pHostperlProc
+ );
+ new_perl->Isys_intern.internal_host = h;
+ h->host_perl = new_perl;
+# ifdef PERL_SYNC_FORK
+ id = win32_start_child((LPVOID)new_perl);
+ PERL_SET_THX(aTHX);
+# else
+ if (w32_message_hwnd == INVALID_HANDLE_VALUE)
+ w32_message_hwnd = win32_create_message_window();
+ new_perl->Isys_intern.message_hwnd = w32_message_hwnd;
+ w32_pseudo_child_message_hwnds[w32_num_pseudo_children] =
+ (w32_message_hwnd == NULL) ? (HWND)NULL : (HWND)INVALID_HANDLE_VALUE;
+# ifdef USE_RTL_THREAD_API
+ handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child,
+ (void*)new_perl, 0, (unsigned*)&id);
+# else
+ handle = CreateThread(NULL, 0, win32_start_child,
+ (LPVOID)new_perl, 0, &id);
+# endif
+ PERL_SET_THX(aTHX); /* XXX perl_clone*() set TLS */
+ if (!handle) {
+ errno = EAGAIN;
+ return -1;
+ }
+ if (IsWin95()) {
+ int pid = (int)id;
+ if (pid < 0)
+ id = -pid;
+ }
+ w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
+ w32_pseudo_child_pids[w32_num_pseudo_children] = id;
+ ++w32_num_pseudo_children;
+# endif
+ return -(int)id;
+#else
+ Perl_croak(aTHX_ "fork() not implemented!\n");
+ return -1;
+#endif /* USE_ITHREADS */
+}
+
+int
+PerlProcGetpid(struct IPerlProc* piPerl)
+{
+ return win32_getpid();
+}
+
+void*
+PerlProcDynaLoader(struct IPerlProc* piPerl, const char* filename)
+{
+ return win32_dynaload(filename);
+}
+
+void
+PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr)
+{
+ win32_str_os_error(sv, dwErr);
+}
+
+int
+PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
+{
+ return win32_spawnvp(mode, cmdname, argv);
+}
+
+int
+PerlProcLastHost(struct IPerlProc* piPerl)
+{
+ dTHX;
+ CPerlHost *h = (CPerlHost*)w32_internal_host;
+ return h->LastHost();
+}
+
+struct IPerlProc perlProc =
+{
+ PerlProcAbort,
+ PerlProcCrypt,
+ PerlProcExit,
+ PerlProc_Exit,
+ PerlProcExecl,
+ PerlProcExecv,
+ PerlProcExecvp,
+ PerlProcGetuid,
+ PerlProcGeteuid,
+ PerlProcGetgid,
+ PerlProcGetegid,
+ PerlProcGetlogin,
+ PerlProcKill,
+ PerlProcKillpg,
+ PerlProcPauseProc,
+ PerlProcPopen,
+ PerlProcPclose,
+ PerlProcPipe,
+ PerlProcSetuid,
+ PerlProcSetgid,
+ PerlProcSleep,
+ PerlProcTimes,
+ PerlProcWait,
+ PerlProcWaitpid,
+ PerlProcSignal,
+ PerlProcFork,
+ PerlProcGetpid,
+ PerlProcDynaLoader,
+ PerlProcGetOSError,
+ PerlProcSpawnvp,
+ PerlProcLastHost,
+ PerlProcPopenList,
+ PerlProcGetTimeOfDay
+};
+
+
+/*
+ * CPerlHost
+ */
+
+CPerlHost::CPerlHost(void)
+{
+ /* Construct a host from scratch */
+ InterlockedIncrement(&num_hosts);
+ m_pvDir = new VDir();
+ m_pVMem = new VMem();
+ m_pVMemShared = new VMem();
+ m_pVMemParse = new VMem();
+
+ m_pvDir->Init(NULL, m_pVMem);
+
+ m_dwEnvCount = 0;
+ m_lppEnvList = NULL;
+ m_bTopLevel = TRUE;
+
+ CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
+ CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
+ CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
+ CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
+ CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
+ CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
+ CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
+ CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
+ CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
+
+ m_pHostperlMem = &m_hostperlMem;
+ m_pHostperlMemShared = &m_hostperlMemShared;
+ m_pHostperlMemParse = &m_hostperlMemParse;
+ m_pHostperlEnv = &m_hostperlEnv;
+ m_pHostperlStdIO = &m_hostperlStdIO;
+ m_pHostperlLIO = &m_hostperlLIO;
+ m_pHostperlDir = &m_hostperlDir;
+ m_pHostperlSock = &m_hostperlSock;
+ m_pHostperlProc = &m_hostperlProc;
+}
+
+#define SETUPEXCHANGE(xptr, iptr, table) \
+ STMT_START { \
+ if (xptr) { \
+ iptr = *xptr; \
+ *xptr = &table; \
+ } \
+ else { \
+ iptr = &table; \
+ } \
+ } STMT_END
+
+CPerlHost::CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
+ struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
+ struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
+ struct IPerlDir** ppDir, struct IPerlSock** ppSock,
+ struct IPerlProc** ppProc)
+{
+ InterlockedIncrement(&num_hosts);
+ m_pvDir = new VDir(0);
+ m_pVMem = new VMem();
+ m_pVMemShared = new VMem();
+ m_pVMemParse = new VMem();
+
+ m_pvDir->Init(NULL, m_pVMem);
+
+ m_dwEnvCount = 0;
+ m_lppEnvList = NULL;
+ m_bTopLevel = FALSE;
+
+ CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
+ CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
+ CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
+ CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
+ CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
+ CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
+ CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
+ CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
+ CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
+
+ SETUPEXCHANGE(ppMem, m_pHostperlMem, m_hostperlMem);
+ SETUPEXCHANGE(ppMemShared, m_pHostperlMemShared, m_hostperlMemShared);
+ SETUPEXCHANGE(ppMemParse, m_pHostperlMemParse, m_hostperlMemParse);
+ SETUPEXCHANGE(ppEnv, m_pHostperlEnv, m_hostperlEnv);
+ SETUPEXCHANGE(ppStdIO, m_pHostperlStdIO, m_hostperlStdIO);
+ SETUPEXCHANGE(ppLIO, m_pHostperlLIO, m_hostperlLIO);
+ SETUPEXCHANGE(ppDir, m_pHostperlDir, m_hostperlDir);
+ SETUPEXCHANGE(ppSock, m_pHostperlSock, m_hostperlSock);
+ SETUPEXCHANGE(ppProc, m_pHostperlProc, m_hostperlProc);
+}
+#undef SETUPEXCHANGE
+
+CPerlHost::CPerlHost(CPerlHost& host)
+{
+ /* Construct a host from another host */
+ InterlockedIncrement(&num_hosts);
+ m_pVMem = new VMem();
+ m_pVMemShared = host.GetMemShared();
+ m_pVMemParse = host.GetMemParse();
+
+ /* duplicate directory info */
+ m_pvDir = new VDir(0);
+ m_pvDir->Init(host.GetDir(), m_pVMem);
+
+ CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
+ CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
+ CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
+ CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
+ CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
+ CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
+ CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
+ CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
+ CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
+ m_pHostperlMem = &m_hostperlMem;
+ m_pHostperlMemShared = &m_hostperlMemShared;
+ m_pHostperlMemParse = &m_hostperlMemParse;
+ m_pHostperlEnv = &m_hostperlEnv;
+ m_pHostperlStdIO = &m_hostperlStdIO;
+ m_pHostperlLIO = &m_hostperlLIO;
+ m_pHostperlDir = &m_hostperlDir;
+ m_pHostperlSock = &m_hostperlSock;
+ m_pHostperlProc = &m_hostperlProc;
+
+ m_dwEnvCount = 0;
+ m_lppEnvList = NULL;
+ m_bTopLevel = FALSE;
+
+ /* duplicate environment info */
+ LPSTR lpPtr;
+ DWORD dwIndex = 0;
+ while(lpPtr = host.GetIndex(dwIndex))
+ Add(lpPtr);
+}
+
+CPerlHost::~CPerlHost(void)
+{
+ Reset();
+ InterlockedDecrement(&num_hosts);
+ delete m_pvDir;
+ m_pVMemParse->Release();
+ m_pVMemShared->Release();
+ m_pVMem->Release();
+}
+
+LPSTR
+CPerlHost::Find(LPCSTR lpStr)
+{
+ LPSTR lpPtr;
+ LPSTR* lppPtr = Lookup(lpStr);
+ if(lppPtr != NULL) {
+ for(lpPtr = *lppPtr; *lpPtr != '\0' && *lpPtr != '='; ++lpPtr)
+ ;
+
+ if(*lpPtr == '=')
+ ++lpPtr;
+
+ return lpPtr;
+ }
+ return NULL;
+}
+
+int
+lookup(const void *arg1, const void *arg2)
+{ // Compare strings
+ char*ptr1, *ptr2;
+ char c1,c2;
+
+ ptr1 = *(char**)arg1;
+ ptr2 = *(char**)arg2;
+ for(;;) {
+ c1 = *ptr1++;
+ c2 = *ptr2++;
+ if(c1 == '\0' || c1 == '=') {
+ if(c2 == '\0' || c2 == '=')
+ break;
+
+ return -1; // string 1 < string 2
+ }
+ else if(c2 == '\0' || c2 == '=')
+ return 1; // string 1 > string 2
+ else if(c1 != c2) {
+ c1 = toupper(c1);
+ c2 = toupper(c2);
+ if(c1 != c2) {
+ if(c1 < c2)
+ return -1; // string 1 < string 2
+
+ return 1; // string 1 > string 2
+ }
+ }
+ }
+ return 0;
+}
+
+LPSTR*
+CPerlHost::Lookup(LPCSTR lpStr)
+{
+#ifdef UNDER_CE
+ if (!m_lppEnvList || !m_dwEnvCount)
+ return NULL;
+#endif
+ if (!lpStr)
+ return NULL;
+ return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup);
+}
+
+int
+compare(const void *arg1, const void *arg2)
+{ // Compare strings
+ char*ptr1, *ptr2;
+ char c1,c2;
+
+ ptr1 = *(char**)arg1;
+ ptr2 = *(char**)arg2;
+ for(;;) {
+ c1 = *ptr1++;
+ c2 = *ptr2++;
+ if(c1 == '\0' || c1 == '=') {
+ if(c1 == c2)
+ break;
+
+ return -1; // string 1 < string 2
+ }
+ else if(c2 == '\0' || c2 == '=')
+ return 1; // string 1 > string 2
+ else if(c1 != c2) {
+ c1 = toupper(c1);
+ c2 = toupper(c2);
+ if(c1 != c2) {
+ if(c1 < c2)
+ return -1; // string 1 < string 2
+
+ return 1; // string 1 > string 2
+ }
+ }
+ }
+ return 0;
+}
+
+void
+CPerlHost::Add(LPCSTR lpStr)
+{
+ dTHX;
+ char szBuffer[1024];
+ LPSTR *lpPtr;
+ int index, length = strlen(lpStr)+1;
+
+ for(index = 0; lpStr[index] != '\0' && lpStr[index] != '='; ++index)
+ szBuffer[index] = lpStr[index];
+
+ szBuffer[index] = '\0';
+
+ // replacing ?
+ lpPtr = Lookup(szBuffer);
+ if (lpPtr != NULL) {
+ // must allocate things via host memory allocation functions
+ // rather than perl's Renew() et al, as the perl interpreter
+ // may either not be initialized enough when we allocate these,
+ // or may already be dead when we go to free these
+ *lpPtr = (char*)Realloc(*lpPtr, length * sizeof(char));
+ strcpy(*lpPtr, lpStr);
+ }
+ else {
+ m_lppEnvList = (LPSTR*)Realloc(m_lppEnvList, (m_dwEnvCount+1) * sizeof(LPSTR));
+ if (m_lppEnvList) {
+ m_lppEnvList[m_dwEnvCount] = (char*)Malloc(length * sizeof(char));
+ if (m_lppEnvList[m_dwEnvCount] != NULL) {
+ strcpy(m_lppEnvList[m_dwEnvCount], lpStr);
+ ++m_dwEnvCount;
+ qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare);
+ }
+ }
+ }
+}
+
+DWORD
+CPerlHost::CalculateEnvironmentSpace(void)
+{
+ DWORD index;
+ DWORD dwSize = 0;
+ for(index = 0; index < m_dwEnvCount; ++index)
+ dwSize += strlen(m_lppEnvList[index]) + 1;
+
+ return dwSize;
+}
+
+void
+CPerlHost::FreeLocalEnvironmentStrings(LPSTR lpStr)
+{
+ dTHX;
+ Safefree(lpStr);
+}
+
+char*
+CPerlHost::GetChildDir(void)
+{
+ dTHX;
+ char* ptr;
+ size_t length;
+
+ Newx(ptr, MAX_PATH+1, char);
+ m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
+ length = strlen(ptr);
+ if (length > 3) {
+ if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
+ ptr[length-1] = 0;
+ }
+ return ptr;
+}
+
+void
+CPerlHost::FreeChildDir(char* pStr)
+{
+ dTHX;
+ Safefree(pStr);
+}
+
+LPSTR
+CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
+{
+ dTHX;
+ LPSTR lpStr, lpPtr, lpEnvPtr, lpTmp, lpLocalEnv, lpAllocPtr;
+ DWORD dwSize, dwEnvIndex;
+ int nLength, compVal;
+
+ // get the process environment strings
+ lpAllocPtr = lpTmp = (LPSTR)GetEnvironmentStrings();
+
+ // step over current directory stuff
+ while(*lpTmp == '=')
+ lpTmp += strlen(lpTmp) + 1;
+
+ // save the start of the environment strings
+ lpEnvPtr = lpTmp;
+ for(dwSize = 1; *lpTmp != '\0'; lpTmp += strlen(lpTmp) + 1) {
+ // calculate the size of the environment strings
+ dwSize += strlen(lpTmp) + 1;
+ }
+
+ // add the size of current directories
+ dwSize += vDir.CalculateEnvironmentSpace();
+
+ // add the additional space used by changes made to the environment
+ dwSize += CalculateEnvironmentSpace();
+
+ Newx(lpStr, dwSize, char);
+ lpPtr = lpStr;
+ if(lpStr != NULL) {
+ // build the local environment
+ lpStr = vDir.BuildEnvironmentSpace(lpStr);
+
+ dwEnvIndex = 0;
+ lpLocalEnv = GetIndex(dwEnvIndex);
+ while(*lpEnvPtr != '\0') {
+ if(!lpLocalEnv) {
+ // all environment overrides have been added
+ // so copy string into place
+ strcpy(lpStr, lpEnvPtr);
+ nLength = strlen(lpEnvPtr) + 1;
+ lpStr += nLength;
+ lpEnvPtr += nLength;
+ }
+ else {
+ // determine which string to copy next
+ compVal = compare(&lpEnvPtr, &lpLocalEnv);
+ if(compVal < 0) {
+ strcpy(lpStr, lpEnvPtr);
+ nLength = strlen(lpEnvPtr) + 1;
+ lpStr += nLength;
+ lpEnvPtr += nLength;
+ }
+ else {
+ char *ptr = strchr(lpLocalEnv, '=');
+ if(ptr && ptr[1]) {
+ strcpy(lpStr, lpLocalEnv);
+ lpStr += strlen(lpLocalEnv) + 1;
+ }
+ lpLocalEnv = GetIndex(dwEnvIndex);
+ if(compVal == 0) {
+ // this string was replaced
+ lpEnvPtr += strlen(lpEnvPtr) + 1;
+ }
+ }
+ }
+ }
+
+ while(lpLocalEnv) {
+ // still have environment overrides to add
+ // so copy the strings into place if not an override
+ char *ptr = strchr(lpLocalEnv, '=');
+ if(ptr && ptr[1]) {
+ strcpy(lpStr, lpLocalEnv);
+ lpStr += strlen(lpLocalEnv) + 1;
+ }
+ lpLocalEnv = GetIndex(dwEnvIndex);
+ }
+
+ // add final NULL
+ *lpStr = '\0';
+ }
+
+ // release the process environment strings
+ FreeEnvironmentStrings(lpAllocPtr);
+
+ return lpPtr;
+}
+
+void
+CPerlHost::Reset(void)
+{
+ dTHX;
+ if(m_lppEnvList != NULL) {
+ for(DWORD index = 0; index < m_dwEnvCount; ++index) {
+ Free(m_lppEnvList[index]);
+ m_lppEnvList[index] = NULL;
+ }
+ }
+ m_dwEnvCount = 0;
+ Free(m_lppEnvList);
+ m_lppEnvList = NULL;
+}
+
+void
+CPerlHost::Clearenv(void)
+{
+ dTHX;
+ char ch;
+ LPSTR lpPtr, lpStr, lpEnvPtr;
+ if (m_lppEnvList != NULL) {
+ /* set every entry to an empty string */
+ for(DWORD index = 0; index < m_dwEnvCount; ++index) {
+ char* ptr = strchr(m_lppEnvList[index], '=');
+ if(ptr) {
+ *++ptr = 0;
+ }
+ }
+ }
+
+ /* get the process environment strings */
+ lpStr = lpEnvPtr = (LPSTR)GetEnvironmentStrings();
+
+ /* step over current directory stuff */
+ while(*lpStr == '=')
+ lpStr += strlen(lpStr) + 1;
+
+ while(*lpStr) {
+ lpPtr = strchr(lpStr, '=');
+ if(lpPtr) {
+ ch = *++lpPtr;
+ *lpPtr = 0;
+ Add(lpStr);
+ if (m_bTopLevel)
+ (void)win32_putenv(lpStr);
+ *lpPtr = ch;
+ }
+ lpStr += strlen(lpStr) + 1;
+ }
+
+ FreeEnvironmentStrings(lpEnvPtr);
+}
+
+
+char*
+CPerlHost::Getenv(const char *varname)
+{
+ dTHX;
+ if (!m_bTopLevel) {
+ char *pEnv = Find(varname);
+ if (pEnv && *pEnv)
+ return pEnv;
+ }
+ return win32_getenv(varname);
+}
+
+int
+CPerlHost::Putenv(const char *envstring)
+{
+ dTHX;
+ Add(envstring);
+ if (m_bTopLevel)
+ return win32_putenv(envstring);
+
+ return 0;
+}
+
+int
+CPerlHost::Chdir(const char *dirname)
+{
+ dTHX;
+ int ret;
+ if (!dirname) {
+ errno = ENOENT;
+ return -1;
+ }
+ ret = m_pvDir->SetCurrentDirectoryA((char*)dirname);
+ if(ret < 0) {
+ errno = ENOENT;
+ }
+ return ret;
+}
+
+#endif /* ___PerlHost_H___ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perlio.h b/Master/tlpkg/tlperl/lib/CORE/perlio.h
new file mode 100644
index 00000000000..a6902d4a956
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perlio.h
@@ -0,0 +1,394 @@
+/* perlio.h
+ *
+ * Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003,
+ * 2004, 2005, 2006, 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifndef _PERLIO_H
+#define _PERLIO_H
+/*
+ Interface for perl to IO functions.
+ There is a hierarchy of Configure determined #define controls:
+ USE_STDIO - forces PerlIO_xxx() to be #define-d onto stdio functions.
+ This is used for x2p subdirectory and for conservative
+ builds - "just like perl5.00X used to be".
+ This dominates over the others.
+
+ USE_PERLIO - The primary Configure variable that enables PerlIO.
+ If USE_PERLIO is _NOT_ set
+ then USE_STDIO above will be set to be conservative.
+ If USE_PERLIO is set
+ then there are two modes determined by USE_SFIO:
+
+ USE_SFIO - If set causes PerlIO_xxx() to be #define-d onto sfio functions.
+ A backward compatability mode for some specialist applications.
+
+ If USE_SFIO is not set then PerlIO_xxx() are real functions
+ defined in perlio.c which implement extra functionality
+ required for utf8 support.
+
+ One further note - the table-of-functions scheme controlled
+ by PERL_IMPLICIT_SYS turns on USE_PERLIO so that iperlsys.h can
+ #define PerlIO_xxx() to go via the function table, without having
+ to #undef them from (say) stdio forms.
+
+*/
+
+#if defined(PERL_IMPLICIT_SYS)
+#ifndef USE_PERLIO
+#ifndef NETWARE
+/* # define USE_PERLIO */
+#endif
+#endif
+#endif
+
+#ifndef USE_PERLIO
+# define USE_STDIO
+#endif
+
+#ifdef USE_STDIO
+# ifndef PERLIO_IS_STDIO
+# define PERLIO_IS_STDIO
+# endif
+#endif
+
+/* -------------------- End of Configure controls ---------------------------- */
+
+/*
+ * Although we may not want stdio to be used including <stdio.h> here
+ * avoids issues where stdio.h has strange side effects
+ */
+#include <stdio.h>
+
+#ifdef __BEOS__
+int fseeko(FILE *stream, off_t offset, int whence);
+off_t ftello(FILE *stream);
+#endif
+
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FTELLO) && !defined(USE_FTELL64)
+#define ftell ftello
+#endif
+
+#if defined(USE_64_BIT_STDIO) && defined(HAS_FSEEKO) && !defined(USE_FSEEK64)
+#define fseek fseeko
+#endif
+
+/* BS2000 includes are sometimes a bit non standard :-( */
+#if defined(POSIX_BC) && defined(O_BINARY) && !defined(O_TEXT)
+#undef O_BINARY
+#endif
+
+#ifdef PERLIO_IS_STDIO
+/* #define PerlIO_xxxx() as equivalent stdio function */
+#include "perlsdio.h"
+#else /* PERLIO_IS_STDIO */
+#ifdef USE_SFIO
+/* #define PerlIO_xxxx() as equivalent sfio function */
+#include "perlsfio.h"
+#endif /* USE_SFIO */
+#endif /* PERLIO_IS_STDIO */
+
+#ifndef PerlIO
+/* ----------- PerlIO implementation ---------- */
+/* PerlIO not #define-d to something else - define the implementation */
+
+typedef struct _PerlIO PerlIOl;
+typedef struct _PerlIO_funcs PerlIO_funcs;
+typedef PerlIOl *PerlIO;
+#define PerlIO PerlIO
+#define PERLIO_LAYERS 1
+
+/* Making the big PerlIO_funcs vtables const is good (enables placing
+ * them in the const section which is good for speed, security, and
+ * embeddability) but this cannot be done by default because of
+ * backward compatibility. */
+#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
+
+PERL_EXPORT_C void PerlIO_define_layer(pTHX_ PerlIO_funcs *tab);
+PERL_EXPORT_C PerlIO_funcs *PerlIO_find_layer(pTHX_ const char *name,
+ STRLEN len,
+ int load);
+PERL_EXPORT_C PerlIO *PerlIO_push(pTHX_ PerlIO *f, PERLIO_FUNCS_DECL(*tab),
+ const char *mode, SV *arg);
+PERL_EXPORT_C void PerlIO_pop(pTHX_ PerlIO *f);
+PERL_EXPORT_C AV* PerlIO_get_layers(pTHX_ PerlIO *f);
+PERL_EXPORT_C void PerlIO_clone(pTHX_ PerlInterpreter *proto,
+ CLONE_PARAMS *param);
+
+#endif /* PerlIO */
+
+/* ----------- End of implementation choices ---------- */
+
+#ifndef PERLIO_IS_STDIO
+/* Not using stdio _directly_ as PerlIO */
+
+/* We now need to determine what happens if source trys to use stdio.
+ * There are three cases based on PERLIO_NOT_STDIO which XS code
+ * can set how it wants.
+ */
+
+#ifdef PERL_CORE
+/* Make a choice for perl core code
+ - currently this is set to try and catch lingering raw stdio calls.
+ This is a known issue with some non UNIX ports which still use
+ "native" stdio features.
+*/
+#ifndef PERLIO_NOT_STDIO
+#define PERLIO_NOT_STDIO 1
+#endif
+#else
+#ifndef PERLIO_NOT_STDIO
+#define PERLIO_NOT_STDIO 0
+#endif
+#endif
+
+#ifdef PERLIO_NOT_STDIO
+#if PERLIO_NOT_STDIO
+/*
+ * PERLIO_NOT_STDIO #define'd as 1
+ * Case 1: Strong denial of stdio - make all stdio calls (we can think of) errors
+ */
+#include "nostdio.h"
+#else /* if PERLIO_NOT_STDIO */
+/*
+ * PERLIO_NOT_STDIO #define'd as 0
+ * Case 2: Declares that both PerlIO and stdio can be used
+ */
+#endif /* if PERLIO_NOT_STDIO */
+#else /* ifdef PERLIO_NOT_STDIO */
+/*
+ * PERLIO_NOT_STDIO not defined
+ * Case 3: Try and fake stdio calls as PerlIO calls
+ */
+#include "fakesdio.h"
+#endif /* ifndef PERLIO_NOT_STDIO */
+#endif /* PERLIO_IS_STDIO */
+
+/* ----------- fill in things that have not got #define'd ---------- */
+
+#ifndef Fpos_t
+#define Fpos_t Off_t
+#endif
+
+#ifndef EOF
+#define EOF (-1)
+#endif
+
+/* This is to catch case with no stdio */
+#ifndef BUFSIZ
+#define BUFSIZ 1024
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#define PERLIO_DUP_CLONE 1
+#define PERLIO_DUP_FD 2
+
+/* --------------------- Now prototypes for functions --------------- */
+
+START_EXTERN_C
+#ifndef __attribute__format__
+# ifdef HASATTRIBUTE_FORMAT
+# define __attribute__format__(x,y,z) __attribute__((format(x,y,z)))
+# else
+# define __attribute__format__(x,y,z)
+# endif
+#endif
+#ifndef PerlIO_init
+PERL_EXPORT_C void PerlIO_init(pTHX);
+#endif
+#ifndef PerlIO_stdoutf
+PERL_EXPORT_C int PerlIO_stdoutf(const char *, ...)
+ __attribute__format__(__printf__, 1, 2);
+#endif
+#ifndef PerlIO_puts
+PERL_EXPORT_C int PerlIO_puts(PerlIO *, const char *);
+#endif
+#ifndef PerlIO_open
+PERL_EXPORT_C PerlIO *PerlIO_open(const char *, const char *);
+#endif
+#ifndef PerlIO_openn
+PERL_EXPORT_C PerlIO *PerlIO_openn(pTHX_ const char *layers, const char *mode,
+ int fd, int imode, int perm, PerlIO *old,
+ int narg, SV **arg);
+#endif
+#ifndef PerlIO_eof
+PERL_EXPORT_C int PerlIO_eof(PerlIO *);
+#endif
+#ifndef PerlIO_error
+PERL_EXPORT_C int PerlIO_error(PerlIO *);
+#endif
+#ifndef PerlIO_clearerr
+PERL_EXPORT_C void PerlIO_clearerr(PerlIO *);
+#endif
+#ifndef PerlIO_getc
+PERL_EXPORT_C int PerlIO_getc(PerlIO *);
+#endif
+#ifndef PerlIO_putc
+PERL_EXPORT_C int PerlIO_putc(PerlIO *, int);
+#endif
+#ifndef PerlIO_ungetc
+PERL_EXPORT_C int PerlIO_ungetc(PerlIO *, int);
+#endif
+#ifndef PerlIO_fdopen
+PERL_EXPORT_C PerlIO *PerlIO_fdopen(int, const char *);
+#endif
+#ifndef PerlIO_importFILE
+PERL_EXPORT_C PerlIO *PerlIO_importFILE(FILE *, const char *);
+#endif
+#ifndef PerlIO_exportFILE
+PERL_EXPORT_C FILE *PerlIO_exportFILE(PerlIO *, const char *);
+#endif
+#ifndef PerlIO_findFILE
+PERL_EXPORT_C FILE *PerlIO_findFILE(PerlIO *);
+#endif
+#ifndef PerlIO_releaseFILE
+PERL_EXPORT_C void PerlIO_releaseFILE(PerlIO *, FILE *);
+#endif
+#ifndef PerlIO_read
+PERL_EXPORT_C SSize_t PerlIO_read(PerlIO *, void *, Size_t);
+#endif
+#ifndef PerlIO_unread
+PERL_EXPORT_C SSize_t PerlIO_unread(PerlIO *, const void *, Size_t);
+#endif
+#ifndef PerlIO_write
+PERL_EXPORT_C SSize_t PerlIO_write(PerlIO *, const void *, Size_t);
+#endif
+#ifndef PerlIO_setlinebuf
+PERL_EXPORT_C void PerlIO_setlinebuf(PerlIO *);
+#endif
+#ifndef PerlIO_printf
+PERL_EXPORT_C int PerlIO_printf(PerlIO *, const char *, ...)
+ __attribute__format__(__printf__, 2, 3);
+#endif
+#ifndef PerlIO_sprintf
+PERL_EXPORT_C int PerlIO_sprintf(char *, int, const char *, ...)
+ __attribute__format__(__printf__, 3, 4);
+#endif
+#ifndef PerlIO_vprintf
+PERL_EXPORT_C int PerlIO_vprintf(PerlIO *, const char *, va_list);
+#endif
+#ifndef PerlIO_tell
+PERL_EXPORT_C Off_t PerlIO_tell(PerlIO *);
+#endif
+#ifndef PerlIO_seek
+PERL_EXPORT_C int PerlIO_seek(PerlIO *, Off_t, int);
+#endif
+#ifndef PerlIO_rewind
+PERL_EXPORT_C void PerlIO_rewind(PerlIO *);
+#endif
+#ifndef PerlIO_has_base
+PERL_EXPORT_C int PerlIO_has_base(PerlIO *);
+#endif
+#ifndef PerlIO_has_cntptr
+PERL_EXPORT_C int PerlIO_has_cntptr(PerlIO *);
+#endif
+#ifndef PerlIO_fast_gets
+PERL_EXPORT_C int PerlIO_fast_gets(PerlIO *);
+#endif
+#ifndef PerlIO_canset_cnt
+PERL_EXPORT_C int PerlIO_canset_cnt(PerlIO *);
+#endif
+#ifndef PerlIO_get_ptr
+PERL_EXPORT_C STDCHAR *PerlIO_get_ptr(PerlIO *);
+#endif
+#ifndef PerlIO_get_cnt
+PERL_EXPORT_C int PerlIO_get_cnt(PerlIO *);
+#endif
+#ifndef PerlIO_set_cnt
+PERL_EXPORT_C void PerlIO_set_cnt(PerlIO *, int);
+#endif
+#ifndef PerlIO_set_ptrcnt
+PERL_EXPORT_C void PerlIO_set_ptrcnt(PerlIO *, STDCHAR *, int);
+#endif
+#ifndef PerlIO_get_base
+PERL_EXPORT_C STDCHAR *PerlIO_get_base(PerlIO *);
+#endif
+#ifndef PerlIO_get_bufsiz
+PERL_EXPORT_C int PerlIO_get_bufsiz(PerlIO *);
+#endif
+#ifndef PerlIO_tmpfile
+PERL_EXPORT_C PerlIO *PerlIO_tmpfile(void);
+#endif
+#ifndef PerlIO_stdin
+PERL_EXPORT_C PerlIO *PerlIO_stdin(void);
+#endif
+#ifndef PerlIO_stdout
+PERL_EXPORT_C PerlIO *PerlIO_stdout(void);
+#endif
+#ifndef PerlIO_stderr
+PERL_EXPORT_C PerlIO *PerlIO_stderr(void);
+#endif
+#ifndef PerlIO_getpos
+PERL_EXPORT_C int PerlIO_getpos(PerlIO *, SV *);
+#endif
+#ifndef PerlIO_setpos
+PERL_EXPORT_C int PerlIO_setpos(PerlIO *, SV *);
+#endif
+#ifndef PerlIO_fdupopen
+PERL_EXPORT_C PerlIO *PerlIO_fdupopen(pTHX_ PerlIO *, CLONE_PARAMS *, int);
+#endif
+#if !defined(PerlIO_modestr) && !defined(PERLIO_IS_STDIO)
+PERL_EXPORT_C char *PerlIO_modestr(PerlIO *, char *buf);
+#endif
+#ifndef PerlIO_isutf8
+PERL_EXPORT_C int PerlIO_isutf8(PerlIO *);
+#endif
+#ifndef PerlIO_apply_layers
+PERL_EXPORT_C int PerlIO_apply_layers(pTHX_ PerlIO *f, const char *mode,
+ const char *names);
+#endif
+#ifndef PerlIO_binmode
+PERL_EXPORT_C int PerlIO_binmode(pTHX_ PerlIO *f, int iotype, int omode,
+ const char *names);
+#endif
+#ifndef PerlIO_getname
+PERL_EXPORT_C char *PerlIO_getname(PerlIO *, char *);
+#endif
+
+PERL_EXPORT_C void PerlIO_destruct(pTHX);
+
+PERL_EXPORT_C int PerlIO_intmode2str(int rawmode, char *mode, int *writing);
+
+#ifdef PERLIO_LAYERS
+PERL_EXPORT_C void PerlIO_cleanup(pTHX);
+
+PERL_EXPORT_C void PerlIO_debug(const char *fmt, ...)
+ __attribute__format__(__printf__, 1, 2);
+typedef struct PerlIO_list_s PerlIO_list_t;
+
+
+#endif
+
+END_EXTERN_C
+#endif /* _PERLIO_H */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perliol.h b/Master/tlpkg/tlperl/lib/CORE/perliol.h
new file mode 100644
index 00000000000..6b714bb6efa
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perliol.h
@@ -0,0 +1,297 @@
+#ifndef _PERLIOL_H
+#define _PERLIOL_H
+
+typedef struct {
+ PerlIO_funcs *funcs;
+ SV *arg;
+} PerlIO_pair_t;
+
+struct PerlIO_list_s {
+ IV refcnt;
+ IV cur;
+ IV len;
+ PerlIO_pair_t *array;
+};
+
+struct _PerlIO_funcs {
+ Size_t fsize;
+ const char *name;
+ Size_t size;
+ U32 kind;
+ IV (*Pushed) (pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+ IV (*Popped) (pTHX_ PerlIO *f);
+ PerlIO *(*Open) (pTHX_ PerlIO_funcs *tab,
+ PerlIO_list_t *layers, IV n,
+ const char *mode,
+ int fd, int imode, int perm,
+ PerlIO *old, int narg, SV **args);
+ IV (*Binmode)(pTHX_ PerlIO *f);
+ SV *(*Getarg) (pTHX_ PerlIO *f, CLONE_PARAMS *param, int flags);
+ IV (*Fileno) (pTHX_ PerlIO *f);
+ PerlIO *(*Dup) (pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+ /* Unix-like functions - cf sfio line disciplines */
+ SSize_t(*Read) (pTHX_ PerlIO *f, void *vbuf, Size_t count);
+ SSize_t(*Unread) (pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+ SSize_t(*Write) (pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+ IV (*Seek) (pTHX_ PerlIO *f, Off_t offset, int whence);
+ Off_t(*Tell) (pTHX_ PerlIO *f);
+ IV (*Close) (pTHX_ PerlIO *f);
+ /* Stdio-like buffered IO functions */
+ IV (*Flush) (pTHX_ PerlIO *f);
+ IV (*Fill) (pTHX_ PerlIO *f);
+ IV (*Eof) (pTHX_ PerlIO *f);
+ IV (*Error) (pTHX_ PerlIO *f);
+ void (*Clearerr) (pTHX_ PerlIO *f);
+ void (*Setlinebuf) (pTHX_ PerlIO *f);
+ /* Perl's snooping functions */
+ STDCHAR *(*Get_base) (pTHX_ PerlIO *f);
+ Size_t(*Get_bufsiz) (pTHX_ PerlIO *f);
+ STDCHAR *(*Get_ptr) (pTHX_ PerlIO *f);
+ SSize_t(*Get_cnt) (pTHX_ PerlIO *f);
+ void (*Set_ptrcnt) (pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+};
+
+/*--------------------------------------------------------------------------------------*/
+/* Kind values */
+#define PERLIO_K_RAW 0x00000001
+#define PERLIO_K_BUFFERED 0x00000002
+#define PERLIO_K_CANCRLF 0x00000004
+#define PERLIO_K_FASTGETS 0x00000008
+#define PERLIO_K_DUMMY 0x00000010
+#define PERLIO_K_UTF8 0x00008000
+#define PERLIO_K_DESTRUCT 0x00010000
+#define PERLIO_K_MULTIARG 0x00020000
+
+/*--------------------------------------------------------------------------------------*/
+struct _PerlIO {
+ PerlIOl *next; /* Lower layer */
+ PerlIO_funcs *tab; /* Functions for this layer */
+ U32 flags; /* Various flags for state */
+};
+
+/*--------------------------------------------------------------------------------------*/
+
+/* Flag values */
+#define PERLIO_F_EOF 0x00000100
+#define PERLIO_F_CANWRITE 0x00000200
+#define PERLIO_F_CANREAD 0x00000400
+#define PERLIO_F_ERROR 0x00000800
+#define PERLIO_F_TRUNCATE 0x00001000
+#define PERLIO_F_APPEND 0x00002000
+#define PERLIO_F_CRLF 0x00004000
+#define PERLIO_F_UTF8 0x00008000
+#define PERLIO_F_UNBUF 0x00010000
+#define PERLIO_F_WRBUF 0x00020000
+#define PERLIO_F_RDBUF 0x00040000
+#define PERLIO_F_LINEBUF 0x00080000
+#define PERLIO_F_TEMP 0x00100000
+#define PERLIO_F_OPEN 0x00200000
+#define PERLIO_F_FASTGETS 0x00400000
+#define PERLIO_F_TTY 0x00800000
+#define PERLIO_F_NOTREG 0x01000000
+
+#define PerlIOBase(f) (*(f))
+#define PerlIOSelf(f,type) ((type *)PerlIOBase(f))
+#define PerlIONext(f) (&(PerlIOBase(f)->next))
+#define PerlIOValid(f) ((f) && *(f))
+
+/*--------------------------------------------------------------------------------------*/
+/* Data exports - EXTCONST rather than extern is needed for Cygwin */
+#undef EXTPERLIO
+#ifdef PERLIO_FUNCS_CONST
+#define EXTPERLIO EXTCONST
+#else
+#define EXTPERLIO EXT
+#endif
+EXTPERLIO PerlIO_funcs PerlIO_unix;
+EXTPERLIO PerlIO_funcs PerlIO_perlio;
+EXTPERLIO PerlIO_funcs PerlIO_stdio;
+EXTPERLIO PerlIO_funcs PerlIO_crlf;
+EXTPERLIO PerlIO_funcs PerlIO_utf8;
+EXTPERLIO PerlIO_funcs PerlIO_byte;
+EXTPERLIO PerlIO_funcs PerlIO_raw;
+EXTPERLIO PerlIO_funcs PerlIO_pending;
+#ifdef HAS_MMAP
+EXTPERLIO PerlIO_funcs PerlIO_mmap;
+#endif
+#ifdef WIN32
+EXTPERLIO PerlIO_funcs PerlIO_win32;
+#endif
+PERL_EXPORT_C PerlIO *PerlIO_allocate(pTHX);
+PERL_EXPORT_C SV *PerlIO_arg_fetch(PerlIO_list_t *av, IV n);
+#define PerlIOArg PerlIO_arg_fetch(layers,n)
+
+#ifdef PERLIO_USING_CRLF
+#define PERLIO_STDTEXT "t"
+#else
+#define PERLIO_STDTEXT ""
+#endif
+
+/*--------------------------------------------------------------------------------------*/
+/* perlio buffer layer
+ As this is reasonably generic its struct and "methods" are declared here
+ so they can be used to "inherit" from it.
+*/
+
+typedef struct {
+ struct _PerlIO base; /* Base "class" info */
+ STDCHAR *buf; /* Start of buffer */
+ STDCHAR *end; /* End of valid part of buffer */
+ STDCHAR *ptr; /* Current position in buffer */
+ Off_t posn; /* Offset of buf into the file */
+ Size_t bufsiz; /* Real size of buffer */
+ IV oneword; /* Emergency buffer */
+} PerlIOBuf;
+
+PERL_EXPORT_C int PerlIO_apply_layera(pTHX_ PerlIO *f, const char *mode,
+ PerlIO_list_t *layers, IV n, IV max);
+PERL_EXPORT_C int PerlIO_parse_layers(pTHX_ PerlIO_list_t *av, const char *names);
+PERL_EXPORT_C PerlIO_funcs *PerlIO_layer_fetch(pTHX_ PerlIO_list_t *av, IV n, PerlIO_funcs *def);
+
+
+PERL_EXPORT_C SV *PerlIO_sv_dup(pTHX_ SV *arg, CLONE_PARAMS *param);
+PERL_EXPORT_C void PerlIO_cleantable(pTHX_ PerlIO **tablep);
+PERL_EXPORT_C SV * PerlIO_tab_sv(pTHX_ PerlIO_funcs *tab);
+PERL_EXPORT_C void PerlIO_default_buffer(pTHX_ PerlIO_list_t *av);
+PERL_EXPORT_C void PerlIO_stdstreams(pTHX);
+PERL_EXPORT_C int PerlIO__close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO_list_t * PerlIO_resolve_layers(pTHX_ const char *layers, const char *mode, int narg, SV **args);
+PERL_EXPORT_C PerlIO_funcs * PerlIO_default_layer(pTHX_ I32 n);
+PERL_EXPORT_C PerlIO_list_t * PerlIO_default_layers(pTHX);
+PERL_EXPORT_C PerlIO * PerlIO_reopen(const char *path, const char *mode, PerlIO *f);
+PERL_EXPORT_C int PerlIO_vsprintf(char *s, int n, const char *fmt, va_list ap)
+ __attribute__format__(__printf__,3,0);
+
+PERL_EXPORT_C PerlIO_list_t *PerlIO_list_alloc(pTHX);
+PERL_EXPORT_C PerlIO_list_t *PerlIO_clone_list(pTHX_ PerlIO_list_t *proto, CLONE_PARAMS *param);
+PERL_EXPORT_C void PerlIO_list_free(pTHX_ PerlIO_list_t *list);
+PERL_EXPORT_C void PerlIO_list_push(pTHX_ PerlIO_list_t *list, PerlIO_funcs *funcs, SV *arg);
+PERL_EXPORT_C void PerlIO_list_free(pTHX_ PerlIO_list_t *list);
+
+/* PerlIO_teardown doesn't need exporting, but the EXTERN_C is needed
+ * for compiling as C++. Must also match with what perl.h says. */
+EXTERN_C void PerlIO_teardown(void);
+
+/*--------------------------------------------------------------------------------------*/
+/* Generic, or stub layer functions */
+
+PERL_EXPORT_C IV PerlIOBase_binmode(pTHX_ PerlIO *f);
+PERL_EXPORT_C void PerlIOBase_clearerr(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBase_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO * PerlIOBase_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV PerlIOBase_eof(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBase_error(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBase_fileno(pTHX_ PerlIO *f);
+PERL_EXPORT_C void PerlIOBase_flush_linebuf(pTHX);
+PERL_EXPORT_C IV PerlIOBase_noop_fail(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBase_noop_ok(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBase_popped(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C void PerlIOBase_setlinebuf(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Buf */
+PERL_EXPORT_C Size_t PerlIOBuf_bufsiz(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBuf_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO * PerlIOBuf_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV PerlIOBuf_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBuf_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOBuf_get_base(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOBuf_get_cnt(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOBuf_get_ptr(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO * PerlIOBuf_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args);
+PERL_EXPORT_C IV PerlIOBuf_popped(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOBuf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t PerlIOBuf_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C IV PerlIOBuf_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C void PerlIOBuf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+PERL_EXPORT_C Off_t PerlIOBuf_tell(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOBuf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t PerlIOBuf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Crlf */
+PERL_EXPORT_C IV PerlIOCrlf_binmode(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOCrlf_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOCrlf_get_cnt(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOCrlf_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C void PerlIOCrlf_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+PERL_EXPORT_C SSize_t PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t PerlIOCrlf_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t PerlIOCrlf_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Mmap */
+PERL_EXPORT_C IV PerlIOMmap_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO * PerlIOMmap_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV PerlIOMmap_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOMmap_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOMmap_get_base(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOMmap_map(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOMmap_unmap(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOMmap_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t PerlIOMmap_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Pending */
+PERL_EXPORT_C IV PerlIOPending_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOPending_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOPending_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOPending_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t PerlIOPending_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C IV PerlIOPending_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C void PerlIOPending_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
+
+/* Pop */
+PERL_EXPORT_C IV PerlIOPop_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+
+/* Raw */
+PERL_EXPORT_C PerlIO * PerlIORaw_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args);
+PERL_EXPORT_C IV PerlIORaw_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+
+/* Stdio */
+PERL_EXPORT_C void PerlIOStdio_clearerr(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOStdio_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO * PerlIOStdio_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV PerlIOStdio_eof(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOStdio_error(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOStdio_fileno(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOStdio_fill(pTHX_ PerlIO *f);
+PERL_EXPORT_C IV PerlIOStdio_flush(pTHX_ PerlIO *f);
+PERL_EXPORT_C STDCHAR * PerlIOStdio_get_base(pTHX_ PerlIO *f);
+PERL_EXPORT_C char * PerlIOStdio_mode(const char *mode, char *tmode);
+PERL_EXPORT_C PerlIO * PerlIOStdio_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args);
+PERL_EXPORT_C IV PerlIOStdio_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t PerlIOStdio_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C IV PerlIOStdio_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C void PerlIOStdio_setlinebuf(pTHX_ PerlIO *f);
+PERL_EXPORT_C Off_t PerlIOStdio_tell(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOStdio_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+PERL_EXPORT_C SSize_t PerlIOStdio_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Unix */
+PERL_EXPORT_C IV PerlIOUnix_close(pTHX_ PerlIO *f);
+PERL_EXPORT_C PerlIO * PerlIOUnix_dup(pTHX_ PerlIO *f, PerlIO *o, CLONE_PARAMS *param, int flags);
+PERL_EXPORT_C IV PerlIOUnix_fileno(pTHX_ PerlIO *f);
+PERL_EXPORT_C int PerlIOUnix_oflags(const char *mode);
+PERL_EXPORT_C PerlIO * PerlIOUnix_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args);
+PERL_EXPORT_C IV PerlIOUnix_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+PERL_EXPORT_C SSize_t PerlIOUnix_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
+PERL_EXPORT_C int PerlIOUnix_refcnt_dec(int fd);
+PERL_EXPORT_C void PerlIOUnix_refcnt_inc(int fd);
+PERL_EXPORT_C IV PerlIOUnix_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+PERL_EXPORT_C Off_t PerlIOUnix_tell(pTHX_ PerlIO *f);
+PERL_EXPORT_C SSize_t PerlIOUnix_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count);
+
+/* Utf8 */
+PERL_EXPORT_C IV PerlIOUtf8_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
+
+#endif /* _PERLIOL_H */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perlsdio.h b/Master/tlpkg/tlperl/lib/CORE/perlsdio.h
new file mode 100644
index 00000000000..1a6f2f01c4c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perlsdio.h
@@ -0,0 +1,164 @@
+/* perlsdio.h
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001,
+ * 2002, 2003, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef PERLIO_IS_STDIO
+
+#ifdef NETWARE
+ #include "nwstdio.h"
+#else
+
+/*
+ * This file #define-s the PerlIO_xxx abstraction onto stdio functions.
+ * Make this as close to original stdio as possible.
+ */
+#define PerlIO FILE
+#define PerlIO_stderr() PerlSIO_stderr
+#define PerlIO_stdout() PerlSIO_stdout
+#define PerlIO_stdin() PerlSIO_stdin
+
+#define PerlIO_isutf8(f) 0
+
+#define PerlIO_printf PerlSIO_printf
+#define PerlIO_stdoutf PerlSIO_stdoutf
+#define PerlIO_vprintf(f,fmt,a) PerlSIO_vprintf(f,fmt,a)
+#define PerlIO_write(f,buf,count) PerlSIO_fwrite(buf,1,count,f)
+#define PerlIO_unread(f,buf,count) (-1)
+#define PerlIO_open PerlSIO_fopen
+#define PerlIO_fdopen PerlSIO_fdopen
+#define PerlIO_reopen PerlSIO_freopen
+#define PerlIO_close(f) PerlSIO_fclose(f)
+#define PerlIO_puts(f,s) PerlSIO_fputs(f,s)
+#define PerlIO_putc(f,c) PerlSIO_fputc(f,c)
+#if defined(VMS)
+# if defined(__DECC)
+ /* Unusual definition of ungetc() here to accomodate fast_sv_gets()'
+ * belief that it can mix getc/ungetc with reads from stdio buffer */
+ int decc$ungetc(int __c, FILE *__stream);
+# define PerlIO_ungetc(f,c) ((c) == EOF ? EOF : \
+ ((*(f) && !((*(f))->_flag & _IONBF) && \
+ ((*(f))->_ptr > (*(f))->_base)) ? \
+ ((*(f))->_cnt++, *(--(*(f))->_ptr) = (c)) : decc$ungetc(c,f)))
+# else
+# define PerlIO_ungetc(f,c) ungetc(c,f)
+# endif
+ /* Work around bug in DECCRTL/AXP (DECC v5.x) and some versions of old
+ * VAXCRTL which causes read from a pipe after EOF has been returned
+ * once to hang.
+ */
+# define PerlIO_getc(f) \
+ (feof(f) ? EOF : getc(f))
+# define PerlIO_read(f,buf,count) \
+ (feof(f) ? 0 : (SSize_t)fread(buf,1,count,f))
+# define PerlIO_tell(f) ftell(f)
+#else
+# define PerlIO_getc(f) PerlSIO_fgetc(f)
+# define PerlIO_ungetc(f,c) PerlSIO_ungetc(c,f)
+# define PerlIO_read(f,buf,count) (SSize_t)PerlSIO_fread(buf,1,count,f)
+# define PerlIO_tell(f) PerlSIO_ftell(f)
+#endif
+#define PerlIO_eof(f) PerlSIO_feof(f)
+#define PerlIO_getname(f,b) fgetname(f,b)
+#define PerlIO_error(f) PerlSIO_ferror(f)
+#define PerlIO_fileno(f) PerlSIO_fileno(f)
+#define PerlIO_clearerr(f) PerlSIO_clearerr(f)
+#define PerlIO_flush(f) PerlSIO_fflush(f)
+#if defined(VMS) && !defined(__DECC)
+/* Old VAXC RTL doesn't reset EOF on seek; Perl folk seem to expect this */
+#define PerlIO_seek(f,o,w) (((f) && (*f) && ((*f)->_flag &= ~_IOEOF)),fseek(f,o,w))
+#else
+# define PerlIO_seek(f,o,w) PerlSIO_fseek(f,o,w)
+#endif
+
+#define PerlIO_rewind(f) PerlSIO_rewind(f)
+#define PerlIO_tmpfile() PerlSIO_tmpfile()
+
+#define PerlIO_importFILE(f,fl) (f)
+#define PerlIO_exportFILE(f,fl) (f)
+#define PerlIO_findFILE(f) (f)
+#define PerlIO_releaseFILE(p,f) ((void) 0)
+
+#ifdef HAS_SETLINEBUF
+#define PerlIO_setlinebuf(f) PerlSIO_setlinebuf(f);
+#else
+#define PerlIO_setlinebuf(f) PerlSIO_setvbuf(f, NULL, _IOLBF, 0);
+#endif
+
+/* Now our interface to Configure's FILE_xxx macros */
+
+#ifdef USE_STDIO_PTR
+#define PerlIO_has_cntptr(f) 1
+#define PerlIO_get_ptr(f) PerlSIO_get_ptr(f)
+#define PerlIO_get_cnt(f) PerlSIO_get_cnt(f)
+
+#ifdef STDIO_CNT_LVALUE
+#define PerlIO_canset_cnt(f) 1
+#define PerlIO_set_cnt(f,c) PerlSIO_set_cnt(f,c)
+#ifdef STDIO_PTR_LVALUE
+#ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+#define PerlIO_fast_gets(f) 1
+#endif
+#endif /* STDIO_PTR_LVALUE */
+#else /* STDIO_CNT_LVALUE */
+#define PerlIO_canset_cnt(f) 0
+#define PerlIO_set_cnt(f,c) abort()
+#endif
+
+#ifdef STDIO_PTR_LVALUE
+#ifdef STDIO_PTR_LVAL_NOCHANGE_CNT
+#define PerlIO_set_ptrcnt(f,p,c) STMT_START {PerlSIO_set_ptr(f,p), PerlIO_set_cnt(f,c);} STMT_END
+#else
+#ifdef STDIO_PTR_LVAL_SETS_CNT
+/* assert() may pre-process to ""; potential syntax error (FILE_ptr(), ) */
+#define PerlIO_set_ptrcnt(f,p,c) STMT_START {PerlSIO_set_ptr(f,p); assert(PerlSIO_get_cnt(f) == (c));} STMT_END
+#define PerlIO_fast_gets(f) 1
+#else
+#define PerlIO_set_ptrcnt(f,p,c) abort()
+#endif
+#endif
+#endif
+
+#else /* USE_STDIO_PTR */
+
+#define PerlIO_has_cntptr(f) 0
+#define PerlIO_canset_cnt(f) 0
+#define PerlIO_get_cnt(f) (abort(),0)
+#define PerlIO_get_ptr(f) (abort(),(void *)0)
+#define PerlIO_set_cnt(f,c) abort()
+#define PerlIO_set_ptrcnt(f,p,c) abort()
+
+#endif /* USE_STDIO_PTR */
+
+#ifndef PerlIO_fast_gets
+#define PerlIO_fast_gets(f) 0
+#endif
+
+
+#ifdef FILE_base
+#define PerlIO_has_base(f) 1
+#define PerlIO_get_base(f) PerlSIO_get_base(f)
+#define PerlIO_get_bufsiz(f) PerlSIO_get_bufsiz(f)
+#else
+#define PerlIO_has_base(f) 0
+#define PerlIO_get_base(f) (abort(),(void *)0)
+#define PerlIO_get_bufsiz(f) (abort(),0)
+#endif
+
+#endif /* NETWARE */
+#endif /* PERLIO_IS_STDIO */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perlsfio.h b/Master/tlpkg/tlperl/lib/CORE/perlsfio.h
new file mode 100644
index 00000000000..2471753ad19
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perlsfio.h
@@ -0,0 +1,84 @@
+/* perlsfio.h
+ *
+ * Copyright (C) 1996, 1999, 2000, 2001, 2002, 2003, 2005, 2007,
+ * by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* The next #ifdef should be redundant if Configure behaves ... */
+#ifndef FILE
+#define FILE FILE
+#endif
+#ifdef I_SFIO
+#include <sfio.h>
+#endif
+
+/* sfio 2000 changed _stdopen to _stdfdopen */
+#if SFIO_VERSION >= 20000101L
+#define _stdopen _stdfdopen
+#endif
+
+extern Sfio_t* _stdopen _ARG_((int, const char*));
+extern int _stdprintf _ARG_((const char*, ...));
+
+#define PerlIO Sfio_t
+#define PerlIO_stderr() sfstderr
+#define PerlIO_stdout() sfstdout
+#define PerlIO_stdin() sfstdin
+
+#define PerlIO_isutf8(f) 0
+
+#define PerlIO_printf sfprintf
+#define PerlIO_stdoutf _stdprintf
+#define PerlIO_vprintf(f,fmt,a) sfvprintf(f,fmt,a)
+#define PerlIO_read(f,buf,count) sfread(f,buf,count)
+#define PerlIO_write(f,buf,count) sfwrite(f,buf,count)
+#define PerlIO_open(path,mode) sfopen(NULL,path,mode)
+#define PerlIO_fdopen(fd,mode) _stdopen(fd,mode)
+#define PerlIO_reopen(path,mode,f) sfopen(f,path,mode)
+#define PerlIO_close(f) sfclose(f)
+#define PerlIO_puts(f,s) sfputr(f,s,-1)
+#define PerlIO_putc(f,c) sfputc(f,c)
+#define PerlIO_ungetc(f,c) sfungetc(f,c)
+#define PerlIO_sprintf sfsprintf
+#define PerlIO_getc(f) sfgetc(f)
+#define PerlIO_eof(f) sfeof(f)
+#define PerlIO_error(f) sferror(f)
+#define PerlIO_fileno(f) sffileno(f)
+#define PerlIO_clearerr(f) sfclrerr(f)
+#define PerlIO_flush(f) sfsync(f)
+#define PerlIO_tell(f) sftell(f)
+#define PerlIO_seek(f,o,w) sfseek(f,o,w)
+#define PerlIO_rewind(f) (void) sfseek((f),0L,0)
+#define PerlIO_tmpfile() sftmp(0)
+#define PerlIO_exportFILE(f,fl) Perl_croak(aTHX_ "Export to FILE * unimplemented")
+#define PerlIO_releaseFILE(p,f) Perl_croak(aTHX_ "Release of FILE * unimplemented")
+
+#define PerlIO_setlinebuf(f) sfset(f,SF_LINE,1)
+
+/* Now our interface to equivalent of Configure's FILE_xxx macros */
+
+#define PerlIO_has_cntptr(f) 1
+#define PerlIO_get_ptr(f) ((f)->next)
+#define PerlIO_get_cnt(f) ((f)->endr - (f)->next)
+#define PerlIO_canset_cnt(f) 1
+#define PerlIO_fast_gets(f) 1
+#define PerlIO_set_ptrcnt(f,p,c) STMT_START {(f)->next = (unsigned char *)(p); assert(PerlIO_get_cnt(f) == (c));} STMT_END
+#define PerlIO_set_cnt(f,c) STMT_START {(f)->next = (f)->endr - (c);} STMT_END
+
+#define PerlIO_has_base(f) 1
+#define PerlIO_get_base(f) ((f)->data)
+#define PerlIO_get_bufsiz(f) ((f)->endr - (f)->data)
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/perlvars.h b/Master/tlpkg/tlperl/lib/CORE/perlvars.h
new file mode 100644
index 00000000000..3d378917c94
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perlvars.h
@@ -0,0 +1,243 @@
+/* perlvars.h
+ *
+ * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+ * by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+=head1 Global Variables
+*/
+
+/* Don't forget to re-run embed.pl to propagate changes! */
+
+/* This file describes the "global" variables used by perl
+ * This used to be in perl.h directly but we want to abstract out into
+ * distinct files which are per-thread, per-interpreter or really global,
+ * and how they're initialized.
+ *
+ * The 'G' prefix is only needed for vars that need appropriate #defines
+ * generated in embed*.h. Such symbols are also used to generate
+ * the appropriate export list for win32. */
+
+/* global state */
+PERLVAR(Gcurinterp, PerlInterpreter *)
+ /* currently running interpreter
+ * (initial parent interpreter under
+ * useithreads) */
+#if defined(USE_ITHREADS)
+PERLVAR(Gthr_key, perl_key) /* key to retrieve per-thread struct */
+#endif
+
+/* constants (these are not literals to facilitate pointer comparisons)
+ * (PERLVARISC really does create variables, despite its looks) */
+PERLVARISC(GYes, "1")
+PERLVARISC(GNo, "")
+PERLVARISC(Ghexdigit, "0123456789abcdef0123456789ABCDEF")
+PERLVARISC(Gpatleave, "\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}")
+
+/* XXX does anyone even use this? */
+PERLVARI(Gdo_undump, bool, FALSE) /* -u or dump seen? */
+
+#if defined(MYMALLOC) && defined(USE_ITHREADS)
+PERLVAR(Gmalloc_mutex, perl_mutex) /* Mutex for malloc */
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Gop_mutex, perl_mutex) /* Mutex for op refcounting */
+#endif
+
+#ifdef USE_ITHREADS
+PERLVAR(Gdollarzero_mutex, perl_mutex) /* Modifying $0 */
+#endif
+
+
+/* This is constant on most architectures, a global on OS/2 */
+#ifdef OS2
+# define PERL___C
+#else
+# define PERL___C const
+#endif
+PERLVARI(Gsh_path, PERL___C char *, SH_PATH) /* full path of shell */
+#undef PERL___C
+
+#ifndef PERL_MICRO
+/* If Perl has to ignore SIGPFE, this is its saved state.
+ * See perl.h macros PERL_FPU_INIT and PERL_FPU_{PRE,POST}_EXEC. */
+PERLVAR(Gsigfpe_saved, Sighandler_t)
+#endif
+
+/* Restricted hashes placeholder value.
+ * The contents are never used, only the address. */
+PERLVAR(Gsv_placeholder, SV)
+
+#ifndef PERL_MICRO
+PERLVARI(Gcsighandlerp, Sighandler_t, Perl_csighandler) /* Pointer to C-level sighandler */
+#endif
+
+#ifndef PERL_USE_SAFE_PUTENV
+PERLVARI(Guse_safe_putenv, int, 1)
+#endif
+
+#ifdef USE_PERLIO
+PERLVARI(Gperlio_fd_refcnt, int*, 0) /* Pointer to array of fd refcounts. */
+PERLVARI(Gperlio_fd_refcnt_size, int, 0) /* Size of the array */
+PERLVARI(Gperlio_debug_fd, int, 0) /* the fd to write perlio debug into, 0 means not set yet */
+#endif
+
+#ifdef HAS_MMAP
+PERLVARI(Gmmap_page_size, IV, 0)
+#endif
+
+#if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
+PERLVARI(Gsig_handlers_initted, int, 0)
+#endif
+#ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
+PERLVARA(Gsig_ignoring, SIG_SIZE, int) /* which signals we are ignoring */
+#endif
+#ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
+PERLVARA(Gsig_defaulting, SIG_SIZE, int)
+#endif
+
+#ifndef PERL_IMPLICIT_CONTEXT
+PERLVAR(Gsig_sv, SV*)
+#endif
+
+/* XXX signals are process-wide anyway, so we
+ * ignore the implications of this for threading */
+#ifndef HAS_SIGACTION
+PERLVARI(Gsig_trapped, int, 0)
+#endif
+
+#ifdef DEBUGGING
+PERLVAR(Gwatch_pvx, char*)
+#endif
+
+#ifdef PERL_GLOBAL_STRUCT
+PERLVAR(Gppaddr, Perl_ppaddr_t*) /* or opcode.h */
+PERLVAR(Gcheck, Perl_check_t *) /* or opcode.h */
+PERLVARA(Gfold_locale, 256, unsigned char) /* or perl.h */
+#endif
+
+#ifdef PERL_NEED_APPCTX
+PERLVAR(Gappctx, void*) /* the application context */
+#endif
+
+PERLVAR(Gop_sequence, HV*) /* dump.c */
+PERLVARI(Gop_seq, UV, 0) /* dump.c */
+
+#if defined(HAS_TIMES) && defined(PERL_NEED_TIMESBASE)
+PERLVAR(Gtimesbase, struct tms)
+#endif
+
+/* allocate a unique index to every module that calls MY_CXT_INIT */
+
+#ifdef PERL_IMPLICIT_CONTEXT
+# ifdef USE_ITHREADS
+PERLVAR(Gmy_ctx_mutex, perl_mutex)
+# endif
+PERLVARI(Gmy_cxt_index, int, 0)
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Ghints_mutex, perl_mutex) /* Mutex for refcounted he refcounting */
+#endif
+
+#if defined(USE_ITHREADS)
+PERLVAR(Gperlio_mutex, perl_mutex) /* Mutex for perlio fd refcounts */
+#endif
+
+/* this is currently set without MUTEX protection, so keep it a type which
+ * can be set atomically (ie not a bit field) */
+PERLVARI(Gveto_cleanup, int, FALSE) /* exit without cleanup */
+
+/* dummy variables that hold pointers to both runops functions, thus forcing
+ * them *both* to get linked in (useful for Peek.xs, debugging etc) */
+
+PERLVARI(Grunops_std, runops_proc_t, MEMBER_TO_FPTR(Perl_runops_standard))
+PERLVARI(Grunops_dbg, runops_proc_t, MEMBER_TO_FPTR(Perl_runops_debug))
+
+
+/* These are baked at compile time into any shared perl library.
+ In future 5.10.x releases this will allow us in main() to sanity test the
+ library we're linking against. */
+
+PERLVARI(Grevision, U8, PERL_REVISION)
+PERLVARI(Gversion, U8, PERL_VERSION)
+PERLVARI(Gsubversion, U8, PERL_SUBVERSION)
+
+#if defined(MULTIPLICITY)
+# define PERL_INTERPRETER_SIZE_UPTO_MEMBER(member) \
+ STRUCT_OFFSET(struct interpreter, member) + \
+ sizeof(((struct interpreter*)0)->member)
+
+/* These might be useful. */
+PERLVARI(Ginterp_size, U16, sizeof(struct interpreter))
+#if defined(PERL_GLOBAL_STRUCT)
+PERLVARI(Gglobal_struct_size, U16, sizeof(struct perl_vars))
+#endif
+
+/* This will be useful for subsequent releases, because this has to be the
+ same in your libperl as in main(), else you have a mismatch and must abort.
+*/
+PERLVARI(Ginterp_size_5_10_0, U16,
+ PERL_INTERPRETER_SIZE_UPTO_MEMBER(PERL_LAST_5_10_0_INTERP_MEMBER))
+#endif
+
+/*
+=for apidoc AmUx|Perl_keyword_plugin_t|PL_keyword_plugin
+
+Function pointer, pointing at a function used to handle extended keywords.
+The function should be declared as
+
+ int keyword_plugin_function(pTHX_
+ char *keyword_ptr, STRLEN keyword_len,
+ OP **op_ptr)
+
+The function is called from the tokeniser, whenever a possible keyword
+is seen. C<keyword_ptr> points at the word in the parser's input
+buffer, and C<keyword_len> gives its length; it is not null-terminated.
+The function is expected to examine the word, and possibly other state
+such as L<%^H|perlvar/%^H>, to decide whether it wants to handle it
+as an extended keyword. If it does not, the function should return
+C<KEYWORD_PLUGIN_DECLINE>, and the normal parser process will continue.
+
+If the function wants to handle the keyword, it first must
+parse anything following the keyword that is part of the syntax
+introduced by the keyword. See L</Lexer interface> for details.
+
+When a keyword is being handled, the plugin function must build
+a tree of C<OP> structures, representing the code that was parsed.
+The root of the tree must be stored in C<*op_ptr>. The function then
+returns a contant indicating the syntactic role of the construct that
+it has parsed: C<KEYWORD_PLUGIN_STMT> if it is a complete statement, or
+C<KEYWORD_PLUGIN_EXPR> if it is an expression. Note that a statement
+construct cannot be used inside an expression (except via C<do BLOCK>
+and similar), and an expression is not a complete statement (it requires
+at least a terminating semicolon).
+
+When a keyword is handled, the plugin function may also have
+(compile-time) side effects. It may modify C<%^H>, define functions, and
+so on. Typically, if side effects are the main purpose of a handler,
+it does not wish to generate any ops to be included in the normal
+compilation. In this case it is still required to supply an op tree,
+but it suffices to generate a single null op.
+
+That's how the C<*PL_keyword_plugin> function needs to behave overall.
+Conventionally, however, one does not completely replace the existing
+handler function. Instead, take a copy of C<PL_keyword_plugin> before
+assigning your own function pointer to it. Your handler function should
+look for keywords that it is interested in and handle those. Where it
+is not interested, it should call the saved plugin function, passing on
+the arguments it received. Thus C<PL_keyword_plugin> actually points
+at a chain of handler functions, all of which have an opportunity to
+handle keywords, and only the last function in the chain (built into
+the Perl core) will normally return C<KEYWORD_PLUGIN_DECLINE>.
+
+=cut
+*/
+
+PERLVARI(Gkeyword_plugin, Perl_keyword_plugin_t, MEMBER_TO_FPTR(Perl_keyword_plugin_standard))
diff --git a/Master/tlpkg/tlperl/lib/CORE/perly.h b/Master/tlpkg/tlperl/lib/CORE/perly.h
new file mode 100644
index 00000000000..b40a968c106
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/perly.h
@@ -0,0 +1,226 @@
+#ifdef PERL_CORE
+
+/* A Bison parser, made by GNU Bison 2.4.1. */
+
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
+
+ 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 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ WORD = 258,
+ METHOD = 259,
+ FUNCMETH = 260,
+ THING = 261,
+ PMFUNC = 262,
+ PRIVATEREF = 263,
+ FUNC0SUB = 264,
+ UNIOPSUB = 265,
+ LSTOPSUB = 266,
+ PLUGEXPR = 267,
+ PLUGSTMT = 268,
+ LABEL = 269,
+ FORMAT = 270,
+ SUB = 271,
+ ANONSUB = 272,
+ PACKAGE = 273,
+ USE = 274,
+ WHILE = 275,
+ UNTIL = 276,
+ IF = 277,
+ UNLESS = 278,
+ ELSE = 279,
+ ELSIF = 280,
+ CONTINUE = 281,
+ FOR = 282,
+ GIVEN = 283,
+ WHEN = 284,
+ DEFAULT = 285,
+ LOOPEX = 286,
+ DOTDOT = 287,
+ YADAYADA = 288,
+ FUNC0 = 289,
+ FUNC1 = 290,
+ FUNC = 291,
+ UNIOP = 292,
+ LSTOP = 293,
+ RELOP = 294,
+ EQOP = 295,
+ MULOP = 296,
+ ADDOP = 297,
+ DOLSHARP = 298,
+ DO = 299,
+ HASHBRACK = 300,
+ NOAMP = 301,
+ LOCAL = 302,
+ MY = 303,
+ MYSUB = 304,
+ REQUIRE = 305,
+ COLONATTR = 306,
+ PREC_LOW = 307,
+ DOROP = 308,
+ OROP = 309,
+ ANDOP = 310,
+ NOTOP = 311,
+ ASSIGNOP = 312,
+ DORDOR = 313,
+ OROR = 314,
+ ANDAND = 315,
+ BITOROP = 316,
+ BITANDOP = 317,
+ SHIFTOP = 318,
+ MATCHOP = 319,
+ REFGEN = 320,
+ UMINUS = 321,
+ POWOP = 322,
+ POSTDEC = 323,
+ POSTINC = 324,
+ PREDEC = 325,
+ PREINC = 326,
+ ARROW = 327,
+ PEG = 328
+ };
+#endif
+
+/* Tokens. */
+#define WORD 258
+#define METHOD 259
+#define FUNCMETH 260
+#define THING 261
+#define PMFUNC 262
+#define PRIVATEREF 263
+#define FUNC0SUB 264
+#define UNIOPSUB 265
+#define LSTOPSUB 266
+#define PLUGEXPR 267
+#define PLUGSTMT 268
+#define LABEL 269
+#define FORMAT 270
+#define SUB 271
+#define ANONSUB 272
+#define PACKAGE 273
+#define USE 274
+#define WHILE 275
+#define UNTIL 276
+#define IF 277
+#define UNLESS 278
+#define ELSE 279
+#define ELSIF 280
+#define CONTINUE 281
+#define FOR 282
+#define GIVEN 283
+#define WHEN 284
+#define DEFAULT 285
+#define LOOPEX 286
+#define DOTDOT 287
+#define YADAYADA 288
+#define FUNC0 289
+#define FUNC1 290
+#define FUNC 291
+#define UNIOP 292
+#define LSTOP 293
+#define RELOP 294
+#define EQOP 295
+#define MULOP 296
+#define ADDOP 297
+#define DOLSHARP 298
+#define DO 299
+#define HASHBRACK 300
+#define NOAMP 301
+#define LOCAL 302
+#define MY 303
+#define MYSUB 304
+#define REQUIRE 305
+#define COLONATTR 306
+#define PREC_LOW 307
+#define DOROP 308
+#define OROP 309
+#define ANDOP 310
+#define NOTOP 311
+#define ASSIGNOP 312
+#define DORDOR 313
+#define OROR 314
+#define ANDAND 315
+#define BITOROP 316
+#define BITANDOP 317
+#define SHIFTOP 318
+#define MATCHOP 319
+#define REFGEN 320
+#define UMINUS 321
+#define POWOP 322
+#define POSTDEC 323
+#define POSTINC 324
+#define PREDEC 325
+#define PREINC 326
+#define ARROW 327
+#define PEG 328
+
+
+
+#endif /* PERL_CORE */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 1676 of yacc.c */
+
+ I32 ival; /* __DEFAULT__ (marker for regen_perly.pl;
+ must always be 1st union member) */
+ char *pval;
+ OP *opval;
+ GV *gvval;
+#ifdef PERL_IN_MADLY_C
+ TOKEN* p_tkval;
+ TOKEN* i_tkval;
+#else
+ char *p_tkval;
+ I32 i_tkval;
+#endif
+#ifdef PERL_MAD
+ TOKEN* tkval;
+#endif
+
+
+
+/* Line 1676 of yacc.c */
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/pp.h b/Master/tlpkg/tlperl/lib/CORE/pp.h
new file mode 100644
index 00000000000..c36502a03fa
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/pp.h
@@ -0,0 +1,551 @@
+/* pp.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ * 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define PP(s) OP * Perl_##s(pTHX)
+
+/*
+=head1 Stack Manipulation Macros
+
+=for apidoc AmU||SP
+Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
+C<SPAGAIN>.
+
+=for apidoc AmU||MARK
+Stack marker variable for the XSUB. See C<dMARK>.
+
+=for apidoc Am|void|PUSHMARK|SP
+Opening bracket for arguments on a callback. See C<PUTBACK> and
+L<perlcall>.
+
+=for apidoc Ams||dSP
+Declares a local copy of perl's stack pointer for the XSUB, available via
+the C<SP> macro. See C<SP>.
+
+=for apidoc ms||djSP
+
+Declare Just C<SP>. This is actually identical to C<dSP>, and declares
+a local copy of perl's stack pointer, available via the C<SP> macro.
+See C<SP>. (Available for backward source code compatibility with the
+old (Perl 5.005) thread model.)
+
+=for apidoc Ams||dMARK
+Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
+C<dORIGMARK>.
+
+=for apidoc Ams||dORIGMARK
+Saves the original stack mark for the XSUB. See C<ORIGMARK>.
+
+=for apidoc AmU||ORIGMARK
+The original stack mark for the XSUB. See C<dORIGMARK>.
+
+=for apidoc Ams||SPAGAIN
+Refetch the stack pointer. Used after a callback. See L<perlcall>.
+
+=cut */
+
+#undef SP /* Solaris 2.7 i386 has this in /usr/include/sys/reg.h */
+#define SP sp
+#define MARK mark
+#define TARG targ
+
+#define PUSHMARK(p) \
+ STMT_START { \
+ if (++PL_markstack_ptr == PL_markstack_max) \
+ markstack_grow(); \
+ *PL_markstack_ptr = (I32)((p) - PL_stack_base);\
+ } STMT_END
+
+#define TOPMARK (*PL_markstack_ptr)
+#define POPMARK (*PL_markstack_ptr--)
+
+#define dSP SV **sp = PL_stack_sp
+#define djSP dSP
+#define dMARK register SV **mark = PL_stack_base + POPMARK
+#define dORIGMARK const I32 origmark = (I32)(mark - PL_stack_base)
+#define ORIGMARK (PL_stack_base + origmark)
+
+#define SPAGAIN sp = PL_stack_sp
+#define MSPAGAIN STMT_START { sp = PL_stack_sp; mark = ORIGMARK; } STMT_END
+
+#define GETTARGETSTACKED targ = (PL_op->op_flags & OPf_STACKED ? POPs : PAD_SV(PL_op->op_targ))
+#define dTARGETSTACKED SV * GETTARGETSTACKED
+
+#define GETTARGET targ = PAD_SV(PL_op->op_targ)
+#define dTARGET SV * GETTARGET
+
+#define GETATARGET targ = (PL_op->op_flags & OPf_STACKED ? sp[-1] : PAD_SV(PL_op->op_targ))
+#define dATARGET SV * GETATARGET
+
+#define dTARG SV *targ
+
+#define NORMAL PL_op->op_next
+#define DIE Perl_die
+
+/*
+=for apidoc Ams||PUTBACK
+Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
+See C<PUSHMARK> and L<perlcall> for other uses.
+
+=for apidoc Amn|SV*|POPs
+Pops an SV off the stack.
+
+=for apidoc Amn|char*|POPp
+Pops a string off the stack. Deprecated. New code should use POPpx.
+
+=for apidoc Amn|char*|POPpx
+Pops a string off the stack.
+
+=for apidoc Amn|char*|POPpbytex
+Pops a string off the stack which must consist of bytes i.e. characters < 256.
+
+=for apidoc Amn|NV|POPn
+Pops a double off the stack.
+
+=for apidoc Amn|IV|POPi
+Pops an integer off the stack.
+
+=for apidoc Amn|long|POPl
+Pops a long off the stack.
+
+=cut
+*/
+
+#define PUTBACK PL_stack_sp = sp
+#define RETURN return (PUTBACK, NORMAL)
+#define RETURNOP(o) return (PUTBACK, o)
+#define RETURNX(x) return (x, PUTBACK, NORMAL)
+
+#define POPs (*sp--)
+#define POPp (SvPVx(POPs, PL_na)) /* deprecated */
+#define POPpx (SvPVx_nolen(POPs))
+#define POPpconstx (SvPVx_nolen_const(POPs))
+#define POPpbytex (SvPVbytex_nolen(POPs))
+#define POPn (SvNVx(POPs))
+#define POPi ((IV)SvIVx(POPs))
+#define POPu ((UV)SvUVx(POPs))
+#define POPl ((long)SvIVx(POPs))
+#define POPul ((unsigned long)SvIVx(POPs))
+#ifdef HAS_QUAD
+#define POPq ((Quad_t)SvIVx(POPs))
+#define POPuq ((Uquad_t)SvUVx(POPs))
+#endif
+
+#define TOPs (*sp)
+#define TOPm1s (*(sp-1))
+#define TOPp1s (*(sp+1))
+#define TOPp (SvPV(TOPs, PL_na)) /* deprecated */
+#define TOPpx (SvPV_nolen(TOPs))
+#define TOPn (SvNV(TOPs))
+#define TOPi ((IV)SvIV(TOPs))
+#define TOPu ((UV)SvUV(TOPs))
+#define TOPl ((long)SvIV(TOPs))
+#define TOPul ((unsigned long)SvUV(TOPs))
+#ifdef HAS_QUAD
+#define TOPq ((Quad_t)SvIV(TOPs))
+#define TOPuq ((Uquad_t)SvUV(TOPs))
+#endif
+
+/* Go to some pains in the rare event that we must extend the stack. */
+
+/*
+=for apidoc Am|void|EXTEND|SP|int nitems
+Used to extend the argument stack for an XSUB's return values. Once
+used, guarantees that there is room for at least C<nitems> to be pushed
+onto the stack.
+
+=for apidoc Am|void|PUSHs|SV* sv
+Push an SV onto the stack. The stack must have room for this element.
+Does not handle 'set' magic. Does not use C<TARG>. See also C<PUSHmortal>,
+C<XPUSHs> and C<XPUSHmortal>.
+
+=for apidoc Am|void|PUSHp|char* str|STRLEN len
+Push a string onto the stack. The stack must have room for this element.
+The C<len> indicates the length of the string. Handles 'set' magic. Uses
+C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to declare it. Do not
+call multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mPUSHp> instead. See also C<XPUSHp> and C<mXPUSHp>.
+
+=for apidoc Am|void|PUSHn|NV nv
+Push a double onto the stack. The stack must have room for this element.
+Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it. Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mPUSHn> instead. See also C<XPUSHn> and
+C<mXPUSHn>.
+
+=for apidoc Am|void|PUSHi|IV iv
+Push an integer onto the stack. The stack must have room for this element.
+Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it. Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mPUSHi> instead. See also C<XPUSHi> and
+C<mXPUSHi>.
+
+=for apidoc Am|void|PUSHu|UV uv
+Push an unsigned integer onto the stack. The stack must have room for this
+element. Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG>
+should be called to declare it. Do not call multiple C<TARG>-oriented
+macros to return lists from XSUB's - see C<mPUSHu> instead. See also
+C<XPUSHu> and C<mXPUSHu>.
+
+=for apidoc Am|void|XPUSHs|SV* sv
+Push an SV onto the stack, extending the stack if necessary. Does not
+handle 'set' magic. Does not use C<TARG>. See also C<XPUSHmortal>,
+C<PUSHs> and C<PUSHmortal>.
+
+=for apidoc Am|void|XPUSHp|char* str|STRLEN len
+Push a string onto the stack, extending the stack if necessary. The C<len>
+indicates the length of the string. Handles 'set' magic. Uses C<TARG>, so
+C<dTARGET> or C<dXSTARG> should be called to declare it. Do not call
+multiple C<TARG>-oriented macros to return lists from XSUB's - see
+C<mXPUSHp> instead. See also C<PUSHp> and C<mPUSHp>.
+
+=for apidoc Am|void|XPUSHn|NV nv
+Push a double onto the stack, extending the stack if necessary. Handles
+'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it. Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHn> instead. See also C<PUSHn> and C<mPUSHn>.
+
+=for apidoc Am|void|XPUSHi|IV iv
+Push an integer onto the stack, extending the stack if necessary. Handles
+'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
+declare it. Do not call multiple C<TARG>-oriented macros to return lists
+from XSUB's - see C<mXPUSHi> instead. See also C<PUSHi> and C<mPUSHi>.
+
+=for apidoc Am|void|XPUSHu|UV uv
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
+called to declare it. Do not call multiple C<TARG>-oriented macros to
+return lists from XSUB's - see C<mXPUSHu> instead. See also C<PUSHu> and
+C<mPUSHu>.
+
+=for apidoc Am|void|mPUSHs|SV* sv
+Push an SV onto the stack and mortalizes the SV. The stack must have room
+for this element. Does not use C<TARG>. See also C<PUSHs> and C<mXPUSHs>.
+
+=for apidoc Am|void|PUSHmortal
+Push a new mortal SV onto the stack. The stack must have room for this
+element. Does not use C<TARG>. See also C<PUSHs>, C<XPUSHmortal> and C<XPUSHs>.
+
+=for apidoc Am|void|mPUSHp|char* str|STRLEN len
+Push a string onto the stack. The stack must have room for this element.
+The C<len> indicates the length of the string. Does not use C<TARG>.
+See also C<PUSHp>, C<mXPUSHp> and C<XPUSHp>.
+
+=for apidoc Am|void|mPUSHn|NV nv
+Push a double onto the stack. The stack must have room for this element.
+Does not use C<TARG>. See also C<PUSHn>, C<mXPUSHn> and C<XPUSHn>.
+
+=for apidoc Am|void|mPUSHi|IV iv
+Push an integer onto the stack. The stack must have room for this element.
+Does not use C<TARG>. See also C<PUSHi>, C<mXPUSHi> and C<XPUSHi>.
+
+=for apidoc Am|void|mPUSHu|UV uv
+Push an unsigned integer onto the stack. The stack must have room for this
+element. Does not use C<TARG>. See also C<PUSHu>, C<mXPUSHu> and C<XPUSHu>.
+
+=for apidoc Am|void|mXPUSHs|SV* sv
+Push an SV onto the stack, extending the stack if necessary and mortalizes
+the SV. Does not use C<TARG>. See also C<XPUSHs> and C<mPUSHs>.
+
+=for apidoc Am|void|XPUSHmortal
+Push a new mortal SV onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHs>, C<PUSHmortal> and C<PUSHs>.
+
+=for apidoc Am|void|mXPUSHp|char* str|STRLEN len
+Push a string onto the stack, extending the stack if necessary. The C<len>
+indicates the length of the string. Does not use C<TARG>. See also C<XPUSHp>,
+C<mPUSHp> and C<PUSHp>.
+
+=for apidoc Am|void|mXPUSHn|NV nv
+Push a double onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHn>, C<mPUSHn> and C<PUSHn>.
+
+=for apidoc Am|void|mXPUSHi|IV iv
+Push an integer onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHi>, C<mPUSHi> and C<PUSHi>.
+
+=for apidoc Am|void|mXPUSHu|UV uv
+Push an unsigned integer onto the stack, extending the stack if necessary.
+Does not use C<TARG>. See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
+
+=cut
+*/
+
+#define EXTEND(p,n) STMT_START { if (PL_stack_max - p < (int)(n)) { \
+ sp = stack_grow(sp,p, (int) (n)); \
+ } } STMT_END
+
+/* Same thing, but update mark register too. */
+#define MEXTEND(p,n) STMT_START {if (PL_stack_max - p < (int)(n)) { \
+ const int markoff = mark - PL_stack_base; \
+ sp = stack_grow(sp,p,(int) (n)); \
+ mark = PL_stack_base + markoff; \
+ } } STMT_END
+
+#define PUSHs(s) (*++sp = (s))
+#define PUSHTARG STMT_START { SvSETMAGIC(TARG); PUSHs(TARG); } STMT_END
+#define PUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); PUSHTARG; } STMT_END
+#define PUSHn(n) STMT_START { sv_setnv(TARG, (NV)(n)); PUSHTARG; } STMT_END
+#define PUSHi(i) STMT_START { sv_setiv(TARG, (IV)(i)); PUSHTARG; } STMT_END
+#define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
+
+#define XPUSHs(s) STMT_START { EXTEND(sp,1); (*++sp = (s)); } STMT_END
+#define XPUSHTARG STMT_START { SvSETMAGIC(TARG); XPUSHs(TARG); } STMT_END
+#define XPUSHp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); XPUSHTARG; } STMT_END
+#define XPUSHn(n) STMT_START { sv_setnv(TARG, (NV)(n)); XPUSHTARG; } STMT_END
+#define XPUSHi(i) STMT_START { sv_setiv(TARG, (IV)(i)); XPUSHTARG; } STMT_END
+#define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#define XPUSHundef STMT_START { SvOK_off(TARG); XPUSHs(TARG); } STMT_END
+
+#define mPUSHs(s) PUSHs(sv_2mortal(s))
+#define PUSHmortal PUSHs(sv_newmortal())
+#define mPUSHp(p,l) PUSHs(newSVpvn_flags((p), (l), SVs_TEMP))
+#define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n))
+#define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i))
+#define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u))
+
+#define mXPUSHs(s) XPUSHs(sv_2mortal(s))
+#define XPUSHmortal XPUSHs(sv_newmortal())
+#define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); mPUSHp((p), (l)); } STMT_END
+#define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
+#define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
+#define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
+
+#define SETs(s) (*sp = s)
+#define SETTARG STMT_START { SvSETMAGIC(TARG); SETs(TARG); } STMT_END
+#define SETp(p,l) STMT_START { sv_setpvn(TARG, (p), (l)); SETTARG; } STMT_END
+#define SETn(n) STMT_START { sv_setnv(TARG, (NV)(n)); SETTARG; } STMT_END
+#define SETi(i) STMT_START { sv_setiv(TARG, (IV)(i)); SETTARG; } STMT_END
+#define SETu(u) STMT_START { sv_setuv(TARG, (UV)(u)); SETTARG; } STMT_END
+
+#define dTOPss SV *sv = TOPs
+#define dPOPss SV *sv = POPs
+#define dTOPnv NV value = TOPn
+#define dPOPnv NV value = POPn
+#define dTOPiv IV value = TOPi
+#define dPOPiv IV value = POPi
+#define dTOPuv UV value = TOPu
+#define dPOPuv UV value = POPu
+#ifdef HAS_QUAD
+#define dTOPqv Quad_t value = TOPu
+#define dPOPqv Quad_t value = POPu
+#define dTOPuqv Uquad_t value = TOPuq
+#define dPOPuqv Uquad_t value = POPuq
+#endif
+
+#define dPOPXssrl(X) SV *right = POPs; SV *left = CAT2(X,s)
+#define dPOPXnnrl(X) NV right = POPn; NV left = CAT2(X,n)
+#define dPOPXiirl(X) IV right = POPi; IV left = CAT2(X,i)
+
+#define USE_LEFT(sv) \
+ (SvOK(sv) || SvGMAGICAL(sv) || !(PL_op->op_flags & OPf_STACKED))
+#define dPOPXnnrl_ul(X) \
+ NV right = POPn; \
+ SV *leftsv = CAT2(X,s); \
+ NV left = USE_LEFT(leftsv) ? SvNV(leftsv) : 0.0
+#define dPOPXiirl_ul(X) \
+ IV right = POPi; \
+ SV *leftsv = CAT2(X,s); \
+ IV left = USE_LEFT(leftsv) ? SvIV(leftsv) : 0
+
+#define dPOPPOPssrl dPOPXssrl(POP)
+#define dPOPPOPnnrl dPOPXnnrl(POP)
+#define dPOPPOPnnrl_ul dPOPXnnrl_ul(POP)
+#define dPOPPOPiirl dPOPXiirl(POP)
+#define dPOPPOPiirl_ul dPOPXiirl_ul(POP)
+
+#define dPOPTOPssrl dPOPXssrl(TOP)
+#define dPOPTOPnnrl dPOPXnnrl(TOP)
+#define dPOPTOPnnrl_ul dPOPXnnrl_ul(TOP)
+#define dPOPTOPiirl dPOPXiirl(TOP)
+#define dPOPTOPiirl_ul dPOPXiirl_ul(TOP)
+
+#define RETPUSHYES RETURNX(PUSHs(&PL_sv_yes))
+#define RETPUSHNO RETURNX(PUSHs(&PL_sv_no))
+#define RETPUSHUNDEF RETURNX(PUSHs(&PL_sv_undef))
+
+#define RETSETYES RETURNX(SETs(&PL_sv_yes))
+#define RETSETNO RETURNX(SETs(&PL_sv_no))
+#define RETSETUNDEF RETURNX(SETs(&PL_sv_undef))
+
+#define ARGTARG PL_op->op_targ
+
+ /* See OPpTARGET_MY: */
+#define MAXARG (PL_op->op_private & 15)
+
+#define SWITCHSTACK(f,t) \
+ STMT_START { \
+ AvFILLp(f) = sp - PL_stack_base; \
+ PL_stack_base = AvARRAY(t); \
+ PL_stack_max = PL_stack_base + AvMAX(t); \
+ sp = PL_stack_sp = PL_stack_base + AvFILLp(t); \
+ PL_curstack = t; \
+ } STMT_END
+
+#define EXTEND_MORTAL(n) \
+ STMT_START { \
+ if (PL_tmps_ix + (n) >= PL_tmps_max) \
+ tmps_grow(n); \
+ } STMT_END
+
+#define AMGf_noright 1
+#define AMGf_noleft 2
+#define AMGf_assign 4
+#define AMGf_unary 8
+
+#define tryAMAGICbinW_var(meth_enum,assign,set) STMT_START { \
+ SV* const left = *(sp-1); \
+ SV* const right = *(sp); \
+ if ((SvAMAGIC(left)||SvAMAGIC(right))) {\
+ SV * const tmpsv = amagic_call(left, \
+ right, \
+ (meth_enum), \
+ (assign)? AMGf_assign: 0); \
+ if (tmpsv) { \
+ SPAGAIN; \
+ (void)POPs; set(tmpsv); RETURN; } \
+ } \
+ } STMT_END
+
+#define tryAMAGICbinW(meth,assign,set) \
+ tryAMAGICbinW_var(CAT2(meth,_amg),assign,set)
+
+#define tryAMAGICbin_var(meth_enum,assign) \
+ tryAMAGICbinW_var(meth_enum,assign,SETsv)
+#define tryAMAGICbin(meth,assign) \
+ tryAMAGICbin_var(CAT2(meth,_amg),assign)
+
+#define tryAMAGICbinSET(meth,assign) tryAMAGICbinW(meth,assign,SETs)
+
+#define tryAMAGICbinSET_var(meth_enum,assign) \
+ tryAMAGICbinW_var(meth_enum,assign,SETs)
+
+#define AMG_CALLun_var(sv,meth_enum) amagic_call(sv,&PL_sv_undef, \
+ meth_enum,AMGf_noright | AMGf_unary)
+#define AMG_CALLun(sv,meth) AMG_CALLun_var(sv,CAT2(meth,_amg))
+
+#define AMG_CALLbinL(left,right,meth) \
+ amagic_call(left,right,CAT2(meth,_amg),AMGf_noright)
+
+#define tryAMAGICunW_var(meth_enum,set,shift,ret) STMT_START { \
+ SV* tmpsv; \
+ SV* arg= sp[shift]; \
+ if(0) goto am_again; /* shut up unused warning */ \
+ am_again: \
+ if ((SvAMAGIC(arg))&&\
+ (tmpsv=AMG_CALLun_var(arg,(meth_enum)))) {\
+ SPAGAIN; if (shift) sp += shift; \
+ set(tmpsv); ret; } \
+ } STMT_END
+#define tryAMAGICunW(meth,set,shift,ret) \
+ tryAMAGICunW_var(CAT2(meth,_amg),set,shift,ret)
+
+#define FORCE_SETs(sv) STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END
+
+#define tryAMAGICun_var(meth_enum) tryAMAGICunW_var(meth_enum,SETsvUN,0,RETURN)
+#define tryAMAGICun(meth) tryAMAGICun_var(CAT2(meth,_amg))
+#define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs,0,RETURN)
+#define tryAMAGICunTARGET(meth, shift) \
+ STMT_START { dSP; sp--; /* get TARGET from below PL_stack_sp */ \
+ { dTARGETSTACKED; \
+ { dSP; tryAMAGICunW(meth,FORCE_SETs,shift,RETURN);}}} STMT_END
+
+#define setAGAIN(ref) \
+ STMT_START { \
+ sv = ref; \
+ if (!SvROK(ref)) \
+ Perl_croak(aTHX_ "Overloaded dereference did not return a reference"); \
+ if (ref != arg && SvRV(ref) != SvRV(arg)) { \
+ arg = ref; \
+ goto am_again; \
+ } \
+ } STMT_END
+
+#define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,(void)0)
+#define tryAMAGICunDEREF_var(meth_enum) \
+ tryAMAGICunW_var(meth_enum,setAGAIN,0,(void)0)
+
+#define tryAMAGICftest(chr) \
+ STMT_START { \
+ assert(chr != '?'); \
+ if ((PL_op->op_flags & OPf_KIDS) \
+ && SvAMAGIC(TOPs)) { \
+ const char tmpchr = (chr); \
+ SV * const tmpsv = amagic_call(TOPs, \
+ newSVpvn_flags(&tmpchr, 1, SVs_TEMP), \
+ ftest_amg, AMGf_unary); \
+ \
+ if (tmpsv) { \
+ const OP *next = PL_op->op_next; \
+ \
+ SPAGAIN; \
+ \
+ if (next->op_type >= OP_FTRREAD && \
+ next->op_type <= OP_FTBINARY && \
+ next->op_private & OPpFT_STACKED \
+ ) { \
+ if (SvTRUE(tmpsv)) \
+ /* leave the object alone */ \
+ RETURN; \
+ } \
+ \
+ SETs(tmpsv); \
+ RETURN; \
+ } \
+ } \
+ } STMT_END
+
+
+#define opASSIGN (PL_op->op_flags & OPf_STACKED)
+#define SETsv(sv) STMT_START { \
+ if (opASSIGN || (SvFLAGS(TARG) & SVs_PADMY)) \
+ { sv_setsv(TARG, (sv)); SETTARG; } \
+ else SETs(sv); } STMT_END
+
+#define SETsvUN(sv) STMT_START { \
+ if (SvFLAGS(TARG) & SVs_PADMY) \
+ { sv_setsv(TARG, (sv)); SETTARG; } \
+ else SETs(sv); } STMT_END
+
+/* newSVsv does not behave as advertised, so we copy missing
+ * information by hand */
+
+/* SV* ref causes confusion with the member variable
+ changed SV* ref to SV* tmpRef */
+#define RvDEEPCP(rv) STMT_START { SV* tmpRef=SvRV(rv); SV* rv_copy; \
+ if (SvREFCNT(tmpRef)>1 && (rv_copy = AMG_CALLun(rv,copy))) { \
+ SvRV_set(rv, rv_copy); \
+ SvREFCNT_dec(tmpRef); \
+ } } STMT_END
+
+/*
+=for apidoc mU||LVRET
+True if this op will be the return value of an lvalue subroutine
+
+=cut */
+#define LVRET ((PL_op->op_private & OPpMAYBE_LVSUB) && is_lvalue_sub())
+
+#define SvCANEXISTDELETE(sv) \
+ (!SvRMAGICAL(sv) \
+ || ((mg = mg_find((const SV *) sv, PERL_MAGIC_tied)) \
+ && (stash = SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(sv), mg)))) \
+ && gv_fetchmethod_autoload(stash, "EXISTS", TRUE) \
+ && gv_fetchmethod_autoload(stash, "DELETE", TRUE) \
+ ) \
+ )
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/pp_proto.h b/Master/tlpkg/tlperl/lib/CORE/pp_proto.h
new file mode 100644
index 00000000000..d7da4538710
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/pp_proto.h
@@ -0,0 +1,414 @@
+/* -*- buffer-read-only: t -*-
+ !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by opcode.pl from its data. Any changes made here
+ will be lost!
+*/
+
+PERL_CKDEF(Perl_ck_anoncode)
+PERL_CKDEF(Perl_ck_bitop)
+PERL_CKDEF(Perl_ck_chdir)
+PERL_CKDEF(Perl_ck_concat)
+PERL_CKDEF(Perl_ck_defined)
+PERL_CKDEF(Perl_ck_delete)
+PERL_CKDEF(Perl_ck_die)
+PERL_CKDEF(Perl_ck_each)
+PERL_CKDEF(Perl_ck_eof)
+PERL_CKDEF(Perl_ck_eval)
+PERL_CKDEF(Perl_ck_exec)
+PERL_CKDEF(Perl_ck_exists)
+PERL_CKDEF(Perl_ck_exit)
+PERL_CKDEF(Perl_ck_ftst)
+PERL_CKDEF(Perl_ck_fun)
+PERL_CKDEF(Perl_ck_glob)
+PERL_CKDEF(Perl_ck_grep)
+PERL_CKDEF(Perl_ck_index)
+PERL_CKDEF(Perl_ck_join)
+PERL_CKDEF(Perl_ck_lfun)
+PERL_CKDEF(Perl_ck_listiob)
+PERL_CKDEF(Perl_ck_match)
+PERL_CKDEF(Perl_ck_method)
+PERL_CKDEF(Perl_ck_null)
+PERL_CKDEF(Perl_ck_open)
+PERL_CKDEF(Perl_ck_readline)
+PERL_CKDEF(Perl_ck_repeat)
+PERL_CKDEF(Perl_ck_require)
+PERL_CKDEF(Perl_ck_return)
+PERL_CKDEF(Perl_ck_rfun)
+PERL_CKDEF(Perl_ck_rvconst)
+PERL_CKDEF(Perl_ck_sassign)
+PERL_CKDEF(Perl_ck_select)
+PERL_CKDEF(Perl_ck_shift)
+PERL_CKDEF(Perl_ck_smartmatch)
+PERL_CKDEF(Perl_ck_sort)
+PERL_CKDEF(Perl_ck_spair)
+PERL_CKDEF(Perl_ck_split)
+PERL_CKDEF(Perl_ck_subr)
+PERL_CKDEF(Perl_ck_substr)
+PERL_CKDEF(Perl_ck_svconst)
+PERL_CKDEF(Perl_ck_trunc)
+PERL_CKDEF(Perl_ck_unpack)
+
+
+PERL_PPDEF(Perl_pp_null)
+PERL_PPDEF(Perl_pp_stub)
+PERL_PPDEF(Perl_pp_scalar)
+PERL_PPDEF(Perl_pp_pushmark)
+PERL_PPDEF(Perl_pp_wantarray)
+PERL_PPDEF(Perl_pp_const)
+PERL_PPDEF(Perl_pp_gvsv)
+PERL_PPDEF(Perl_pp_gv)
+PERL_PPDEF(Perl_pp_gelem)
+PERL_PPDEF(Perl_pp_padsv)
+PERL_PPDEF(Perl_pp_padav)
+PERL_PPDEF(Perl_pp_padhv)
+PERL_PPDEF(Perl_pp_padany)
+PERL_PPDEF(Perl_pp_pushre)
+PERL_PPDEF(Perl_pp_rv2gv)
+PERL_PPDEF(Perl_pp_rv2sv)
+PERL_PPDEF(Perl_pp_av2arylen)
+PERL_PPDEF(Perl_pp_rv2cv)
+PERL_PPDEF(Perl_pp_anoncode)
+PERL_PPDEF(Perl_pp_prototype)
+PERL_PPDEF(Perl_pp_refgen)
+PERL_PPDEF(Perl_pp_srefgen)
+PERL_PPDEF(Perl_pp_ref)
+PERL_PPDEF(Perl_pp_bless)
+PERL_PPDEF(Perl_pp_backtick)
+PERL_PPDEF(Perl_pp_glob)
+PERL_PPDEF(Perl_pp_readline)
+PERL_PPDEF(Perl_pp_rcatline)
+PERL_PPDEF(Perl_pp_regcmaybe)
+PERL_PPDEF(Perl_pp_regcreset)
+PERL_PPDEF(Perl_pp_regcomp)
+PERL_PPDEF(Perl_pp_match)
+PERL_PPDEF(Perl_pp_qr)
+PERL_PPDEF(Perl_pp_subst)
+PERL_PPDEF(Perl_pp_substcont)
+PERL_PPDEF(Perl_pp_trans)
+PERL_PPDEF(Perl_pp_sassign)
+PERL_PPDEF(Perl_pp_aassign)
+PERL_PPDEF(Perl_pp_chop)
+PERL_PPDEF(Perl_pp_schop)
+PERL_PPDEF(Perl_pp_chomp)
+PERL_PPDEF(Perl_pp_schomp)
+PERL_PPDEF(Perl_pp_defined)
+PERL_PPDEF(Perl_pp_undef)
+PERL_PPDEF(Perl_pp_study)
+PERL_PPDEF(Perl_pp_pos)
+PERL_PPDEF(Perl_pp_preinc)
+PERL_PPDEF(Perl_pp_predec)
+PERL_PPDEF(Perl_pp_postinc)
+PERL_PPDEF(Perl_pp_postdec)
+PERL_PPDEF(Perl_pp_pow)
+PERL_PPDEF(Perl_pp_multiply)
+PERL_PPDEF(Perl_pp_i_multiply)
+PERL_PPDEF(Perl_pp_divide)
+PERL_PPDEF(Perl_pp_i_divide)
+PERL_PPDEF(Perl_pp_modulo)
+PERL_PPDEF(Perl_pp_i_modulo)
+PERL_PPDEF(Perl_pp_repeat)
+PERL_PPDEF(Perl_pp_add)
+PERL_PPDEF(Perl_pp_i_add)
+PERL_PPDEF(Perl_pp_subtract)
+PERL_PPDEF(Perl_pp_i_subtract)
+PERL_PPDEF(Perl_pp_concat)
+PERL_PPDEF(Perl_pp_stringify)
+PERL_PPDEF(Perl_pp_left_shift)
+PERL_PPDEF(Perl_pp_right_shift)
+PERL_PPDEF(Perl_pp_lt)
+PERL_PPDEF(Perl_pp_i_lt)
+PERL_PPDEF(Perl_pp_gt)
+PERL_PPDEF(Perl_pp_i_gt)
+PERL_PPDEF(Perl_pp_le)
+PERL_PPDEF(Perl_pp_i_le)
+PERL_PPDEF(Perl_pp_ge)
+PERL_PPDEF(Perl_pp_i_ge)
+PERL_PPDEF(Perl_pp_eq)
+PERL_PPDEF(Perl_pp_i_eq)
+PERL_PPDEF(Perl_pp_ne)
+PERL_PPDEF(Perl_pp_i_ne)
+PERL_PPDEF(Perl_pp_ncmp)
+PERL_PPDEF(Perl_pp_i_ncmp)
+PERL_PPDEF(Perl_pp_slt)
+PERL_PPDEF(Perl_pp_sgt)
+PERL_PPDEF(Perl_pp_sle)
+PERL_PPDEF(Perl_pp_sge)
+PERL_PPDEF(Perl_pp_seq)
+PERL_PPDEF(Perl_pp_sne)
+PERL_PPDEF(Perl_pp_scmp)
+PERL_PPDEF(Perl_pp_bit_and)
+PERL_PPDEF(Perl_pp_bit_xor)
+PERL_PPDEF(Perl_pp_bit_or)
+PERL_PPDEF(Perl_pp_negate)
+PERL_PPDEF(Perl_pp_i_negate)
+PERL_PPDEF(Perl_pp_not)
+PERL_PPDEF(Perl_pp_complement)
+PERL_PPDEF(Perl_pp_smartmatch)
+PERL_PPDEF(Perl_pp_atan2)
+PERL_PPDEF(Perl_pp_sin)
+PERL_PPDEF(Perl_pp_cos)
+PERL_PPDEF(Perl_pp_rand)
+PERL_PPDEF(Perl_pp_srand)
+PERL_PPDEF(Perl_pp_exp)
+PERL_PPDEF(Perl_pp_log)
+PERL_PPDEF(Perl_pp_sqrt)
+PERL_PPDEF(Perl_pp_int)
+PERL_PPDEF(Perl_pp_hex)
+PERL_PPDEF(Perl_pp_oct)
+PERL_PPDEF(Perl_pp_abs)
+PERL_PPDEF(Perl_pp_length)
+PERL_PPDEF(Perl_pp_substr)
+PERL_PPDEF(Perl_pp_vec)
+PERL_PPDEF(Perl_pp_index)
+PERL_PPDEF(Perl_pp_rindex)
+PERL_PPDEF(Perl_pp_sprintf)
+PERL_PPDEF(Perl_pp_formline)
+PERL_PPDEF(Perl_pp_ord)
+PERL_PPDEF(Perl_pp_chr)
+PERL_PPDEF(Perl_pp_crypt)
+PERL_PPDEF(Perl_pp_ucfirst)
+PERL_PPDEF(Perl_pp_lcfirst)
+PERL_PPDEF(Perl_pp_uc)
+PERL_PPDEF(Perl_pp_lc)
+PERL_PPDEF(Perl_pp_quotemeta)
+PERL_PPDEF(Perl_pp_rv2av)
+PERL_PPDEF(Perl_pp_aelemfast)
+PERL_PPDEF(Perl_pp_aelem)
+PERL_PPDEF(Perl_pp_aslice)
+PERL_PPDEF(Perl_pp_aeach)
+PERL_PPDEF(Perl_pp_akeys)
+PERL_PPDEF(Perl_pp_avalues)
+PERL_PPDEF(Perl_pp_each)
+PERL_PPDEF(Perl_pp_values)
+PERL_PPDEF(Perl_pp_keys)
+PERL_PPDEF(Perl_pp_delete)
+PERL_PPDEF(Perl_pp_exists)
+PERL_PPDEF(Perl_pp_rv2hv)
+PERL_PPDEF(Perl_pp_helem)
+PERL_PPDEF(Perl_pp_hslice)
+PERL_PPDEF(Perl_pp_boolkeys)
+PERL_PPDEF(Perl_pp_unpack)
+PERL_PPDEF(Perl_pp_pack)
+PERL_PPDEF(Perl_pp_split)
+PERL_PPDEF(Perl_pp_join)
+PERL_PPDEF(Perl_pp_list)
+PERL_PPDEF(Perl_pp_lslice)
+PERL_PPDEF(Perl_pp_anonlist)
+PERL_PPDEF(Perl_pp_anonhash)
+PERL_PPDEF(Perl_pp_splice)
+PERL_PPDEF(Perl_pp_push)
+PERL_PPDEF(Perl_pp_pop)
+PERL_PPDEF(Perl_pp_shift)
+PERL_PPDEF(Perl_pp_unshift)
+PERL_PPDEF(Perl_pp_sort)
+PERL_PPDEF(Perl_pp_reverse)
+PERL_PPDEF(Perl_pp_grepstart)
+PERL_PPDEF(Perl_pp_grepwhile)
+PERL_PPDEF(Perl_pp_mapstart)
+PERL_PPDEF(Perl_pp_mapwhile)
+PERL_PPDEF(Perl_pp_range)
+PERL_PPDEF(Perl_pp_flip)
+PERL_PPDEF(Perl_pp_flop)
+PERL_PPDEF(Perl_pp_and)
+PERL_PPDEF(Perl_pp_or)
+PERL_PPDEF(Perl_pp_xor)
+PERL_PPDEF(Perl_pp_dor)
+PERL_PPDEF(Perl_pp_cond_expr)
+PERL_PPDEF(Perl_pp_andassign)
+PERL_PPDEF(Perl_pp_orassign)
+PERL_PPDEF(Perl_pp_dorassign)
+PERL_PPDEF(Perl_pp_method)
+PERL_PPDEF(Perl_pp_entersub)
+PERL_PPDEF(Perl_pp_leavesub)
+PERL_PPDEF(Perl_pp_leavesublv)
+PERL_PPDEF(Perl_pp_caller)
+PERL_PPDEF(Perl_pp_warn)
+PERL_PPDEF(Perl_pp_die)
+PERL_PPDEF(Perl_pp_reset)
+PERL_PPDEF(Perl_pp_lineseq)
+PERL_PPDEF(Perl_pp_nextstate)
+PERL_PPDEF(Perl_pp_dbstate)
+PERL_PPDEF(Perl_pp_unstack)
+PERL_PPDEF(Perl_pp_enter)
+PERL_PPDEF(Perl_pp_leave)
+PERL_PPDEF(Perl_pp_scope)
+PERL_PPDEF(Perl_pp_enteriter)
+PERL_PPDEF(Perl_pp_iter)
+PERL_PPDEF(Perl_pp_enterloop)
+PERL_PPDEF(Perl_pp_leaveloop)
+PERL_PPDEF(Perl_pp_return)
+PERL_PPDEF(Perl_pp_last)
+PERL_PPDEF(Perl_pp_next)
+PERL_PPDEF(Perl_pp_redo)
+PERL_PPDEF(Perl_pp_dump)
+PERL_PPDEF(Perl_pp_goto)
+PERL_PPDEF(Perl_pp_exit)
+PERL_PPDEF(Perl_pp_method_named)
+PERL_PPDEF(Perl_pp_entergiven)
+PERL_PPDEF(Perl_pp_leavegiven)
+PERL_PPDEF(Perl_pp_enterwhen)
+PERL_PPDEF(Perl_pp_leavewhen)
+PERL_PPDEF(Perl_pp_break)
+PERL_PPDEF(Perl_pp_continue)
+PERL_PPDEF(Perl_pp_open)
+PERL_PPDEF(Perl_pp_close)
+PERL_PPDEF(Perl_pp_pipe_op)
+PERL_PPDEF(Perl_pp_fileno)
+PERL_PPDEF(Perl_pp_umask)
+PERL_PPDEF(Perl_pp_binmode)
+PERL_PPDEF(Perl_pp_tie)
+PERL_PPDEF(Perl_pp_untie)
+PERL_PPDEF(Perl_pp_tied)
+PERL_PPDEF(Perl_pp_dbmopen)
+PERL_PPDEF(Perl_pp_dbmclose)
+PERL_PPDEF(Perl_pp_sselect)
+PERL_PPDEF(Perl_pp_select)
+PERL_PPDEF(Perl_pp_getc)
+PERL_PPDEF(Perl_pp_read)
+PERL_PPDEF(Perl_pp_enterwrite)
+PERL_PPDEF(Perl_pp_leavewrite)
+PERL_PPDEF(Perl_pp_prtf)
+PERL_PPDEF(Perl_pp_print)
+PERL_PPDEF(Perl_pp_say)
+PERL_PPDEF(Perl_pp_sysopen)
+PERL_PPDEF(Perl_pp_sysseek)
+PERL_PPDEF(Perl_pp_sysread)
+PERL_PPDEF(Perl_pp_syswrite)
+PERL_PPDEF(Perl_pp_eof)
+PERL_PPDEF(Perl_pp_tell)
+PERL_PPDEF(Perl_pp_seek)
+PERL_PPDEF(Perl_pp_truncate)
+PERL_PPDEF(Perl_pp_fcntl)
+PERL_PPDEF(Perl_pp_ioctl)
+PERL_PPDEF(Perl_pp_flock)
+PERL_PPDEF(Perl_pp_send)
+PERL_PPDEF(Perl_pp_recv)
+PERL_PPDEF(Perl_pp_socket)
+PERL_PPDEF(Perl_pp_sockpair)
+PERL_PPDEF(Perl_pp_bind)
+PERL_PPDEF(Perl_pp_connect)
+PERL_PPDEF(Perl_pp_listen)
+PERL_PPDEF(Perl_pp_accept)
+PERL_PPDEF(Perl_pp_shutdown)
+PERL_PPDEF(Perl_pp_gsockopt)
+PERL_PPDEF(Perl_pp_ssockopt)
+PERL_PPDEF(Perl_pp_getsockname)
+PERL_PPDEF(Perl_pp_getpeername)
+PERL_PPDEF(Perl_pp_lstat)
+PERL_PPDEF(Perl_pp_stat)
+PERL_PPDEF(Perl_pp_ftrread)
+PERL_PPDEF(Perl_pp_ftrwrite)
+PERL_PPDEF(Perl_pp_ftrexec)
+PERL_PPDEF(Perl_pp_fteread)
+PERL_PPDEF(Perl_pp_ftewrite)
+PERL_PPDEF(Perl_pp_fteexec)
+PERL_PPDEF(Perl_pp_ftis)
+PERL_PPDEF(Perl_pp_ftsize)
+PERL_PPDEF(Perl_pp_ftmtime)
+PERL_PPDEF(Perl_pp_ftatime)
+PERL_PPDEF(Perl_pp_ftctime)
+PERL_PPDEF(Perl_pp_ftrowned)
+PERL_PPDEF(Perl_pp_fteowned)
+PERL_PPDEF(Perl_pp_ftzero)
+PERL_PPDEF(Perl_pp_ftsock)
+PERL_PPDEF(Perl_pp_ftchr)
+PERL_PPDEF(Perl_pp_ftblk)
+PERL_PPDEF(Perl_pp_ftfile)
+PERL_PPDEF(Perl_pp_ftdir)
+PERL_PPDEF(Perl_pp_ftpipe)
+PERL_PPDEF(Perl_pp_ftsuid)
+PERL_PPDEF(Perl_pp_ftsgid)
+PERL_PPDEF(Perl_pp_ftsvtx)
+PERL_PPDEF(Perl_pp_ftlink)
+PERL_PPDEF(Perl_pp_fttty)
+PERL_PPDEF(Perl_pp_fttext)
+PERL_PPDEF(Perl_pp_ftbinary)
+PERL_PPDEF(Perl_pp_chdir)
+PERL_PPDEF(Perl_pp_chown)
+PERL_PPDEF(Perl_pp_chroot)
+PERL_PPDEF(Perl_pp_unlink)
+PERL_PPDEF(Perl_pp_chmod)
+PERL_PPDEF(Perl_pp_utime)
+PERL_PPDEF(Perl_pp_rename)
+PERL_PPDEF(Perl_pp_link)
+PERL_PPDEF(Perl_pp_symlink)
+PERL_PPDEF(Perl_pp_readlink)
+PERL_PPDEF(Perl_pp_mkdir)
+PERL_PPDEF(Perl_pp_rmdir)
+PERL_PPDEF(Perl_pp_open_dir)
+PERL_PPDEF(Perl_pp_readdir)
+PERL_PPDEF(Perl_pp_telldir)
+PERL_PPDEF(Perl_pp_seekdir)
+PERL_PPDEF(Perl_pp_rewinddir)
+PERL_PPDEF(Perl_pp_closedir)
+PERL_PPDEF(Perl_pp_fork)
+PERL_PPDEF(Perl_pp_wait)
+PERL_PPDEF(Perl_pp_waitpid)
+PERL_PPDEF(Perl_pp_system)
+PERL_PPDEF(Perl_pp_exec)
+PERL_PPDEF(Perl_pp_kill)
+PERL_PPDEF(Perl_pp_getppid)
+PERL_PPDEF(Perl_pp_getpgrp)
+PERL_PPDEF(Perl_pp_setpgrp)
+PERL_PPDEF(Perl_pp_getpriority)
+PERL_PPDEF(Perl_pp_setpriority)
+PERL_PPDEF(Perl_pp_time)
+PERL_PPDEF(Perl_pp_tms)
+PERL_PPDEF(Perl_pp_localtime)
+PERL_PPDEF(Perl_pp_gmtime)
+PERL_PPDEF(Perl_pp_alarm)
+PERL_PPDEF(Perl_pp_sleep)
+PERL_PPDEF(Perl_pp_shmget)
+PERL_PPDEF(Perl_pp_shmctl)
+PERL_PPDEF(Perl_pp_shmread)
+PERL_PPDEF(Perl_pp_shmwrite)
+PERL_PPDEF(Perl_pp_msgget)
+PERL_PPDEF(Perl_pp_msgctl)
+PERL_PPDEF(Perl_pp_msgsnd)
+PERL_PPDEF(Perl_pp_msgrcv)
+PERL_PPDEF(Perl_pp_semop)
+PERL_PPDEF(Perl_pp_semget)
+PERL_PPDEF(Perl_pp_semctl)
+PERL_PPDEF(Perl_pp_require)
+PERL_PPDEF(Perl_pp_dofile)
+PERL_PPDEF(Perl_pp_hintseval)
+PERL_PPDEF(Perl_pp_entereval)
+PERL_PPDEF(Perl_pp_leaveeval)
+PERL_PPDEF(Perl_pp_entertry)
+PERL_PPDEF(Perl_pp_leavetry)
+PERL_PPDEF(Perl_pp_ghbyname)
+PERL_PPDEF(Perl_pp_ghbyaddr)
+PERL_PPDEF(Perl_pp_ghostent)
+PERL_PPDEF(Perl_pp_gnbyname)
+PERL_PPDEF(Perl_pp_gnbyaddr)
+PERL_PPDEF(Perl_pp_gnetent)
+PERL_PPDEF(Perl_pp_gpbyname)
+PERL_PPDEF(Perl_pp_gpbynumber)
+PERL_PPDEF(Perl_pp_gprotoent)
+PERL_PPDEF(Perl_pp_gsbyname)
+PERL_PPDEF(Perl_pp_gsbyport)
+PERL_PPDEF(Perl_pp_gservent)
+PERL_PPDEF(Perl_pp_shostent)
+PERL_PPDEF(Perl_pp_snetent)
+PERL_PPDEF(Perl_pp_sprotoent)
+PERL_PPDEF(Perl_pp_sservent)
+PERL_PPDEF(Perl_pp_ehostent)
+PERL_PPDEF(Perl_pp_enetent)
+PERL_PPDEF(Perl_pp_eprotoent)
+PERL_PPDEF(Perl_pp_eservent)
+PERL_PPDEF(Perl_pp_gpwnam)
+PERL_PPDEF(Perl_pp_gpwuid)
+PERL_PPDEF(Perl_pp_gpwent)
+PERL_PPDEF(Perl_pp_spwent)
+PERL_PPDEF(Perl_pp_epwent)
+PERL_PPDEF(Perl_pp_ggrnam)
+PERL_PPDEF(Perl_pp_ggrgid)
+PERL_PPDEF(Perl_pp_ggrent)
+PERL_PPDEF(Perl_pp_sgrent)
+PERL_PPDEF(Perl_pp_egrent)
+PERL_PPDEF(Perl_pp_getlogin)
+PERL_PPDEF(Perl_pp_syscall)
+PERL_PPDEF(Perl_pp_lock)
+PERL_PPDEF(Perl_pp_once)
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/proto.h b/Master/tlpkg/tlperl/lib/CORE/proto.h
new file mode 100644
index 00000000000..3306ab0d052
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/proto.h
@@ -0,0 +1,6840 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * proto.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by embed.pl from data in embed.fnc, embed.pl,
+ * pp.sym, intrpvar.h, and perlvars.h.
+ * Any changes made here will be lost!
+ *
+ * Edit those files and run 'make regen_headers' to effect changes.
+ */
+
+START_EXTERN_C
+
+#if defined(PERL_IMPLICIT_SYS)
+PERL_CALLCONV PerlInterpreter* perl_alloc_using(struct IPerlMem *ipM, struct IPerlMem *ipMS, struct IPerlMem *ipMP, struct IPerlEnv *ipE, struct IPerlStdIO *ipStd, struct IPerlLIO *ipLIO, struct IPerlDir *ipD, struct IPerlSock *ipS, struct IPerlProc *ipP)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3)
+ __attribute__nonnull__(4)
+ __attribute__nonnull__(5)
+ __attribute__nonnull__(6)
+ __attribute__nonnull__(7)
+ __attribute__nonnull__(8)
+ __attribute__nonnull__(9);
+#define PERL_ARGS_ASSERT_PERL_ALLOC_USING \
+ assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP)
+
+#endif
+PERL_CALLCONV PerlInterpreter* perl_alloc(void);
+PERL_CALLCONV void perl_construct(PerlInterpreter *my_perl)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PERL_CONSTRUCT \
+ assert(my_perl)
+
+PERL_CALLCONV int perl_destruct(PerlInterpreter *my_perl)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PERL_DESTRUCT \
+ assert(my_perl)
+
+PERL_CALLCONV void perl_free(PerlInterpreter *my_perl)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PERL_FREE \
+ assert(my_perl)
+
+PERL_CALLCONV int perl_run(PerlInterpreter *my_perl)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PERL_RUN \
+ assert(my_perl)
+
+PERL_CALLCONV int perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char** argv, char** env)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PERL_PARSE \
+ assert(my_perl)
+
+PERL_CALLCONV bool Perl_doing_taint(int argc, char** argv, char** env)
+ __attribute__warn_unused_result__;
+
+#if defined(USE_ITHREADS)
+PERL_CALLCONV PerlInterpreter* perl_clone(PerlInterpreter *proto_perl, UV flags)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PERL_CLONE \
+ assert(proto_perl)
+
+# if defined(PERL_IMPLICIT_SYS)
+PERL_CALLCONV PerlInterpreter* perl_clone_using(PerlInterpreter *proto_perl, UV flags, struct IPerlMem* ipM, struct IPerlMem* ipMS, struct IPerlMem* ipMP, struct IPerlEnv* ipE, struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO, struct IPerlDir* ipD, struct IPerlSock* ipS, struct IPerlProc* ipP)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3)
+ __attribute__nonnull__(4)
+ __attribute__nonnull__(5)
+ __attribute__nonnull__(6)
+ __attribute__nonnull__(7)
+ __attribute__nonnull__(8)
+ __attribute__nonnull__(9)
+ __attribute__nonnull__(10)
+ __attribute__nonnull__(11);
+#define PERL_ARGS_ASSERT_PERL_CLONE_USING \
+ assert(proto_perl); assert(ipM); assert(ipMS); assert(ipMP); assert(ipE); assert(ipStd); assert(ipLIO); assert(ipD); assert(ipS); assert(ipP)
+
+# endif
+#endif
+
+PERL_CALLCONV Malloc_t Perl_malloc(MEM_SIZE nbytes)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t Perl_realloc(Malloc_t where, MEM_SIZE nbytes)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV Free_t Perl_mfree(Malloc_t where);
+#if defined(MYMALLOC)
+PERL_CALLCONV MEM_SIZE Perl_malloced_size(void *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_MALLOCED_SIZE \
+ assert(p)
+
+PERL_CALLCONV MEM_SIZE Perl_malloc_good_size(size_t nbytes)
+ __attribute__warn_unused_result__;
+
+#endif
+
+PERL_CALLCONV void* Perl_get_context(void)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_set_context(void *t)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_SET_CONTEXT \
+ assert(t)
+
+PERL_CALLCONV I32 Perl_regcurly(const char *s)
+ __attribute__warn_unused_result__
+ __attribute__pure__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_REGCURLY \
+ assert(s)
+
+
+END_EXTERN_C
+
+/* functions with flag 'n' should come before here */
+START_EXTERN_C
+# include "pp_proto.h"
+PERL_CALLCONV SV* Perl_amagic_call(pTHX_ SV* left, SV* right, int method, int dir)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AMAGIC_CALL \
+ assert(left); assert(right)
+
+PERL_CALLCONV int Perl_Gv_AMupdate(pTHX_ HV* stash, bool destructing)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_AMUPDATE \
+ assert(stash)
+
+PERL_CALLCONV CV* Perl_gv_handler(pTHX_ HV* stash, I32 id)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_append_elem(pTHX_ I32 optype, OP* first, OP* last);
+PERL_CALLCONV OP* Perl_append_list(pTHX_ I32 optype, LISTOP* first, LISTOP* last);
+PERL_CALLCONV I32 Perl_apply(pTHX_ I32 type, SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_APPLY \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV void Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv, const char *attrstr, STRLEN len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_APPLY_ATTRS_STRING \
+ assert(stashpv); assert(cv); assert(attrstr)
+
+PERL_CALLCONV void Perl_av_clear(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_CLEAR \
+ assert(av)
+
+PERL_CALLCONV SV* Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_DELETE \
+ assert(av)
+
+PERL_CALLCONV bool Perl_av_exists(pTHX_ AV *av, I32 key)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_EXISTS \
+ assert(av)
+
+PERL_CALLCONV void Perl_av_extend(pTHX_ AV *av, I32 key)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_EXTEND \
+ assert(av)
+
+PERL_CALLCONV SV** Perl_av_fetch(pTHX_ AV *av, I32 key, I32 lval)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_FETCH \
+ assert(av)
+
+PERL_CALLCONV void Perl_av_fill(pTHX_ AV *av, I32 fill)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_FILL \
+ assert(av)
+
+PERL_CALLCONV I32 Perl_av_len(pTHX_ AV *av)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_LEN \
+ assert(av)
+
+PERL_CALLCONV AV* Perl_av_make(pTHX_ I32 size, SV **strp)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AV_MAKE \
+ assert(strp)
+
+PERL_CALLCONV SV* Perl_av_pop(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_POP \
+ assert(av)
+
+PERL_CALLCONV void Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH \
+ assert(avp); assert(val)
+
+PERL_CALLCONV void Perl_av_push(pTHX_ AV *av, SV *val)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AV_PUSH \
+ assert(av); assert(val)
+
+PERL_CALLCONV void Perl_av_reify(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_REIFY \
+ assert(av)
+
+PERL_CALLCONV SV* Perl_av_shift(pTHX_ AV *av)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_SHIFT \
+ assert(av)
+
+PERL_CALLCONV SV** Perl_av_store(pTHX_ AV *av, I32 key, SV *val)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_STORE \
+ assert(av)
+
+PERL_CALLCONV void Perl_av_undef(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_UNDEF \
+ assert(av)
+
+PERL_CALLCONV SV** Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE \
+ assert(avp); assert(val)
+
+PERL_CALLCONV void Perl_av_unshift(pTHX_ AV *av, I32 num)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_UNSHIFT \
+ assert(av)
+
+PERL_CALLCONV SV** Perl_av_arylen_p(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_ARYLEN_P \
+ assert(av)
+
+PERL_CALLCONV IV* Perl_av_iter_p(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_ITER_P \
+ assert(av)
+
+#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
+STATIC MAGIC* S_get_aux_mg(pTHX_ AV *av)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_AUX_MG \
+ assert(av)
+
+#endif
+PERL_CALLCONV OP* Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_BIND_MATCH \
+ assert(left); assert(right)
+
+PERL_CALLCONV OP* Perl_block_end(pTHX_ I32 floor, OP* seq)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV I32 Perl_block_gimme(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV int Perl_block_start(pTHX_ int full)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_boot_core_UNIVERSAL(pTHX);
+PERL_CALLCONV void Perl_boot_core_PerlIO(pTHX);
+PERL_CALLCONV void Perl_call_list(pTHX_ I32 oldscope, AV *paramList)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_CALL_LIST \
+ assert(paramList)
+
+PERL_CALLCONV bool Perl_cando(pTHX_ Mode_t mode, bool effective, const Stat_t* statbufp)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_CANDO \
+ assert(statbufp)
+
+PERL_CALLCONV U32 Perl_cast_ulong(pTHX_ NV f)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV I32 Perl_cast_i32(pTHX_ NV f)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV IV Perl_cast_iv(pTHX_ NV f)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV UV Perl_cast_uv(pTHX_ NV f)
+ __attribute__warn_unused_result__;
+
+#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
+PERL_CALLCONV I32 Perl_my_chsize(pTHX_ int fd, Off_t length)
+ __attribute__warn_unused_result__;
+
+#endif
+PERL_CALLCONV OP* Perl_convert(pTHX_ I32 optype, I32 flags, OP* o)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV PERL_CONTEXT* Perl_create_eval_scope(pTHX_ U32 flags);
+PERL_CALLCONV void Perl_croak(pTHX_ const char* pat, ...)
+ __attribute__noreturn__
+ __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2);
+
+PERL_CALLCONV void Perl_vcroak(pTHX_ const char* pat, va_list* args)
+ __attribute__noreturn__;
+
+PERL_CALLCONV void Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
+ __attribute__noreturn__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_CROAK_XS_USAGE \
+ assert(cv); assert(params)
+
+
+#if defined(PERL_IMPLICIT_CONTEXT)
+PERL_CALLCONV void Perl_croak_nocontext(const char* pat, ...)
+ __attribute__noreturn__
+ __attribute__format__null_ok__(__printf__,1,2);
+
+PERL_CALLCONV OP* Perl_die_nocontext(const char* pat, ...)
+ __attribute__format__null_ok__(__printf__,1,2);
+
+PERL_CALLCONV void Perl_deb_nocontext(const char* pat, ...)
+ __attribute__format__(__printf__,1,2)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_DEB_NOCONTEXT \
+ assert(pat)
+
+PERL_CALLCONV char* Perl_form_nocontext(const char* pat, ...)
+ __attribute__format__(__printf__,1,2)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_FORM_NOCONTEXT \
+ assert(pat)
+
+PERL_CALLCONV void Perl_load_module_nocontext(U32 flags, SV* name, SV* ver, ...)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT \
+ assert(name)
+
+PERL_CALLCONV SV* Perl_mess_nocontext(const char* pat, ...)
+ __attribute__format__(__printf__,1,2)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_MESS_NOCONTEXT \
+ assert(pat)
+
+PERL_CALLCONV void Perl_warn_nocontext(const char* pat, ...)
+ __attribute__format__(__printf__,1,2)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_WARN_NOCONTEXT \
+ assert(pat)
+
+PERL_CALLCONV void Perl_warner_nocontext(U32 err, const char* pat, ...)
+ __attribute__format__(__printf__,2,3)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_WARNER_NOCONTEXT \
+ assert(pat)
+
+PERL_CALLCONV SV* Perl_newSVpvf_nocontext(const char *const pat, ...)
+ __attribute__format__(__printf__,1,2)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT \
+ assert(pat)
+
+PERL_CALLCONV void Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,2,3)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,2,3)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,2,3)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,2,3)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV int Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...)
+ __attribute__format__(__printf__,2,3)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_FPRINTF_NOCONTEXT \
+ assert(stream); assert(format)
+
+PERL_CALLCONV int Perl_printf_nocontext(const char *format, ...)
+ __attribute__format__(__printf__,1,2)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PRINTF_NOCONTEXT \
+ assert(format)
+
+#endif
+PERL_CALLCONV void Perl_cv_ckproto_len(pTHX_ const CV* cv, const GV* gv, const char* p, const STRLEN len)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CV_CKPROTO_LEN \
+ assert(cv)
+
+PERL_CALLCONV CV* Perl_cv_clone(pTHX_ CV* proto)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CV_CLONE \
+ assert(proto)
+
+PERL_CALLCONV SV* Perl_gv_const_sv(pTHX_ GV* gv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_CONST_SV \
+ assert(gv)
+
+PERL_CALLCONV SV* Perl_cv_const_sv(pTHX_ const CV *const cv)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_op_const_sv(pTHX_ const OP* o, CV* cv)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_cv_undef(pTHX_ CV* cv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CV_UNDEF \
+ assert(cv)
+
+PERL_CALLCONV void Perl_cx_dump(pTHX_ PERL_CONTEXT* cx)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CX_DUMP \
+ assert(cx)
+
+PERL_CALLCONV SV* Perl_filter_add(pTHX_ filter_t funcp, SV* datasv);
+PERL_CALLCONV void Perl_filter_del(pTHX_ filter_t funcp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FILTER_DEL \
+ assert(funcp)
+
+PERL_CALLCONV I32 Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_FILTER_READ \
+ assert(buf_sv)
+
+PERL_CALLCONV char** Perl_get_op_descs(pTHX)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV char** Perl_get_op_names(pTHX)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV const char* Perl_get_no_modify(pTHX)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV U32* Perl_get_opargs(pTHX)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV PPADDR_t* Perl_get_ppaddr(pTHX)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV I32 Perl_cxinc(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_deb(pTHX_ const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_1,pTHX_2)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DEB \
+ assert(pat)
+
+PERL_CALLCONV void Perl_vdeb(pTHX_ const char* pat, va_list* args)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VDEB \
+ assert(pat)
+
+PERL_CALLCONV void Perl_debprofdump(pTHX);
+PERL_CALLCONV I32 Perl_debop(pTHX_ const OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DEBOP \
+ assert(o)
+
+PERL_CALLCONV I32 Perl_debstack(pTHX);
+PERL_CALLCONV I32 Perl_debstackptrs(pTHX);
+PERL_CALLCONV char* Perl_delimcpy(char* to, const char* toend, const char* from, const char* fromend, int delim, I32* retlen)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3)
+ __attribute__nonnull__(4)
+ __attribute__nonnull__(6);
+#define PERL_ARGS_ASSERT_DELIMCPY \
+ assert(to); assert(toend); assert(from); assert(fromend); assert(retlen)
+
+PERL_CALLCONV void Perl_delete_eval_scope(pTHX);
+PERL_CALLCONV OP* Perl_die(pTHX_ const char* pat, ...)
+ __attribute__format__null_ok__(__printf__,pTHX_1,pTHX_2);
+
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_vdie(pTHX_ const char* pat, va_list* args);
+#endif
+PERL_CALLCONV void Perl_die_where(pTHX_ SV* msv)
+ __attribute__noreturn__;
+
+PERL_CALLCONV void Perl_dounwind(pTHX_ I32 cxix);
+/* PERL_CALLCONV bool Perl_do_aexec(pTHX_ SV* really, SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3); */
+#define PERL_ARGS_ASSERT_DO_AEXEC \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV bool Perl_do_aexec5(pTHX_ SV* really, SV** mark, SV** sp, int fd, int do_report)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_AEXEC5 \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV int Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_BINMODE \
+ assert(fp)
+
+PERL_CALLCONV void Perl_do_chop(pTHX_ SV *astr, SV *sv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_CHOP \
+ assert(astr); assert(sv)
+
+PERL_CALLCONV bool Perl_do_close(pTHX_ GV* gv, bool not_implicit);
+PERL_CALLCONV bool Perl_do_eof(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_EOF \
+ assert(gv)
+
+
+#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
+/* PERL_CALLCONV bool Perl_do_exec(pTHX_ const char* cmd)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_DO_EXEC \
+ assert(cmd)
+
+#else
+PERL_CALLCONV bool Perl_do_exec(pTHX_ const char* cmd)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_EXEC \
+ assert(cmd)
+
+#endif
+
+#if defined(WIN32) || defined(__SYMBIAN32__) || defined(VMS)
+PERL_CALLCONV int Perl_do_aspawn(pTHX_ SV* really, SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_ASPAWN \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV int Perl_do_spawn(pTHX_ char* cmd)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_SPAWN \
+ assert(cmd)
+
+PERL_CALLCONV int Perl_do_spawn_nowait(pTHX_ char* cmd)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_SPAWN_NOWAIT \
+ assert(cmd)
+
+#endif
+#if !defined(WIN32)
+PERL_CALLCONV bool Perl_do_exec3(pTHX_ const char *incmd, int fd, int do_report)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_EXEC3 \
+ assert(incmd)
+
+#endif
+PERL_CALLCONV void Perl_do_execfree(pTHX);
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+STATIC void S_exec_failed(pTHX_ const char *cmd, int fd, int do_report)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_EXEC_FAILED \
+ assert(cmd)
+
+#endif
+#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+PERL_CALLCONV I32 Perl_do_ipcctl(pTHX_ I32 optype, SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_IPCCTL \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV I32 Perl_do_ipcget(pTHX_ I32 optype, SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_IPCGET \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV I32 Perl_do_msgrcv(pTHX_ SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_MSGRCV \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV I32 Perl_do_msgsnd(pTHX_ SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_MSGSND \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV I32 Perl_do_semop(pTHX_ SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_SEMOP \
+ assert(mark); assert(sp)
+
+PERL_CALLCONV I32 Perl_do_shmio(pTHX_ I32 optype, SV** mark, SV** sp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_SHMIO \
+ assert(mark); assert(sp)
+
+#endif
+PERL_CALLCONV void Perl_do_join(pTHX_ SV *sv, SV *delim, SV **mark, SV **sp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_DO_JOIN \
+ assert(sv); assert(delim); assert(mark); assert(sp)
+
+PERL_CALLCONV OP* Perl_do_kv(pTHX);
+/* PERL_CALLCONV bool Perl_do_open(pTHX_ GV* gv, const char* name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO* supplied_fp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_DO_OPEN \
+ assert(gv); assert(name)
+
+PERL_CALLCONV bool Perl_do_open9(pTHX_ GV *gv, const char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_8);
+#define PERL_ARGS_ASSERT_DO_OPEN9 \
+ assert(gv); assert(name); assert(svs)
+
+PERL_CALLCONV bool Perl_do_openn(pTHX_ GV *gv, const char *oname, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV **svp, I32 num)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_OPENN \
+ assert(gv); assert(oname)
+
+PERL_CALLCONV bool Perl_do_print(pTHX_ SV* sv, PerlIO* fp)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_PRINT \
+ assert(fp)
+
+PERL_CALLCONV OP* Perl_do_readline(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV I32 Perl_do_chomp(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_CHOMP \
+ assert(sv)
+
+PERL_CALLCONV bool Perl_do_seek(pTHX_ GV* gv, Off_t pos, int whence);
+PERL_CALLCONV void Perl_do_sprintf(pTHX_ SV* sv, I32 len, SV** sarg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_SPRINTF \
+ assert(sv); assert(sarg)
+
+PERL_CALLCONV Off_t Perl_do_sysseek(pTHX_ GV* gv, Off_t pos, int whence)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_SYSSEEK \
+ assert(gv)
+
+PERL_CALLCONV Off_t Perl_do_tell(pTHX_ GV* gv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TELL \
+ assert(gv)
+
+PERL_CALLCONV I32 Perl_do_trans(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS \
+ assert(sv)
+
+PERL_CALLCONV UV Perl_do_vecget(pTHX_ SV* sv, I32 offset, I32 size)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_VECGET \
+ assert(sv)
+
+PERL_CALLCONV void Perl_do_vecset(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_VECSET \
+ assert(sv)
+
+PERL_CALLCONV void Perl_do_vop(pTHX_ I32 optype, SV* sv, SV* left, SV* right)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_DO_VOP \
+ assert(sv); assert(left); assert(right)
+
+PERL_CALLCONV OP* Perl_dofile(pTHX_ OP* term, I32 force_builtin)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DOFILE \
+ assert(term)
+
+PERL_CALLCONV I32 Perl_dowantarray(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_dump_all(pTHX);
+PERL_CALLCONV void Perl_dump_all_perl(pTHX_ bool justperl);
+PERL_CALLCONV void Perl_dump_eval(pTHX);
+#if defined(DUMP_FDS)
+PERL_CALLCONV void Perl_dump_fds(pTHX_ char* s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_FDS \
+ assert(s)
+
+#endif
+PERL_CALLCONV void Perl_dump_form(pTHX_ const GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_FORM \
+ assert(gv)
+
+PERL_CALLCONV void Perl_gv_dump(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_DUMP \
+ assert(gv)
+
+PERL_CALLCONV void Perl_op_dump(pTHX_ const OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OP_DUMP \
+ assert(o)
+
+PERL_CALLCONV void Perl_pmop_dump(pTHX_ PMOP* pm);
+PERL_CALLCONV void Perl_dump_packsubs(pTHX_ const HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_PACKSUBS \
+ assert(stash)
+
+PERL_CALLCONV void Perl_dump_packsubs_perl(pTHX_ const HV* stash, bool justperl)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL \
+ assert(stash)
+
+PERL_CALLCONV void Perl_dump_sub(pTHX_ const GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_SUB \
+ assert(gv)
+
+PERL_CALLCONV void Perl_dump_sub_perl(pTHX_ const GV* gv, bool justperl)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_SUB_PERL \
+ assert(gv)
+
+PERL_CALLCONV void Perl_fbm_compile(pTHX_ SV* sv, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FBM_COMPILE \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_fbm_instr(pTHX_ unsigned char* big, unsigned char* bigend, SV* littlestr, U32 flags)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_FBM_INSTR \
+ assert(big); assert(bigend); assert(littlestr)
+
+PERL_CALLCONV char* Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char *const *const search_ext, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FIND_SCRIPT \
+ assert(scriptname)
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_force_list(pTHX_ OP* arg);
+STATIC OP* S_fold_constants(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FOLD_CONSTANTS \
+ assert(o)
+
+#endif
+PERL_CALLCONV char* Perl_form(pTHX_ const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_1,pTHX_2)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORM \
+ assert(pat)
+
+PERL_CALLCONV char* Perl_vform(pTHX_ const char* pat, va_list* args)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VFORM \
+ assert(pat)
+
+PERL_CALLCONV void Perl_free_tmps(pTHX);
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_gen_constant_list(pTHX_ OP* o);
+#endif
+#if !defined(HAS_GETENV_LEN)
+PERL_CALLCONV char* Perl_getenv_len(pTHX_ const char *env_elem, unsigned long *len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GETENV_LEN \
+ assert(env_elem); assert(len)
+
+#endif
+PERL_CALLCONV void Perl_get_db_sub(pTHX_ SV **svp, CV *cv)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GET_DB_SUB \
+ assert(cv)
+
+PERL_CALLCONV void Perl_gp_free(pTHX_ GV* gv);
+PERL_CALLCONV GP* Perl_gp_ref(pTHX_ GP* gp);
+PERL_CALLCONV GV* Perl_gv_add_by_type(pTHX_ GV *gv, svtype type);
+/* PERL_CALLCONV GV* Perl_gv_AVadd(pTHX_ GV *gv); */
+/* PERL_CALLCONV GV* Perl_gv_HVadd(pTHX_ GV *gv); */
+/* PERL_CALLCONV GV* Perl_gv_IOadd(pTHX_ GV* gv); */
+PERL_CALLCONV GV* Perl_gv_autoload4(pTHX_ HV* stash, const char* name, STRLEN len, I32 method)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_AUTOLOAD4 \
+ assert(name)
+
+PERL_CALLCONV void Perl_gv_check(pTHX_ const HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_CHECK \
+ assert(stash)
+
+PERL_CALLCONV void Perl_gv_efullname(pTHX_ SV* sv, const GV* gv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_EFULLNAME \
+ assert(sv); assert(gv)
+
+/* PERL_CALLCONV void Perl_gv_efullname3(pTHX_ SV* sv, const GV* gv, const char* prefix)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_GV_EFULLNAME3 \
+ assert(sv); assert(gv)
+
+PERL_CALLCONV void Perl_gv_efullname4(pTHX_ SV* sv, const GV* gv, const char* prefix, bool keepmain)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_EFULLNAME4 \
+ assert(sv); assert(gv)
+
+PERL_CALLCONV GV* Perl_gv_fetchfile(pTHX_ const char* name)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_FETCHFILE \
+ assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchfile_flags(pTHX_ const char *const name, const STRLEN len, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_FETCHFILE_FLAGS \
+ assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchmeth(pTHX_ HV* stash, const char* name, STRLEN len, I32 level)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH \
+ assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchmeth_autoload(pTHX_ HV* stash, const char* name, STRLEN len, I32 level)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_FETCHMETH_AUTOLOAD \
+ assert(name)
+
+/* PERL_CALLCONV GV* Perl_gv_fetchmethod(pTHX_ HV* stash, const char* name)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD \
+ assert(stash); assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchmethod_autoload(pTHX_ HV* stash, const char* name, I32 autoload)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_AUTOLOAD \
+ assert(stash); assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchmethod_flags(pTHX_ HV* stash, const char* name, U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_FETCHMETHOD_FLAGS \
+ assert(stash); assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, const svtype sv_type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_FETCHPV \
+ assert(nambeg)
+
+PERL_CALLCONV void Perl_gv_fullname(pTHX_ SV* sv, const GV* gv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_FULLNAME \
+ assert(sv); assert(gv)
+
+/* PERL_CALLCONV void Perl_gv_fullname3(pTHX_ SV* sv, const GV* gv, const char* prefix)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_GV_FULLNAME3 \
+ assert(sv); assert(gv)
+
+PERL_CALLCONV void Perl_gv_fullname4(pTHX_ SV* sv, const GV* gv, const char* prefix, bool keepmain)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_FULLNAME4 \
+ assert(sv); assert(gv)
+
+PERL_CALLCONV GP * Perl_newGP(pTHX_ GV *const gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWGP \
+ assert(gv)
+
+PERL_CALLCONV void Perl_gv_init(pTHX_ GV* gv, HV* stash, const char* name, STRLEN len, int multi)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_GV_INIT \
+ assert(gv); assert(name)
+
+PERL_CALLCONV void Perl_gv_name_set(pTHX_ GV* gv, const char *name, U32 len, U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GV_NAME_SET \
+ assert(gv); assert(name)
+
+PERL_CALLCONV void Perl_gv_try_downgrade(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_TRY_DOWNGRADE \
+ assert(gv)
+
+PERL_CALLCONV HV* Perl_gv_stashpv(pTHX_ const char* name, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_STASHPV \
+ assert(name)
+
+PERL_CALLCONV HV* Perl_gv_stashpvn(pTHX_ const char* name, U32 namelen, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_STASHPVN \
+ assert(name)
+
+PERL_CALLCONV HV* Perl_gv_stashsv(pTHX_ SV* sv, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_STASHSV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_hv_clear(pTHX_ HV *hv);
+PERL_CALLCONV HV * Perl_hv_copy_hints_hv(pTHX_ HV *const ohv);
+PERL_CALLCONV void Perl_hv_delayfree_ent(pTHX_ HV *hv, HE *entry)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_DELAYFREE_ENT \
+ assert(hv)
+
+/* PERL_CALLCONV SV* Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_HV_DELETE \
+ assert(key)
+
+/* PERL_CALLCONV SV* Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_HV_DELETE_ENT \
+ assert(keysv)
+
+/* PERL_CALLCONV bool Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_HV_EXISTS \
+ assert(key)
+
+/* PERL_CALLCONV bool Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_HV_EXISTS_ENT \
+ assert(keysv)
+
+/* PERL_CALLCONV SV** Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_HV_FETCH \
+ assert(key)
+
+/* PERL_CALLCONV HE* Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, U32 hash)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_HV_FETCH_ENT \
+ assert(keysv)
+
+PERL_CALLCONV void* Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char* key, STRLEN klen, int flags, int action, SV *val, U32 hash);
+PERL_CALLCONV void* Perl_hv_common_key_len(pTHX_ HV *hv, const char *key, I32 klen_i32, const int action, SV *val, const U32 hash)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_HV_COMMON_KEY_LEN \
+ assert(key)
+
+PERL_CALLCONV void Perl_hv_free_ent(pTHX_ HV *hv, HE *entryK)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_FREE_ENT \
+ assert(hv)
+
+PERL_CALLCONV I32 Perl_hv_iterinit(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_ITERINIT \
+ assert(hv)
+
+PERL_CALLCONV char* Perl_hv_iterkey(pTHX_ HE* entry, I32* retlen)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_HV_ITERKEY \
+ assert(entry); assert(retlen)
+
+PERL_CALLCONV SV* Perl_hv_iterkeysv(pTHX_ HE* entry)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_ITERKEYSV \
+ assert(entry)
+
+/* PERL_CALLCONV HE* Perl_hv_iternext(pTHX_ HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_HV_ITERNEXT \
+ assert(hv)
+
+PERL_CALLCONV SV* Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_HV_ITERNEXTSV \
+ assert(hv); assert(key); assert(retlen)
+
+PERL_CALLCONV HE* Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS \
+ assert(hv)
+
+PERL_CALLCONV SV* Perl_hv_iterval(pTHX_ HV *hv, HE *entry)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_HV_ITERVAL \
+ assert(hv); assert(entry)
+
+PERL_CALLCONV void Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_KSPLIT \
+ assert(hv)
+
+/* PERL_CALLCONV void Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_HV_MAGIC \
+ assert(hv)
+
+PERL_CALLCONV HV * Perl_refcounted_he_chain_2hv(pTHX_ const struct refcounted_he *c);
+PERL_CALLCONV SV * Perl_refcounted_he_fetch(pTHX_ const struct refcounted_he *chain, SV *keysv, const char *key, STRLEN klen, int flags, U32 hash);
+PERL_CALLCONV void Perl_refcounted_he_free(pTHX_ struct refcounted_he *he);
+PERL_CALLCONV struct refcounted_he * Perl_refcounted_he_new(pTHX_ struct refcounted_he *const parent, SV *const key, SV *const value);
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+STATIC struct refcounted_he * S_refcounted_he_new_common(pTHX_ struct refcounted_he *const parent, const char *const key_p, const STRLEN key_len, const char flags, char value_type, const void *value, const STRLEN value_len)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_6);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_COMMON \
+ assert(key_p); assert(value)
+
+#endif
+/* PERL_CALLCONV SV** Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash); */
+/* PERL_CALLCONV HE* Perl_hv_store_ent(pTHX_ HV *hv, SV *key, SV *val, U32 hash); */
+/* PERL_CALLCONV SV** Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val, U32 hash, int flags); */
+PERL_CALLCONV void Perl_hv_undef(pTHX_ HV *hv);
+PERL_CALLCONV I32 Perl_ibcmp(const char* a, const char* b, I32 len)
+ __attribute__pure__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_IBCMP \
+ assert(a); assert(b)
+
+PERL_CALLCONV I32 Perl_ibcmp_locale(const char* a, const char* b, I32 len)
+ __attribute__pure__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_IBCMP_LOCALE \
+ assert(a); assert(b)
+
+PERL_CALLCONV I32 Perl_ibcmp_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_IBCMP_UTF8 \
+ assert(s1); assert(s2)
+
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+STATIC bool S_ingroup(pTHX_ Gid_t testgid, bool effective)
+ __attribute__warn_unused_result__;
+
+#endif
+PERL_CALLCONV void Perl_init_argv_symbols(pTHX_ int argc, char **argv)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_INIT_ARGV_SYMBOLS \
+ assert(argv)
+
+PERL_CALLCONV void Perl_init_dbargs(pTHX);
+PERL_CALLCONV void Perl_init_debugger(pTHX);
+PERL_CALLCONV void Perl_init_stacks(pTHX);
+PERL_CALLCONV void Perl_init_tm(pTHX_ struct tm *ptm)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_INIT_TM \
+ assert(ptm)
+
+PERL_CALLCONV U32 Perl_intro_my(pTHX);
+PERL_CALLCONV char* Perl_instr(const char* big, const char* little)
+ __attribute__warn_unused_result__
+ __attribute__pure__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_INSTR \
+ assert(big); assert(little)
+
+PERL_CALLCONV bool Perl_io_close(pTHX_ IO* io, bool not_implicit)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IO_CLOSE \
+ assert(io)
+
+PERL_CALLCONV OP* Perl_invert(pTHX_ OP* cmd)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV I32 Perl_is_lvalue_sub(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV U32 Perl_to_uni_upper_lc(pTHX_ U32 c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV U32 Perl_to_uni_title_lc(pTHX_ U32 c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV U32 Perl_to_uni_lower_lc(pTHX_ U32 c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_alnum(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_idfirst(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_alpha(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_ascii(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_space(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_cntrl(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_graph(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_digit(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_upper(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_lower(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_print(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_punct(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_xdigit(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV UV Perl_to_uni_upper(pTHX_ UV c, U8 *p, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_TO_UNI_UPPER \
+ assert(p); assert(lenp)
+
+PERL_CALLCONV UV Perl_to_uni_title(pTHX_ UV c, U8 *p, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_TO_UNI_TITLE \
+ assert(p); assert(lenp)
+
+PERL_CALLCONV UV Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_TO_UNI_LOWER \
+ assert(p); assert(lenp)
+
+PERL_CALLCONV UV Perl_to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_TO_UNI_FOLD \
+ assert(p); assert(lenp)
+
+PERL_CALLCONV bool Perl_is_uni_alnum_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_idfirst_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_alpha_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_ascii_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_space_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_cntrl_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_graph_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_digit_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_upper_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_lower_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_print_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_punct_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_uni_xdigit_lc(pTHX_ UV c)
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV bool Perl_is_ascii_string(const U8 *s, STRLEN len)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_IS_ASCII_STRING \
+ assert(s)
+
+PERL_CALLCONV STRLEN Perl_is_utf8_char(const U8 *s)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_IS_UTF8_CHAR \
+ assert(s)
+
+PERL_CALLCONV bool Perl_is_utf8_string(const U8 *s, STRLEN len)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_IS_UTF8_STRING \
+ assert(s)
+
+/* PERL_CALLCONV bool Perl_is_utf8_string_loc(const U8 *s, STRLEN len, const U8 **p)
+ __attribute__nonnull__(1); */
+#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC \
+ assert(s)
+
+PERL_CALLCONV bool Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN \
+ assert(s)
+
+PERL_CALLCONV bool Perl_is_utf8_alnum(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_ALNUM \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_idfirst(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_IDFIRST \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_idcont(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_IDCONT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_alpha(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_ALPHA \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_ascii(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_ASCII \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_space(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_SPACE \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_perl_space(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_PERL_SPACE \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_perl_word(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_PERL_WORD \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_cntrl(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_CNTRL \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_digit(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_DIGIT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_posix_digit(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_POSIX_DIGIT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_graph(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_GRAPH \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_upper(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_UPPER \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_lower(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_LOWER \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_print(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_PRINT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_punct(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_PUNCT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_xdigit(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_XDIGIT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_mark(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_MARK \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_begin(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_BEGIN \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_extend(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_EXTEND \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_prepend(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_PREPEND \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_non_hangul(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_NON_HANGUL \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_L(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_L \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_LV(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_LV \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_LVT(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_LVT \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_LV_LVT_V(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_LV_LVT_V \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_T(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_T \
+ assert(p)
+
+PERL_CALLCONV bool Perl_is_utf8_X_V(pTHX_ const U8 *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_UTF8_X_V \
+ assert(p)
+
+PERL_CALLCONV OP* Perl_jmaybe(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_JMAYBE \
+ assert(o)
+
+PERL_CALLCONV I32 Perl_keyword(pTHX_ const char *name, I32 len, bool all_keywords)
+ __attribute__pure__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_KEYWORD \
+ assert(name)
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_opt_scalarhv(pTHX_ OP* rep_op)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OPT_SCALARHV \
+ assert(rep_op)
+
+STATIC OP* S_is_inplace_av(pTHX_ OP* o, OP* oright)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_INPLACE_AV \
+ assert(o)
+
+#endif
+PERL_CALLCONV void Perl_leave_scope(pTHX_ I32 base);
+PERL_CALLCONV void Perl_lex_end(pTHX);
+PERL_CALLCONV void Perl_lex_start(pTHX_ SV* line, PerlIO *rsfp, bool new_filter);
+PERL_CALLCONV bool Perl_lex_bufutf8(pTHX);
+PERL_CALLCONV char* Perl_lex_grow_linestr(pTHX_ STRLEN len);
+PERL_CALLCONV void Perl_lex_stuff_pvn(pTHX_ char* pv, STRLEN len, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LEX_STUFF_PVN \
+ assert(pv)
+
+PERL_CALLCONV void Perl_lex_stuff_sv(pTHX_ SV* sv, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LEX_STUFF_SV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_lex_unstuff(pTHX_ char* ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LEX_UNSTUFF \
+ assert(ptr)
+
+PERL_CALLCONV void Perl_lex_read_to(pTHX_ char* ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LEX_READ_TO \
+ assert(ptr)
+
+PERL_CALLCONV void Perl_lex_discard_to(pTHX_ char* ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LEX_DISCARD_TO \
+ assert(ptr)
+
+PERL_CALLCONV bool Perl_lex_next_chunk(pTHX_ U32 flags);
+PERL_CALLCONV I32 Perl_lex_peek_unichar(pTHX_ U32 flags);
+PERL_CALLCONV I32 Perl_lex_read_unichar(pTHX_ U32 flags);
+PERL_CALLCONV void Perl_lex_read_space(pTHX_ U32 flags);
+PERL_CALLCONV void Perl_op_null(pTHX_ OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OP_NULL \
+ assert(o)
+
+PERL_CALLCONV void Perl_op_clear(pTHX_ OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OP_CLEAR \
+ assert(o)
+
+PERL_CALLCONV void Perl_op_refcnt_lock(pTHX);
+PERL_CALLCONV void Perl_op_refcnt_unlock(pTHX);
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_linklist(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LINKLIST \
+ assert(o)
+
+STATIC OP* S_listkids(pTHX_ OP* o);
+#endif
+PERL_CALLCONV OP* Perl_list(pTHX_ OP* o);
+PERL_CALLCONV void Perl_load_module(pTHX_ U32 flags, SV* name, SV* ver, ...)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_LOAD_MODULE \
+ assert(name)
+
+PERL_CALLCONV void Perl_vload_module(pTHX_ U32 flags, SV* name, SV* ver, va_list* args)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_VLOAD_MODULE \
+ assert(name)
+
+PERL_CALLCONV OP* Perl_localize(pTHX_ OP *o, I32 lex)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LOCALIZE \
+ assert(o)
+
+PERL_CALLCONV I32 Perl_looks_like_number(pTHX_ SV *const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER \
+ assert(sv)
+
+PERL_CALLCONV UV Perl_grok_bin(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_GROK_BIN \
+ assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV UV Perl_grok_hex(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_GROK_HEX \
+ assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV int Perl_grok_number(pTHX_ const char *pv, STRLEN len, UV *valuep)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GROK_NUMBER \
+ assert(pv)
+
+PERL_CALLCONV bool Perl_grok_numeric_radix(pTHX_ const char **sp, const char *send)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GROK_NUMERIC_RADIX \
+ assert(sp); assert(send)
+
+PERL_CALLCONV UV Perl_grok_oct(pTHX_ const char* start, STRLEN* len_p, I32* flags, NV *result)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_GROK_OCT \
+ assert(start); assert(len_p); assert(flags)
+
+PERL_CALLCONV int Perl_magic_clearenv(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEARENV \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_clear_all_env(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEAR_ALL_ENV \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_clearhint(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEARHINT \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_clearhints(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEARHINTS \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_clearisa(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEARISA \
+ assert(mg)
+
+PERL_CALLCONV int Perl_magic_clearpack(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEARPACK \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_clearsig(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_CLEARSIG \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_existspack(pTHX_ SV* sv, const MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_EXISTSPACK \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_freeovrld(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_FREEOVRLD \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_get(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GET \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getarylen(pTHX_ SV* sv, const MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETARYLEN \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getdefelem(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETDEFELEM \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getnkeys(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETNKEYS \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getpack(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETPACK \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getpos(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETPOS \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getsig(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETSIG \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getsubstr(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETSUBSTR \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_gettaint(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETTAINT \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getuvar(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETUVAR \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_getvec(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_GETVEC \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV U32 Perl_magic_len(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_LEN \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MAGIC_NEXTPACK \
+ assert(sv); assert(mg); assert(key)
+
+PERL_CALLCONV U32 Perl_magic_regdata_cnt(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_regdatum_get(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_GET \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_regdatum_set(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__noreturn__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_REGDATUM_SET \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_set(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SET \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setamagic(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETAMAGIC \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setarylen(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETARYLEN \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_freearylen_p(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_FREEARYLEN_P \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setdbline(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETDBLINE \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setdefelem(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETDEFELEM \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setenv(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETENV \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_sethint(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETHINT \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setisa(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETISA \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setmglob(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETMGLOB \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setnkeys(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETNKEYS \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setpack(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETPACK \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setpos(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETPOS \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setregexp(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETREGEXP \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setsig(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETSIG \
+ assert(mg)
+
+PERL_CALLCONV int Perl_magic_setsubstr(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETSUBSTR \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_settaint(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETTAINT \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setuvar(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETUVAR \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setvec(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETVEC \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_setutf8(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETUTF8 \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_set_all_env(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SET_ALL_ENV \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV U32 Perl_magic_sizepack(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SIZEPACK \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV int Perl_magic_wipepack(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_WIPEPACK \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV void Perl_markstack_grow(pTHX);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV int Perl_magic_setcollxfrm(pTHX_ SV* sv, MAGIC* mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SETCOLLXFRM \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV char* Perl_mem_collxfrm(pTHX_ const char* s, STRLEN len, STRLEN* xlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MEM_COLLXFRM \
+ assert(s); assert(xlen)
+
+#endif
+PERL_CALLCONV SV* Perl_mess(pTHX_ const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_1,pTHX_2)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MESS \
+ assert(pat)
+
+PERL_CALLCONV SV* Perl_vmess(pTHX_ const char* pat, va_list* args)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VMESS \
+ assert(pat)
+
+PERL_CALLCONV void Perl_qerror(pTHX_ SV* err)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_QERROR \
+ assert(err)
+
+PERL_CALLCONV void Perl_sortsv(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SORTSV \
+ assert(cmp)
+
+PERL_CALLCONV void Perl_sortsv_flags(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SORTSV_FLAGS \
+ assert(cmp)
+
+PERL_CALLCONV int Perl_mg_clear(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_CLEAR \
+ assert(sv)
+
+PERL_CALLCONV int Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MG_COPY \
+ assert(sv); assert(nsv)
+
+PERL_CALLCONV void Perl_mg_localize(pTHX_ SV* sv, SV* nsv, bool setmagic)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MG_LOCALIZE \
+ assert(sv); assert(nsv)
+
+PERL_CALLCONV MAGIC* Perl_mg_find(pTHX_ const SV* sv, int type)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV int Perl_mg_free(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_FREE \
+ assert(sv)
+
+PERL_CALLCONV int Perl_mg_get(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_GET \
+ assert(sv)
+
+PERL_CALLCONV U32 Perl_mg_length(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_LENGTH \
+ assert(sv)
+
+PERL_CALLCONV void Perl_mg_magical(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_MAGICAL \
+ assert(sv)
+
+PERL_CALLCONV int Perl_mg_set(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_SET \
+ assert(sv)
+
+PERL_CALLCONV I32 Perl_mg_size(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MG_SIZE \
+ assert(sv)
+
+PERL_CALLCONV void Perl_mini_mktime(pTHX_ struct tm *ptm)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MINI_MKTIME \
+ assert(ptm)
+
+PERL_CALLCONV OP* Perl_mod(pTHX_ OP* o, I32 type);
+PERL_CALLCONV int Perl_mode_from_discipline(pTHX_ const char* s, STRLEN len);
+PERL_CALLCONV const char* Perl_moreswitches(pTHX_ const char* s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MORESWITCHES \
+ assert(s)
+
+PERL_CALLCONV NV Perl_my_atof(pTHX_ const char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MY_ATOF \
+ assert(s)
+
+#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
+PERL_CALLCONV char* Perl_my_bcopy(const char* from, char* to, I32 len)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_MY_BCOPY \
+ assert(from); assert(to)
+
+#endif
+#if !defined(HAS_BZERO) && !defined(HAS_MEMSET)
+PERL_CALLCONV char* Perl_my_bzero(char* loc, I32 len)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_MY_BZERO \
+ assert(loc)
+
+#endif
+PERL_CALLCONV void Perl_my_exit(pTHX_ U32 status)
+ __attribute__noreturn__;
+
+PERL_CALLCONV void Perl_my_failure_exit(pTHX)
+ __attribute__noreturn__;
+
+PERL_CALLCONV I32 Perl_my_fflush_all(pTHX);
+PERL_CALLCONV Pid_t Perl_my_fork(void);
+PERL_CALLCONV void Perl_atfork_lock(void);
+PERL_CALLCONV void Perl_atfork_unlock(void);
+PERL_CALLCONV I32 Perl_my_lstat(pTHX);
+#if !defined(HAS_MEMCMP) || !defined(HAS_SANE_MEMCMP)
+PERL_CALLCONV I32 Perl_my_memcmp(const char* s1, const char* s2, I32 len)
+ __attribute__pure__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_MY_MEMCMP \
+ assert(s1); assert(s2)
+
+#endif
+#if !defined(HAS_MEMSET)
+PERL_CALLCONV void* Perl_my_memset(char* loc, I32 ch, I32 len)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_MY_MEMSET \
+ assert(loc)
+
+#endif
+PERL_CALLCONV I32 Perl_my_pclose(pTHX_ PerlIO* ptr);
+PERL_CALLCONV PerlIO* Perl_my_popen(pTHX_ const char* cmd, const char* mode)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MY_POPEN \
+ assert(cmd); assert(mode)
+
+PERL_CALLCONV PerlIO* Perl_my_popen_list(pTHX_ const char* mode, int n, SV ** args)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MY_POPEN_LIST \
+ assert(mode); assert(args)
+
+PERL_CALLCONV void Perl_my_setenv(pTHX_ const char* nam, const char* val);
+PERL_CALLCONV I32 Perl_my_stat(pTHX);
+PERL_CALLCONV char * Perl_my_strftime(pTHX_ const char *fmt, int sec, int min, int hour, int mday, int mon, int year, int wday, int yday, int isdst)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MY_STRFTIME \
+ assert(fmt)
+
+#if defined(MYSWAP)
+PERL_CALLCONV short Perl_my_swap(pTHX_ short s)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV long Perl_my_htonl(pTHX_ long l)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+PERL_CALLCONV long Perl_my_ntohl(pTHX_ long l)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__pure__;
+
+#endif
+PERL_CALLCONV void Perl_my_unexec(pTHX);
+PERL_CALLCONV OP* Perl_newANONLIST(pTHX_ OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newANONHASH(pTHX_ OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newANONSUB(pTHX_ I32 floor, OP* proto, OP* block);
+PERL_CALLCONV OP* Perl_newASSIGNOP(pTHX_ I32 flags, OP* left, I32 optype, OP* right)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newCONDOP(pTHX_ I32 flags, OP* first, OP* trueop, OP* falseop)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEWCONDOP \
+ assert(first)
+
+PERL_CALLCONV CV* Perl_newCONSTSUB(pTHX_ HV* stash, const char* name, SV* sv);
+#ifdef PERL_MAD
+PERL_CALLCONV OP* Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
+#else
+PERL_CALLCONV void Perl_newFORM(pTHX_ I32 floor, OP* o, OP* block);
+#endif
+PERL_CALLCONV OP* Perl_newFOROP(pTHX_ I32 flags, char* label, line_t forline, OP* sv, OP* expr, OP* block, OP* cont)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_NEWFOROP \
+ assert(expr)
+
+PERL_CALLCONV OP* Perl_newGIVENOP(pTHX_ OP* cond, OP* block, PADOFFSET defsv_off)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEWGIVENOP \
+ assert(cond); assert(block)
+
+PERL_CALLCONV OP* Perl_newLOGOP(pTHX_ I32 optype, I32 flags, OP *first, OP *other)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_NEWLOGOP \
+ assert(first); assert(other)
+
+PERL_CALLCONV OP* Perl_newLOOPEX(pTHX_ I32 type, OP* label)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEWLOOPEX \
+ assert(label)
+
+PERL_CALLCONV OP* Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP* expr, OP* block)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newNULLLIST(pTHX)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newOP(pTHX_ I32 optype, I32 flags)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_newPROG(pTHX_ OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWPROG \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_newRANGE(pTHX_ I32 flags, OP* left, OP* right)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_NEWRANGE \
+ assert(left); assert(right)
+
+PERL_CALLCONV OP* Perl_newSLICEOP(pTHX_ I32 flags, OP* subscript, OP* listop)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newSTATEOP(pTHX_ I32 flags, char* label, OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV CV* Perl_newSUB(pTHX_ I32 floor, OP* o, OP* proto, OP* block);
+PERL_CALLCONV CV * Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr, const char *const filename, const char *const proto, U32 flags)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_NEWXS_FLAGS \
+ assert(subaddr); assert(filename)
+
+PERL_CALLCONV CV* Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_NEWXS \
+ assert(subaddr); assert(filename)
+
+/* PERL_CALLCONV AV* Perl_newAV(pTHX)
+ __attribute__warn_unused_result__; */
+
+PERL_CALLCONV OP* Perl_newAVREF(pTHX_ OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWAVREF \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_newBINOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newCVREF(pTHX_ I32 flags, OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newGVOP(pTHX_ I32 type, I32 flags, GV* gv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_NEWGVOP \
+ assert(gv)
+
+PERL_CALLCONV GV* Perl_newGVgen(pTHX_ const char* pack)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWGVGEN \
+ assert(pack)
+
+PERL_CALLCONV OP* Perl_newGVREF(pTHX_ I32 type, OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newHVREF(pTHX_ OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWHVREF \
+ assert(o)
+
+/* PERL_CALLCONV HV* Perl_newHV(pTHX)
+ __attribute__warn_unused_result__; */
+
+PERL_CALLCONV HV* Perl_newHVhv(pTHX_ HV *hv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+/* PERL_CALLCONV IO* Perl_newIO(pTHX)
+ __attribute__malloc__
+ __attribute__warn_unused_result__; */
+
+PERL_CALLCONV OP* Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP* first, OP* last)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+#ifdef USE_ITHREADS
+PERL_CALLCONV OP* Perl_newPADOP(pTHX_ I32 type, I32 flags, SV* sv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_NEWPADOP \
+ assert(sv)
+
+#endif
+PERL_CALLCONV OP* Perl_newPMOP(pTHX_ I32 type, I32 flags)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newPVOP(pTHX_ I32 type, I32 flags, char* pv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newRV(pTHX_ SV *const sv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWRV \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_newRV_noinc(pTHX_ SV *const sv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWRV_NOINC \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_newSV(pTHX_ const STRLEN len)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newSVREF(pTHX_ OP* o)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWSVREF \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_newSVOP(pTHX_ I32 type, I32 flags, SV* sv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_NEWSVOP \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_newSViv(pTHX_ const IV i)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVuv(pTHX_ const UV u)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVnv(pTHX_ const NV n)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVhek(pTHX_ const HEK *const hek)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVpvn_share(pTHX_ const char* s, I32 len, U32 hash)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSVpvf(pTHX_ const char *const pat, ...)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__format__(__printf__,pTHX_1,pTHX_2)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWSVPVF \
+ assert(pat)
+
+PERL_CALLCONV SV* Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VNEWSVPVF \
+ assert(pat)
+
+PERL_CALLCONV SV* Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEWSVRV \
+ assert(rv)
+
+PERL_CALLCONV SV* Perl_newSVsv(pTHX_ SV *const old)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_newSV_type(pTHX_ const svtype type)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newUNOP(pTHX_ I32 type, I32 flags, OP* first)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV OP* Perl_newWHENOP(pTHX_ OP* cond, OP* block)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEWWHENOP \
+ assert(block)
+
+PERL_CALLCONV OP* Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP* loop, I32 whileline, OP* expr, OP* block, OP* cont, I32 has_my)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV PERL_SI* Perl_new_stackinfo(pTHX_ I32 stitems, I32 cxitems)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV char* Perl_scan_vstring(pTHX_ const char *s, const char *const e, SV *sv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SCAN_VSTRING \
+ assert(s); assert(e); assert(sv)
+
+PERL_CALLCONV const char* Perl_scan_version(pTHX_ const char *s, SV *rv, bool qv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SCAN_VERSION \
+ assert(s); assert(rv)
+
+PERL_CALLCONV const char* Perl_prescan_version(pTHX_ const char *s, bool strict, const char** errstr, bool *sqv, int *ssaw_decimal, int *swidth, bool *salpha)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PRESCAN_VERSION \
+ assert(s)
+
+PERL_CALLCONV SV* Perl_new_version(pTHX_ SV *ver)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEW_VERSION \
+ assert(ver)
+
+PERL_CALLCONV SV* Perl_upg_version(pTHX_ SV *ver, bool qv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UPG_VERSION \
+ assert(ver)
+
+PERL_CALLCONV bool Perl_vverify(pTHX_ SV *vs)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VVERIFY \
+ assert(vs)
+
+PERL_CALLCONV SV* Perl_vnumify(pTHX_ SV *vs)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VNUMIFY \
+ assert(vs)
+
+PERL_CALLCONV SV* Perl_vnormal(pTHX_ SV *vs)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VNORMAL \
+ assert(vs)
+
+PERL_CALLCONV SV* Perl_vstringify(pTHX_ SV *vs)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VSTRINGIFY \
+ assert(vs)
+
+PERL_CALLCONV int Perl_vcmp(pTHX_ SV *lhv, SV *rhv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_VCMP \
+ assert(lhv); assert(rhv)
+
+PERL_CALLCONV PerlIO* Perl_nextargv(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEXTARGV \
+ assert(gv)
+
+PERL_CALLCONV char* Perl_ninstr(const char* big, const char* bigend, const char* little, const char* lend)
+ __attribute__pure__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3)
+ __attribute__nonnull__(4);
+#define PERL_ARGS_ASSERT_NINSTR \
+ assert(big); assert(bigend); assert(little); assert(lend)
+
+PERL_CALLCONV void Perl_op_free(pTHX_ OP* arg);
+#ifdef PERL_MAD
+PERL_CALLCONV OP* Perl_package(pTHX_ OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PACKAGE \
+ assert(o)
+
+#else
+PERL_CALLCONV void Perl_package(pTHX_ OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PACKAGE \
+ assert(o)
+
+#endif
+PERL_CALLCONV void Perl_package_version(pTHX_ OP* v)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PACKAGE_VERSION \
+ assert(v)
+
+PERL_CALLCONV PADOFFSET Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype);
+PERL_CALLCONV PADOFFSET Perl_allocmy(pTHX_ const char *const name, const STRLEN len, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_ALLOCMY \
+ assert(name)
+
+PERL_CALLCONV PADOFFSET Perl_pad_findmy(pTHX_ const char* name, STRLEN len, U32 flags)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_FINDMY \
+ assert(name)
+
+PERL_CALLCONV PADOFFSET Perl_find_rundefsvoffset(pTHX);
+PERL_CALLCONV OP* Perl_oopsAV(pTHX_ OP* o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OOPSAV \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_oopsHV(pTHX_ OP* o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OOPSHV \
+ assert(o)
+
+PERL_CALLCONV void Perl_pad_leavemy(pTHX);
+#ifdef DEBUGGING
+PERL_CALLCONV SV* Perl_pad_sv(pTHX_ PADOFFSET po);
+#endif
+PERL_CALLCONV void Perl_pad_free(pTHX_ PADOFFSET po);
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+STATIC void S_pad_reset(pTHX);
+#endif
+PERL_CALLCONV void Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust);
+PERL_CALLCONV void Perl_peep(pTHX_ OP* o);
+PERL_CALLCONV PerlIO* Perl_start_glob(pTHX_ SV *tmpglob, IO *io)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_START_GLOB \
+ assert(tmpglob); assert(io)
+
+#if defined(USE_REENTRANT_API)
+PERL_CALLCONV void Perl_reentrant_size(pTHX);
+PERL_CALLCONV void Perl_reentrant_init(pTHX);
+PERL_CALLCONV void Perl_reentrant_free(pTHX);
+PERL_CALLCONV void* Perl_reentrant_retry(const char *f, ...)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_REENTRANT_RETRY \
+ assert(f)
+
+#endif
+PERL_CALLCONV void Perl_call_atexit(pTHX_ ATEXIT_t fn, void *ptr);
+PERL_CALLCONV I32 Perl_call_argv(pTHX_ const char* sub_name, I32 flags, char** argv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_CALL_ARGV \
+ assert(sub_name); assert(argv)
+
+PERL_CALLCONV I32 Perl_call_method(pTHX_ const char* methname, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CALL_METHOD \
+ assert(methname)
+
+PERL_CALLCONV I32 Perl_call_pv(pTHX_ const char* sub_name, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CALL_PV \
+ assert(sub_name)
+
+PERL_CALLCONV I32 Perl_call_sv(pTHX_ SV* sv, VOL I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CALL_SV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_despatch_signals(pTHX);
+PERL_CALLCONV OP * Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DOREF \
+ assert(o)
+
+PERL_CALLCONV SV* Perl_eval_pv(pTHX_ const char* p, I32 croak_on_error)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_EVAL_PV \
+ assert(p)
+
+PERL_CALLCONV I32 Perl_eval_sv(pTHX_ SV* sv, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_EVAL_SV \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_get_sv(pTHX_ const char *name, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_SV \
+ assert(name)
+
+PERL_CALLCONV AV* Perl_get_av(pTHX_ const char *name, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_AV \
+ assert(name)
+
+PERL_CALLCONV HV* Perl_get_hv(pTHX_ const char *name, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_HV \
+ assert(name)
+
+PERL_CALLCONV CV* Perl_get_cv(pTHX_ const char* name, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_CV \
+ assert(name)
+
+PERL_CALLCONV CV* Perl_get_cvn_flags(pTHX_ const char* name, STRLEN len, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_CVN_FLAGS \
+ assert(name)
+
+PERL_CALLCONV int Perl_init_i18nl10n(pTHX_ int printwarn);
+PERL_CALLCONV int Perl_init_i18nl14n(pTHX_ int printwarn);
+PERL_CALLCONV void Perl_new_collate(pTHX_ const char* newcoll);
+PERL_CALLCONV void Perl_new_ctype(pTHX_ const char* newctype)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEW_CTYPE \
+ assert(newctype)
+
+PERL_CALLCONV void Perl_new_numeric(pTHX_ const char* newcoll);
+PERL_CALLCONV void Perl_set_numeric_local(pTHX);
+PERL_CALLCONV void Perl_set_numeric_radix(pTHX);
+PERL_CALLCONV void Perl_set_numeric_standard(pTHX);
+PERL_CALLCONV void Perl_require_pv(pTHX_ const char* pv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REQUIRE_PV \
+ assert(pv)
+
+PERL_CALLCONV void Perl_pack_cat(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5)
+ __attribute__nonnull__(pTHX_6);
+#define PERL_ARGS_ASSERT_PACK_CAT \
+ assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist); assert(next_in_list)
+
+PERL_CALLCONV void Perl_packlist(pTHX_ SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_PACKLIST \
+ assert(cat); assert(pat); assert(patend); assert(beglist); assert(endlist)
+
+#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
+STATIC void S_pidgone(pTHX_ Pid_t pid, int status);
+#endif
+PERL_CALLCONV void Perl_pmflag(pTHX_ U32 *pmfl, int ch)
+ __attribute__deprecated__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PMFLAG \
+ assert(pmfl)
+
+PERL_CALLCONV OP* Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PMRUNTIME \
+ assert(o); assert(expr)
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_pmtrans(pTHX_ OP* o, OP* expr, OP* repl)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_PMTRANS \
+ assert(o); assert(expr); assert(repl)
+
+#endif
+PERL_CALLCONV void Perl_pop_scope(pTHX);
+PERL_CALLCONV OP* Perl_prepend_elem(pTHX_ I32 optype, OP* head, OP* tail);
+PERL_CALLCONV void Perl_push_scope(pTHX);
+/* PERL_CALLCONV OP* Perl_ref(pTHX_ OP* o, I32 type); */
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_refkids(pTHX_ OP* o, I32 type);
+#endif
+PERL_CALLCONV void Perl_regdump(pTHX_ const regexp* r)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGDUMP \
+ assert(r)
+
+PERL_CALLCONV void Perl_regdump(pTHX_ const regexp* r)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGDUMP \
+ assert(r)
+
+PERL_CALLCONV SV* Perl_regclass_swash(pTHX_ const regexp *prog, const struct regnode *node, bool doinit, SV **listsvp, SV **altsvp)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGCLASS_SWASH \
+ assert(node)
+
+PERL_CALLCONV I32 Perl_pregexec(pTHX_ REGEXP * const prog, char* stringarg, char* strend, char* strbeg, I32 minend, SV* screamer, U32 nosave)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_6);
+#define PERL_ARGS_ASSERT_PREGEXEC \
+ assert(prog); assert(stringarg); assert(strend); assert(strbeg); assert(screamer)
+
+PERL_CALLCONV void Perl_pregfree(pTHX_ REGEXP* r);
+PERL_CALLCONV void Perl_pregfree2(pTHX_ REGEXP *rx)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PREGFREE2 \
+ assert(rx)
+
+PERL_CALLCONV REGEXP* Perl_reg_temp_copy(pTHX_ REGEXP* ret_x, REGEXP* rx)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REG_TEMP_COPY \
+ assert(rx)
+
+PERL_CALLCONV void Perl_regfree_internal(pTHX_ REGEXP *const rx)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGFREE_INTERNAL \
+ assert(rx)
+
+#if defined(USE_ITHREADS)
+PERL_CALLCONV void* Perl_regdupe_internal(pTHX_ REGEXP * const r, CLONE_PARAMS* param)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGDUPE_INTERNAL \
+ assert(r); assert(param)
+
+#endif
+PERL_CALLCONV REGEXP* Perl_pregcomp(pTHX_ SV * const pattern, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PREGCOMP \
+ assert(pattern)
+
+PERL_CALLCONV REGEXP* Perl_re_compile(pTHX_ SV * const pattern, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_RE_COMPILE \
+ assert(pattern)
+
+PERL_CALLCONV char* Perl_re_intuit_start(pTHX_ REGEXP * const rx, SV* sv, char* strpos, char* strend, const U32 flags, re_scream_pos_data *data)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_RE_INTUIT_START \
+ assert(rx); assert(strpos); assert(strend)
+
+PERL_CALLCONV SV* Perl_re_intuit_string(pTHX_ REGEXP *const r)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_RE_INTUIT_STRING \
+ assert(r)
+
+PERL_CALLCONV I32 Perl_regexec_flags(pTHX_ REGEXP *const rx, char *stringarg, char *strend, char *strbeg, I32 minend, SV *sv, void *data, U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_6);
+#define PERL_ARGS_ASSERT_REGEXEC_FLAGS \
+ assert(rx); assert(stringarg); assert(strend); assert(strbeg); assert(sv)
+
+PERL_CALLCONV regnode* Perl_regnext(pTHX_ regnode* p)
+ __attribute__warn_unused_result__;
+
+
+PERL_CALLCONV SV* Perl_reg_named_buff(pTHX_ REGEXP * const rx, SV * const key, SV * const value, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF \
+ assert(rx)
+
+PERL_CALLCONV SV* Perl_reg_named_buff_iter(pTHX_ REGEXP * const rx, const SV * const lastkey, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER \
+ assert(rx)
+
+PERL_CALLCONV SV* Perl_reg_named_buff_fetch(pTHX_ REGEXP * const rx, SV * const namesv, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH \
+ assert(rx); assert(namesv)
+
+PERL_CALLCONV bool Perl_reg_named_buff_exists(pTHX_ REGEXP * const rx, SV * const key, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_EXISTS \
+ assert(rx); assert(key)
+
+PERL_CALLCONV SV* Perl_reg_named_buff_firstkey(pTHX_ REGEXP * const rx, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY \
+ assert(rx)
+
+PERL_CALLCONV SV* Perl_reg_named_buff_nextkey(pTHX_ REGEXP * const rx, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY \
+ assert(rx)
+
+PERL_CALLCONV SV* Perl_reg_named_buff_scalar(pTHX_ REGEXP * const rx, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR \
+ assert(rx)
+
+PERL_CALLCONV SV* Perl_reg_named_buff_all(pTHX_ REGEXP * const rx, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMED_BUFF_ALL \
+ assert(rx)
+
+
+PERL_CALLCONV void Perl_reg_numbered_buff_fetch(pTHX_ REGEXP * const rx, const I32 paren, SV * const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH \
+ assert(rx)
+
+PERL_CALLCONV void Perl_reg_numbered_buff_store(pTHX_ REGEXP * const rx, const I32 paren, SV const * const value)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE \
+ assert(rx)
+
+PERL_CALLCONV I32 Perl_reg_numbered_buff_length(pTHX_ REGEXP * const rx, const SV * const sv, const I32 paren)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH \
+ assert(rx); assert(sv)
+
+
+PERL_CALLCONV SV* Perl_reg_qr_package(pTHX_ REGEXP * const rx)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_QR_PACKAGE \
+ assert(rx)
+
+
+PERL_CALLCONV void Perl_regprop(pTHX_ const regexp *prog, SV* sv, const regnode* o)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REGPROP \
+ assert(sv); assert(o)
+
+PERL_CALLCONV void Perl_repeatcpy(char* to, const char* from, I32 len, I32 count)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_REPEATCPY \
+ assert(to); assert(from)
+
+PERL_CALLCONV char* Perl_rninstr(const char* big, const char* bigend, const char* little, const char* lend)
+ __attribute__pure__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3)
+ __attribute__nonnull__(4);
+#define PERL_ARGS_ASSERT_RNINSTR \
+ assert(big); assert(bigend); assert(little); assert(lend)
+
+PERL_CALLCONV Sighandler_t Perl_rsignal(pTHX_ int i, Sighandler_t t);
+PERL_CALLCONV int Perl_rsignal_restore(pTHX_ int i, Sigsave_t* t);
+PERL_CALLCONV int Perl_rsignal_save(pTHX_ int i, Sighandler_t t1, Sigsave_t* save)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_RSIGNAL_SAVE \
+ assert(save)
+
+PERL_CALLCONV Sighandler_t Perl_rsignal_state(pTHX_ int i);
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+STATIC void S_rxres_free(pTHX_ void** rsp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_RXRES_FREE \
+ assert(rsp)
+
+STATIC void S_rxres_restore(pTHX_ void **rsp, REGEXP *rx)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_RXRES_RESTORE \
+ assert(rsp); assert(rx)
+
+#endif
+PERL_CALLCONV void Perl_rxres_save(pTHX_ void **rsp, REGEXP *rx)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_RXRES_SAVE \
+ assert(rsp); assert(rx)
+
+#if !defined(HAS_RENAME)
+PERL_CALLCONV I32 Perl_same_dirent(pTHX_ const char* a, const char* b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SAME_DIRENT \
+ assert(a); assert(b)
+
+#endif
+PERL_CALLCONV char* Perl_savepv(pTHX_ const char* pv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV char* Perl_savepvn(pTHX_ const char* pv, I32 len)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV char* Perl_savesharedpv(pTHX_ const char* pv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV char* Perl_savesharedpvn(pTHX_ const char *const pv, const STRLEN len)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVESHAREDPVN \
+ assert(pv)
+
+PERL_CALLCONV char* Perl_savesvpv(pTHX_ SV* sv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVESVPV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_savestack_grow(pTHX);
+PERL_CALLCONV void Perl_savestack_grow_cnt(pTHX_ I32 need);
+/* PERL_CALLCONV void Perl_save_aelem(pTHX_ AV* av, I32 idx, SV **sptr)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3); */
+
+PERL_CALLCONV void Perl_save_aelem_flags(pTHX_ AV* av, I32 idx, SV **sptr, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SAVE_AELEM_FLAGS \
+ assert(av); assert(sptr)
+
+PERL_CALLCONV I32 Perl_save_alloc(pTHX_ I32 size, I32 pad);
+PERL_CALLCONV void Perl_save_aptr(pTHX_ AV** aptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_APTR \
+ assert(aptr)
+
+PERL_CALLCONV AV* Perl_save_ary(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_ARY \
+ assert(gv)
+
+PERL_CALLCONV void Perl_save_bool(pTHX_ bool* boolp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_BOOL \
+ assert(boolp)
+
+PERL_CALLCONV void Perl_save_clearsv(pTHX_ SV** svp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_CLEARSV \
+ assert(svp)
+
+PERL_CALLCONV void Perl_save_delete(pTHX_ HV *hv, char *key, I32 klen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SAVE_DELETE \
+ assert(hv); assert(key)
+
+PERL_CALLCONV void Perl_save_hdelete(pTHX_ HV *hv, SV *keysv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SAVE_HDELETE \
+ assert(hv); assert(keysv)
+
+PERL_CALLCONV void Perl_save_adelete(pTHX_ AV *av, I32 key)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_ADELETE \
+ assert(av)
+
+PERL_CALLCONV void Perl_save_destructor(pTHX_ DESTRUCTORFUNC_NOCONTEXT_t f, void* p)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SAVE_DESTRUCTOR \
+ assert(p)
+
+PERL_CALLCONV void Perl_save_destructor_x(pTHX_ DESTRUCTORFUNC_t f, void* p);
+/* PERL_CALLCONV void Perl_save_freesv(pTHX_ SV* sv); */
+/* PERL_CALLCONV void Perl_save_freeop(pTHX_ OP* o); */
+/* PERL_CALLCONV void Perl_save_freepv(pTHX_ char* pv); */
+PERL_CALLCONV void Perl_save_generic_svref(pTHX_ SV** sptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF \
+ assert(sptr)
+
+PERL_CALLCONV void Perl_save_generic_pvref(pTHX_ char** str)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF \
+ assert(str)
+
+PERL_CALLCONV void Perl_save_shared_pvref(pTHX_ char** str)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_SHARED_PVREF \
+ assert(str)
+
+PERL_CALLCONV void Perl_save_gp(pTHX_ GV* gv, I32 empty)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_GP \
+ assert(gv)
+
+PERL_CALLCONV HV* Perl_save_hash(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_HASH \
+ assert(gv)
+
+PERL_CALLCONV void Perl_save_hints(pTHX);
+/* PERL_CALLCONV void Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3); */
+
+PERL_CALLCONV void Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS \
+ assert(hv); assert(key); assert(sptr)
+
+PERL_CALLCONV void Perl_save_hptr(pTHX_ HV** hptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_HPTR \
+ assert(hptr)
+
+PERL_CALLCONV void Perl_save_I16(pTHX_ I16* intp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_I16 \
+ assert(intp)
+
+PERL_CALLCONV void Perl_save_I32(pTHX_ I32* intp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_I32 \
+ assert(intp)
+
+PERL_CALLCONV void Perl_save_I8(pTHX_ I8* bytep)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_I8 \
+ assert(bytep)
+
+PERL_CALLCONV void Perl_save_int(pTHX_ int* intp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_INT \
+ assert(intp)
+
+PERL_CALLCONV void Perl_save_item(pTHX_ SV* item)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_ITEM \
+ assert(item)
+
+PERL_CALLCONV void Perl_save_iv(pTHX_ IV *ivp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_IV \
+ assert(ivp)
+
+PERL_CALLCONV void Perl_save_list(pTHX_ SV** sarg, I32 maxsarg)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_LIST \
+ assert(sarg)
+
+PERL_CALLCONV void Perl_save_long(pTHX_ long* longp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_LONG \
+ assert(longp)
+
+/* PERL_CALLCONV void Perl_save_mortalizesv(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SAVE_MORTALIZESV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_save_nogv(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_NOGV \
+ assert(gv)
+
+/* PERL_CALLCONV void Perl_save_op(pTHX); */
+PERL_CALLCONV SV* Perl_save_scalar(pTHX_ GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_SCALAR \
+ assert(gv)
+
+PERL_CALLCONV void Perl_save_pptr(pTHX_ char** pptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_PPTR \
+ assert(pptr)
+
+PERL_CALLCONV void Perl_save_vptr(pTHX_ void *ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_VPTR \
+ assert(ptr)
+
+PERL_CALLCONV void Perl_save_re_context(pTHX);
+PERL_CALLCONV void Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off);
+PERL_CALLCONV void Perl_save_sptr(pTHX_ SV** sptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_SPTR \
+ assert(sptr)
+
+PERL_CALLCONV SV* Perl_save_svref(pTHX_ SV** sptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_SVREF \
+ assert(sptr)
+
+PERL_CALLCONV void Perl_save_pushptr(pTHX_ void *const ptr, const int type);
+PERL_CALLCONV void Perl_save_pushi32ptr(pTHX_ const I32 i, void *const ptr, const int type);
+PERL_CALLCONV void Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type);
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+STATIC void S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2, const int type);
+#endif
+PERL_CALLCONV OP* Perl_sawparens(pTHX_ OP* o);
+PERL_CALLCONV OP* Perl_scalar(pTHX_ OP* o);
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_scalarkids(pTHX_ OP* o);
+STATIC OP* S_scalarseq(pTHX_ OP* o);
+#endif
+PERL_CALLCONV OP* Perl_scalarvoid(pTHX_ OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCALARVOID \
+ assert(o)
+
+PERL_CALLCONV NV Perl_scan_bin(pTHX_ const char* start, STRLEN len, STRLEN* retlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SCAN_BIN \
+ assert(start); assert(retlen)
+
+PERL_CALLCONV NV Perl_scan_hex(pTHX_ const char* start, STRLEN len, STRLEN* retlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SCAN_HEX \
+ assert(start); assert(retlen)
+
+PERL_CALLCONV char* Perl_scan_num(pTHX_ const char* s, YYSTYPE *lvalp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SCAN_NUM \
+ assert(s); assert(lvalp)
+
+PERL_CALLCONV NV Perl_scan_oct(pTHX_ const char* start, STRLEN len, STRLEN* retlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SCAN_OCT \
+ assert(start); assert(retlen)
+
+PERL_CALLCONV OP* Perl_scope(pTHX_ OP* o);
+PERL_CALLCONV char* Perl_screaminstr(pTHX_ SV *bigstr, SV *littlestr, I32 start_shift, I32 end_shift, I32 *old_posp, I32 last)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_SCREAMINSTR \
+ assert(bigstr); assert(littlestr); assert(old_posp)
+
+PERL_CALLCONV void Perl_setdefout(pTHX_ GV* gv);
+PERL_CALLCONV HEK* Perl_share_hek(pTHX_ const char* str, I32 len, U32 hash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SHARE_HEK \
+ assert(str)
+
+#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+PERL_CALLCONV Signal_t Perl_sighandler(int sig, siginfo_t *info, void *uap);
+PERL_CALLCONV Signal_t Perl_csighandler(int sig, siginfo_t *info, void *uap);
+#else
+PERL_CALLCONV Signal_t Perl_sighandler(int sig);
+PERL_CALLCONV Signal_t Perl_csighandler(int sig);
+#endif
+PERL_CALLCONV SV** Perl_stack_grow(pTHX_ SV** sp, SV** p, int n)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_STACK_GROW \
+ assert(sp); assert(p)
+
+PERL_CALLCONV I32 Perl_start_subparse(pTHX_ I32 is_format, U32 flags);
+PERL_CALLCONV void Perl_sub_crush_depth(pTHX_ CV* cv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SUB_CRUSH_DEPTH \
+ assert(cv)
+
+PERL_CALLCONV bool Perl_sv_2bool(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2BOOL \
+ assert(sv)
+
+PERL_CALLCONV CV* Perl_sv_2cv(pTHX_ SV* sv, HV **const st, GV **const gvp, const I32 lref)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SV_2CV \
+ assert(st); assert(gvp)
+
+PERL_CALLCONV IO* Perl_sv_2io(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2IO \
+ assert(sv)
+
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC bool S_glob_2number(pTHX_ GV* const gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GLOB_2NUMBER \
+ assert(gv)
+
+#endif
+/* PERL_CALLCONV IV Perl_sv_2iv(pTHX_ SV *sv); */
+PERL_CALLCONV IV Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags);
+PERL_CALLCONV SV* Perl_sv_2mortal(pTHX_ SV *const sv);
+PERL_CALLCONV NV Perl_sv_2nv(pTHX_ SV *const sv);
+PERL_CALLCONV SV* Perl_sv_2num(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2NUM \
+ assert(sv)
+
+/* PERL_CALLCONV char* Perl_sv_2pv(pTHX_ SV *sv, STRLEN *lp); */
+PERL_CALLCONV char* Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags);
+PERL_CALLCONV char* Perl_sv_2pvutf8(pTHX_ SV *const sv, STRLEN *const lp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2PVUTF8 \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_2pvbyte(pTHX_ SV *const sv, STRLEN *const lp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2PVBYTE \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_pvn_nomg(pTHX_ SV* sv, STRLEN* lp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_PVN_NOMG \
+ assert(sv)
+
+/* PERL_CALLCONV UV Perl_sv_2uv(pTHX_ SV *sv); */
+PERL_CALLCONV UV Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags);
+PERL_CALLCONV IV Perl_sv_iv(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_IV \
+ assert(sv)
+
+PERL_CALLCONV UV Perl_sv_uv(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UV \
+ assert(sv)
+
+PERL_CALLCONV NV Perl_sv_nv(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_NV \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_PVN \
+ assert(sv); assert(lp)
+
+PERL_CALLCONV char* Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_PVUTF8N \
+ assert(sv); assert(lp)
+
+PERL_CALLCONV char* Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_PVBYTEN \
+ assert(sv); assert(lp)
+
+PERL_CALLCONV I32 Perl_sv_true(pTHX_ SV *const sv);
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC void S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_ADD_ARENA \
+ assert(ptr)
+
+#endif
+PERL_CALLCONV int Perl_sv_backoff(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_BACKOFF \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_BLESS \
+ assert(sv); assert(stash)
+
+PERL_CALLCONV void Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_CATPVF \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_VCATPVF \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_catpv(pTHX_ SV *const sv, const char* ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_CATPV \
+ assert(sv)
+
+/* PERL_CALLCONV void Perl_sv_catpvn(pTHX_ SV *dsv, const char *sstr, STRLEN len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_SV_CATPVN \
+ assert(dsv); assert(sstr)
+
+/* PERL_CALLCONV void Perl_sv_catsv(pTHX_ SV *dstr, SV *sstr)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_CATSV \
+ assert(dstr)
+
+PERL_CALLCONV void Perl_sv_chop(pTHX_ SV *const sv, const char *const ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_CHOP \
+ assert(sv)
+
+PERL_CALLCONV I32 Perl_sv_clean_all(pTHX);
+PERL_CALLCONV void Perl_sv_clean_objs(pTHX);
+PERL_CALLCONV void Perl_sv_clear(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_CLEAR \
+ assert(sv)
+
+PERL_CALLCONV I32 Perl_sv_cmp(pTHX_ SV *const sv1, SV *const sv2);
+PERL_CALLCONV I32 Perl_sv_cmp_locale(pTHX_ SV *const sv1, SV *const sv2);
+#if defined(USE_LOCALE_COLLATE)
+PERL_CALLCONV char* Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_COLLXFRM \
+ assert(sv); assert(nxp)
+
+#endif
+PERL_CALLCONV OP* Perl_sv_compile_2op(pTHX_ SV *sv, OP **startop, const char *code, PAD **padp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_SV_COMPILE_2OP \
+ assert(sv); assert(startop); assert(code); assert(padp)
+
+PERL_CALLCONV int Perl_getcwd_sv(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GETCWD_SV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_dec(pTHX_ SV *const sv);
+PERL_CALLCONV void Perl_sv_dump(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_DUMP \
+ assert(sv)
+
+PERL_CALLCONV bool Perl_sv_derived_from(pTHX_ SV* sv, const char *const name)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_DERIVED_FROM \
+ assert(sv); assert(name)
+
+PERL_CALLCONV bool Perl_sv_does(pTHX_ SV* sv, const char *const name)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_DOES \
+ assert(sv); assert(name)
+
+PERL_CALLCONV I32 Perl_sv_eq(pTHX_ SV* sv1, SV* sv2);
+PERL_CALLCONV void Perl_sv_free(pTHX_ SV *const sv);
+PERL_CALLCONV void Perl_sv_free2(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_FREE2 \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_free_arenas(pTHX);
+PERL_CALLCONV char* Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_GETS \
+ assert(sv); assert(fp)
+
+PERL_CALLCONV char* Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_GROW \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_inc(pTHX_ SV *const sv);
+/* PERL_CALLCONV void Perl_sv_insert(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_4); */
+#define PERL_ARGS_ASSERT_SV_INSERT \
+ assert(bigstr); assert(little)
+
+PERL_CALLCONV void Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_SV_INSERT_FLAGS \
+ assert(bigstr); assert(little)
+
+PERL_CALLCONV int Perl_sv_isa(pTHX_ SV* sv, const char *const name)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_ISA \
+ assert(name)
+
+PERL_CALLCONV int Perl_sv_isobject(pTHX_ SV* sv);
+PERL_CALLCONV STRLEN Perl_sv_len(pTHX_ SV *const sv);
+PERL_CALLCONV STRLEN Perl_sv_len_utf8(pTHX_ SV *const sv);
+PERL_CALLCONV void Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how, const char *const name, const I32 namlen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_MAGIC \
+ assert(sv)
+
+PERL_CALLCONV MAGIC * Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, const MGVTBL *const vtbl, const char *const name, const I32 namlen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_MAGICEXT \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_sv_mortalcopy(pTHX_ SV *const oldsv)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_sv_newmortal(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV SV* Perl_sv_newref(pTHX_ SV *const sv);
+PERL_CALLCONV char* Perl_sv_peek(pTHX_ SV* sv);
+PERL_CALLCONV void Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_POS_U2B \
+ assert(offsetp)
+
+PERL_CALLCONV STRLEN Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_POS_B2U \
+ assert(offsetp)
+
+/* PERL_CALLCONV char* Perl_sv_pvn_force(pTHX_ SV* sv, STRLEN* lp)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_PVN_FORCE \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_recode_to_utf8(pTHX_ SV* sv, SV *encoding)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8 \
+ assert(sv); assert(encoding)
+
+PERL_CALLCONV bool Perl_sv_cat_decode(pTHX_ SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_SV_CAT_DECODE \
+ assert(dsv); assert(encoding); assert(ssv); assert(offset); assert(tstr)
+
+PERL_CALLCONV const char* Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_REFTYPE \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_replace(pTHX_ SV *const sv, SV *const nsv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_REPLACE \
+ assert(sv); assert(nsv)
+
+PERL_CALLCONV void Perl_sv_report_used(pTHX);
+PERL_CALLCONV void Perl_sv_reset(pTHX_ const char* s, HV *const stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_RESET \
+ assert(s)
+
+PERL_CALLCONV void Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_SETPVF \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_VSETPVF \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_setiv(pTHX_ SV *const sv, const IV num)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETIV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setpviv(pTHX_ SV *const sv, const IV num)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETPVIV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setuv(pTHX_ SV *const sv, const UV num)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETUV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setnv(pTHX_ SV *const sv, const NV num)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETNV \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETREF_IV \
+ assert(rv)
+
+PERL_CALLCONV SV* Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETREF_UV \
+ assert(rv)
+
+PERL_CALLCONV SV* Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETREF_NV \
+ assert(rv)
+
+PERL_CALLCONV SV* Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETREF_PV \
+ assert(rv)
+
+PERL_CALLCONV SV* Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname, const char *const pv, const STRLEN n)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SV_SETREF_PVN \
+ assert(rv); assert(pv)
+
+PERL_CALLCONV void Perl_sv_setpv(pTHX_ SV *const sv, const char *const ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETPV \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setpvn(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETPVN \
+ assert(sv)
+
+/* PERL_CALLCONV void Perl_sv_setsv(pTHX_ SV *dstr, SV *sstr)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_SETSV \
+ assert(dstr)
+
+/* PERL_CALLCONV void Perl_sv_taint(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_TAINT \
+ assert(sv)
+
+PERL_CALLCONV bool Perl_sv_tainted(pTHX_ SV *const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_TAINTED \
+ assert(sv)
+
+PERL_CALLCONV int Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UNMAGIC \
+ assert(sv)
+
+/* PERL_CALLCONV void Perl_sv_unref(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_UNREF \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UNREF_FLAGS \
+ assert(ref)
+
+PERL_CALLCONV void Perl_sv_untaint(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UNTAINT \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_upgrade(pTHX_ SV *const sv, svtype new_type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UPGRADE \
+ assert(sv)
+
+/* PERL_CALLCONV void Perl_sv_usepvn(pTHX_ SV* sv, char* ptr, STRLEN len)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_USEPVN \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_usepvn_flags(pTHX_ SV *const sv, char* ptr, const STRLEN len, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_USEPVN_FLAGS \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_VCATPVFN \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_VSETPVFN \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV NV Perl_str_to_version(pTHX_ SV *sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_STR_TO_VERSION \
+ assert(sv)
+
+PERL_CALLCONV SV* Perl_swash_init(pTHX_ const char* pkg, const char* name, SV* listsv, I32 minbits, I32 none)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SWASH_INIT \
+ assert(pkg); assert(name); assert(listsv)
+
+PERL_CALLCONV UV Perl_swash_fetch(pTHX_ SV *swash, const U8 *ptr, bool do_utf8)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SWASH_FETCH \
+ assert(swash); assert(ptr)
+
+PERL_CALLCONV void Perl_taint_env(pTHX);
+PERL_CALLCONV void Perl_taint_proper(pTHX_ const char* f, const char *const s)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TAINT_PROPER \
+ assert(s)
+
+PERL_CALLCONV UV Perl_to_utf8_case(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, const char *normal, const char *special)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5)
+ __attribute__nonnull__(pTHX_6);
+#define PERL_ARGS_ASSERT_TO_UTF8_CASE \
+ assert(p); assert(ustrp); assert(swashp); assert(normal); assert(special)
+
+PERL_CALLCONV UV Perl_to_utf8_lower(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TO_UTF8_LOWER \
+ assert(p); assert(ustrp)
+
+PERL_CALLCONV UV Perl_to_utf8_upper(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TO_UTF8_UPPER \
+ assert(p); assert(ustrp)
+
+PERL_CALLCONV UV Perl_to_utf8_title(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TO_UTF8_TITLE \
+ assert(p); assert(ustrp)
+
+PERL_CALLCONV UV Perl_to_utf8_fold(pTHX_ const U8 *p, U8* ustrp, STRLEN *lenp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TO_UTF8_FOLD \
+ assert(p); assert(ustrp)
+
+#if defined(UNLINK_ALL_VERSIONS)
+PERL_CALLCONV I32 Perl_unlnk(pTHX_ const char* f)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UNLNK \
+ assert(f)
+
+#endif
+PERL_CALLCONV I32 Perl_unpack_str(pTHX_ const char *pat, const char *patend, const char *s, const char *strbeg, const char *strend, char **new_s, I32 ocnt, U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_UNPACK_STR \
+ assert(pat); assert(patend); assert(s); assert(strend)
+
+PERL_CALLCONV I32 Perl_unpackstring(pTHX_ const char *pat, const char *patend, const char *s, const char *strend, U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UNPACKSTRING \
+ assert(pat); assert(patend); assert(s); assert(strend)
+
+PERL_CALLCONV void Perl_unsharepvn(pTHX_ const char* sv, I32 len, U32 hash);
+PERL_CALLCONV void Perl_unshare_hek(pTHX_ HEK* hek);
+#ifdef PERL_MAD
+PERL_CALLCONV OP * Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UTILIZE \
+ assert(idop)
+
+#else
+PERL_CALLCONV void Perl_utilize(pTHX_ int aver, I32 floor, OP* version, OP* idop, OP* arg)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UTILIZE \
+ assert(idop)
+
+#endif
+PERL_CALLCONV U8* Perl_utf16_to_utf8(pTHX_ U8* p, U8 *d, I32 bytelen, I32 *newlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UTF16_TO_UTF8 \
+ assert(p); assert(d); assert(newlen)
+
+PERL_CALLCONV U8* Perl_utf16_to_utf8_reversed(pTHX_ U8* p, U8 *d, I32 bytelen, I32 *newlen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED \
+ assert(p); assert(d); assert(newlen)
+
+PERL_CALLCONV STRLEN Perl_utf8_length(pTHX_ const U8* s, const U8 *e)
+ __attribute__warn_unused_result__
+ __attribute__pure__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_UTF8_LENGTH \
+ assert(s); assert(e)
+
+PERL_CALLCONV IV Perl_utf8_distance(pTHX_ const U8 *a, const U8 *b)
+ __attribute__warn_unused_result__
+ __attribute__pure__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_UTF8_DISTANCE \
+ assert(a); assert(b)
+
+PERL_CALLCONV U8* Perl_utf8_hop(pTHX_ const U8 *s, I32 off)
+ __attribute__warn_unused_result__
+ __attribute__pure__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UTF8_HOP \
+ assert(s)
+
+PERL_CALLCONV U8* Perl_utf8_to_bytes(pTHX_ U8 *s, STRLEN *len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_UTF8_TO_BYTES \
+ assert(s); assert(len)
+
+PERL_CALLCONV U8* Perl_bytes_from_utf8(pTHX_ const U8 *s, STRLEN *len, bool *is_utf8)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_BYTES_FROM_UTF8 \
+ assert(s); assert(len)
+
+PERL_CALLCONV U8* Perl_bytes_to_utf8(pTHX_ const U8 *s, STRLEN *len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_BYTES_TO_UTF8 \
+ assert(s); assert(len)
+
+PERL_CALLCONV UV Perl_utf8_to_uvchr(pTHX_ const U8 *s, STRLEN *retlen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UTF8_TO_UVCHR \
+ assert(s)
+
+PERL_CALLCONV UV Perl_utf8_to_uvuni(pTHX_ const U8 *s, STRLEN *retlen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UTF8_TO_UVUNI \
+ assert(s)
+
+
+#ifdef EBCDIC
+PERL_CALLCONV UV Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \
+ assert(s)
+
+#else
+/* PERL_CALLCONV UV Perl_utf8n_to_uvchr(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_UTF8N_TO_UVCHR \
+ assert(s)
+
+#endif
+
+PERL_CALLCONV UV Perl_utf8n_to_uvuni(pTHX_ const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UTF8N_TO_UVUNI \
+ assert(s)
+
+
+#ifdef EBCDIC
+PERL_CALLCONV U8* Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8 \
+ assert(d)
+
+#else
+/* PERL_CALLCONV U8* Perl_uvchr_to_utf8(pTHX_ U8 *d, UV uv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8 \
+ assert(d)
+
+#endif
+
+/* PERL_CALLCONV U8* Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8 \
+ assert(d)
+
+PERL_CALLCONV U8* Perl_uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS \
+ assert(d)
+
+PERL_CALLCONV U8* Perl_uvuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UVUNI_TO_UTF8_FLAGS \
+ assert(d)
+
+PERL_CALLCONV char* Perl_pv_uni_display(pTHX_ SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PV_UNI_DISPLAY \
+ assert(dsv); assert(spv)
+
+PERL_CALLCONV char* Perl_sv_uni_display(pTHX_ SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_UNI_DISPLAY \
+ assert(dsv); assert(ssv)
+
+PERL_CALLCONV void Perl_vivify_defelem(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VIVIFY_DEFELEM \
+ assert(sv)
+
+PERL_CALLCONV void Perl_vivify_ref(pTHX_ SV* sv, U32 to_what)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VIVIFY_REF \
+ assert(sv)
+
+PERL_CALLCONV I32 Perl_wait4pid(pTHX_ Pid_t pid, int* statusp, int flags)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_WAIT4PID \
+ assert(statusp)
+
+PERL_CALLCONV U32 Perl_parse_unicode_opts(pTHX_ const char **popt)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS \
+ assert(popt)
+
+PERL_CALLCONV U32 Perl_seed(pTHX);
+PERL_CALLCONV UV Perl_get_hash_seed(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_report_evil_fh(pTHX_ const GV *gv, const IO *io, I32 op);
+PERL_CALLCONV void Perl_report_uninit(pTHX_ const SV *uninit_sv);
+PERL_CALLCONV void Perl_warn(pTHX_ const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_1,pTHX_2)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_WARN \
+ assert(pat)
+
+PERL_CALLCONV void Perl_vwarn(pTHX_ const char* pat, va_list* args)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VWARN \
+ assert(pat)
+
+PERL_CALLCONV void Perl_warner(pTHX_ U32 err, const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_WARNER \
+ assert(pat)
+
+PERL_CALLCONV void Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_CK_WARNER \
+ assert(pat)
+
+PERL_CALLCONV void Perl_ck_warner_d(pTHX_ U32 err, const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_CK_WARNER_D \
+ assert(pat)
+
+PERL_CALLCONV void Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_VWARNER \
+ assert(pat)
+
+PERL_CALLCONV void Perl_watch(pTHX_ char** addr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_WATCH \
+ assert(addr)
+
+PERL_CALLCONV I32 Perl_whichsig(pTHX_ const char* sig)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_WHICHSIG \
+ assert(sig)
+
+PERL_CALLCONV void Perl_write_to_stderr(pTHX_ SV* msv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_WRITE_TO_STDERR \
+ assert(msv)
+
+PERL_CALLCONV int Perl_yyerror(pTHX_ const char *const s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_YYERROR \
+ assert(s)
+
+PERL_CALLCONV int Perl_yylex(pTHX);
+PERL_CALLCONV int Perl_yyparse(pTHX);
+PERL_CALLCONV void Perl_parser_free(pTHX_ const yy_parser *parser)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PARSER_FREE \
+ assert(parser)
+
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+STATIC int S_yywarn(pTHX_ const char *const s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_YYWARN \
+ assert(s)
+
+#endif
+#if defined(MYMALLOC)
+PERL_CALLCONV void Perl_dump_mstats(pTHX_ const char* s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_MSTATS \
+ assert(s)
+
+PERL_CALLCONV int Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_MSTATS \
+ assert(buf)
+
+#endif
+PERL_CALLCONV Malloc_t Perl_safesysmalloc(MEM_SIZE nbytes)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t Perl_safesyscalloc(MEM_SIZE elements, MEM_SIZE size)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV Malloc_t Perl_safesysrealloc(Malloc_t where, MEM_SIZE nbytes)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV Free_t Perl_safesysfree(Malloc_t where);
+#if defined(PERL_GLOBAL_STRUCT)
+PERL_CALLCONV struct perl_vars * Perl_GetVars(pTHX);
+PERL_CALLCONV struct perl_vars* Perl_init_global_struct(pTHX);
+PERL_CALLCONV void Perl_free_global_struct(pTHX_ struct perl_vars *plvarsp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FREE_GLOBAL_STRUCT \
+ assert(plvarsp)
+
+#endif
+PERL_CALLCONV int Perl_runops_standard(pTHX);
+PERL_CALLCONV int Perl_runops_debug(pTHX);
+PERL_CALLCONV void Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_CATPVF_MG \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_VCATPVF_MG \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_catpv_mg(pTHX_ SV *const sv, const char *const ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_CATPV_MG \
+ assert(sv)
+
+/* PERL_CALLCONV void Perl_sv_catpvn_mg(pTHX_ SV *sv, const char *ptr, STRLEN len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2); */
+#define PERL_ARGS_ASSERT_SV_CATPVN_MG \
+ assert(sv); assert(ptr)
+
+/* PERL_CALLCONV void Perl_sv_catsv_mg(pTHX_ SV *dsv, SV *ssv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_CATSV_MG \
+ assert(dsv)
+
+PERL_CALLCONV void Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
+ __attribute__format__(__printf__,pTHX_2,pTHX_3)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_SETPVF_MG \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_VSETPVF_MG \
+ assert(sv); assert(pat)
+
+PERL_CALLCONV void Perl_sv_setiv_mg(pTHX_ SV *const sv, const IV i)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETIV_MG \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETPVIV_MG \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setuv_mg(pTHX_ SV *const sv, const UV u)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETUV_MG \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setnv_mg(pTHX_ SV *const sv, const NV num)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETNV_MG \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setpv_mg(pTHX_ SV *const sv, const char *const ptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETPV_MG \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_setpvn_mg(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_SETPVN_MG \
+ assert(sv); assert(ptr)
+
+PERL_CALLCONV void Perl_sv_setsv_mg(pTHX_ SV *const dstr, SV *const sstr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETSV_MG \
+ assert(dstr)
+
+/* PERL_CALLCONV void Perl_sv_usepvn_mg(pTHX_ SV *sv, char *ptr, STRLEN len)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_USEPVN_MG \
+ assert(sv)
+
+PERL_CALLCONV MGVTBL* Perl_get_vtbl(pTHX_ int vtbl_id)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV char* Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PV_DISPLAY \
+ assert(dsv); assert(pv)
+
+PERL_CALLCONV char* Perl_pv_escape(pTHX_ SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PV_ESCAPE \
+ assert(dsv); assert(str)
+
+PERL_CALLCONV char* Perl_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)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PV_PRETTY \
+ assert(dsv); assert(str)
+
+PERL_CALLCONV void Perl_dump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_3,pTHX_4)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DUMP_INDENT \
+ assert(file); assert(pat)
+
+PERL_CALLCONV void Perl_dump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DUMP_VINDENT \
+ assert(file); assert(pat)
+
+PERL_CALLCONV void Perl_do_gv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_GV_DUMP \
+ assert(file); assert(name)
+
+PERL_CALLCONV void Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_GVGV_DUMP \
+ assert(file); assert(name)
+
+PERL_CALLCONV void Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_HV_DUMP \
+ assert(file); assert(name)
+
+PERL_CALLCONV void Perl_do_magic_dump(pTHX_ I32 level, PerlIO *file, const MAGIC *mg, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_MAGIC_DUMP \
+ assert(file); assert(mg)
+
+PERL_CALLCONV void Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_OP_DUMP \
+ assert(file)
+
+PERL_CALLCONV void Perl_do_pmop_dump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_PMOP_DUMP \
+ assert(file)
+
+PERL_CALLCONV void Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bool dumpops, STRLEN pvlim)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_SV_DUMP \
+ assert(file)
+
+PERL_CALLCONV void Perl_magic_dump(pTHX_ const MAGIC *mg);
+PERL_CALLCONV void Perl_reginitcolors(pTHX);
+/* PERL_CALLCONV char* Perl_sv_2pv_nolen(pTHX_ SV* sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_2PV_NOLEN \
+ assert(sv)
+
+/* PERL_CALLCONV char* Perl_sv_2pvutf8_nolen(pTHX_ SV* sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_2PVUTF8_NOLEN \
+ assert(sv)
+
+/* PERL_CALLCONV char* Perl_sv_2pvbyte_nolen(pTHX_ SV* sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_2PVBYTE_NOLEN \
+ assert(sv)
+
+/* PERL_CALLCONV char* Perl_sv_pv(pTHX_ SV *sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_PV \
+ assert(sv)
+
+/* PERL_CALLCONV char* Perl_sv_pvutf8(pTHX_ SV *sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_PVUTF8 \
+ assert(sv)
+
+/* PERL_CALLCONV char* Perl_sv_pvbyte(pTHX_ SV *sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_PVBYTE \
+ assert(sv)
+
+/* PERL_CALLCONV STRLEN Perl_sv_utf8_upgrade(pTHX_ SV *sv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE \
+ assert(sv)
+
+/* PERL_CALLCONV STRLEN sv_utf8_upgrade_nomg(pTHX_ SV *sv)
+ __attribute__nonnull__(pTHX_1); */
+
+PERL_CALLCONV bool Perl_sv_utf8_downgrade(pTHX_ SV *const sv, const bool fail_ok)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_utf8_encode(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UTF8_ENCODE \
+ assert(sv)
+
+PERL_CALLCONV bool Perl_sv_utf8_decode(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UTF8_DECODE \
+ assert(sv)
+
+/* PERL_CALLCONV void Perl_sv_force_normal(pTHX_ SV *sv)
+ __attribute__nonnull__(pTHX_1); */
+#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS \
+ assert(sv)
+
+PERL_CALLCONV void Perl_tmps_grow(pTHX_ I32 n);
+PERL_CALLCONV SV* Perl_sv_rvweaken(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_RVWEAKEN \
+ assert(sv)
+
+PERL_CALLCONV int Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_KILLBACKREFS \
+ assert(sv); assert(mg)
+
+PERL_CALLCONV OP* Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block);
+PERL_CALLCONV CV* Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block);
+#ifdef PERL_MAD
+PERL_CALLCONV OP * Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+ __attribute__noreturn__;
+
+#else
+PERL_CALLCONV void Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
+ __attribute__noreturn__;
+
+#endif
+PERL_CALLCONV OP * Perl_my_attrs(pTHX_ OP *o, OP *attrs)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MY_ATTRS \
+ assert(o)
+
+#if defined(USE_ITHREADS)
+PERL_CALLCONV PERL_CONTEXT* Perl_cx_dup(pTHX_ PERL_CONTEXT* cx, I32 ix, I32 max, CLONE_PARAMS* param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_CX_DUP \
+ assert(param)
+
+PERL_CALLCONV PERL_SI* Perl_si_dup(pTHX_ PERL_SI* si, CLONE_PARAMS* param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SI_DUP \
+ assert(param)
+
+PERL_CALLCONV ANY* Perl_ss_dup(pTHX_ PerlInterpreter* proto_perl, CLONE_PARAMS* param)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SS_DUP \
+ assert(proto_perl); assert(param)
+
+PERL_CALLCONV void* Perl_any_dup(pTHX_ void* v, const PerlInterpreter* proto_perl)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_ANY_DUP \
+ assert(proto_perl)
+
+PERL_CALLCONV HE* Perl_he_dup(pTHX_ const HE* e, bool shared, CLONE_PARAMS* param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_HE_DUP \
+ assert(param)
+
+PERL_CALLCONV HEK* Perl_hek_dup(pTHX_ HEK* e, CLONE_PARAMS* param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_HEK_DUP \
+ assert(param)
+
+PERL_CALLCONV void Perl_re_dup_guts(pTHX_ const REGEXP *sstr, REGEXP *dstr, CLONE_PARAMS* param)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_RE_DUP_GUTS \
+ assert(sstr); assert(dstr); assert(param)
+
+PERL_CALLCONV PerlIO* Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_FP_DUP \
+ assert(param)
+
+PERL_CALLCONV DIR* Perl_dirp_dup(pTHX_ DIR *const dp)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV GP* Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GP_DUP \
+ assert(param)
+
+PERL_CALLCONV MAGIC* Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MG_DUP \
+ assert(param)
+
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC SV ** S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest, SSize_t items, CLONE_PARAMS *const param)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE \
+ assert(source); assert(dest); assert(param)
+
+#endif
+PERL_CALLCONV SV* Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_DUP \
+ assert(param)
+
+PERL_CALLCONV void Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_RVPV_DUP \
+ assert(dstr); assert(sstr); assert(param)
+
+PERL_CALLCONV yy_parser* Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PARSER_DUP \
+ assert(param)
+
+#endif
+PERL_CALLCONV PTR_TBL_t* Perl_ptr_table_new(pTHX)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void* Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PTR_TABLE_FETCH \
+ assert(tbl)
+
+PERL_CALLCONV void Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_PTR_TABLE_STORE \
+ assert(tbl); assert(newsv)
+
+PERL_CALLCONV void Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PTR_TABLE_SPLIT \
+ assert(tbl)
+
+PERL_CALLCONV void Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl);
+PERL_CALLCONV void Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl);
+#if defined(USE_ITHREADS)
+# if defined(HAVE_INTERP_INTERN)
+PERL_CALLCONV void Perl_sys_intern_dup(pTHX_ struct interp_intern* src, struct interp_intern* dst)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SYS_INTERN_DUP \
+ assert(src); assert(dst)
+
+# endif
+#endif
+#if defined(HAVE_INTERP_INTERN)
+PERL_CALLCONV void Perl_sys_intern_clear(pTHX);
+PERL_CALLCONV void Perl_sys_intern_init(pTHX);
+#endif
+
+PERL_CALLCONV const char * Perl_custom_op_name(pTHX_ const OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CUSTOM_OP_NAME \
+ assert(o)
+
+PERL_CALLCONV const char * Perl_custom_op_desc(pTHX_ const OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CUSTOM_OP_DESC \
+ assert(o)
+
+
+PERL_CALLCONV void Perl_sv_nosharing(pTHX_ SV *sv);
+/* PERL_CALLCONV void Perl_sv_nolocking(pTHX_ SV *sv); */
+PERL_CALLCONV bool Perl_sv_destroyable(pTHX_ SV *sv);
+#ifdef NO_MATHOMS
+/* PERL_CALLCONV void Perl_sv_nounlocking(pTHX_ SV *sv); */
+#else
+PERL_CALLCONV void Perl_sv_nounlocking(pTHX_ SV *sv);
+#endif
+PERL_CALLCONV int Perl_nothreadhook(pTHX);
+
+END_EXTERN_C
+
+#if defined(PERL_IN_DOOP_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_do_trans_simple(pTHX_ SV * const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS_SIMPLE \
+ assert(sv)
+
+STATIC I32 S_do_trans_count(pTHX_ SV * const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS_COUNT \
+ assert(sv)
+
+STATIC I32 S_do_trans_complex(pTHX_ SV * const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS_COMPLEX \
+ assert(sv)
+
+STATIC I32 S_do_trans_simple_utf8(pTHX_ SV * const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS_SIMPLE_UTF8 \
+ assert(sv)
+
+STATIC I32 S_do_trans_count_utf8(pTHX_ SV * const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS_COUNT_UTF8 \
+ assert(sv)
+
+STATIC I32 S_do_trans_complex_utf8(pTHX_ SV * const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DO_TRANS_COMPLEX_UTF8 \
+ assert(sv)
+
+#endif
+
+#if defined(PERL_IN_GV_C) || defined(PERL_DECL_PROT)
+STATIC void S_gv_init_sv(pTHX_ GV *gv, const svtype sv_type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_INIT_SV \
+ assert(gv)
+
+STATIC HV* S_gv_get_super_pkg(pTHX_ const char* name, I32 namelen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_GET_SUPER_PKG \
+ assert(name)
+
+STATIC HV* S_require_tie_mod(pTHX_ GV *gv, const char *varpv, SV* namesv, const char *methpv, const U32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_REQUIRE_TIE_MOD \
+ assert(gv); assert(varpv); assert(namesv); assert(methpv)
+
+#endif
+
+PERL_CALLCONV void* Perl_get_arena(pTHX_ const size_t arenasize, const svtype bodytype)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+
+#if defined(PERL_IN_HV_C) || defined(PERL_DECL_PROT)
+STATIC void S_hsplit(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HSPLIT \
+ assert(hv)
+
+STATIC void S_hfreeentries(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HFREEENTRIES \
+ assert(hv)
+
+STATIC I32 S_anonymise_cv(pTHX_ HEK *stash, SV *val)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_ANONYMISE_CV \
+ assert(val)
+
+STATIC HE* S_new_he(pTHX)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+STATIC HEK* S_save_hek_flags(const char *str, I32 len, U32 hash, int flags)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_SAVE_HEK_FLAGS \
+ assert(str)
+
+STATIC void S_hv_magic_check(HV *hv, bool *needs_copy, bool *needs_store)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_HV_MAGIC_CHECK \
+ assert(hv); assert(needs_copy); assert(needs_store)
+
+STATIC void S_unshare_hek_or_pvn(pTHX_ const HEK* hek, const char* str, I32 len, U32 hash);
+STATIC HEK* S_share_hek_flags(pTHX_ const char *str, I32 len, U32 hash, int flags)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SHARE_HEK_FLAGS \
+ assert(str)
+
+STATIC void S_hv_notallowed(pTHX_ int flags, const char *key, I32 klen, const char *msg)
+ __attribute__noreturn__
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_HV_NOTALLOWED \
+ assert(key); assert(msg)
+
+STATIC struct xpvhv_aux* S_hv_auxinit(HV *hv)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_HV_AUXINIT \
+ assert(hv)
+
+STATIC SV* S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, int k_flags, I32 d_flags, U32 hash);
+STATIC void S_clear_placeholders(pTHX_ HV *hv, U32 items)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CLEAR_PLACEHOLDERS \
+ assert(hv)
+
+STATIC SV * S_refcounted_he_value(pTHX_ const struct refcounted_he *he)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REFCOUNTED_HE_VALUE \
+ assert(he)
+
+#endif
+
+#if defined(PERL_IN_MG_C) || defined(PERL_DECL_PROT)
+STATIC void S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SAVE_MAGIC \
+ assert(sv)
+
+STATIC int S_magic_methpack(pTHX_ SV *sv, const MAGIC *mg, const char *meth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MAGIC_METHPACK \
+ assert(sv); assert(mg); assert(meth)
+
+STATIC int S_magic_methcall(pTHX_ SV *sv, const MAGIC *mg, const char *meth, I32 f, int n, SV *val)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MAGIC_METHCALL \
+ assert(sv); assert(mg); assert(meth)
+
+STATIC void S_restore_magic(pTHX_ const void *p);
+STATIC void S_unwind_handler_stack(pTHX_ const void *p)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_UNWIND_HANDLER_STACK \
+ assert(p)
+
+
+#endif
+
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+PERL_CALLCONV OP* Perl_ck_anoncode(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_ANONCODE \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_bitop(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_BITOP \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_concat(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_CONCAT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_defined(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_DEFINED \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_delete(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_DELETE \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_die(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_DIE \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_eof(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_EOF \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_eval(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_EVAL \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_exec(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_EXEC \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_exists(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_EXISTS \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_exit(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_EXIT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_ftst(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_FTST \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_fun(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_FUN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_glob(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_GLOB \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_grep(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_GREP \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_index(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_INDEX \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_join(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_JOIN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_lfun(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_LFUN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_listiob(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_LISTIOB \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_match(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_MATCH \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_method(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_METHOD \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_null(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_NULL \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_open(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_OPEN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_readline(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_READLINE \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_repeat(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_REPEAT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_require(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_REQUIRE \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_return(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_RETURN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_rfun(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_RFUN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_rvconst(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_RVCONST \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_sassign(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SASSIGN \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_select(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SELECT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_shift(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SHIFT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_sort(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SORT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_spair(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SPAIR \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_split(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SPLIT \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_subr(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SUBR \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_substr(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SUBSTR \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_svconst(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_SVCONST \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_trunc(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_TRUNC \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_unpack(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_UNPACK \
+ assert(o)
+
+PERL_CALLCONV OP* Perl_ck_each(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CK_EACH \
+ assert(o)
+
+STATIC bool S_is_handle_constructor(const OP *o, I32 numargs)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR \
+ assert(o)
+
+STATIC I32 S_is_list_assignment(pTHX_ const OP *o)
+ __attribute__warn_unused_result__;
+
+# ifdef USE_ITHREADS
+STATIC void S_forget_pmop(pTHX_ PMOP *const o, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORGET_PMOP \
+ assert(o)
+
+# else
+STATIC void S_forget_pmop(pTHX_ PMOP *const o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORGET_PMOP \
+ assert(o)
+
+# endif
+STATIC void S_find_and_forget_pmops(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS \
+ assert(o)
+
+STATIC void S_cop_free(pTHX_ COP *cop)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_COP_FREE \
+ assert(cop)
+
+STATIC OP* S_modkids(pTHX_ OP *o, I32 type);
+STATIC OP* S_scalarboolean(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCALARBOOLEAN \
+ assert(o)
+
+STATIC OP* S_newDEFSVOP(pTHX)
+ __attribute__warn_unused_result__;
+
+STATIC OP* S_search_const(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SEARCH_CONST \
+ assert(o)
+
+STATIC OP* S_new_logop(pTHX_ I32 type, I32 flags, OP **firstp, OP **otherp)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_NEW_LOGOP \
+ assert(firstp); assert(otherp)
+
+STATIC void S_simplify_sort(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SIMPLIFY_SORT \
+ assert(o)
+
+STATIC const char* S_gv_ename(pTHX_ GV *gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_ENAME \
+ assert(gv)
+
+STATIC bool S_scalar_mod_type(const OP *o, I32 type)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_SCALAR_MOD_TYPE \
+ assert(o)
+
+STATIC OP * S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MY_KID \
+ assert(imopsp)
+
+STATIC OP * S_dup_attrlist(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUP_ATTRLIST \
+ assert(o)
+
+STATIC void S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_APPLY_ATTRS \
+ assert(stash); assert(target)
+
+STATIC void S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_APPLY_ATTRS_MY \
+ assert(stash); assert(target); assert(imopsp)
+
+STATIC void S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_BAD_TYPE \
+ assert(t); assert(name); assert(kid)
+
+STATIC void S_no_bareword_allowed(pTHX_ const OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED \
+ assert(o)
+
+STATIC OP* S_no_fh_allowed(pTHX_ OP *o)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NO_FH_ALLOWED \
+ assert(o)
+
+STATIC OP* S_too_few_arguments(pTHX_ OP *o, const char* name)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS \
+ assert(o); assert(name)
+
+STATIC OP* S_too_many_arguments(pTHX_ OP *o, const char* name)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS \
+ assert(o); assert(name)
+
+STATIC bool S_looks_like_bool(pTHX_ const OP* o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL \
+ assert(o)
+
+STATIC OP* S_newGIVWHENOP(pTHX_ OP* cond, OP *block, I32 enter_opcode, I32 leave_opcode, PADOFFSET entertarg)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEWGIVWHENOP \
+ assert(block)
+
+STATIC OP* S_ref_array_or_hash(pTHX_ OP* cond);
+STATIC void S_process_special_blocks(pTHX_ const char *const fullname, GV *const gv, CV *const cv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS \
+ assert(fullname); assert(gv); assert(cv)
+
+#endif
+#if defined(PL_OP_SLAB_ALLOC)
+PERL_CALLCONV void* Perl_Slab_Alloc(pTHX_ size_t sz)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_Slab_Free(pTHX_ void *op)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SLAB_FREE \
+ assert(op)
+
+# if defined(PERL_DEBUG_READONLY_OPS)
+PERL_CALLCONV void Perl_pending_Slabs_to_ro(pTHX);
+PERL_CALLCONV OP * Perl_op_refcnt_inc(pTHX_ OP *o);
+PERL_CALLCONV PADOFFSET Perl_op_refcnt_dec(pTHX_ OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OP_REFCNT_DEC \
+ assert(o)
+
+# if defined(PERL_IN_OP_C)
+STATIC void S_Slab_to_rw(pTHX_ void *op)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SLAB_TO_RW \
+ assert(op)
+
+# endif
+# endif
+#endif
+
+#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
+STATIC void S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_FIND_BEGINNING \
+ assert(linestr_sv); assert(rsfp)
+
+STATIC void S_forbid_setid(pTHX_ const char flag, const bool suidscript);
+STATIC void S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_INCPUSH \
+ assert(dir)
+
+STATIC void S_incpush_use_sep(pTHX_ const char *p, STRLEN len, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_INCPUSH_USE_SEP \
+ assert(p)
+
+STATIC void S_init_interp(pTHX);
+STATIC void S_init_ids(pTHX);
+STATIC void S_init_main_stash(pTHX);
+STATIC void S_init_perllib(pTHX);
+STATIC void S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS \
+ assert(argv)
+
+STATIC void S_init_predump_symbols(pTHX);
+STATIC void S_my_exit_jump(pTHX)
+ __attribute__noreturn__;
+
+STATIC void S_nuke_stacks(pTHX);
+STATIC int S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript, PerlIO **rsfpp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_OPEN_SCRIPT \
+ assert(scriptname); assert(suidscript); assert(rsfpp)
+
+STATIC void S_usage(pTHX_ const char *name)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_USAGE \
+ assert(name)
+
+#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
+STATIC void S_validate_suid(pTHX_ PerlIO *rsfp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VALIDATE_SUID \
+ assert(rsfp)
+
+#endif
+
+STATIC void* S_parse_body(pTHX_ char **env, XSINIT_t xsinit);
+STATIC void S_run_body(pTHX_ I32 oldscope)
+ __attribute__noreturn__;
+
+STATIC SV * S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_INCPUSH_IF_EXISTS \
+ assert(av); assert(dir); assert(stem)
+
+#endif
+
+#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_do_delete_local(pTHX);
+STATIC SV* S_refto(pTHX_ SV* sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REFTO \
+ assert(sv)
+
+#endif
+#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+PERL_CALLCONV GV* Perl_softref2xv(pTHX_ SV *const sv, const char *const what, const svtype type, SV ***spp)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_SOFTREF2XV \
+ assert(sv); assert(what); assert(spp)
+
+#endif
+
+#if defined(PERL_IN_PP_PACK_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_unpack_rec(pTHX_ struct tempsym* symptr, const char *s, const char *strbeg, const char *strend, const char **new_s)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_UNPACK_REC \
+ assert(symptr); assert(s); assert(strbeg); assert(strend)
+
+STATIC SV ** S_pack_rec(pTHX_ SV *cat, struct tempsym* symptr, SV **beglist, SV **endlist)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_PACK_REC \
+ assert(cat); assert(symptr); assert(beglist); assert(endlist)
+
+STATIC SV* S_mul128(pTHX_ SV *sv, U8 m)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MUL128 \
+ assert(sv)
+
+STATIC I32 S_measure_struct(pTHX_ struct tempsym* symptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MEASURE_STRUCT \
+ assert(symptr)
+
+STATIC bool S_next_symbol(pTHX_ struct tempsym* symptr)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEXT_SYMBOL \
+ assert(symptr)
+
+STATIC SV* S_is_an_int(pTHX_ const char *s, STRLEN l)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_AN_INT \
+ assert(s)
+
+STATIC int S_div128(pTHX_ SV *pnum, bool *done)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DIV128 \
+ assert(pnum); assert(done)
+
+STATIC const char * S_group_end(pTHX_ const char *patptr, const char *patend, char ender)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GROUP_END \
+ assert(patptr); assert(patend)
+
+STATIC const char * S_get_num(pTHX_ const char *patptr, I32 *lenptr)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GET_NUM \
+ assert(patptr); assert(lenptr)
+
+STATIC bool S_need_utf8(const char *pat, const char *patend)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_NEED_UTF8 \
+ assert(pat); assert(patend)
+
+STATIC char S_first_symbol(const char *pat, const char *patend)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_FIRST_SYMBOL \
+ assert(pat); assert(patend)
+
+STATIC char * S_sv_exp_grow(pTHX_ SV *sv, STRLEN needed)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_EXP_GROW \
+ assert(sv)
+
+STATIC char * S_bytes_to_uni(const U8 *start, STRLEN len, char *dest)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_BYTES_TO_UNI \
+ assert(start); assert(dest)
+
+#endif
+
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_docatch(pTHX_ OP *o)
+ __attribute__warn_unused_result__;
+
+STATIC OP* S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **oplimit)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_DOFINDLABEL \
+ assert(o); assert(label); assert(opstack); assert(oplimit)
+
+STATIC OP* S_doparseform(pTHX_ SV *sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DOPARSEFORM \
+ assert(sv)
+
+STATIC bool S_num_overflow(NV value, I32 fldsize, I32 frcsize)
+ __attribute__warn_unused_result__;
+
+STATIC I32 S_dopoptoeval(pTHX_ I32 startingblock)
+ __attribute__warn_unused_result__;
+
+STATIC I32 S_dopoptogiven(pTHX_ I32 startingblock)
+ __attribute__warn_unused_result__;
+
+STATIC I32 S_dopoptolabel(pTHX_ const char *label)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DOPOPTOLABEL \
+ assert(label)
+
+STATIC I32 S_dopoptoloop(pTHX_ I32 startingblock)
+ __attribute__warn_unused_result__;
+
+STATIC I32 S_dopoptosub_at(pTHX_ const PERL_CONTEXT* cxstk, I32 startingblock)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DOPOPTOSUB_AT \
+ assert(cxstk)
+
+STATIC I32 S_dopoptowhen(pTHX_ I32 startingblock)
+ __attribute__warn_unused_result__;
+
+STATIC void S_save_lines(pTHX_ AV *array, SV *sv)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SAVE_LINES \
+ assert(sv)
+
+STATIC bool S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq);
+STATIC PerlIO * S_check_type_and_open(pTHX_ const char *name)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CHECK_TYPE_AND_OPEN \
+ assert(name)
+
+#ifndef PERL_DISABLE_PMC
+STATIC PerlIO * S_doopen_pm(pTHX_ const char *name, const STRLEN namelen)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DOOPEN_PM \
+ assert(name)
+
+#endif
+STATIC bool S_path_is_absolute(const char *name)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PATH_IS_ABSOLUTE \
+ assert(name)
+
+STATIC I32 S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_RUN_USER_FILTER \
+ assert(buf_sv)
+
+STATIC PMOP* S_make_matcher(pTHX_ REGEXP* re)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MAKE_MATCHER \
+ assert(re)
+
+STATIC bool S_matcher_matches_sv(pTHX_ PMOP* matcher, SV* sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MATCHER_MATCHES_SV \
+ assert(matcher); assert(sv)
+
+STATIC void S_destroy_matcher(pTHX_ PMOP* matcher)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DESTROY_MATCHER \
+ assert(matcher)
+
+STATIC OP* S_do_smartmatch(pTHX_ HV* seen_this, HV* seen_other);
+#endif
+
+#if defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+STATIC void S_do_oddball(pTHX_ HV *hash, SV **relem, SV **firstrelem)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DO_ODDBALL \
+ assert(hash); assert(relem); assert(firstrelem)
+
+STATIC SV* S_method_common(pTHX_ SV* meth, U32* hashp)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_METHOD_COMMON \
+ assert(meth)
+
+#endif
+
+#if defined(PERL_IN_PP_SORT_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_sv_ncmp(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_NCMP \
+ assert(a); assert(b)
+
+STATIC I32 S_sv_i_ncmp(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_I_NCMP \
+ assert(a); assert(b)
+
+STATIC I32 S_amagic_ncmp(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AMAGIC_NCMP \
+ assert(a); assert(b)
+
+STATIC I32 S_amagic_i_ncmp(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AMAGIC_I_NCMP \
+ assert(a); assert(b)
+
+STATIC I32 S_amagic_cmp(pTHX_ SV *const str1, SV *const str2)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AMAGIC_CMP \
+ assert(str1); assert(str2)
+
+STATIC I32 S_amagic_cmp_locale(pTHX_ SV *const str1, SV *const str2)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE \
+ assert(str1); assert(str2)
+
+STATIC I32 S_sortcv(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SORTCV \
+ assert(a); assert(b)
+
+STATIC I32 S_sortcv_xsub(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SORTCV_XSUB \
+ assert(a); assert(b)
+
+STATIC I32 S_sortcv_stacked(pTHX_ SV *const a, SV *const b)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SORTCV_STACKED \
+ assert(a); assert(b)
+
+STATIC void S_qsortsvu(pTHX_ SV** array, size_t num_elts, SVCOMPARE_t compare)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_QSORTSVU \
+ assert(compare)
+
+#endif
+
+#if defined(PERL_IN_PP_SYS_C) || defined(PERL_DECL_PROT)
+STATIC OP* S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DOFORM \
+ assert(cv); assert(gv); assert(retop)
+
+# if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
+STATIC int S_dooneliner(pTHX_ const char *cmd, const char *filename)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DOONELINER \
+ assert(cmd); assert(filename)
+
+# endif
+STATIC SV * S_space_join_names_mortal(pTHX_ char *const *array)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL \
+ assert(array)
+
+#endif
+
+#if defined(PERL_IN_REGCOMP_C) || defined(PERL_DECL_PROT)
+STATIC regnode* S_reg(pTHX_ struct RExC_state_t *pRExC_state, I32 paren, I32 *flagp, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REG \
+ assert(pRExC_state); assert(flagp)
+
+STATIC regnode* S_reganode(pTHX_ struct RExC_state_t *pRExC_state, U8 op, U32 arg)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGANODE \
+ assert(pRExC_state)
+
+STATIC regnode* S_regatom(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGATOM \
+ assert(pRExC_state); assert(flagp)
+
+STATIC regnode* S_regbranch(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, I32 first, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGBRANCH \
+ assert(pRExC_state); assert(flagp)
+
+STATIC STRLEN S_reguni(pTHX_ const struct RExC_state_t *pRExC_state, UV uv, char *s)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REGUNI \
+ assert(pRExC_state); assert(s)
+
+STATIC regnode* S_regclass(pTHX_ struct RExC_state_t *pRExC_state, U32 depth)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGCLASS \
+ assert(pRExC_state)
+
+STATIC regnode* S_reg_node(pTHX_ struct RExC_state_t *pRExC_state, U8 op)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NODE \
+ assert(pRExC_state)
+
+STATIC UV S_reg_recode(pTHX_ const char value, SV **encp)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REG_RECODE \
+ assert(encp)
+
+STATIC regnode* S_regpiece(pTHX_ struct RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGPIECE \
+ assert(pRExC_state); assert(flagp)
+
+STATIC regnode* S_reg_namedseq(pTHX_ struct RExC_state_t *pRExC_state, UV *valuep, I32 *flagp)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_NAMEDSEQ \
+ assert(pRExC_state)
+
+STATIC void S_reginsert(pTHX_ struct RExC_state_t *pRExC_state, U8 op, regnode *opnd, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REGINSERT \
+ assert(pRExC_state); assert(opnd)
+
+STATIC void S_regtail(pTHX_ struct RExC_state_t *pRExC_state, regnode *p, const regnode *val, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REGTAIL \
+ assert(pRExC_state); assert(p); assert(val)
+
+STATIC SV * S_reg_scan_name(pTHX_ struct RExC_state_t *pRExC_state, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_SCAN_NAME \
+ assert(pRExC_state)
+
+STATIC U32 S_join_exact(pTHX_ struct RExC_state_t *pRExC_state, regnode *scan, I32 *min, U32 flags, regnode *val, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_JOIN_EXACT \
+ assert(pRExC_state); assert(scan); assert(min)
+
+STATIC char * S_regwhite(struct RExC_state_t *pRExC_state, char *p)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_REGWHITE \
+ assert(pRExC_state); assert(p)
+
+STATIC char * S_nextchar(pTHX_ struct RExC_state_t *pRExC_state)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NEXTCHAR \
+ assert(pRExC_state)
+
+STATIC bool S_reg_skipcomment(pTHX_ struct RExC_state_t *pRExC_state)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REG_SKIPCOMMENT \
+ assert(pRExC_state)
+
+STATIC void S_scan_commit(pTHX_ const struct RExC_state_t *pRExC_state, struct scan_data_t *data, I32 *minlenp, int is_inf)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SCAN_COMMIT \
+ assert(pRExC_state); assert(data); assert(minlenp)
+
+STATIC void S_cl_anything(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_CL_ANYTHING \
+ assert(pRExC_state); assert(cl)
+
+STATIC int S_cl_is_anything(const struct regnode_charclass_class *cl)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_CL_IS_ANYTHING \
+ assert(cl)
+
+STATIC void S_cl_init(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_CL_INIT \
+ assert(pRExC_state); assert(cl)
+
+STATIC void S_cl_init_zero(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_CL_INIT_ZERO \
+ assert(pRExC_state); assert(cl)
+
+STATIC void S_cl_and(struct regnode_charclass_class *cl, const struct regnode_charclass_class *and_with)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_CL_AND \
+ assert(cl); assert(and_with)
+
+STATIC void S_cl_or(const struct RExC_state_t *pRExC_state, struct regnode_charclass_class *cl, const struct regnode_charclass_class *or_with)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_CL_OR \
+ assert(pRExC_state); assert(cl); assert(or_with)
+
+STATIC I32 S_study_chunk(pTHX_ struct RExC_state_t *pRExC_state, regnode **scanp, I32 *minlenp, I32 *deltap, regnode *last, struct scan_data_t *data, I32 stopparen, U8* recursed, struct regnode_charclass_class *and_withp, U32 flags, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_STUDY_CHUNK \
+ assert(pRExC_state); assert(scanp); assert(minlenp); assert(deltap); assert(last)
+
+STATIC U32 S_add_data(struct RExC_state_t *pRExC_state, U32 n, const char *s)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_ADD_DATA \
+ assert(pRExC_state); assert(s)
+
+STATIC void S_re_croak2(pTHX_ const char* pat1, const char* pat2, ...)
+ __attribute__noreturn__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_RE_CROAK2 \
+ assert(pat1); assert(pat2)
+
+STATIC I32 S_regpposixcc(pTHX_ struct RExC_state_t *pRExC_state, I32 value)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGPPOSIXCC \
+ assert(pRExC_state)
+
+STATIC void S_checkposixcc(pTHX_ struct RExC_state_t *pRExC_state)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CHECKPOSIXCC \
+ assert(pRExC_state)
+
+STATIC I32 S_make_trie(pTHX_ struct RExC_state_t *pRExC_state, regnode *startbranch, regnode *first, regnode *last, regnode *tail, U32 word_count, U32 flags, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_MAKE_TRIE \
+ assert(pRExC_state); assert(startbranch); assert(first); assert(last); assert(tail)
+
+STATIC void S_make_trie_failtable(pTHX_ struct RExC_state_t *pRExC_state, regnode *source, regnode *stclass, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MAKE_TRIE_FAILTABLE \
+ assert(pRExC_state); assert(source); assert(stclass)
+
+# ifdef DEBUGGING
+STATIC void S_regdump_extflags(pTHX_ const char *lead, const U32 flags);
+STATIC const regnode* S_dumpuntil(pTHX_ const regexp *r, const regnode *start, const regnode *node, const regnode *last, const regnode *plast, SV* sv, I32 indent, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_6);
+#define PERL_ARGS_ASSERT_DUMPUNTIL \
+ assert(r); assert(start); assert(node); assert(sv)
+
+STATIC void S_put_byte(pTHX_ SV* sv, int c)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PUT_BYTE \
+ assert(sv)
+
+STATIC void S_dump_trie(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DUMP_TRIE \
+ assert(trie); assert(revcharmap)
+
+STATIC void S_dump_trie_interim_list(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 next_alloc, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST \
+ assert(trie); assert(revcharmap)
+
+STATIC void S_dump_trie_interim_table(pTHX_ const struct _reg_trie_data *trie, HV* widecharmap, AV *revcharmap, U32 next_alloc, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE \
+ assert(trie); assert(revcharmap)
+
+STATIC U8 S_regtail_study(pTHX_ struct RExC_state_t *pRExC_state, regnode *p, const regnode *val, U32 depth)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REGTAIL_STUDY \
+ assert(pRExC_state); assert(p); assert(val)
+
+# endif
+#endif
+
+#if defined(PERL_IN_REGEXEC_C) || defined(PERL_DECL_PROT)
+STATIC I32 S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGMATCH \
+ assert(reginfo); assert(prog)
+
+STATIC I32 S_regrepeat(pTHX_ const regexp *prog, const regnode *p, I32 max, int depth)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGREPEAT \
+ assert(prog); assert(p)
+
+STATIC I32 S_regtry(pTHX_ regmatch_info *reginfo, char **startpos)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REGTRY \
+ assert(reginfo); assert(startpos)
+
+STATIC bool S_reginclass(pTHX_ const regexp *prog, const regnode *n, const U8 *p, STRLEN *lenp, bool do_utf8sv_is_utf8)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_REGINCLASS \
+ assert(n); assert(p)
+
+STATIC CHECKPOINT S_regcppush(pTHX_ I32 parenfloor);
+STATIC char* S_regcppop(pTHX_ const regexp *rex)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_REGCPPOP \
+ assert(rex)
+
+STATIC U8* S_reghop3(U8 *s, I32 off, const U8 *lim)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_REGHOP3 \
+ assert(s); assert(lim)
+
+#ifdef XXX_dmq
+STATIC U8* S_reghop4(U8 *s, I32 off, const U8 *llim, const U8 *rlim)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3)
+ __attribute__nonnull__(4);
+#define PERL_ARGS_ASSERT_REGHOP4 \
+ assert(s); assert(llim); assert(rlim)
+
+#endif
+STATIC U8* S_reghopmaybe3(U8 *s, I32 off, const U8 *lim)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_REGHOPMAYBE3 \
+ assert(s); assert(lim)
+
+STATIC char* S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s, const char *strend, regmatch_info *reginfo)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_FIND_BYCLASS \
+ assert(prog); assert(c); assert(s); assert(strend)
+
+STATIC void S_to_utf8_substr(pTHX_ regexp * prog)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_TO_UTF8_SUBSTR \
+ assert(prog)
+
+STATIC void S_to_byte_substr(pTHX_ regexp * prog)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_TO_BYTE_SUBSTR \
+ assert(prog)
+
+STATIC I32 S_reg_check_named_buff_matched(pTHX_ const regexp *rex, const regnode *scan)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED \
+ assert(rex); assert(scan)
+
+# ifdef DEBUGGING
+STATIC void S_dump_exec_pos(pTHX_ const char *locinput, const regnode *scan, const char *loc_regeol, const char *loc_bostr, const char *loc_reg_starttry, const bool do_utf8)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_DUMP_EXEC_POS \
+ assert(locinput); assert(scan); assert(loc_regeol); assert(loc_bostr); assert(loc_reg_starttry)
+
+STATIC void S_debug_start_match(pTHX_ const REGEXP *prog, const bool do_utf8, const char *start, const char *end, const char *blurb)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_DEBUG_START_MATCH \
+ assert(prog); assert(start); assert(end); assert(blurb)
+
+# endif
+#endif
+
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+STATIC CV* S_deb_curcv(pTHX_ const I32 ix);
+STATIC void S_debprof(pTHX_ const OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DEBPROF \
+ assert(o)
+
+STATIC void S_sequence(pTHX_ const OP *o);
+STATIC void S_sequence_tail(pTHX_ const OP *o);
+STATIC UV S_sequence_num(pTHX_ const OP *o);
+STATIC SV* S_pm_description(pTHX_ const PMOP *pm)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PM_DESCRIPTION \
+ assert(pm)
+
+#endif
+
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+STATIC SV* S_save_scalar_at(pTHX_ SV **sptr, const U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_SCALAR_AT \
+ assert(sptr)
+
+#endif
+
+#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+PERL_CALLCONV void Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_ADD_BACKREF \
+ assert(tsv); assert(sv)
+
+#endif
+
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+PERL_CALLCONV int Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_KILL_BACKREFS \
+ assert(sv); assert(av)
+
+#endif
+
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC char * S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(5);
+#define PERL_ARGS_ASSERT_UIV_2BUF \
+ assert(buf); assert(peob)
+
+STATIC void S_sv_unglob(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UNGLOB \
+ assert(sv)
+
+STATIC void S_not_a_number(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NOT_A_NUMBER \
+ assert(sv)
+
+STATIC I32 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_VISIT \
+ assert(f)
+
+STATIC void S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_DEL_BACKREF \
+ assert(tsv); assert(sv)
+
+STATIC SV * S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ, const SV *const keyname, I32 aindex, int subscript_type)
+ __attribute__warn_unused_result__;
+
+# ifdef DEBUGGING
+STATIC void S_del_sv(pTHX_ SV *p)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DEL_SV \
+ assert(p)
+
+# endif
+# if !defined(NV_PRESERVES_UV)
+# ifdef DEBUGGING
+STATIC int S_sv_2iuv_non_preserve(pTHX_ SV *const sv, I32 numtype)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \
+ assert(sv)
+
+# else
+STATIC int S_sv_2iuv_non_preserve(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE \
+ assert(sv)
+
+# endif
+# endif
+STATIC I32 S_expect_number(pTHX_ char **const pattern)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_EXPECT_NUMBER \
+ assert(pattern)
+
+#
+STATIC STRLEN S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send, STRLEN uoffset)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS \
+ assert(start); assert(send)
+
+STATIC STRLEN S_sv_pos_u2b_midway(const U8 *const start, const U8 *send, const STRLEN uoffset, const STRLEN uend)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY \
+ assert(start); assert(send)
+
+STATIC STRLEN S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start, const U8 *const send, const STRLEN uoffset, STRLEN uoffset0, STRLEN boffset0)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_SV_POS_U2B_CACHED \
+ assert(sv); assert(mgp); assert(start); assert(send)
+
+STATIC void S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte, const STRLEN utf8, const STRLEN blen)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE \
+ assert(sv); assert(mgp)
+
+STATIC STRLEN S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target, const U8 *end, STRLEN endu)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY \
+ assert(s); assert(target); assert(end)
+
+STATIC char * S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_F0CONVERT \
+ assert(endbuf); assert(len)
+
+# if defined(PERL_OLD_COPY_ON_WRITE)
+STATIC void S_sv_release_COW(pTHX_ SV *sv, const char *pvx, SV *after)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SV_RELEASE_COW \
+ assert(sv); assert(pvx); assert(after)
+
+# endif
+STATIC SV * S_more_sv(pTHX);
+STATIC void * S_more_bodies(pTHX_ const svtype sv_type);
+STATIC bool S_sv_2iuv_common(pTHX_ SV *const sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_2IUV_COMMON \
+ assert(sv)
+
+STATIC void S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB \
+ assert(dstr); assert(sstr)
+
+STATIC void S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_GLOB_ASSIGN_REF \
+ assert(dstr); assert(sstr)
+
+STATIC PTR_TBL_ENT_t * S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PTR_TABLE_FIND \
+ assert(tbl)
+
+#endif
+
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+STATIC void S_check_uni(pTHX);
+STATIC void S_force_next(pTHX_ I32 type);
+STATIC char* S_force_version(pTHX_ char *s, int guessing)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORCE_VERSION \
+ assert(s)
+
+STATIC char* S_force_strict_version(pTHX_ char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORCE_STRICT_VERSION \
+ assert(s)
+
+STATIC char* S_force_word(pTHX_ char *start, int token, int check_keyword, int allow_pack, int allow_tick)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORCE_WORD \
+ assert(start)
+
+STATIC SV* S_tokeq(pTHX_ SV *sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_TOKEQ \
+ assert(sv)
+
+STATIC void S_readpipe_override(pTHX);
+STATIC char* S_scan_const(pTHX_ char *start)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_CONST \
+ assert(start)
+
+STATIC char* S_scan_formline(pTHX_ char *s)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_FORMLINE \
+ assert(s)
+
+STATIC char* S_scan_heredoc(pTHX_ char *s)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_HEREDOC \
+ assert(s)
+
+STATIC char* S_scan_ident(pTHX_ char *s, const char *send, char *dest, STRLEN destlen, I32 ck_uni)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_SCAN_IDENT \
+ assert(s); assert(send); assert(dest)
+
+STATIC char* S_scan_inputsymbol(pTHX_ char *start)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL \
+ assert(start)
+
+STATIC char* S_scan_pat(pTHX_ char *start, I32 type)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_PAT \
+ assert(start)
+
+STATIC char* S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_STR \
+ assert(start)
+
+STATIC char* S_scan_subst(pTHX_ char *start)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_SUBST \
+ assert(start)
+
+STATIC char* S_scan_trans(pTHX_ char *start)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SCAN_TRANS \
+ assert(start)
+
+STATIC char* S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow_package, STRLEN *slp)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_SCAN_WORD \
+ assert(s); assert(dest); assert(slp)
+
+STATIC void S_update_debugger_info(pTHX_ SV *orig_sv, const char *const buf, STRLEN len);
+STATIC char* S_skipspace(pTHX_ char *s)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SKIPSPACE \
+ assert(s)
+
+STATIC char* S_swallow_bom(pTHX_ U8 *s)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SWALLOW_BOM \
+ assert(s)
+
+#ifndef PERL_NO_UTF16_FILTER
+STATIC I32 S_utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_UTF16_TEXTFILTER \
+ assert(sv)
+
+STATIC U8* S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_ADD_UTF16_TEXTFILTER \
+ assert(s)
+
+#endif
+STATIC void S_checkcomma(pTHX_ const char *s, const char *name, const char *what)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_CHECKCOMMA \
+ assert(s); assert(name); assert(what)
+
+STATIC bool S_feature_is_enabled(pTHX_ const char *const name, STRLEN namelen)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FEATURE_IS_ENABLED \
+ assert(name)
+
+STATIC void S_force_ident(pTHX_ const char *s, int kind)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FORCE_IDENT \
+ assert(s)
+
+STATIC void S_incline(pTHX_ const char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_INCLINE \
+ assert(s)
+
+STATIC int S_intuit_method(pTHX_ char *s, GV *gv, CV *cv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_INTUIT_METHOD \
+ assert(s)
+
+STATIC int S_intuit_more(pTHX_ char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_INTUIT_MORE \
+ assert(s)
+
+STATIC I32 S_lop(pTHX_ I32 f, int x, char *s)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_LOP \
+ assert(s)
+
+STATIC void S_missingterm(pTHX_ char *s)
+ __attribute__noreturn__;
+
+STATIC void S_no_op(pTHX_ const char *const what, char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_NO_OP \
+ assert(what)
+
+STATIC I32 S_sublex_done(pTHX)
+ __attribute__warn_unused_result__;
+
+STATIC I32 S_sublex_push(pTHX)
+ __attribute__warn_unused_result__;
+
+STATIC I32 S_sublex_start(pTHX)
+ __attribute__warn_unused_result__;
+
+STATIC char * S_filter_gets(pTHX_ SV *sv, STRLEN append)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FILTER_GETS \
+ assert(sv)
+
+STATIC HV * S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_FIND_IN_MY_STASH \
+ assert(pkgname)
+
+STATIC char * S_tokenize_use(pTHX_ int is_use, char *s)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TOKENIZE_USE \
+ assert(s)
+
+STATIC SV* S_new_constant(pTHX_ const char *s, STRLEN len, const char *key, STRLEN keylen, SV *sv, SV *pv, const char *type, STRLEN typelen)
+ __attribute__nonnull__(pTHX_3)
+ __attribute__nonnull__(pTHX_5);
+#define PERL_ARGS_ASSERT_NEW_CONSTANT \
+ assert(key); assert(sv)
+
+STATIC int S_deprecate_commaless_var_list(pTHX);
+STATIC int S_ao(pTHX_ int toketype);
+# if defined(PERL_CR_FILTER)
+STATIC I32 S_cr_textfilter(pTHX_ int idx, SV *sv, int maxlen);
+STATIC void S_strip_return(pTHX_ SV *sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_STRIP_RETURN \
+ assert(sv)
+
+# endif
+# if defined(DEBUGGING)
+STATIC int S_tokereport(pTHX_ I32 rv, const YYSTYPE* lvalp)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_TOKEREPORT \
+ assert(lvalp)
+
+STATIC void S_printbuf(pTHX_ const char *const fmt, const char *const s)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PRINTBUF \
+ assert(fmt); assert(s)
+
+# endif
+#endif
+
+#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
+STATIC bool S_isa_lookup(pTHX_ HV *stash, const char * const name)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_ISA_LOOKUP \
+ assert(stash); assert(name)
+
+STATIC HV * S_get_isa_hash(pTHX_ HV *const stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_ISA_HASH \
+ assert(stash)
+
+#endif
+
+#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
+#if defined(USE_LOCALE_NUMERIC) || defined(USE_LOCALE_COLLATE)
+STATIC char* S_stdize_locale(pTHX_ char* locs)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_STDIZE_LOCALE \
+ assert(locs)
+
+#endif
+#endif
+
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+STATIC const COP* S_closest_cop(pTHX_ const COP *cop, const OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_CLOSEST_COP \
+ assert(cop)
+
+STATIC SV* S_mess_alloc(pTHX);
+STATIC SV * S_vdie_croak_common(pTHX_ const char *pat, va_list *args);
+STATIC bool S_vdie_common(pTHX_ SV *message, bool warn);
+STATIC char * S_write_no_mem(pTHX)
+ __attribute__noreturn__;
+
+#if defined(PERL_MEM_LOG) && !defined(PERL_MEM_LOG_NOIMPL)
+STATIC void S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesize, const char *type_name, const SV *sv, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname)
+ __attribute__nonnull__(4)
+ __attribute__nonnull__(8)
+ __attribute__nonnull__(10);
+#define PERL_ARGS_ASSERT_MEM_LOG_COMMON \
+ assert(type_name); assert(filename); assert(funcname)
+
+#endif
+#endif
+
+#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
+STATIC NV S_mulexp10(NV value, I32 exponent);
+#endif
+
+#if defined(PERL_IN_UTF8_C) || defined(PERL_DECL_PROT)
+STATIC STRLEN S_is_utf8_char_slow(const U8 *s, const STRLEN len)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_IS_UTF8_CHAR_SLOW \
+ assert(s)
+
+STATIC bool S_is_utf8_common(pTHX_ const U8 *const p, SV **swash, const char * const swashname)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_IS_UTF8_COMMON \
+ assert(p); assert(swash); assert(swashname)
+
+STATIC SV* S_swash_get(pTHX_ SV* swash, UV start, UV span)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SWASH_GET \
+ assert(swash)
+
+#endif
+
+START_EXTERN_C
+
+PERL_CALLCONV void Perl_sv_setsv_flags(pTHX_ SV *dstr, SV *sstr, const I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_SETSV_FLAGS \
+ assert(dstr)
+
+PERL_CALLCONV void Perl_sv_catpvn_flags(pTHX_ SV *const dstr, const char *sstr, const STRLEN len, const I32 flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_CATPVN_FLAGS \
+ assert(dstr); assert(sstr)
+
+PERL_CALLCONV void Perl_sv_catsv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_CATSV_FLAGS \
+ assert(dsv)
+
+/* PERL_CALLCONV STRLEN Perl_sv_utf8_upgrade_flags(pTHX_ SV *const sv, const I32 flags)
+ __attribute__nonnull__(pTHX_1); */
+
+PERL_CALLCONV STRLEN Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extra)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW \
+ assert(sv)
+
+PERL_CALLCONV char* Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS \
+ assert(sv)
+
+PERL_CALLCONV void Perl_sv_copypv(pTHX_ SV *const dsv, SV *const ssv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_COPYPV \
+ assert(dsv); assert(ssv)
+
+PERL_CALLCONV char* Perl_my_atof2(pTHX_ const char *s, NV* value)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MY_ATOF2 \
+ assert(s); assert(value)
+
+PERL_CALLCONV int Perl_my_socketpair(int family, int type, int protocol, int fd[2]);
+PERL_CALLCONV int Perl_my_dirfd(pTHX_ DIR* dir);
+#ifdef PERL_OLD_COPY_ON_WRITE
+PERL_CALLCONV SV* Perl_sv_setsv_cow(pTHX_ SV* dstr, SV* sstr)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_SETSV_COW \
+ assert(sstr)
+
+#endif
+
+PERL_CALLCONV const char * Perl_PerlIO_context_layers(pTHX_ const char *mode);
+
+#if defined(USE_PERLIO) && !defined(USE_SFIO)
+PERL_CALLCONV int Perl_PerlIO_close(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_fill(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_fileno(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_eof(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_error(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_flush(pTHX_ PerlIO *f);
+PERL_CALLCONV void Perl_PerlIO_clearerr(pTHX_ PerlIO *f);
+PERL_CALLCONV void Perl_PerlIO_set_cnt(pTHX_ PerlIO *f, int cnt);
+PERL_CALLCONV void Perl_PerlIO_set_ptrcnt(pTHX_ PerlIO *f, STDCHAR *ptr, int cnt);
+PERL_CALLCONV void Perl_PerlIO_setlinebuf(pTHX_ PerlIO *f);
+PERL_CALLCONV SSize_t Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PERLIO_READ \
+ assert(vbuf)
+
+PERL_CALLCONV SSize_t Perl_PerlIO_write(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PERLIO_WRITE \
+ assert(vbuf)
+
+PERL_CALLCONV SSize_t Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PERLIO_UNREAD \
+ assert(vbuf)
+
+PERL_CALLCONV Off_t Perl_PerlIO_tell(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_seek(pTHX_ PerlIO *f, Off_t offset, int whence);
+
+PERL_CALLCONV STDCHAR * Perl_PerlIO_get_base(pTHX_ PerlIO *f);
+PERL_CALLCONV STDCHAR * Perl_PerlIO_get_ptr(pTHX_ PerlIO *f);
+PERL_CALLCONV int Perl_PerlIO_get_bufsiz(pTHX_ PerlIO *f)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV int Perl_PerlIO_get_cnt(pTHX_ PerlIO *f)
+ __attribute__warn_unused_result__;
+
+
+PERL_CALLCONV PerlIO * Perl_PerlIO_stdin(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV PerlIO * Perl_PerlIO_stdout(pTHX)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV PerlIO * Perl_PerlIO_stderr(pTHX)
+ __attribute__warn_unused_result__;
+
+#endif /* PERLIO_LAYERS */
+
+PERL_CALLCONV void Perl_deb_stack_all(pTHX);
+#if defined(PERL_IN_DEB_C) || defined(PERL_DECL_PROT)
+STATIC void S_deb_stack_n(pTHX_ SV** stack_base, I32 stack_min, I32 stack_max, I32 mark_min, I32 mark_max)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DEB_STACK_N \
+ assert(stack_base)
+
+#endif
+
+PERL_CALLCONV PADLIST* Perl_pad_new(pTHX_ int flags)
+ __attribute__malloc__
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_pad_undef(pTHX_ CV* cv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_UNDEF \
+ assert(cv)
+
+PERL_CALLCONV PADOFFSET Perl_pad_add_name(pTHX_ const char *name, const STRLEN len, const U32 flags, HV *typestash, HV *ourstash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_ADD_NAME \
+ assert(name)
+
+PERL_CALLCONV PADOFFSET Perl_pad_add_anon(pTHX_ SV* sv, OPCODE op_type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_ADD_ANON \
+ assert(sv)
+
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+STATIC void S_pad_check_dup(pTHX_ SV *name, const U32 flags, const HV *ourstash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_CHECK_DUP \
+ assert(name)
+
+#endif
+#ifdef DEBUGGING
+PERL_CALLCONV void Perl_pad_setsv(pTHX_ PADOFFSET po, SV* sv)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_PAD_SETSV \
+ assert(sv)
+
+#endif
+PERL_CALLCONV void Perl_pad_block_start(pTHX_ int full);
+PERL_CALLCONV void Perl_pad_tidy(pTHX_ padtidy_type type);
+PERL_CALLCONV void Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_DUMP_PAD \
+ assert(file)
+
+PERL_CALLCONV void Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_PAD_FIXUP_INNER_ANONS \
+ assert(padlist); assert(old_cv); assert(new_cv)
+
+
+PERL_CALLCONV void Perl_pad_push(pTHX_ PADLIST *padlist, int depth)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_PUSH \
+ assert(padlist)
+
+PERL_CALLCONV HV* Perl_pad_compname_type(pTHX_ const PADOFFSET po)
+ __attribute__warn_unused_result__;
+
+
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+STATIC PADOFFSET S_pad_findlex(pTHX_ const char *name, const CV* cv, U32 seq, int warn, SV** out_capture, SV** out_name_sv, int *out_flags)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_6)
+ __attribute__nonnull__(pTHX_7);
+#define PERL_ARGS_ASSERT_PAD_FINDLEX \
+ assert(name); assert(cv); assert(out_name_sv); assert(out_flags)
+
+STATIC PADOFFSET S_pad_add_name_sv(pTHX_ SV *namesv, const U32 flags, HV *typestash, HV *ourstash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_PAD_ADD_NAME_SV \
+ assert(namesv)
+
+# if defined(DEBUGGING)
+STATIC void S_cv_dump(pTHX_ const CV *cv, const char *title)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_CV_DUMP \
+ assert(cv); assert(title)
+
+# endif
+#endif
+PERL_CALLCONV CV* Perl_find_runcv(pTHX_ U32 *db_seqp)
+ __attribute__warn_unused_result__;
+
+PERL_CALLCONV void Perl_free_tied_hv_pool(pTHX);
+#if defined(DEBUGGING)
+PERL_CALLCONV int Perl_get_debug_opts(pTHX_ const char **s, bool givehelp)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GET_DEBUG_OPTS \
+ assert(s)
+
+#endif
+PERL_CALLCONV void Perl_save_set_svflags(pTHX_ SV *sv, U32 mask, U32 val)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SAVE_SET_SVFLAGS \
+ assert(sv)
+
+#ifdef DEBUGGING
+PERL_CALLCONV void Perl_hv_assert(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_ASSERT \
+ assert(hv)
+
+#endif
+
+PERL_CALLCONV SV* Perl_hv_scalar(pTHX_ HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_SCALAR \
+ assert(hv)
+
+PERL_CALLCONV I32* Perl_hv_riter_p(pTHX_ HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_RITER_P \
+ assert(hv)
+
+PERL_CALLCONV HE** Perl_hv_eiter_p(pTHX_ HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_EITER_P \
+ assert(hv)
+
+PERL_CALLCONV void Perl_hv_riter_set(pTHX_ HV *hv, I32 riter)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_RITER_SET \
+ assert(hv)
+
+PERL_CALLCONV void Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_EITER_SET \
+ assert(hv)
+
+PERL_CALLCONV void Perl_hv_name_set(pTHX_ HV *hv, const char *name, U32 len, U32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_NAME_SET \
+ assert(hv)
+
+PERL_CALLCONV AV** Perl_hv_backreferences_p(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_BACKREFERENCES_P \
+ assert(hv)
+
+#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+PERL_CALLCONV void Perl_hv_kill_backrefs(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_KILL_BACKREFS \
+ assert(hv)
+
+#endif
+PERL_CALLCONV void Perl_hv_clear_placeholders(pTHX_ HV *hv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_CLEAR_PLACEHOLDERS \
+ assert(hv)
+
+PERL_CALLCONV I32* Perl_hv_placeholders_p(pTHX_ HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_P \
+ assert(hv)
+
+PERL_CALLCONV I32 Perl_hv_placeholders_get(pTHX_ const HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_GET \
+ assert(hv)
+
+PERL_CALLCONV void Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_HV_PLACEHOLDERS_SET \
+ assert(hv)
+
+
+PERL_CALLCONV SV* Perl_magic_scalarpack(pTHX_ HV *hv, MAGIC *mg)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MAGIC_SCALARPACK \
+ assert(hv); assert(mg)
+
+
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+STATIC SV * S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT \
+ assert(val)
+
+STATIC I32 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT \
+ assert(val)
+
+STATIC SV* S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv, bool top);
+#endif
+
+#ifdef PERL_NEED_MY_HTOLE16
+PERL_CALLCONV U16 Perl_my_htole16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_LETOH16
+PERL_CALLCONV U16 Perl_my_letoh16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_HTOBE16
+PERL_CALLCONV U16 Perl_my_htobe16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_BETOH16
+PERL_CALLCONV U16 Perl_my_betoh16(U16 n);
+#endif
+#ifdef PERL_NEED_MY_HTOLE32
+PERL_CALLCONV U32 Perl_my_htole32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_LETOH32
+PERL_CALLCONV U32 Perl_my_letoh32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_HTOBE32
+PERL_CALLCONV U32 Perl_my_htobe32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_BETOH32
+PERL_CALLCONV U32 Perl_my_betoh32(U32 n);
+#endif
+#ifdef PERL_NEED_MY_HTOLE64
+PERL_CALLCONV U64 Perl_my_htole64(U64 n);
+#endif
+#ifdef PERL_NEED_MY_LETOH64
+PERL_CALLCONV U64 Perl_my_letoh64(U64 n);
+#endif
+#ifdef PERL_NEED_MY_HTOBE64
+PERL_CALLCONV U64 Perl_my_htobe64(U64 n);
+#endif
+#ifdef PERL_NEED_MY_BETOH64
+PERL_CALLCONV U64 Perl_my_betoh64(U64 n);
+#endif
+
+#ifdef PERL_NEED_MY_HTOLES
+PERL_CALLCONV short Perl_my_htoles(short n);
+#endif
+#ifdef PERL_NEED_MY_LETOHS
+PERL_CALLCONV short Perl_my_letohs(short n);
+#endif
+#ifdef PERL_NEED_MY_HTOBES
+PERL_CALLCONV short Perl_my_htobes(short n);
+#endif
+#ifdef PERL_NEED_MY_BETOHS
+PERL_CALLCONV short Perl_my_betohs(short n);
+#endif
+#ifdef PERL_NEED_MY_HTOLEI
+PERL_CALLCONV int Perl_my_htolei(int n);
+#endif
+#ifdef PERL_NEED_MY_LETOHI
+PERL_CALLCONV int Perl_my_letohi(int n);
+#endif
+#ifdef PERL_NEED_MY_HTOBEI
+PERL_CALLCONV int Perl_my_htobei(int n);
+#endif
+#ifdef PERL_NEED_MY_BETOHI
+PERL_CALLCONV int Perl_my_betohi(int n);
+#endif
+#ifdef PERL_NEED_MY_HTOLEL
+PERL_CALLCONV long Perl_my_htolel(long n);
+#endif
+#ifdef PERL_NEED_MY_LETOHL
+PERL_CALLCONV long Perl_my_letohl(long n);
+#endif
+#ifdef PERL_NEED_MY_HTOBEL
+PERL_CALLCONV long Perl_my_htobel(long n);
+#endif
+#ifdef PERL_NEED_MY_BETOHL
+PERL_CALLCONV long Perl_my_betohl(long n);
+#endif
+
+PERL_CALLCONV void Perl_my_swabn(void* ptr, int n)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_MY_SWABN \
+ assert(ptr)
+
+
+PERL_CALLCONV GV* Perl_gv_fetchpvn_flags(pTHX_ const char* name, STRLEN len, I32 flags, const svtype sv_type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_FETCHPVN_FLAGS \
+ assert(name)
+
+PERL_CALLCONV GV* Perl_gv_fetchsv(pTHX_ SV *name, I32 flags, const svtype sv_type)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_FETCHSV \
+ assert(name)
+
+PERL_CALLCONV bool Perl_is_gv_magical_sv(pTHX_ SV *const name_sv, U32 flags)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_IS_GV_MAGICAL_SV \
+ assert(name_sv)
+
+
+PERL_CALLCONV bool Perl_stashpv_hvname_match(pTHX_ const COP *c, const HV *hv)
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_STASHPV_HVNAME_MATCH \
+ assert(c); assert(hv)
+
+
+#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+PERL_CALLCONV void Perl_dump_sv_child(pTHX_ SV *sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_DUMP_SV_CHILD \
+ assert(sv)
+
+#endif
+
+#ifdef PERL_DONT_CREATE_GVSV
+/* PERL_CALLCONV GV* Perl_gv_SVadd(pTHX_ GV *gv); */
+#endif
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+STATIC bool S_ckwarn_common(pTHX_ U32 w);
+#endif
+PERL_CALLCONV bool Perl_ckwarn(pTHX_ U32 w);
+PERL_CALLCONV bool Perl_ckwarn_d(pTHX_ U32 w);
+PERL_CALLCONV STRLEN * Perl_new_warnings_bitfield(pTHX_ STRLEN *buffer, const char *const bits, STRLEN size)
+ __attribute__malloc__
+ __attribute__warn_unused_result__
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEW_WARNINGS_BITFIELD \
+ assert(bits)
+
+
+PERL_CALLCONV void Perl_offer_nice_chunk(pTHX_ void *const chunk, const U32 chunk_size)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OFFER_NICE_CHUNK \
+ assert(chunk)
+
+
+#ifndef SPRINTF_RETURNS_STRLEN
+PERL_CALLCONV int Perl_my_sprintf(char *buffer, const char *pat, ...)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_MY_SPRINTF \
+ assert(buffer); assert(pat)
+
+#endif
+
+PERL_CALLCONV int Perl_my_snprintf(char *buffer, const Size_t len, const char *format, ...)
+ __attribute__format__(__printf__,3,4)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_MY_SNPRINTF \
+ assert(buffer); assert(format)
+
+PERL_CALLCONV int Perl_my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_MY_VSNPRINTF \
+ assert(buffer); assert(format)
+
+
+PERL_CALLCONV void Perl_my_clearenv(pTHX);
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#ifdef PERL_GLOBAL_STRUCT_PRIVATE
+PERL_CALLCONV void* Perl_my_cxt_init(pTHX_ const char *my_cxt_key, size_t size)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MY_CXT_INIT \
+ assert(my_cxt_key)
+
+PERL_CALLCONV int Perl_my_cxt_index(pTHX_ const char *my_cxt_key)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MY_CXT_INDEX \
+ assert(my_cxt_key)
+
+#else
+PERL_CALLCONV void* Perl_my_cxt_init(pTHX_ int *index, size_t size)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MY_CXT_INIT \
+ assert(index)
+
+#endif
+#endif
+
+#ifndef HAS_STRLCAT
+PERL_CALLCONV Size_t Perl_my_strlcat(char *dst, const char *src, Size_t size);
+#endif
+
+#ifndef HAS_STRLCPY
+PERL_CALLCONV Size_t Perl_my_strlcpy(char *dst, const char *src, Size_t size);
+#endif
+
+#ifdef PERL_MAD
+PERL_CALLCONV void Perl_pad_peg(const char* s)
+ __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_PAD_PEG \
+ assert(s)
+
+#if defined(PERL_IN_DUMP_C) || defined(PERL_DECL_PROT)
+STATIC void S_xmldump_attr(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_3,pTHX_4)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_XMLDUMP_ATTR \
+ assert(file); assert(pat)
+
+#endif
+PERL_CALLCONV void Perl_xmldump_indent(pTHX_ I32 level, PerlIO *file, const char* pat, ...)
+ __attribute__format__(__printf__,pTHX_3,pTHX_4)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_XMLDUMP_INDENT \
+ assert(file); assert(pat)
+
+PERL_CALLCONV void Perl_xmldump_vindent(pTHX_ I32 level, PerlIO *file, const char* pat, va_list *args)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_XMLDUMP_VINDENT \
+ assert(file); assert(pat)
+
+PERL_CALLCONV void Perl_xmldump_all(pTHX);
+PERL_CALLCONV void Perl_xmldump_all_perl(pTHX_ bool justperl);
+PERL_CALLCONV void Perl_xmldump_packsubs(pTHX_ const HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS \
+ assert(stash)
+
+PERL_CALLCONV void Perl_xmldump_packsubs_perl(pTHX_ const HV* stash, bool justperl)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_XMLDUMP_PACKSUBS_PERL \
+ assert(stash)
+
+PERL_CALLCONV void Perl_xmldump_sub(pTHX_ const GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_XMLDUMP_SUB \
+ assert(gv)
+
+PERL_CALLCONV void Perl_xmldump_sub_perl(pTHX_ const GV* gv, bool justperl)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_XMLDUMP_SUB_PERL \
+ assert(gv)
+
+PERL_CALLCONV void Perl_xmldump_form(pTHX_ const GV* gv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_XMLDUMP_FORM \
+ assert(gv)
+
+PERL_CALLCONV void Perl_xmldump_eval(pTHX);
+PERL_CALLCONV char* Perl_sv_catxmlsv(pTHX_ SV *dsv, SV *ssv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_CATXMLSV \
+ assert(dsv); assert(ssv)
+
+PERL_CALLCONV char* Perl_sv_catxmlpvn(pTHX_ SV *dsv, const char *pv, STRLEN len, int utf8)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_SV_CATXMLPVN \
+ assert(dsv); assert(pv)
+
+PERL_CALLCONV char* Perl_sv_xmlpeek(pTHX_ SV* sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SV_XMLPEEK \
+ assert(sv)
+
+PERL_CALLCONV void Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_PMOP_XMLDUMP \
+ assert(file)
+
+PERL_CALLCONV void Perl_pmop_xmldump(pTHX_ const PMOP* pm);
+PERL_CALLCONV void Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_DO_OP_XMLDUMP \
+ assert(file)
+
+PERL_CALLCONV void Perl_op_xmldump(pTHX_ const OP *o)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_OP_XMLDUMP \
+ assert(o)
+
+
+PERL_CALLCONV TOKEN* Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop);
+PERL_CALLCONV void Perl_token_free(pTHX_ TOKEN *tk)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_TOKEN_FREE \
+ assert(tk)
+
+PERL_CALLCONV void Perl_token_getmad(pTHX_ TOKEN *tk, OP *o, char slot)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_TOKEN_GETMAD \
+ assert(tk)
+
+PERL_CALLCONV void Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot);
+PERL_CALLCONV void Perl_op_getmad(pTHX_ OP* from, OP* o, char slot);
+PERL_CALLCONV void Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot);
+PERL_CALLCONV void Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot);
+PERL_CALLCONV void Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot);
+PERL_CALLCONV MADPROP* Perl_newMADsv(pTHX_ char key, SV* sv)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_NEWMADSV \
+ assert(sv)
+
+PERL_CALLCONV MADPROP* Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen);
+PERL_CALLCONV void Perl_mad_free(pTHX_ MADPROP* mp);
+
+# if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+STATIC char* S_skipspace0(pTHX_ char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SKIPSPACE0 \
+ assert(s)
+
+STATIC char* S_skipspace1(pTHX_ char *s)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SKIPSPACE1 \
+ assert(s)
+
+STATIC char* S_skipspace2(pTHX_ char *s, SV **sv)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_SKIPSPACE2 \
+ assert(s)
+
+STATIC void S_start_force(pTHX_ int where);
+STATIC void S_curmad(pTHX_ char slot, SV *sv);
+# endif
+PERL_CALLCONV int Perl_madlex(pTHX);
+PERL_CALLCONV int Perl_madparse(pTHX);
+#endif
+#if !defined(HAS_SIGNBIT)
+PERL_CALLCONV int Perl_signbit(NV f)
+ __attribute__pure__;
+
+#endif
+
+PERL_CALLCONV void Perl_emulate_cop_io(pTHX_ const COP *const c, SV *const sv)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_EMULATE_COP_IO \
+ assert(c); assert(sv)
+
+PERL_CALLCONV REGEXP * Perl_get_re_arg(pTHX_ SV *sv);
+
+PERL_CALLCONV SV* Perl_mro_get_private_data(pTHX_ struct mro_meta *const smeta, const struct mro_alg *const which)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA \
+ assert(smeta); assert(which)
+
+PERL_CALLCONV SV* Perl_mro_set_private_data(pTHX_ struct mro_meta *const smeta, const struct mro_alg *const which, SV *const data)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_MRO_SET_PRIVATE_DATA \
+ assert(smeta); assert(which); assert(data)
+
+PERL_CALLCONV const struct mro_alg * Perl_mro_get_from_name(pTHX_ SV *name)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_GET_FROM_NAME \
+ assert(name)
+
+PERL_CALLCONV void Perl_mro_register(pTHX_ const struct mro_alg *mro)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_REGISTER \
+ assert(mro)
+
+PERL_CALLCONV void Perl_mro_set_mro(pTHX_ struct mro_meta *const meta, SV *const name)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MRO_SET_MRO \
+ assert(meta); assert(name)
+
+PERL_CALLCONV struct mro_meta* Perl_mro_meta_init(pTHX_ HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_META_INIT \
+ assert(stash)
+
+#if defined(USE_ITHREADS)
+PERL_CALLCONV struct mro_meta* Perl_mro_meta_dup(pTHX_ struct mro_meta* smeta, CLONE_PARAMS* param)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_MRO_META_DUP \
+ assert(smeta); assert(param)
+
+#endif
+PERL_CALLCONV AV* Perl_mro_get_linear_isa(pTHX_ HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA \
+ assert(stash)
+
+#if defined(PERL_IN_MRO_C) || defined(PERL_DECL_PROT)
+STATIC AV* S_mro_get_linear_isa_dfs(pTHX_ HV* stash, U32 level)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA_DFS \
+ assert(stash)
+
+#endif
+PERL_CALLCONV void Perl_mro_isa_changed_in(pTHX_ HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_ISA_CHANGED_IN \
+ assert(stash)
+
+PERL_CALLCONV void Perl_mro_method_changed_in(pTHX_ HV* stash)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN \
+ assert(stash)
+
+PERL_CALLCONV void Perl_boot_core_mro(pTHX);
+PERL_CALLCONV void Perl_sys_init(int* argc, char*** argv)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_SYS_INIT \
+ assert(argc); assert(argv)
+
+PERL_CALLCONV void Perl_sys_init3(int* argc, char*** argv, char*** env)
+ __attribute__nonnull__(1)
+ __attribute__nonnull__(2)
+ __attribute__nonnull__(3);
+#define PERL_ARGS_ASSERT_SYS_INIT3 \
+ assert(argc); assert(argv); assert(env)
+
+PERL_CALLCONV void Perl_sys_term(void);
+PERL_CALLCONV const char * Perl_fetch_cop_label(pTHX_ struct refcounted_he *const chain, STRLEN *len, U32 *flags);
+PERL_CALLCONV struct refcounted_he * Perl_store_cop_label(pTHX_ struct refcounted_he *const chain, const char *label)
+ __attribute__nonnull__(pTHX_2);
+#define PERL_ARGS_ASSERT_STORE_COP_LABEL \
+ assert(label)
+
+
+PERL_CALLCONV int Perl_keyword_plugin_standard(pTHX_ char* keyword_ptr, STRLEN keyword_len, OP** op_ptr)
+ __attribute__nonnull__(pTHX_1)
+ __attribute__nonnull__(pTHX_3);
+#define PERL_ARGS_ASSERT_KEYWORD_PLUGIN_STANDARD \
+ assert(keyword_ptr); assert(op_ptr)
+
+
+END_EXTERN_C
+/*
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/reentr.h b/Master/tlpkg/tlperl/lib/CORE/reentr.h
new file mode 100644
index 00000000000..004cc46b6cb
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/reentr.h
@@ -0,0 +1,1509 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * reentr.h
+ *
+ * Copyright (C) 2002, 2003, 2005, 2006, 2007 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by reentr.pl from data in reentr.pl.
+ */
+
+#ifndef REENTR_H
+#define REENTR_H
+
+/* If compiling for a threaded perl, we will macro-wrap the system/library
+ * interfaces (e.g. getpwent()) which have threaded versions
+ * (e.g. getpwent_r()), which will handle things correctly for
+ * the Perl interpreter, but otherwise (for XS) the wrapping does
+ * not take place. See L<perlxs/Thread-aware system interfaces>.
+ */
+
+#ifndef PERL_REENTR_API
+# if defined(PERL_CORE) || defined(PERL_EXT)
+# define PERL_REENTR_API 1
+# else
+# define PERL_REENTR_API 0
+# endif
+#endif
+
+#ifdef USE_REENTRANT_API
+
+/* Deprecations: some platforms have the said reentrant interfaces
+ * but they are declared obsolete and are not to be used. Often this
+ * means that the platform has threadsafed the interfaces (hopefully).
+ * All this is OS version dependent, so we are of course fooling ourselves.
+ * If you know of more deprecations on some platforms, please add your own
+ * (by editing reentr.pl, mind!) */
+
+#ifdef __hpux
+# undef HAS_CRYPT_R
+# undef HAS_DRAND48_R
+# undef HAS_ENDGRENT_R
+# undef HAS_ENDPWENT_R
+# undef HAS_GETGRENT_R
+# undef HAS_GETPWENT_R
+# undef HAS_SETLOCALE_R
+# undef HAS_SRAND48_R
+# undef HAS_STRERROR_R
+# define NETDB_R_OBSOLETE
+#endif
+
+#if defined(__osf__) && defined(__alpha) /* Tru64 aka Digital UNIX */
+# undef HAS_CRYPT_R
+# undef HAS_STRERROR_R
+# define NETDB_R_OBSOLETE
+#endif
+
+/*
+ * As of OpenBSD 3.7, reentrant functions are now working, they just are
+ * incompatible with everyone else. To make OpenBSD happy, we have to
+ * memzero out certain structures before calling the functions.
+ */
+#if defined(__OpenBSD__)
+# define REENTR_MEMZERO(a,b) memzero(a,b)
+#else
+# define REENTR_MEMZERO(a,b) 0
+#endif
+
+#ifdef NETDB_R_OBSOLETE
+# undef HAS_ENDHOSTENT_R
+# undef HAS_ENDNETENT_R
+# undef HAS_ENDPROTOENT_R
+# undef HAS_ENDSERVENT_R
+# undef HAS_GETHOSTBYADDR_R
+# undef HAS_GETHOSTBYNAME_R
+# undef HAS_GETHOSTENT_R
+# undef HAS_GETNETBYADDR_R
+# undef HAS_GETNETBYNAME_R
+# undef HAS_GETNETENT_R
+# undef HAS_GETPROTOBYNAME_R
+# undef HAS_GETPROTOBYNUMBER_R
+# undef HAS_GETPROTOENT_R
+# undef HAS_GETSERVBYNAME_R
+# undef HAS_GETSERVBYPORT_R
+# undef HAS_GETSERVENT_R
+# undef HAS_SETHOSTENT_R
+# undef HAS_SETNETENT_R
+# undef HAS_SETPROTOENT_R
+# undef HAS_SETSERVENT_R
+#endif
+
+#ifdef I_PWD
+# include <pwd.h>
+#endif
+#ifdef I_GRP
+# include <grp.h>
+#endif
+#ifdef I_NETDB
+# include <netdb.h>
+#endif
+#ifdef I_STDLIB
+# include <stdlib.h> /* drand48_data */
+#endif
+#ifdef I_CRYPT
+# ifdef I_CRYPT
+# include <crypt.h>
+# endif
+#endif
+#ifdef HAS_GETSPNAM_R
+# ifdef I_SHADOW
+# include <shadow.h>
+# endif
+#endif
+
+#define REENTRANT_PROTO_B_B 1
+#define REENTRANT_PROTO_B_BI 2
+#define REENTRANT_PROTO_B_BW 3
+#define REENTRANT_PROTO_B_CCD 4
+#define REENTRANT_PROTO_B_CCS 5
+#define REENTRANT_PROTO_B_IBI 6
+#define REENTRANT_PROTO_B_IBW 7
+#define REENTRANT_PROTO_B_SB 8
+#define REENTRANT_PROTO_B_SBI 9
+#define REENTRANT_PROTO_I_BI 10
+#define REENTRANT_PROTO_I_BW 11
+#define REENTRANT_PROTO_I_CCSBWR 12
+#define REENTRANT_PROTO_I_CCSD 13
+#define REENTRANT_PROTO_I_CII 14
+#define REENTRANT_PROTO_I_CIISD 15
+#define REENTRANT_PROTO_I_CSBI 16
+#define REENTRANT_PROTO_I_CSBIR 17
+#define REENTRANT_PROTO_I_CSBWR 18
+#define REENTRANT_PROTO_I_CSBWRE 19
+#define REENTRANT_PROTO_I_CSD 20
+#define REENTRANT_PROTO_I_CWISBWRE 21
+#define REENTRANT_PROTO_I_CWISD 22
+#define REENTRANT_PROTO_I_D 23
+#define REENTRANT_PROTO_I_H 24
+#define REENTRANT_PROTO_I_IBI 25
+#define REENTRANT_PROTO_I_IBW 26
+#define REENTRANT_PROTO_I_ICBI 27
+#define REENTRANT_PROTO_I_ICSBWR 28
+#define REENTRANT_PROTO_I_ICSD 29
+#define REENTRANT_PROTO_I_ID 30
+#define REENTRANT_PROTO_I_IISD 31
+#define REENTRANT_PROTO_I_ISBWR 32
+#define REENTRANT_PROTO_I_ISD 33
+#define REENTRANT_PROTO_I_LISBI 34
+#define REENTRANT_PROTO_I_LISD 35
+#define REENTRANT_PROTO_I_LS 36
+#define REENTRANT_PROTO_I_SB 37
+#define REENTRANT_PROTO_I_SBI 38
+#define REENTRANT_PROTO_I_SBIE 39
+#define REENTRANT_PROTO_I_SBIH 40
+#define REENTRANT_PROTO_I_SBIR 41
+#define REENTRANT_PROTO_I_SBWR 42
+#define REENTRANT_PROTO_I_SBWRE 43
+#define REENTRANT_PROTO_I_SD 44
+#define REENTRANT_PROTO_I_ST 45
+#define REENTRANT_PROTO_I_St 46
+#define REENTRANT_PROTO_I_TISD 47
+#define REENTRANT_PROTO_I_TS 48
+#define REENTRANT_PROTO_I_TSBI 49
+#define REENTRANT_PROTO_I_TSBIR 50
+#define REENTRANT_PROTO_I_TSBWR 51
+#define REENTRANT_PROTO_I_TSR 52
+#define REENTRANT_PROTO_I_TsISBWRE 53
+#define REENTRANT_PROTO_I_UISBWRE 54
+#define REENTRANT_PROTO_I_iS 55
+#define REENTRANT_PROTO_I_lS 56
+#define REENTRANT_PROTO_I_uISBWRE 57
+#define REENTRANT_PROTO_S_CBI 58
+#define REENTRANT_PROTO_S_CCSBI 59
+#define REENTRANT_PROTO_S_CIISBIE 60
+#define REENTRANT_PROTO_S_CSBI 61
+#define REENTRANT_PROTO_S_CSBIE 62
+#define REENTRANT_PROTO_S_CWISBIE 63
+#define REENTRANT_PROTO_S_CWISBWIE 64
+#define REENTRANT_PROTO_S_ICSBI 65
+#define REENTRANT_PROTO_S_ISBI 66
+#define REENTRANT_PROTO_S_LISBI 67
+#define REENTRANT_PROTO_S_SBI 68
+#define REENTRANT_PROTO_S_SBIE 69
+#define REENTRANT_PROTO_S_SBW 70
+#define REENTRANT_PROTO_S_TISBI 71
+#define REENTRANT_PROTO_S_TSBI 72
+#define REENTRANT_PROTO_S_TSBIE 73
+#define REENTRANT_PROTO_S_TWISBIE 74
+#define REENTRANT_PROTO_V_D 75
+#define REENTRANT_PROTO_V_H 76
+#define REENTRANT_PROTO_V_ID 77
+
+/* Defines for indicating which special features are supported. */
+
+/* The getgrent getgrgid getgrnam using buffer? */
+
+#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR || GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBW || GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+# define GETGRENT_R_HAS_BUFFER
+#else
+# undef GETGRENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETGRGID_R) && (GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBI || GETGRGID_R_PROTO == REENTRANT_PROTO_S_TSBI)
+# define GETGRGID_R_HAS_BUFFER
+#else
+# undef GETGRGID_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETGRNAM_R) && (GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR || GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CBI || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBI || GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CSBI)
+# define GETGRNAM_R_HAS_BUFFER
+#else
+# undef GETGRNAM_R_HAS_BUFFER
+#endif
+
+/* Any of the getgrent getgrgid getgrnam using buffer? */
+
+#if (defined(GETGRENT_R_HAS_BUFFER) || defined(GETGRGID_R_HAS_BUFFER) || defined(GETGRNAM_R_HAS_BUFFER))
+# define USE_GRENT_BUFFER
+#else
+# undef USE_GRENT_BUFFER
+#endif
+
+/* The getgrent getgrgid getgrnam using ptr? */
+
+#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR)
+# define GETGRENT_R_HAS_PTR
+#else
+# undef GETGRENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETGRGID_R) && (GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR)
+# define GETGRGID_R_HAS_PTR
+#else
+# undef GETGRGID_R_HAS_PTR
+#endif
+#if defined(HAS_GETGRNAM_R) && (GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR)
+# define GETGRNAM_R_HAS_PTR
+#else
+# undef GETGRNAM_R_HAS_PTR
+#endif
+
+/* Any of the getgrent getgrgid getgrnam using ptr? */
+
+#if (defined(GETGRENT_R_HAS_PTR) || defined(GETGRGID_R_HAS_PTR) || defined(GETGRNAM_R_HAS_PTR))
+# define USE_GRENT_PTR
+#else
+# undef USE_GRENT_PTR
+#endif
+
+/* The getpwent getpwnam getpwuid using ptr? */
+
+#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR)
+# define GETPWENT_R_HAS_PTR
+#else
+# undef GETPWENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETPWNAM_R) && (GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR)
+# define GETPWNAM_R_HAS_PTR
+#else
+# undef GETPWNAM_R_HAS_PTR
+#endif
+#if defined(HAS_GETPWUID_R) && (GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBWR || GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBIR)
+# define GETPWUID_R_HAS_PTR
+#else
+# undef GETPWUID_R_HAS_PTR
+#endif
+
+/* Any of the getpwent getpwnam getpwuid using ptr? */
+
+#if (defined(GETPWENT_R_HAS_PTR) || defined(GETPWNAM_R_HAS_PTR) || defined(GETPWUID_R_HAS_PTR))
+# define USE_PWENT_PTR
+#else
+# undef USE_PWENT_PTR
+#endif
+
+/* The getspent getspnam using ptr? */
+
+#if defined(HAS_GETSPNAM_R) && (GETSPNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR)
+# define GETSPNAM_R_HAS_PTR
+#else
+# undef GETSPNAM_R_HAS_PTR
+#endif
+
+/* Any of the getspent getspnam using ptr? */
+
+#if (defined(GETSPENT_R_HAS_PTR) || defined(GETSPNAM_R_HAS_PTR))
+# define USE_SPENT_PTR
+#else
+# undef USE_SPENT_PTR
+#endif
+
+/* The getgrent getgrgid getgrnam setgrent endgrent using fptr? */
+
+#if defined(HAS_GETGRENT_R) && (GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+# define GETGRENT_R_HAS_FPTR
+#else
+# undef GETGRENT_R_HAS_FPTR
+#endif
+#if defined(HAS_SETGRENT_R) && (SETGRENT_R_PROTO == REENTRANT_PROTO_I_H || SETGRENT_R_PROTO == REENTRANT_PROTO_V_H)
+# define SETGRENT_R_HAS_FPTR
+#else
+# undef SETGRENT_R_HAS_FPTR
+#endif
+#if defined(HAS_ENDGRENT_R) && (ENDGRENT_R_PROTO == REENTRANT_PROTO_I_H || ENDGRENT_R_PROTO == REENTRANT_PROTO_V_H)
+# define ENDGRENT_R_HAS_FPTR
+#else
+# undef ENDGRENT_R_HAS_FPTR
+#endif
+
+/* Any of the getgrent getgrgid getgrnam setgrent endgrent using fptr? */
+
+#if (defined(GETGRENT_R_HAS_FPTR) || defined(GETGRGID_R_HAS_FPTR) || defined(GETGRNAM_R_HAS_FPTR) || defined(SETGRENT_R_HAS_FPTR) || defined(ENDGRENT_R_HAS_FPTR))
+# define USE_GRENT_FPTR
+#else
+# undef USE_GRENT_FPTR
+#endif
+
+/* The getpwent getpwnam getpwuid setpwent endpwent using fptr? */
+
+#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+# define GETPWENT_R_HAS_FPTR
+#else
+# undef GETPWENT_R_HAS_FPTR
+#endif
+#if defined(HAS_SETPWENT_R) && (SETPWENT_R_PROTO == REENTRANT_PROTO_I_H || SETPWENT_R_PROTO == REENTRANT_PROTO_V_H)
+# define SETPWENT_R_HAS_FPTR
+#else
+# undef SETPWENT_R_HAS_FPTR
+#endif
+#if defined(HAS_ENDPWENT_R) && (ENDPWENT_R_PROTO == REENTRANT_PROTO_I_H || ENDPWENT_R_PROTO == REENTRANT_PROTO_V_H)
+# define ENDPWENT_R_HAS_FPTR
+#else
+# undef ENDPWENT_R_HAS_FPTR
+#endif
+
+/* Any of the getpwent getpwnam getpwuid setpwent endpwent using fptr? */
+
+#if (defined(GETPWENT_R_HAS_FPTR) || defined(GETPWNAM_R_HAS_FPTR) || defined(GETPWUID_R_HAS_FPTR) || defined(SETPWENT_R_HAS_FPTR) || defined(ENDPWENT_R_HAS_FPTR))
+# define USE_PWENT_FPTR
+#else
+# undef USE_PWENT_FPTR
+#endif
+
+/* The getpwent getpwgid getpwnam using buffer? */
+
+#if defined(HAS_GETPWENT_R) && (GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR || GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBW || GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH)
+# define GETPWENT_R_HAS_BUFFER
+#else
+# undef GETPWENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETPWNAM_R) && (GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR || GETPWNAM_R_PROTO == REENTRANT_PROTO_S_CSBI || GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBI)
+# define GETPWNAM_R_HAS_BUFFER
+#else
+# undef GETPWNAM_R_HAS_BUFFER
+#endif
+
+/* Any of the getpwent getpwgid getpwnam using buffer? */
+
+#if (defined(GETPWENT_R_HAS_BUFFER) || defined(GETPWGID_R_HAS_BUFFER) || defined(GETPWNAM_R_HAS_BUFFER))
+# define USE_PWENT_BUFFER
+#else
+# undef USE_PWENT_BUFFER
+#endif
+
+/* The gethostent gethostbyaddr gethostbyname using ptr? */
+
+#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE)
+# define GETHOSTENT_R_HAS_PTR
+#else
+# undef GETHOSTENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
+# define GETHOSTBYADDR_R_HAS_PTR
+#else
+# undef GETHOSTBYADDR_R_HAS_PTR
+#endif
+#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
+# define GETHOSTBYNAME_R_HAS_PTR
+#else
+# undef GETHOSTBYNAME_R_HAS_PTR
+#endif
+
+/* Any of the gethostent gethostbyaddr gethostbyname using ptr? */
+
+#if (defined(GETHOSTENT_R_HAS_PTR) || defined(GETHOSTBYADDR_R_HAS_PTR) || defined(GETHOSTBYNAME_R_HAS_PTR))
+# define USE_HOSTENT_PTR
+#else
+# undef USE_HOSTENT_PTR
+#endif
+
+/* The getnetent getnetbyaddr getnetbyname using ptr? */
+
+#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE)
+# define GETNETENT_R_HAS_PTR
+#else
+# undef GETNETENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
+# define GETNETBYADDR_R_HAS_PTR
+#else
+# undef GETNETBYADDR_R_HAS_PTR
+#endif
+#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
+# define GETNETBYNAME_R_HAS_PTR
+#else
+# undef GETNETBYNAME_R_HAS_PTR
+#endif
+
+/* Any of the getnetent getnetbyaddr getnetbyname using ptr? */
+
+#if (defined(GETNETENT_R_HAS_PTR) || defined(GETNETBYADDR_R_HAS_PTR) || defined(GETNETBYNAME_R_HAS_PTR))
+# define USE_NETENT_PTR
+#else
+# undef USE_NETENT_PTR
+#endif
+
+/* The getprotoent getprotobyname getprotobynumber using ptr? */
+
+#if defined(HAS_GETPROTOENT_R) && (GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR)
+# define GETPROTOENT_R_HAS_PTR
+#else
+# undef GETPROTOENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETPROTOBYNAME_R) && (GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR)
+# define GETPROTOBYNAME_R_HAS_PTR
+#else
+# undef GETPROTOBYNAME_R_HAS_PTR
+#endif
+#if defined(HAS_GETPROTOBYNUMBER_R) && (GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR)
+# define GETPROTOBYNUMBER_R_HAS_PTR
+#else
+# undef GETPROTOBYNUMBER_R_HAS_PTR
+#endif
+
+/* Any of the getprotoent getprotobyname getprotobynumber using ptr? */
+
+#if (defined(GETPROTOENT_R_HAS_PTR) || defined(GETPROTOBYNAME_R_HAS_PTR) || defined(GETPROTOBYNUMBER_R_HAS_PTR))
+# define USE_PROTOENT_PTR
+#else
+# undef USE_PROTOENT_PTR
+#endif
+
+/* The getservent getservbyname getservbyport using ptr? */
+
+#if defined(HAS_GETSERVENT_R) && (GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR)
+# define GETSERVENT_R_HAS_PTR
+#else
+# undef GETSERVENT_R_HAS_PTR
+#endif
+#if defined(HAS_GETSERVBYNAME_R) && (GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR)
+# define GETSERVBYNAME_R_HAS_PTR
+#else
+# undef GETSERVBYNAME_R_HAS_PTR
+#endif
+#if defined(HAS_GETSERVBYPORT_R) && (GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR)
+# define GETSERVBYPORT_R_HAS_PTR
+#else
+# undef GETSERVBYPORT_R_HAS_PTR
+#endif
+
+/* Any of the getservent getservbyname getservbyport using ptr? */
+
+#if (defined(GETSERVENT_R_HAS_PTR) || defined(GETSERVBYNAME_R_HAS_PTR) || defined(GETSERVBYPORT_R_HAS_PTR))
+# define USE_SERVENT_PTR
+#else
+# undef USE_SERVENT_PTR
+#endif
+
+/* The gethostent gethostbyaddr gethostbyname using buffer? */
+
+#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBI)
+# define GETHOSTENT_R_HAS_BUFFER
+#else
+# undef GETHOSTENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
+# define GETHOSTBYADDR_R_HAS_BUFFER
+#else
+# undef GETHOSTBYADDR_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE)
+# define GETHOSTBYNAME_R_HAS_BUFFER
+#else
+# undef GETHOSTBYNAME_R_HAS_BUFFER
+#endif
+
+/* Any of the gethostent gethostbyaddr gethostbyname using buffer? */
+
+#if (defined(GETHOSTENT_R_HAS_BUFFER) || defined(GETHOSTBYADDR_R_HAS_BUFFER) || defined(GETHOSTBYNAME_R_HAS_BUFFER))
+# define USE_HOSTENT_BUFFER
+#else
+# undef USE_HOSTENT_BUFFER
+#endif
+
+/* The getnetent getnetbyaddr getnetbyname using buffer? */
+
+#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBI || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBI)
+# define GETNETENT_R_HAS_BUFFER
+#else
+# undef GETNETENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_TISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_LISBI || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
+# define GETNETBYADDR_R_HAS_BUFFER
+#else
+# undef GETNETBYADDR_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBI || GETNETBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI)
+# define GETNETBYNAME_R_HAS_BUFFER
+#else
+# undef GETNETBYNAME_R_HAS_BUFFER
+#endif
+
+/* Any of the getnetent getnetbyaddr getnetbyname using buffer? */
+
+#if (defined(GETNETENT_R_HAS_BUFFER) || defined(GETNETBYADDR_R_HAS_BUFFER) || defined(GETNETBYNAME_R_HAS_BUFFER))
+# define USE_NETENT_BUFFER
+#else
+# undef USE_NETENT_BUFFER
+#endif
+
+/* The getprotoent getprotobyname getprotobynumber using buffer? */
+
+#if defined(HAS_GETPROTOENT_R) && (GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETPROTOENT_R_PROTO == REENTRANT_PROTO_S_SBI)
+# define GETPROTOENT_R_HAS_BUFFER
+#else
+# undef GETPROTOENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETPROTOBYNAME_R) && (GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR || GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI)
+# define GETPROTOBYNAME_R_HAS_BUFFER
+#else
+# undef GETPROTOBYNAME_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETPROTOBYNUMBER_R) && (GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR || GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_S_ISBI)
+# define GETPROTOBYNUMBER_R_HAS_BUFFER
+#else
+# undef GETPROTOBYNUMBER_R_HAS_BUFFER
+#endif
+
+/* Any of the getprotoent getprotobyname getprotobynumber using buffer? */
+
+#if (defined(GETPROTOENT_R_HAS_BUFFER) || defined(GETPROTOBYNAME_R_HAS_BUFFER) || defined(GETPROTOBYNUMBER_R_HAS_BUFFER))
+# define USE_PROTOENT_BUFFER
+#else
+# undef USE_PROTOENT_BUFFER
+#endif
+
+/* The getservent getservbyname getservbyport using buffer? */
+
+#if defined(HAS_GETSERVENT_R) && (GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR || GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBI || GETSERVENT_R_PROTO == REENTRANT_PROTO_S_SBI)
+# define GETSERVENT_R_HAS_BUFFER
+#else
+# undef GETSERVENT_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETSERVBYNAME_R) && (GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR || GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_S_CCSBI)
+# define GETSERVBYNAME_R_HAS_BUFFER
+#else
+# undef GETSERVBYNAME_R_HAS_BUFFER
+#endif
+#if defined(HAS_GETSERVBYPORT_R) && (GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR || GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_S_ICSBI)
+# define GETSERVBYPORT_R_HAS_BUFFER
+#else
+# undef GETSERVBYPORT_R_HAS_BUFFER
+#endif
+
+/* Any of the getservent getservbyname getservbyport using buffer? */
+
+#if (defined(GETSERVENT_R_HAS_BUFFER) || defined(GETSERVBYNAME_R_HAS_BUFFER) || defined(GETSERVBYPORT_R_HAS_BUFFER))
+# define USE_SERVENT_BUFFER
+#else
+# undef USE_SERVENT_BUFFER
+#endif
+
+/* The gethostent gethostbyaddr gethostbyname using errno? */
+
+#if defined(HAS_GETHOSTENT_R) && (GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE)
+# define GETHOSTENT_R_HAS_ERRNO
+#else
+# undef GETHOSTENT_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETHOSTBYADDR_R) && (GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE || GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE)
+# define GETHOSTBYADDR_R_HAS_ERRNO
+#else
+# undef GETHOSTBYADDR_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETHOSTBYNAME_R) && (GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE || GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE)
+# define GETHOSTBYNAME_R_HAS_ERRNO
+#else
+# undef GETHOSTBYNAME_R_HAS_ERRNO
+#endif
+
+/* Any of the gethostent gethostbyaddr gethostbyname using errno? */
+
+#if (defined(GETHOSTENT_R_HAS_ERRNO) || defined(GETHOSTBYADDR_R_HAS_ERRNO) || defined(GETHOSTBYNAME_R_HAS_ERRNO))
+# define USE_HOSTENT_ERRNO
+#else
+# undef USE_HOSTENT_ERRNO
+#endif
+
+/* The getnetent getnetbyaddr getnetbyname using errno? */
+
+#if defined(HAS_GETNETENT_R) && (GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE || GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE || GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE)
+# define GETNETENT_R_HAS_ERRNO
+#else
+# undef GETNETENT_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETNETBYADDR_R) && (GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE || GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE)
+# define GETNETBYADDR_R_HAS_ERRNO
+#else
+# undef GETNETBYADDR_R_HAS_ERRNO
+#endif
+#if defined(HAS_GETNETBYNAME_R) && (GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE)
+# define GETNETBYNAME_R_HAS_ERRNO
+#else
+# undef GETNETBYNAME_R_HAS_ERRNO
+#endif
+
+/* Any of the getnetent getnetbyaddr getnetbyname using errno? */
+
+#if (defined(GETNETENT_R_HAS_ERRNO) || defined(GETNETBYADDR_R_HAS_ERRNO) || defined(GETNETBYNAME_R_HAS_ERRNO))
+# define USE_NETENT_ERRNO
+#else
+# undef USE_NETENT_ERRNO
+#endif
+
+
+typedef struct {
+#ifdef HAS_ASCTIME_R
+ char* _asctime_buffer;
+ size_t _asctime_size;
+#endif /* HAS_ASCTIME_R */
+#ifdef HAS_CRYPT_R
+#if CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
+ CRYPTD* _crypt_data;
+#else
+ struct crypt_data *_crypt_struct_buffer;
+#endif
+#endif /* HAS_CRYPT_R */
+#ifdef HAS_CTIME_R
+ char* _ctime_buffer;
+ size_t _ctime_size;
+#endif /* HAS_CTIME_R */
+#ifdef HAS_DRAND48_R
+ struct drand48_data _drand48_struct;
+ double _drand48_double;
+#endif /* HAS_DRAND48_R */
+#ifdef HAS_GETGRNAM_R
+ struct group _grent_struct;
+ char* _grent_buffer;
+ size_t _grent_size;
+# ifdef USE_GRENT_PTR
+ struct group* _grent_ptr;
+# endif
+# ifdef USE_GRENT_FPTR
+ FILE* _grent_fptr;
+# endif
+#endif /* HAS_GETGRNAM_R */
+#ifdef HAS_GETHOSTBYNAME_R
+ struct hostent _hostent_struct;
+# if GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+ struct hostent_data _hostent_data;
+# else
+ char* _hostent_buffer;
+ size_t _hostent_size;
+# endif
+# ifdef USE_HOSTENT_PTR
+ struct hostent* _hostent_ptr;
+# endif
+# ifdef USE_HOSTENT_ERRNO
+ int _hostent_errno;
+# endif
+#endif /* HAS_GETHOSTBYNAME_R */
+#ifdef HAS_GETLOGIN_R
+ char* _getlogin_buffer;
+ size_t _getlogin_size;
+#endif /* HAS_GETLOGIN_R */
+#ifdef HAS_GETNETBYNAME_R
+ struct netent _netent_struct;
+# if GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+ struct netent_data _netent_data;
+# else
+ char* _netent_buffer;
+ size_t _netent_size;
+# endif
+# ifdef USE_NETENT_PTR
+ struct netent* _netent_ptr;
+# endif
+# ifdef USE_NETENT_ERRNO
+ int _netent_errno;
+# endif
+#endif /* HAS_GETNETBYNAME_R */
+#ifdef HAS_GETPROTOBYNAME_R
+ struct protoent _protoent_struct;
+# if GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+ struct protoent_data _protoent_data;
+# else
+ char* _protoent_buffer;
+ size_t _protoent_size;
+# endif
+# ifdef USE_PROTOENT_PTR
+ struct protoent* _protoent_ptr;
+# endif
+# ifdef USE_PROTOENT_ERRNO
+ int _protoent_errno;
+# endif
+#endif /* HAS_GETPROTOBYNAME_R */
+#ifdef HAS_GETPWNAM_R
+ struct passwd _pwent_struct;
+ char* _pwent_buffer;
+ size_t _pwent_size;
+# ifdef USE_PWENT_PTR
+ struct passwd* _pwent_ptr;
+# endif
+# ifdef USE_PWENT_FPTR
+ FILE* _pwent_fptr;
+# endif
+#endif /* HAS_GETPWNAM_R */
+#ifdef HAS_GETSERVBYNAME_R
+ struct servent _servent_struct;
+# if GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD
+ struct servent_data _servent_data;
+# else
+ char* _servent_buffer;
+ size_t _servent_size;
+# endif
+# ifdef USE_SERVENT_PTR
+ struct servent* _servent_ptr;
+# endif
+# ifdef USE_SERVENT_ERRNO
+ int _servent_errno;
+# endif
+#endif /* HAS_GETSERVBYNAME_R */
+#ifdef HAS_GETSPNAM_R
+ struct spwd _spent_struct;
+ char* _spent_buffer;
+ size_t _spent_size;
+# ifdef USE_SPENT_PTR
+ struct spwd* _spent_ptr;
+# endif
+# ifdef USE_SPENT_FPTR
+ FILE* _spent_fptr;
+# endif
+#endif /* HAS_GETSPNAM_R */
+#ifdef HAS_RANDOM_R
+ struct random_data _random_struct;
+# if RANDOM_R_PROTO == REENTRANT_PROTO_I_iS
+ int _random_retval;
+# endif
+# if RANDOM_R_PROTO == REENTRANT_PROTO_I_lS
+ long _random_retval;
+# endif
+# if RANDOM_R_PROTO == REENTRANT_PROTO_I_St
+ int32_t _random_retval;
+# endif
+#endif /* HAS_RANDOM_R */
+#ifdef HAS_READDIR_R
+ struct dirent* _readdir_struct;
+ size_t _readdir_size;
+# if READDIR_R_PROTO == REENTRANT_PROTO_I_TSR
+ struct dirent* _readdir_ptr;
+# endif
+#endif /* HAS_READDIR_R */
+#ifdef HAS_READDIR64_R
+ struct dirent64* _readdir64_struct;
+ size_t _readdir64_size;
+# if READDIR64_R_PROTO == REENTRANT_PROTO_I_TSR
+ struct dirent64* _readdir64_ptr;
+# endif
+#endif /* HAS_READDIR64_R */
+#ifdef HAS_SETLOCALE_R
+ char* _setlocale_buffer;
+ size_t _setlocale_size;
+#endif /* HAS_SETLOCALE_R */
+#ifdef HAS_SRANDOM_R
+ struct random_data _srandom_struct;
+#endif /* HAS_SRANDOM_R */
+#ifdef HAS_STRERROR_R
+ char* _strerror_buffer;
+ size_t _strerror_size;
+#endif /* HAS_STRERROR_R */
+#ifdef HAS_TTYNAME_R
+ char* _ttyname_buffer;
+ size_t _ttyname_size;
+#endif /* HAS_TTYNAME_R */
+
+ int dummy; /* cannot have empty structs */
+} REENTR;
+
+/* The wrappers. */
+
+#ifdef HAS_ASCTIME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef asctime
+# if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_B_SB
+# define asctime(a) asctime_r(a, PL_reentrant_buffer->_asctime_buffer)
+# endif
+# if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_B_SBI
+# define asctime(a) asctime_r(a, PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size)
+# endif
+# if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_I_SB
+# define asctime(a) (asctime_r(a, PL_reentrant_buffer->_asctime_buffer) == 0 ? PL_reentrant_buffer->_asctime_buffer : 0)
+# endif
+# if !defined(asctime) && ASCTIME_R_PROTO == REENTRANT_PROTO_I_SBI
+# define asctime(a) (asctime_r(a, PL_reentrant_buffer->_asctime_buffer, PL_reentrant_buffer->_asctime_size) == 0 ? PL_reentrant_buffer->_asctime_buffer : 0)
+# endif
+# endif
+#endif /* HAS_ASCTIME_R */
+
+#ifdef HAS_CRYPT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef crypt
+# if !defined(crypt) && CRYPT_R_PROTO == REENTRANT_PROTO_B_CCS
+# define crypt(a, b) crypt_r(a, b, PL_reentrant_buffer->_crypt_struct_buffer)
+# endif
+# if !defined(crypt) && CRYPT_R_PROTO == REENTRANT_PROTO_B_CCD
+# define crypt(a, b) crypt_r(a, b, &PL_reentrant_buffer->_crypt_data)
+# endif
+# endif
+#endif /* HAS_CRYPT_R */
+
+#ifdef HAS_CTERMID_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef ctermid
+# if !defined(ctermid) && CTERMID_R_PROTO == REENTRANT_PROTO_B_B
+# define ctermid(a) ctermid_r(a)
+# endif
+# endif
+#endif /* HAS_CTERMID_R */
+
+#ifdef HAS_CTIME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef ctime
+# if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_B_SB
+# define ctime(a) ctime_r(a, PL_reentrant_buffer->_ctime_buffer)
+# endif
+# if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_B_SBI
+# define ctime(a) ctime_r(a, PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size)
+# endif
+# if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_I_SB
+# define ctime(a) (ctime_r(a, PL_reentrant_buffer->_ctime_buffer) == 0 ? PL_reentrant_buffer->_ctime_buffer : 0)
+# endif
+# if !defined(ctime) && CTIME_R_PROTO == REENTRANT_PROTO_I_SBI
+# define ctime(a) (ctime_r(a, PL_reentrant_buffer->_ctime_buffer, PL_reentrant_buffer->_ctime_size) == 0 ? PL_reentrant_buffer->_ctime_buffer : 0)
+# endif
+# endif
+#endif /* HAS_CTIME_R */
+
+#ifdef HAS_DRAND48_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef drand48
+# if !defined(drand48) && DRAND48_R_PROTO == REENTRANT_PROTO_I_ST
+# define drand48() (drand48_r(&PL_reentrant_buffer->_drand48_struct, &PL_reentrant_buffer->_drand48_double) == 0 ? PL_reentrant_buffer->_drand48_double : 0)
+# endif
+# endif
+#endif /* HAS_DRAND48_R */
+
+#ifdef HAS_ENDGRENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef endgrent
+# if !defined(endgrent) && ENDGRENT_R_PROTO == REENTRANT_PROTO_I_H
+# define endgrent() (endgrent_r(&PL_reentrant_buffer->_grent_fptr) == 0 ? 1 : 0)
+# endif
+# if !defined(endgrent) && ENDGRENT_R_PROTO == REENTRANT_PROTO_V_H
+# define endgrent() endgrent_r(&PL_reentrant_buffer->_grent_fptr)
+# endif
+# endif
+#endif /* HAS_ENDGRENT_R */
+
+#ifdef HAS_ENDHOSTENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef endhostent
+# if !defined(endhostent) && ENDHOSTENT_R_PROTO == REENTRANT_PROTO_I_D
+# define endhostent() (endhostent_r(&PL_reentrant_buffer->_hostent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(endhostent) && ENDHOSTENT_R_PROTO == REENTRANT_PROTO_V_D
+# define endhostent() endhostent_r(&PL_reentrant_buffer->_hostent_data)
+# endif
+# endif
+#endif /* HAS_ENDHOSTENT_R */
+
+#ifdef HAS_ENDNETENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef endnetent
+# if !defined(endnetent) && ENDNETENT_R_PROTO == REENTRANT_PROTO_I_D
+# define endnetent() (endnetent_r(&PL_reentrant_buffer->_netent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(endnetent) && ENDNETENT_R_PROTO == REENTRANT_PROTO_V_D
+# define endnetent() endnetent_r(&PL_reentrant_buffer->_netent_data)
+# endif
+# endif
+#endif /* HAS_ENDNETENT_R */
+
+#ifdef HAS_ENDPROTOENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef endprotoent
+# if !defined(endprotoent) && ENDPROTOENT_R_PROTO == REENTRANT_PROTO_I_D
+# define endprotoent() (endprotoent_r(&PL_reentrant_buffer->_protoent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(endprotoent) && ENDPROTOENT_R_PROTO == REENTRANT_PROTO_V_D
+# define endprotoent() endprotoent_r(&PL_reentrant_buffer->_protoent_data)
+# endif
+# endif
+#endif /* HAS_ENDPROTOENT_R */
+
+#ifdef HAS_ENDPWENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef endpwent
+# if !defined(endpwent) && ENDPWENT_R_PROTO == REENTRANT_PROTO_I_H
+# define endpwent() (endpwent_r(&PL_reentrant_buffer->_pwent_fptr) == 0 ? 1 : 0)
+# endif
+# if !defined(endpwent) && ENDPWENT_R_PROTO == REENTRANT_PROTO_V_H
+# define endpwent() endpwent_r(&PL_reentrant_buffer->_pwent_fptr)
+# endif
+# endif
+#endif /* HAS_ENDPWENT_R */
+
+#ifdef HAS_ENDSERVENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef endservent
+# if !defined(endservent) && ENDSERVENT_R_PROTO == REENTRANT_PROTO_I_D
+# define endservent() (endservent_r(&PL_reentrant_buffer->_servent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(endservent) && ENDSERVENT_R_PROTO == REENTRANT_PROTO_V_D
+# define endservent() endservent_r(&PL_reentrant_buffer->_servent_data)
+# endif
+# endif
+#endif /* HAS_ENDSERVENT_R */
+
+#ifdef HAS_GETGRENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getgrent
+# if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+# define getgrent() ((PL_reentrant_retint = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+# endif
+# if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIR
+# define getgrent() ((PL_reentrant_retint = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+# endif
+# if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBW
+# define getgrent() (getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+# endif
+# if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_S_SBI
+# define getgrent() (getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+# endif
+# if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBI
+# define getgrent() ((PL_reentrant_retint = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+# endif
+# if !defined(getgrent) && GETGRENT_R_PROTO == REENTRANT_PROTO_I_SBIH
+# define getgrent() ((PL_reentrant_retint = getgrent_r(&PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_fptr)) == 0 ? &PL_reentrant_buffer->_grent_struct : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrent") : 0))
+# endif
+# endif
+#endif /* HAS_GETGRENT_R */
+
+#ifdef HAS_GETGRGID_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getgrgid
+# if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBWR
+# define getgrgid(a) ((PL_reentrant_retint = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrgid", a) : 0))
+# endif
+# if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBIR
+# define getgrgid(a) ((PL_reentrant_retint = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrgid", a) : 0))
+# endif
+# if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_I_TSBI
+# define getgrgid(a) ((PL_reentrant_retint = getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrgid", a) : 0))
+# endif
+# if !defined(getgrgid) && GETGRGID_R_PROTO == REENTRANT_PROTO_S_TSBI
+# define getgrgid(a) (getgrgid_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrgid", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETGRGID_R */
+
+#ifdef HAS_GETGRNAM_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getgrnam
+# if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR
+# define getgrnam(a) ((PL_reentrant_retint = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+# endif
+# if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR
+# define getgrnam(a) ((PL_reentrant_retint = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size, &PL_reentrant_buffer->_grent_ptr)) == 0 ? PL_reentrant_buffer->_grent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+# endif
+# if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CBI
+# define getgrnam(a) (getgrnam_r(a, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? PL_reentrant_buffer->_grent_buffer : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+# endif
+# if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_I_CSBI
+# define getgrnam(a) ((PL_reentrant_retint = getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size)) == 0 ? &PL_reentrant_buffer->_grent_struct : ((PL_reentrant_retint == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+# endif
+# if !defined(getgrnam) && GETGRNAM_R_PROTO == REENTRANT_PROTO_S_CSBI
+# define getgrnam(a) (getgrnam_r(a, &PL_reentrant_buffer->_grent_struct, PL_reentrant_buffer->_grent_buffer, PL_reentrant_buffer->_grent_size) ? &PL_reentrant_buffer->_grent_struct : ((errno == ERANGE) ? (struct group *) Perl_reentrant_retry("getgrnam", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETGRNAM_R */
+
+#ifdef HAS_GETHOSTBYADDR_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef gethostbyaddr
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISBWRE
+# define gethostbyaddr(a, b, c) ((PL_reentrant_retint = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBWIE
+# define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CWISBIE
+# define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TWISBIE
+# define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CIISBIE
+# define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_CSBIE
+# define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? 1 : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_S_TSBIE
+# define gethostbyaddr(a, b, c) (gethostbyaddr_r(a, b, c, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? 1 : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CWISD
+# define gethostbyaddr(a, b, c) ((PL_reentrant_retint = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CIISD
+# define gethostbyaddr(a, b, c) ((PL_reentrant_retint = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_CII
+# define gethostbyaddr(a, b, c) ((PL_reentrant_retint = gethostbyaddr_r(a, b, c)) == 0 ? 1 : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# if !defined(gethostbyaddr) && GETHOSTBYADDR_R_PROTO == REENTRANT_PROTO_I_TsISBWRE
+# define gethostbyaddr(a, b, c) ((PL_reentrant_retint = gethostbyaddr_r(a, b, c, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyaddr", a, b, c) : 0))
+# endif
+# endif
+#endif /* HAS_GETHOSTBYADDR_R */
+
+#ifdef HAS_GETHOSTBYNAME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef gethostbyname
+# if !defined(gethostbyname) && GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE
+# define gethostbyname(a) ((PL_reentrant_retint = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyname", a) : 0))
+# endif
+# if !defined(gethostbyname) && GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBIE
+# define gethostbyname(a) (gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyname", a) : 0))
+# endif
+# if !defined(gethostbyname) && GETHOSTBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+# define gethostbyname(a) ((PL_reentrant_retint = gethostbyname_r(a, &PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostbyname", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETHOSTBYNAME_R */
+
+#ifdef HAS_GETHOSTENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef gethostent
+# if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBWRE
+# define gethostent() ((PL_reentrant_retint = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_ptr, &PL_reentrant_buffer->_hostent_errno)) == 0 ? PL_reentrant_buffer->_hostent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+# endif
+# if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBIE
+# define gethostent() ((PL_reentrant_retint = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno)) == 0 ? &PL_reentrant_buffer->_hostent_struct : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+# endif
+# if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBIE
+# define gethostent() (gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size, &PL_reentrant_buffer->_hostent_errno) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+# endif
+# if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_S_SBI
+# define gethostent() (gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size) ? &PL_reentrant_buffer->_hostent_struct : ((errno == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+# endif
+# if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SBI
+# define gethostent() ((PL_reentrant_retint = gethostent_r(&PL_reentrant_buffer->_hostent_struct, PL_reentrant_buffer->_hostent_buffer, PL_reentrant_buffer->_hostent_size)) == 0 ? &PL_reentrant_buffer->_hostent_struct : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+# endif
+# if !defined(gethostent) && GETHOSTENT_R_PROTO == REENTRANT_PROTO_I_SD
+# define gethostent() ((PL_reentrant_retint = gethostent_r(&PL_reentrant_buffer->_hostent_struct, &PL_reentrant_buffer->_hostent_data)) == 0 ? &PL_reentrant_buffer->_hostent_struct : ((PL_reentrant_retint == ERANGE) ? (struct hostent *) Perl_reentrant_retry("gethostent") : 0))
+# endif
+# endif
+#endif /* HAS_GETHOSTENT_R */
+
+#ifdef HAS_GETLOGIN_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getlogin
+# if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_I_BW
+# define getlogin() ((PL_reentrant_retint = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : ((PL_reentrant_retint == ERANGE) ? (char *) Perl_reentrant_retry("getlogin") : 0))
+# endif
+# if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_I_BI
+# define getlogin() ((PL_reentrant_retint = getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)) == 0 ? PL_reentrant_buffer->_getlogin_buffer : ((PL_reentrant_retint == ERANGE) ? (char *) Perl_reentrant_retry("getlogin") : 0))
+# endif
+# if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_B_BW
+# define getlogin() getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)
+# endif
+# if !defined(getlogin) && GETLOGIN_R_PROTO == REENTRANT_PROTO_B_BI
+# define getlogin() getlogin_r(PL_reentrant_buffer->_getlogin_buffer, PL_reentrant_buffer->_getlogin_size)
+# endif
+# endif
+#endif /* HAS_GETLOGIN_R */
+
+#ifdef HAS_GETNETBYADDR_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getnetbyaddr
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_UISBWRE
+# define getnetbyaddr(a, b) ((PL_reentrant_retint = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISBI
+# define getnetbyaddr(a, b) ((PL_reentrant_retint = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_TISBI
+# define getnetbyaddr(a, b) (getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_S_LISBI
+# define getnetbyaddr(a, b) (getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_TISD
+# define getnetbyaddr(a, b) ((PL_reentrant_retint = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_LISD
+# define getnetbyaddr(a, b) ((PL_reentrant_retint = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_IISD
+# define getnetbyaddr(a, b) ((PL_reentrant_retint = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# if !defined(getnetbyaddr) && GETNETBYADDR_R_PROTO == REENTRANT_PROTO_I_uISBWRE
+# define getnetbyaddr(a, b) ((PL_reentrant_retint = getnetbyaddr_r(a, b, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyaddr", a, b) : 0))
+# endif
+# endif
+#endif /* HAS_GETNETBYADDR_R */
+
+#ifdef HAS_GETNETBYNAME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getnetbyname
+# if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWRE
+# define getnetbyname(a) ((PL_reentrant_retint = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyname", a) : 0))
+# endif
+# if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBI
+# define getnetbyname(a) ((PL_reentrant_retint = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyname", a) : 0))
+# endif
+# if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI
+# define getnetbyname(a) (getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyname", a) : 0))
+# endif
+# if !defined(getnetbyname) && GETNETBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+# define getnetbyname(a) ((PL_reentrant_retint = getnetbyname_r(a, &PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetbyname", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETNETBYNAME_R */
+
+#ifdef HAS_GETNETENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getnetent
+# if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBWRE
+# define getnetent() ((PL_reentrant_retint = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_ptr, &PL_reentrant_buffer->_netent_errno)) == 0 ? PL_reentrant_buffer->_netent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+# endif
+# if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBIE
+# define getnetent() ((PL_reentrant_retint = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_errno)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+# endif
+# if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBIE
+# define getnetent() (getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size, &PL_reentrant_buffer->_netent_errno) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+# endif
+# if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_S_SBI
+# define getnetent() (getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size) ? &PL_reentrant_buffer->_netent_struct : ((errno == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+# endif
+# if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SBI
+# define getnetent() ((PL_reentrant_retint = getnetent_r(&PL_reentrant_buffer->_netent_struct, PL_reentrant_buffer->_netent_buffer, PL_reentrant_buffer->_netent_size)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+# endif
+# if !defined(getnetent) && GETNETENT_R_PROTO == REENTRANT_PROTO_I_SD
+# define getnetent() ((PL_reentrant_retint = getnetent_r(&PL_reentrant_buffer->_netent_struct, &PL_reentrant_buffer->_netent_data)) == 0 ? &PL_reentrant_buffer->_netent_struct : ((PL_reentrant_retint == ERANGE) ? (struct netent *) Perl_reentrant_retry("getnetent") : 0))
+# endif
+# endif
+#endif /* HAS_GETNETENT_R */
+
+#ifdef HAS_GETPROTOBYNAME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getprotobyname
+# if !defined(getprotobyname) && GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSBWR
+# define getprotobyname(a) ((PL_reentrant_retint = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobyname", a) : 0))
+# endif
+# if !defined(getprotobyname) && GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_S_CSBI
+# define getprotobyname(a) (getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size) ? &PL_reentrant_buffer->_protoent_struct : ((errno == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobyname", a) : 0))
+# endif
+# if !defined(getprotobyname) && GETPROTOBYNAME_R_PROTO == REENTRANT_PROTO_I_CSD
+# define getprotobyname(a) (REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)),(PL_reentrant_retint = getprotobyname_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobyname", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETPROTOBYNAME_R */
+
+#ifdef HAS_GETPROTOBYNUMBER_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getprotobynumber
+# if !defined(getprotobynumber) && GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISBWR
+# define getprotobynumber(a) ((PL_reentrant_retint = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobynumber", a) : 0))
+# endif
+# if !defined(getprotobynumber) && GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_S_ISBI
+# define getprotobynumber(a) (getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size) ? &PL_reentrant_buffer->_protoent_struct : ((errno == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobynumber", a) : 0))
+# endif
+# if !defined(getprotobynumber) && GETPROTOBYNUMBER_R_PROTO == REENTRANT_PROTO_I_ISD
+# define getprotobynumber(a) (REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)),(PL_reentrant_retint = getprotobynumber_r(a, &PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotobynumber", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETPROTOBYNUMBER_R */
+
+#ifdef HAS_GETPROTOENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getprotoent
+# if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+# define getprotoent() ((PL_reentrant_retint = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size, &PL_reentrant_buffer->_protoent_ptr)) == 0 ? PL_reentrant_buffer->_protoent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotoent") : 0))
+# endif
+# if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SBI
+# define getprotoent() ((PL_reentrant_retint = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size)) == 0 ? &PL_reentrant_buffer->_protoent_struct : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotoent") : 0))
+# endif
+# if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_S_SBI
+# define getprotoent() (getprotoent_r(&PL_reentrant_buffer->_protoent_struct, PL_reentrant_buffer->_protoent_buffer, PL_reentrant_buffer->_protoent_size) ? &PL_reentrant_buffer->_protoent_struct : ((errno == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotoent") : 0))
+# endif
+# if !defined(getprotoent) && GETPROTOENT_R_PROTO == REENTRANT_PROTO_I_SD
+# define getprotoent() (REENTR_MEMZERO(&PL_reentrant_buffer->_protoent_data, sizeof(PL_reentrant_buffer->_protoent_data)),(PL_reentrant_retint = getprotoent_r(&PL_reentrant_buffer->_protoent_struct, &PL_reentrant_buffer->_protoent_data)) == 0 ? &PL_reentrant_buffer->_protoent_struct : ((PL_reentrant_retint == ERANGE) ? (struct protoent *) Perl_reentrant_retry("getprotoent") : 0))
+# endif
+# endif
+#endif /* HAS_GETPROTOENT_R */
+
+#ifdef HAS_GETPWENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getpwent
+# if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+# define getpwent() ((PL_reentrant_retint = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+# endif
+# if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIR
+# define getpwent() ((PL_reentrant_retint = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+# endif
+# if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBW
+# define getpwent() (getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+# endif
+# if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_S_SBI
+# define getpwent() (getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+# endif
+# if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBI
+# define getpwent() ((PL_reentrant_retint = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+# endif
+# if !defined(getpwent) && GETPWENT_R_PROTO == REENTRANT_PROTO_I_SBIH
+# define getpwent() ((PL_reentrant_retint = getpwent_r(&PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_fptr)) == 0 ? &PL_reentrant_buffer->_pwent_struct : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwent") : 0))
+# endif
+# endif
+#endif /* HAS_GETPWENT_R */
+
+#ifdef HAS_GETPWNAM_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getpwnam
+# if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR
+# define getpwnam(a) ((PL_reentrant_retint = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwnam", a) : 0))
+# endif
+# if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBIR
+# define getpwnam(a) ((PL_reentrant_retint = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwnam", a) : 0))
+# endif
+# if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_S_CSBI
+# define getpwnam(a) (getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwnam", a) : 0))
+# endif
+# if !defined(getpwnam) && GETPWNAM_R_PROTO == REENTRANT_PROTO_I_CSBI
+# define getpwnam(a) ((PL_reentrant_retint = getpwnam_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwnam", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETPWNAM_R */
+
+#ifdef HAS_GETPWUID_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getpwuid
+# if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBWR
+# define getpwuid(a) ((PL_reentrant_retint = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwuid", a) : 0))
+# endif
+# if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBIR
+# define getpwuid(a) ((PL_reentrant_retint = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size, &PL_reentrant_buffer->_pwent_ptr)) == 0 ? PL_reentrant_buffer->_pwent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwuid", a) : 0))
+# endif
+# if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_I_TSBI
+# define getpwuid(a) ((PL_reentrant_retint = getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size)) == 0 ? &PL_reentrant_buffer->_pwent_struct : ((PL_reentrant_retint == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwuid", a) : 0))
+# endif
+# if !defined(getpwuid) && GETPWUID_R_PROTO == REENTRANT_PROTO_S_TSBI
+# define getpwuid(a) (getpwuid_r(a, &PL_reentrant_buffer->_pwent_struct, PL_reentrant_buffer->_pwent_buffer, PL_reentrant_buffer->_pwent_size) ? &PL_reentrant_buffer->_pwent_struct : ((errno == ERANGE) ? (struct passwd *) Perl_reentrant_retry("getpwuid", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETPWUID_R */
+
+#ifdef HAS_GETSERVBYNAME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getservbyname
+# if !defined(getservbyname) && GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSBWR
+# define getservbyname(a, b) ((PL_reentrant_retint = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyname", a, b) : 0))
+# endif
+# if !defined(getservbyname) && GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_S_CCSBI
+# define getservbyname(a, b) (getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size) ? &PL_reentrant_buffer->_servent_struct : ((errno == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyname", a, b) : 0))
+# endif
+# if !defined(getservbyname) && GETSERVBYNAME_R_PROTO == REENTRANT_PROTO_I_CCSD
+# define getservbyname(a, b) (REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)),(PL_reentrant_retint = getservbyname_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyname", a, b) : 0))
+# endif
+# endif
+#endif /* HAS_GETSERVBYNAME_R */
+
+#ifdef HAS_GETSERVBYPORT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getservbyport
+# if !defined(getservbyport) && GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSBWR
+# define getservbyport(a, b) ((PL_reentrant_retint = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyport", a, b) : 0))
+# endif
+# if !defined(getservbyport) && GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_S_ICSBI
+# define getservbyport(a, b) (getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size) ? &PL_reentrant_buffer->_servent_struct : ((errno == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyport", a, b) : 0))
+# endif
+# if !defined(getservbyport) && GETSERVBYPORT_R_PROTO == REENTRANT_PROTO_I_ICSD
+# define getservbyport(a, b) (REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)),(PL_reentrant_retint = getservbyport_r(a, b, &PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservbyport", a, b) : 0))
+# endif
+# endif
+#endif /* HAS_GETSERVBYPORT_R */
+
+#ifdef HAS_GETSERVENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getservent
+# if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBWR
+# define getservent() ((PL_reentrant_retint = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size, &PL_reentrant_buffer->_servent_ptr)) == 0 ? PL_reentrant_buffer->_servent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservent") : 0))
+# endif
+# if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SBI
+# define getservent() ((PL_reentrant_retint = getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size)) == 0 ? &PL_reentrant_buffer->_servent_struct : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservent") : 0))
+# endif
+# if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_S_SBI
+# define getservent() (getservent_r(&PL_reentrant_buffer->_servent_struct, PL_reentrant_buffer->_servent_buffer, PL_reentrant_buffer->_servent_size) ? &PL_reentrant_buffer->_servent_struct : ((errno == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservent") : 0))
+# endif
+# if !defined(getservent) && GETSERVENT_R_PROTO == REENTRANT_PROTO_I_SD
+# define getservent() (REENTR_MEMZERO(&PL_reentrant_buffer->_servent_data, sizeof(PL_reentrant_buffer->_servent_data)),(PL_reentrant_retint = getservent_r(&PL_reentrant_buffer->_servent_struct, &PL_reentrant_buffer->_servent_data)) == 0 ? &PL_reentrant_buffer->_servent_struct : ((PL_reentrant_retint == ERANGE) ? (struct servent *) Perl_reentrant_retry("getservent") : 0))
+# endif
+# endif
+#endif /* HAS_GETSERVENT_R */
+
+#ifdef HAS_GETSPNAM_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef getspnam
+# if !defined(getspnam) && GETSPNAM_R_PROTO == REENTRANT_PROTO_I_CSBWR
+# define getspnam(a) ((PL_reentrant_retint = getspnam_r(a, &PL_reentrant_buffer->_spent_struct, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size, &PL_reentrant_buffer->_spent_ptr)) == 0 ? PL_reentrant_buffer->_spent_ptr : ((PL_reentrant_retint == ERANGE) ? (struct spwd *) Perl_reentrant_retry("getspnam", a) : 0))
+# endif
+# if !defined(getspnam) && GETSPNAM_R_PROTO == REENTRANT_PROTO_S_CSBI
+# define getspnam(a) (getspnam_r(a, &PL_reentrant_buffer->_spent_struct, PL_reentrant_buffer->_spent_buffer, PL_reentrant_buffer->_spent_size) ? &PL_reentrant_buffer->_spent_struct : ((errno == ERANGE) ? (struct spwd *) Perl_reentrant_retry("getspnam", a) : 0))
+# endif
+# endif
+#endif /* HAS_GETSPNAM_R */
+
+#ifdef HAS_RANDOM_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef random
+# if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_iS
+# define random() (random_r(&PL_reentrant_buffer->_random_retval, &PL_reentrant_buffer->_random_struct) == 0 ? PL_reentrant_buffer->_random_retval : 0)
+# endif
+# if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_lS
+# define random() (random_r(&PL_reentrant_buffer->_random_retval, &PL_reentrant_buffer->_random_struct) == 0 ? PL_reentrant_buffer->_random_retval : 0)
+# endif
+# if !defined(random) && RANDOM_R_PROTO == REENTRANT_PROTO_I_St
+# define random() (random_r(&PL_reentrant_buffer->_random_struct, &PL_reentrant_buffer->_random_retval) == 0 ? PL_reentrant_buffer->_random_retval : 0)
+# endif
+# endif
+#endif /* HAS_RANDOM_R */
+
+#ifdef HAS_READDIR_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef readdir
+# if !defined(readdir) && READDIR_R_PROTO == REENTRANT_PROTO_I_TSR
+# define readdir(a) (readdir_r(a, PL_reentrant_buffer->_readdir_struct, &PL_reentrant_buffer->_readdir_ptr) == 0 ? PL_reentrant_buffer->_readdir_ptr : 0)
+# endif
+# if !defined(readdir) && READDIR_R_PROTO == REENTRANT_PROTO_I_TS
+# define readdir(a) (readdir_r(a, PL_reentrant_buffer->_readdir_struct) == 0 ? PL_reentrant_buffer->_readdir_struct : 0)
+# endif
+# endif
+#endif /* HAS_READDIR_R */
+
+#ifdef HAS_READDIR64_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef readdir64
+# if !defined(readdir64) && READDIR64_R_PROTO == REENTRANT_PROTO_I_TSR
+# define readdir64(a) (readdir64_r(a, PL_reentrant_buffer->_readdir64_struct, &PL_reentrant_buffer->_readdir64_ptr) == 0 ? PL_reentrant_buffer->_readdir64_ptr : 0)
+# endif
+# if !defined(readdir64) && READDIR64_R_PROTO == REENTRANT_PROTO_I_TS
+# define readdir64(a) (readdir64_r(a, PL_reentrant_buffer->_readdir64_struct) == 0 ? PL_reentrant_buffer->_readdir64_struct : 0)
+# endif
+# endif
+#endif /* HAS_READDIR64_R */
+
+#ifdef HAS_SETGRENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef setgrent
+# if !defined(setgrent) && SETGRENT_R_PROTO == REENTRANT_PROTO_I_H
+# define setgrent() (setgrent_r(&PL_reentrant_buffer->_grent_fptr) == 0 ? 1 : 0)
+# endif
+# if !defined(setgrent) && SETGRENT_R_PROTO == REENTRANT_PROTO_V_H
+# define setgrent() setgrent_r(&PL_reentrant_buffer->_grent_fptr)
+# endif
+# endif
+#endif /* HAS_SETGRENT_R */
+
+#ifdef HAS_SETHOSTENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef sethostent
+# if !defined(sethostent) && SETHOSTENT_R_PROTO == REENTRANT_PROTO_I_ID
+# define sethostent(a) (sethostent_r(a, &PL_reentrant_buffer->_hostent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(sethostent) && SETHOSTENT_R_PROTO == REENTRANT_PROTO_V_ID
+# define sethostent(a) sethostent_r(a, &PL_reentrant_buffer->_hostent_data)
+# endif
+# endif
+#endif /* HAS_SETHOSTENT_R */
+
+#ifdef HAS_SETLOCALE_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef setlocale
+# if !defined(setlocale) && SETLOCALE_R_PROTO == REENTRANT_PROTO_I_ICBI
+# define setlocale(a, b) (setlocale_r(a, b, PL_reentrant_buffer->_setlocale_buffer, PL_reentrant_buffer->_setlocale_size) == 0 ? PL_reentrant_buffer->_setlocale_buffer : 0)
+# endif
+# endif
+#endif /* HAS_SETLOCALE_R */
+
+#ifdef HAS_SETNETENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef setnetent
+# if !defined(setnetent) && SETNETENT_R_PROTO == REENTRANT_PROTO_I_ID
+# define setnetent(a) (setnetent_r(a, &PL_reentrant_buffer->_netent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(setnetent) && SETNETENT_R_PROTO == REENTRANT_PROTO_V_ID
+# define setnetent(a) setnetent_r(a, &PL_reentrant_buffer->_netent_data)
+# endif
+# endif
+#endif /* HAS_SETNETENT_R */
+
+#ifdef HAS_SETPROTOENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef setprotoent
+# if !defined(setprotoent) && SETPROTOENT_R_PROTO == REENTRANT_PROTO_I_ID
+# define setprotoent(a) (setprotoent_r(a, &PL_reentrant_buffer->_protoent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(setprotoent) && SETPROTOENT_R_PROTO == REENTRANT_PROTO_V_ID
+# define setprotoent(a) setprotoent_r(a, &PL_reentrant_buffer->_protoent_data)
+# endif
+# endif
+#endif /* HAS_SETPROTOENT_R */
+
+#ifdef HAS_SETPWENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef setpwent
+# if !defined(setpwent) && SETPWENT_R_PROTO == REENTRANT_PROTO_I_H
+# define setpwent() (setpwent_r(&PL_reentrant_buffer->_pwent_fptr) == 0 ? 1 : 0)
+# endif
+# if !defined(setpwent) && SETPWENT_R_PROTO == REENTRANT_PROTO_V_H
+# define setpwent() setpwent_r(&PL_reentrant_buffer->_pwent_fptr)
+# endif
+# endif
+#endif /* HAS_SETPWENT_R */
+
+#ifdef HAS_SETSERVENT_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef setservent
+# if !defined(setservent) && SETSERVENT_R_PROTO == REENTRANT_PROTO_I_ID
+# define setservent(a) (setservent_r(a, &PL_reentrant_buffer->_servent_data) == 0 ? 1 : 0)
+# endif
+# if !defined(setservent) && SETSERVENT_R_PROTO == REENTRANT_PROTO_V_ID
+# define setservent(a) setservent_r(a, &PL_reentrant_buffer->_servent_data)
+# endif
+# endif
+#endif /* HAS_SETSERVENT_R */
+
+#ifdef HAS_SRAND48_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef srand48
+# if !defined(srand48) && SRAND48_R_PROTO == REENTRANT_PROTO_I_LS
+# define srand48(a) (srand48_r(a, &PL_reentrant_buffer->_drand48_struct) == 0 ? &PL_reentrant_buffer->_drand48_struct : 0)
+# endif
+# endif
+#endif /* HAS_SRAND48_R */
+
+#ifdef HAS_SRANDOM_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef srandom
+# if !defined(srandom) && SRANDOM_R_PROTO == REENTRANT_PROTO_I_TS
+# define srandom(a) (srandom_r(a, &PL_reentrant_buffer->_srandom_struct) == 0 ? &PL_reentrant_buffer->_srandom_struct : 0)
+# endif
+# endif
+#endif /* HAS_SRANDOM_R */
+
+#ifdef HAS_STRERROR_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef strerror
+# if !defined(strerror) && STRERROR_R_PROTO == REENTRANT_PROTO_I_IBW
+# define strerror(a) (strerror_r(a, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size) == 0 ? PL_reentrant_buffer->_strerror_buffer : 0)
+# endif
+# if !defined(strerror) && STRERROR_R_PROTO == REENTRANT_PROTO_I_IBI
+# define strerror(a) (strerror_r(a, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size) == 0 ? PL_reentrant_buffer->_strerror_buffer : 0)
+# endif
+# if !defined(strerror) && STRERROR_R_PROTO == REENTRANT_PROTO_B_IBW
+# define strerror(a) strerror_r(a, PL_reentrant_buffer->_strerror_buffer, PL_reentrant_buffer->_strerror_size)
+# endif
+# endif
+#endif /* HAS_STRERROR_R */
+
+#ifdef HAS_TMPNAM_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef tmpnam
+# if !defined(tmpnam) && TMPNAM_R_PROTO == REENTRANT_PROTO_B_B
+# define tmpnam(a) tmpnam_r(a)
+# endif
+# endif
+#endif /* HAS_TMPNAM_R */
+
+#ifdef HAS_TTYNAME_R
+# if defined(PERL_REENTR_API) && (PERL_REENTR_API+0 == 1)
+# undef ttyname
+# if !defined(ttyname) && TTYNAME_R_PROTO == REENTRANT_PROTO_I_IBW
+# define ttyname(a) (ttyname_r(a, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size) == 0 ? PL_reentrant_buffer->_ttyname_buffer : 0)
+# endif
+# if !defined(ttyname) && TTYNAME_R_PROTO == REENTRANT_PROTO_I_IBI
+# define ttyname(a) (ttyname_r(a, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size) == 0 ? PL_reentrant_buffer->_ttyname_buffer : 0)
+# endif
+# if !defined(ttyname) && TTYNAME_R_PROTO == REENTRANT_PROTO_B_IBI
+# define ttyname(a) ttyname_r(a, PL_reentrant_buffer->_ttyname_buffer, PL_reentrant_buffer->_ttyname_size)
+# endif
+# endif
+#endif /* HAS_TTYNAME_R */
+
+
+
+#endif /* USE_REENTRANT_API */
+
+#endif
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/regcharclass.h b/Master/tlpkg/tlperl/lib/CORE/regcharclass.h
new file mode 100644
index 00000000000..f9a1558d66a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/regcharclass.h
@@ -0,0 +1,454 @@
+/* -*- buffer-read-only: t -*-
+ *
+ * regcharclass.h
+ *
+ * Copyright (C) 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ * This file is built by Porting/regcharclass.pl.
+ *
+ * Any changes made here will be lost!
+ *
+ */
+
+/*
+ LNBREAK: Line Break: \R
+
+ "\x0D\x0A" # CRLF - Network (Windows) line ending
+ 0x0A # LF | LINE FEED
+ 0x0B # VT | VERTICAL TAB
+ 0x0C # FF | FORM FEED
+ 0x0D # CR | CARRIAGE RETURN
+ 0x85 # NEL | NEXT LINE
+ 0x2028 # LINE SEPARATOR
+ 0x2029 # PARAGRAPH SEPARATOR
+*/
+/*** GENERATED CODE ***/
+#define is_LNBREAK(s,is_utf8) \
+( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+: ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+: ( is_utf8 ) ? \
+ ( ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+: ( 0x85 == ((U8*)s)[0] ) )
+
+/*** GENERATED CODE ***/
+#define is_LNBREAK_safe(s,e,is_utf8) \
+( ((e)-(s) > 2) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+ : ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+ : ( is_utf8 ) ? \
+ ( ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+ : ( 0x85 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 1) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+ : ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+ : ( is_utf8 ) ? \
+ ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \
+ : ( 0x85 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 0) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+ : ( !( is_utf8 ) ) ? \
+ ( 0x85 == ((U8*)s)[0] ) \
+ : 0 ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_LNBREAK_utf8(s) \
+( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+: ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+: ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+: ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_LNBREAK_utf8_safe(s,e) \
+( ((e)-(s) > 2) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+ : ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+ : ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+: ((e)-(s) > 1) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+ : ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+ : ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : 0 ) \
+: ((e)-(s) > 0) ? \
+ ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_LNBREAK_latin1(s) \
+( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+: ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+: ( 0x85 == ((U8*)s)[0] ) )
+
+/*** GENERATED CODE ***/
+#define is_LNBREAK_latin1_safe(s,e) \
+( ((e)-(s) > 1) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0C ) ? 1 \
+ : ( 0x0D == ((U8*)s)[0] ) ? \
+ ( ( 0x0A == ((U8*)s)[1] ) ? 2 : 1 ) \
+ : ( 0x85 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 0) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x85 == ((U8*)s)[0] )\
+: 0 )
+
+/*
+ HORIZWS: Horizontal Whitespace: \h \H
+
+ 0x09 # HT
+ 0x20 # SPACE
+ 0xa0 # NBSP
+ 0x1680 # OGHAM SPACE MARK
+ 0x180e # MONGOLIAN VOWEL SEPARATOR
+ 0x2000 # EN QUAD
+ 0x2001 # EM QUAD
+ 0x2002 # EN SPACE
+ 0x2003 # EM SPACE
+ 0x2004 # THREE-PER-EM SPACE
+ 0x2005 # FOUR-PER-EM SPACE
+ 0x2006 # SIX-PER-EM SPACE
+ 0x2007 # FIGURE SPACE
+ 0x2008 # PUNCTUATION SPACE
+ 0x2009 # THIN SPACE
+ 0x200A # HAIR SPACE
+ 0x202f # NARROW NO-BREAK SPACE
+ 0x205f # MEDIUM MATHEMATICAL SPACE
+ 0x3000 # IDEOGRAPHIC SPACE
+*/
+/*** GENERATED CODE ***/
+#define is_HORIZWS(s,is_utf8) \
+( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+: ( is_utf8 ) ? \
+ ( ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE1 == ((U8*)s)[0] ) ? \
+ ( ( 0x9A == ((U8*)s)[1] ) ? \
+ ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : ( 0xA0 == ((U8*)s)[1] ) ? \
+ ( ( 0x8E == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( 0x80 == ((U8*)s)[1] ) ? \
+ ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\
+ : ( 0x81 == ((U8*)s)[1] ) ? \
+ ( ( 0x9F == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+ : ( 0xE3 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) \
+ : 0 ) \
+: ( 0xA0 == ((U8*)s)[0] ) )
+
+/*** GENERATED CODE ***/
+#define is_HORIZWS_safe(s,e,is_utf8) \
+( ((e)-(s) > 2) ? \
+ ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+ : ( is_utf8 ) ? \
+ ( ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE1 == ((U8*)s)[0] ) ? \
+ ( ( 0x9A == ((U8*)s)[1] ) ? \
+ ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : ( 0xA0 == ((U8*)s)[1] ) ? \
+ ( ( 0x8E == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( 0x80 == ((U8*)s)[1] ) ? \
+ ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\
+ : ( 0x81 == ((U8*)s)[1] ) ? \
+ ( ( 0x9F == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+ : ( 0xE3 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+ : ( 0xA0 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 1) ? \
+ ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+ : ( is_utf8 ) ? \
+ ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0xA0 == ((U8*)s)[1] ) ) ? 2 : 0 ) \
+ : ( 0xA0 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 0) ? \
+ ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+ : ( !( is_utf8 ) ) ? \
+ ( 0xA0 == ((U8*)s)[0] ) \
+ : 0 ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_HORIZWS_utf8(s) \
+( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+: ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+: ( 0xE1 == ((U8*)s)[0] ) ? \
+ ( ( 0x9A == ((U8*)s)[1] ) ? \
+ ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : ( 0xA0 == ((U8*)s)[1] ) ? \
+ ( ( 0x8E == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+: ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( 0x80 == ((U8*)s)[1] ) ? \
+ ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\
+ : ( 0x81 == ((U8*)s)[1] ) ? \
+ ( ( 0x9F == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+: ( 0xE3 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_HORIZWS_utf8_safe(s,e) \
+( ((e)-(s) > 2) ? \
+ ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+ : ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE1 == ((U8*)s)[0] ) ? \
+ ( ( 0x9A == ((U8*)s)[1] ) ? \
+ ( ( 0x80 == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : ( 0xA0 == ((U8*)s)[1] ) ? \
+ ( ( 0x8E == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( 0x80 == ((U8*)s)[1] ) ? \
+ ( ( ( 0x80 <= ((U8*)s)[2] && ((U8*)s)[2] <= 0x8A ) || 0xAF == ((U8*)s)[2] ) ? 3 : 0 )\
+ : ( 0x81 == ((U8*)s)[1] ) ? \
+ ( ( 0x9F == ((U8*)s)[2] ) ? 3 : 0 ) \
+ : 0 ) \
+ : ( 0xE3 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0x80 == ((U8*)s)[2] ) ) ? 3 : 0 ) \
+ : 0 ) \
+: ((e)-(s) > 1) ? \
+ ( ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) ? 1 \
+ : ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0xA0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : 0 ) \
+: ((e)-(s) > 0) ? \
+ ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_HORIZWS_latin1(s) \
+( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] || 0xA0 == ((U8*)s)[0] )
+
+/*** GENERATED CODE ***/
+#define is_HORIZWS_latin1_safe(s,e) \
+( ((e)-(s) > 0) ? \
+ ( 0x09 == ((U8*)s)[0] || 0x20 == ((U8*)s)[0] || 0xA0 == ((U8*)s)[0] ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_HORIZWS_cp(cp) \
+( 0x09 == cp || ( 0x09 < cp && \
+( 0x20 == cp || ( 0x20 < cp && \
+( 0xA0 == cp || ( 0xA0 < cp && \
+( 0x1680 == cp || ( 0x1680 < cp && \
+( 0x180E == cp || ( 0x180E < cp && \
+( ( 0x2000 <= cp && cp <= 0x200A ) || ( 0x200A < cp && \
+( 0x202F == cp || ( 0x202F < cp && \
+( 0x205F == cp || ( 0x205F < cp && \
+0x3000 == cp ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
+
+/*
+ VERTWS: Vertical Whitespace: \v \V
+
+ 0x0A # LF
+ 0x0B # VT
+ 0x0C # FF
+ 0x0D # CR
+ 0x85 # NEL
+ 0x2028 # LINE SEPARATOR
+ 0x2029 # PARAGRAPH SEPARATOR
+*/
+/*** GENERATED CODE ***/
+#define is_VERTWS(s,is_utf8) \
+( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+: ( is_utf8 ) ? \
+ ( ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+: ( 0x85 == ((U8*)s)[0] ) )
+
+/*** GENERATED CODE ***/
+#define is_VERTWS_safe(s,e,is_utf8) \
+( ((e)-(s) > 2) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+ : ( is_utf8 ) ? \
+ ( ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+ : ( 0x85 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 1) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+ : ( is_utf8 ) ? \
+ ( ( ( 0xC2 == ((U8*)s)[0] ) && ( 0x85 == ((U8*)s)[1] ) ) ? 2 : 0 ) \
+ : ( 0x85 == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 0) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+ : ( !( is_utf8 ) ) ? \
+ ( 0x85 == ((U8*)s)[0] ) \
+ : 0 ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_VERTWS_utf8(s) \
+( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+: ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+: ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_VERTWS_utf8_safe(s,e) \
+( ((e)-(s) > 2) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+ : ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xE2 == ((U8*)s)[0] ) ? \
+ ( ( ( 0x80 == ((U8*)s)[1] ) && ( 0xA8 == ((U8*)s)[2] || 0xA9 == ((U8*)s)[2] ) ) ? 3 : 0 )\
+ : 0 ) \
+: ((e)-(s) > 1) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) ? 1 \
+ : ( 0xC2 == ((U8*)s)[0] ) ? \
+ ( ( 0x85 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : 0 ) \
+: ((e)-(s) > 0) ? \
+ ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_VERTWS_latin1(s) \
+( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x85 == ((U8*)s)[0] )
+
+/*** GENERATED CODE ***/
+#define is_VERTWS_latin1_safe(s,e) \
+( ((e)-(s) > 0) ? \
+ ( ( 0x0A <= ((U8*)s)[0] && ((U8*)s)[0] <= 0x0D ) || 0x85 == ((U8*)s)[0] )\
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_VERTWS_cp(cp) \
+( ( 0x0A <= cp && cp <= 0x0D ) || ( 0x0D < cp && \
+( 0x85 == cp || ( 0x85 < cp && \
+( 0x2028 == cp || ( 0x2028 < cp && \
+0x2029 == cp ) ) ) ) ) )
+
+/*
+ TRICKYFOLD: Problematic fold case letters.
+
+ 0x00DF # LATIN1 SMALL LETTER SHARP S
+ 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+*/
+/*** GENERATED CODE ***/
+#define is_TRICKYFOLD(s,is_utf8) \
+( ( is_utf8 ) ? \
+ ( ( 0xC3 == ((U8*)s)[0] ) ? \
+ ( ( 0x9F == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xCE == ((U8*)s)[0] ) ? \
+ ( ( 0x90 == ((U8*)s)[1] || 0xB0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : 0 ) \
+: ( 0xDF == ((U8*)s)[0] ) )
+
+/*** GENERATED CODE ***/
+#define is_TRICKYFOLD_safe(s,e,is_utf8) \
+( ((e)-(s) > 1) ? \
+ ( ( is_utf8 ) ? \
+ ( ( 0xC3 == ((U8*)s)[0] ) ? \
+ ( ( 0x9F == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : ( 0xCE == ((U8*)s)[0] ) ? \
+ ( ( 0x90 == ((U8*)s)[1] || 0xB0 == ((U8*)s)[1] ) ? 2 : 0 ) \
+ : 0 ) \
+ : ( 0xDF == ((U8*)s)[0] ) ) \
+: ((e)-(s) > 0) ? \
+ ( ( !( is_utf8 ) ) ? \
+ ( 0xDF == ((U8*)s)[0] ) \
+ : 0 ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define is_TRICKYFOLD_cp(cp) \
+( 0xDF == cp || ( 0xDF < cp && \
+( 0x390 == cp || ( 0x390 < cp && \
+0x3B0 == cp ) ) ) )
+
+/*** GENERATED CODE ***/
+#define what_TRICKYFOLD(s,is_utf8) \
+( ( is_utf8 ) ? \
+ ( ( 0xC3 == ((U8*)s)[0] ) ? \
+ ( ( 0x9F == ((U8*)s)[1] ) ? 0xDF : 0 ) \
+ : ( 0xCE == ((U8*)s)[0] ) ? \
+ ( ( 0x90 == ((U8*)s)[1] ) ? 0x390 \
+ : ( 0xB0 == ((U8*)s)[1] ) ? 0x3B0 : 0 ) \
+ : 0 ) \
+: ( 0xDF == ((U8*)s)[0] ) ? 0xDF : 0 )
+
+/*** GENERATED CODE ***/
+#define what_TRICKYFOLD_safe(s,e,is_utf8) \
+( ((e)-(s) > 1) ? \
+ ( ( is_utf8 ) ? \
+ ( ( 0xC3 == ((U8*)s)[0] ) ? \
+ ( ( 0x9F == ((U8*)s)[1] ) ? 0xDF : 0 ) \
+ : ( 0xCE == ((U8*)s)[0] ) ? \
+ ( ( 0x90 == ((U8*)s)[1] ) ? 0x390 \
+ : ( 0xB0 == ((U8*)s)[1] ) ? 0x3B0 : 0 ) \
+ : 0 ) \
+ : ( 0xDF == ((U8*)s)[0] ) ? 0xDF : 0 ) \
+: ((e)-(s) > 0) ? \
+ ( ( ( !( is_utf8 ) ) && ( 0xDF == ((U8*)s)[0] ) ) ? 0xDF : 0 ) \
+: 0 )
+
+/*** GENERATED CODE ***/
+#define what_len_TRICKYFOLD(s,is_utf8,len) \
+( ( is_utf8 ) ? \
+ ( ( 0xC3 == ((U8*)s)[0] ) ? \
+ ( ( 0x9F == ((U8*)s)[1] ) ? len=2, 0xDF : 0 ) \
+ : ( 0xCE == ((U8*)s)[0] ) ? \
+ ( ( 0x90 == ((U8*)s)[1] ) ? len=2, 0x390 \
+ : ( 0xB0 == ((U8*)s)[1] ) ? len=2, 0x3B0 : 0 ) \
+ : 0 ) \
+: ( 0xDF == ((U8*)s)[0] ) ? len=1, 0xDF : 0 )
+
+/*** GENERATED CODE ***/
+#define what_len_TRICKYFOLD_safe(s,e,is_utf8,len) \
+( ((e)-(s) > 1) ? \
+ ( ( is_utf8 ) ? \
+ ( ( 0xC3 == ((U8*)s)[0] ) ? \
+ ( ( 0x9F == ((U8*)s)[1] ) ? len=2, 0xDF : 0 ) \
+ : ( 0xCE == ((U8*)s)[0] ) ? \
+ ( ( 0x90 == ((U8*)s)[1] ) ? len=2, 0x390 \
+ : ( 0xB0 == ((U8*)s)[1] ) ? len=2, 0x3B0 : 0 ) \
+ : 0 ) \
+ : ( 0xDF == ((U8*)s)[0] ) ? len=1, 0xDF : 0 ) \
+: ((e)-(s) > 0) ? \
+ ( ( ( !( is_utf8 ) ) && ( 0xDF == ((U8*)s)[0] ) ) ? len=1, 0xDF : 0 ) \
+: 0 )
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/regcomp.h b/Master/tlpkg/tlperl/lib/CORE/regcomp.h
new file mode 100644
index 00000000000..20b4401ed2f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/regcomp.h
@@ -0,0 +1,850 @@
+/* regcomp.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ * 2000, 2001, 2002, 2003, 2005, 2006, 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+#include "regcharclass.h"
+
+typedef OP OP_4tree; /* Will be redefined later. */
+
+
+/* Convert branch sequences to more efficient trie ops? */
+#define PERL_ENABLE_TRIE_OPTIMISATION 1
+
+/* Be really agressive about optimising patterns with trie sequences? */
+#define PERL_ENABLE_EXTENDED_TRIE_OPTIMISATION 1
+
+/* Use old style unicode mappings for perl and posix character classes
+ *
+ * NOTE: Enabling this essentially breaks character class matching against unicode
+ * strings, so that POSIX char classes match when they shouldn't, and \d matches
+ * way more than 10 characters, and sometimes a charclass and its complement either
+ * both match or neither match.
+ * NOTE: Disabling this will cause various backwards compatibility issues to rear
+ * their head, and tests to fail. However it will make the charclass behaviour
+ * consistant regardless of internal string type, and make character class inversions
+ * consistant. The tests that fail in the regex engine are basically broken tests.
+ *
+ * Personally I think 5.12 should disable this for sure. Its a bit more debatable for
+ * 5.10, so for now im leaving it enabled.
+ * XXX: It is now enabled for 5.11/5.12
+ *
+ * -demerphq
+ */
+#define PERL_LEGACY_UNICODE_CHARCLASS_MAPPINGS 1
+
+/* Should the optimiser take positive assertions into account? */
+#define PERL_ENABLE_POSITIVE_ASSERTION_STUDY 0
+
+/* Not for production use: */
+#define PERL_ENABLE_EXPERIMENTAL_REGEX_OPTIMISATIONS 0
+
+/* Activate offsets code - set to if 1 to enable */
+#ifdef DEBUGGING
+#define RE_TRACK_PATTERN_OFFSETS
+#endif
+
+/* Unless the next line is uncommented it is illegal to combine lazy
+ matching with possessive matching. Frankly it doesn't make much sense
+ to allow it as X*?+ matches nothing, X+?+ matches a single char only,
+ and X{min,max}?+ matches min times only.
+ */
+/* #define REG_ALLOW_MINMOD_SUSPEND */
+
+/*
+ * The "internal use only" fields in regexp.h are present to pass info from
+ * compile to execute that permits the execute phase to run lots faster on
+ * simple cases. They are:
+ *
+ * regstart sv that must begin a match; NULL if none obvious
+ * reganch is the match anchored (at beginning-of-line only)?
+ * regmust string (pointer into program) that match must include, or NULL
+ * [regmust changed to SV* for bminstr()--law]
+ * regmlen length of regmust string
+ * [regmlen not used currently]
+ *
+ * Regstart and reganch permit very fast decisions on suitable starting points
+ * for a match, cutting down the work a lot. Regmust permits fast rejection
+ * of lines that cannot possibly match. The regmust tests are costly enough
+ * that pregcomp() supplies a regmust only if the r.e. contains something
+ * potentially expensive (at present, the only such thing detected is * or +
+ * at the start of the r.e., which can involve a lot of backup). Regmlen is
+ * supplied because the test in pregexec() needs it and pregcomp() is computing
+ * it anyway.
+ * [regmust is now supplied always. The tests that use regmust have a
+ * heuristic that disables the test if it usually matches.]
+ *
+ * [In fact, we now use regmust in many cases to locate where the search
+ * starts in the string, so if regback is >= 0, the regmust search is never
+ * wasted effort. The regback variable says how many characters back from
+ * where regmust matched is the earliest possible start of the match.
+ * For instance, /[a-z].foo/ has a regmust of 'foo' and a regback of 2.]
+ */
+
+/*
+ * Structure for regexp "program". This is essentially a linear encoding
+ * of a nondeterministic finite-state machine (aka syntax charts or
+ * "railroad normal form" in parsing technology). Each node is an opcode
+ * plus a "next" pointer, possibly plus an operand. "Next" pointers of
+ * all nodes except BRANCH implement concatenation; a "next" pointer with
+ * a BRANCH on both ends of it is connecting two alternatives. (Here we
+ * have one of the subtle syntax dependencies: an individual BRANCH (as
+ * opposed to a collection of them) is never concatenated with anything
+ * because of operator precedence.) The operand of some types of node is
+ * a literal string; for others, it is a node leading into a sub-FSM. In
+ * particular, the operand of a BRANCH node is the first node of the branch.
+ * (NB this is *not* a tree structure: the tail of the branch connects
+ * to the thing following the set of BRANCHes.) The opcodes are defined
+ * in regnodes.h which is generated from regcomp.sym by regcomp.pl.
+ */
+
+/*
+ * A node is one char of opcode followed by two chars of "next" pointer.
+ * "Next" pointers are stored as two 8-bit pieces, high order first. The
+ * value is a positive offset from the opcode of the node containing it.
+ * An operand, if any, simply follows the node. (Note that much of the
+ * code generation knows about this implicit relationship.)
+ *
+ * Using two bytes for the "next" pointer is vast overkill for most things,
+ * but allows patterns to get big without disasters.
+ *
+ * [The "next" pointer is always aligned on an even
+ * boundary, and reads the offset directly as a short. Also, there is no
+ * special test to reverse the sign of BACK pointers since the offset is
+ * stored negative.]
+ */
+
+/* This is the stuff that used to live in regexp.h that was truly
+ private to the engine itself. It now lives here. */
+
+
+
+ typedef struct regexp_internal {
+ int name_list_idx; /* Optional data index of an array of paren names */
+ union {
+ U32 *offsets; /* offset annotations 20001228 MJD
+ data about mapping the program to the
+ string -
+ offsets[0] is proglen when this is used
+ */
+ U32 proglen;
+ } u;
+
+ regnode *regstclass; /* Optional startclass as identified or constructed
+ by the optimiser */
+ struct reg_data *data; /* Additional miscellaneous data used by the program.
+ Used to make it easier to clone and free arbitrary
+ data that the regops need. Often the ARG field of
+ a regop is an index into this structure */
+ regnode program[1]; /* Unwarranted chumminess with compiler. */
+} regexp_internal;
+
+#define RXi_SET(x,y) (x)->pprivate = (void*)(y)
+#define RXi_GET(x) ((regexp_internal *)((x)->pprivate))
+#define RXi_GET_DECL(r,ri) regexp_internal *ri = RXi_GET(r)
+/*
+ * Flags stored in regexp->intflags
+ * These are used only internally to the regexp engine
+ *
+ * See regexp.h for flags used externally to the regexp engine
+ */
+#define PREGf_SKIP 0x00000001
+#define PREGf_IMPLICIT 0x00000002 /* Converted .* to ^.* */
+#define PREGf_NAUGHTY 0x00000004 /* how exponential is this pattern? */
+#define PREGf_VERBARG_SEEN 0x00000008
+#define PREGf_CUTGROUP_SEEN 0x00000010
+
+
+/* this is where the old regcomp.h started */
+
+struct regnode_string {
+ U8 str_len;
+ U8 type;
+ U16 next_off;
+ char string[1];
+};
+
+/* Argument bearing node - workhorse,
+ arg1 is often for the data field */
+struct regnode_1 {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+ U32 arg1;
+};
+
+/* Similar to a regnode_1 but with an extra signed argument */
+struct regnode_2L {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+ U32 arg1;
+ I32 arg2;
+};
+
+/* 'Two field' -- Two 16 bit unsigned args */
+struct regnode_2 {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+ U16 arg1;
+ U16 arg2;
+};
+
+
+#define ANYOF_BITMAP_SIZE 32 /* 256 b/(8 b/B) */
+#define ANYOF_CLASSBITMAP_SIZE 4 /* up to 32 (8*4) named classes */
+
+/* also used by trie */
+struct regnode_charclass {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+ U32 arg1;
+ char bitmap[ANYOF_BITMAP_SIZE]; /* only compile-time */
+};
+
+struct regnode_charclass_class { /* has [[:blah:]] classes */
+ U8 flags; /* should have ANYOF_CLASS here */
+ U8 type;
+ U16 next_off;
+ U32 arg1;
+ char bitmap[ANYOF_BITMAP_SIZE]; /* both compile-time */
+ char classflags[ANYOF_CLASSBITMAP_SIZE]; /* and run-time */
+};
+
+/* XXX fix this description.
+ Impose a limit of REG_INFTY on various pattern matching operations
+ to limit stack growth and to avoid "infinite" recursions.
+*/
+/* The default size for REG_INFTY is I16_MAX, which is the same as
+ SHORT_MAX (see perl.h). Unfortunately I16 isn't necessarily 16 bits
+ (see handy.h). On the Cray C90, sizeof(short)==4 and hence I16_MAX is
+ ((1<<31)-1), while on the Cray T90, sizeof(short)==8 and I16_MAX is
+ ((1<<63)-1). To limit stack growth to reasonable sizes, supply a
+ smaller default.
+ --Andy Dougherty 11 June 1998
+*/
+#if SHORTSIZE > 2
+# ifndef REG_INFTY
+# define REG_INFTY ((1<<15)-1)
+# endif
+#endif
+
+#ifndef REG_INFTY
+# define REG_INFTY I16_MAX
+#endif
+
+#define ARG_VALUE(arg) (arg)
+#define ARG__SET(arg,val) ((arg) = (val))
+
+#undef ARG
+#undef ARG1
+#undef ARG2
+
+#define ARG(p) ARG_VALUE(ARG_LOC(p))
+#define ARG1(p) ARG_VALUE(ARG1_LOC(p))
+#define ARG2(p) ARG_VALUE(ARG2_LOC(p))
+#define ARG2L(p) ARG_VALUE(ARG2L_LOC(p))
+
+#define ARG_SET(p, val) ARG__SET(ARG_LOC(p), (val))
+#define ARG1_SET(p, val) ARG__SET(ARG1_LOC(p), (val))
+#define ARG2_SET(p, val) ARG__SET(ARG2_LOC(p), (val))
+#define ARG2L_SET(p, val) ARG__SET(ARG2L_LOC(p), (val))
+
+#undef NEXT_OFF
+#undef NODE_ALIGN
+
+#define NEXT_OFF(p) ((p)->next_off)
+#define NODE_ALIGN(node)
+#define NODE_ALIGN_FILL(node) ((node)->flags = 0xde) /* deadbeef */
+
+#define SIZE_ALIGN NODE_ALIGN
+
+#undef OP
+#undef OPERAND
+#undef MASK
+#undef STRING
+
+#define OP(p) ((p)->type)
+#define OPERAND(p) (((struct regnode_string *)p)->string)
+#define MASK(p) ((char*)OPERAND(p))
+#define STR_LEN(p) (((struct regnode_string *)p)->str_len)
+#define STRING(p) (((struct regnode_string *)p)->string)
+#define STR_SZ(l) ((l + sizeof(regnode) - 1) / sizeof(regnode))
+#define NODE_SZ_STR(p) (STR_SZ(STR_LEN(p))+1)
+
+#undef NODE_ALIGN
+#undef ARG_LOC
+#undef NEXTOPER
+#undef PREVOPER
+
+#define NODE_ALIGN(node)
+#define ARG_LOC(p) (((struct regnode_1 *)p)->arg1)
+#define ARG1_LOC(p) (((struct regnode_2 *)p)->arg1)
+#define ARG2_LOC(p) (((struct regnode_2 *)p)->arg2)
+#define ARG2L_LOC(p) (((struct regnode_2L *)p)->arg2)
+
+#define NODE_STEP_REGNODE 1 /* sizeof(regnode)/sizeof(regnode) */
+#define EXTRA_STEP_2ARGS EXTRA_SIZE(struct regnode_2)
+
+#define NODE_STEP_B 4
+
+#define NEXTOPER(p) ((p) + NODE_STEP_REGNODE)
+#define PREVOPER(p) ((p) - NODE_STEP_REGNODE)
+
+#define FILL_ADVANCE_NODE(ptr, op) STMT_START { \
+ (ptr)->type = op; (ptr)->next_off = 0; (ptr)++; } STMT_END
+#define FILL_ADVANCE_NODE_ARG(ptr, op, arg) STMT_START { \
+ ARG_SET(ptr, arg); FILL_ADVANCE_NODE(ptr, op); (ptr) += 1; } STMT_END
+
+#define REG_MAGIC 0234
+
+#define SIZE_ONLY (RExC_emit == &PL_regdummy)
+
+/* Flags for node->flags of ANYOF */
+
+#define ANYOF_CLASS 0x08 /* has [[:blah:]] classes */
+#define ANYOF_INVERT 0x04
+#define ANYOF_FOLD 0x02
+#define ANYOF_LOCALE 0x01
+
+/* Used for regstclass only */
+#define ANYOF_EOS 0x10 /* Can match an empty string too */
+
+/* There is a character or a range past 0xff */
+#define ANYOF_UNICODE 0x20
+#define ANYOF_UNICODE_ALL 0x40 /* Can match any char past 0xff */
+
+/* size of node is large (includes class pointer) */
+#define ANYOF_LARGE 0x80
+
+/* Are there any runtime flags on in this node? */
+#define ANYOF_RUNTIME(s) (ANYOF_FLAGS(s) & 0x0f)
+
+#define ANYOF_FLAGS_ALL 0xff
+
+/* Character classes for node->classflags of ANYOF */
+/* Should be synchronized with a table in regprop() */
+/* 2n should pair with 2n+1 */
+
+#define ANYOF_ALNUM 0 /* \w, PL_utf8_alnum, utf8::IsWord, ALNUM */
+#define ANYOF_NALNUM 1
+#define ANYOF_SPACE 2 /* \s */
+#define ANYOF_NSPACE 3
+#define ANYOF_DIGIT 4 /* \d */
+#define ANYOF_NDIGIT 5
+#define ANYOF_ALNUMC 6 /* [[:alnum:]] isalnum(3), utf8::IsAlnum, ALNUMC */
+#define ANYOF_NALNUMC 7
+#define ANYOF_ALPHA 8
+#define ANYOF_NALPHA 9
+#define ANYOF_ASCII 10
+#define ANYOF_NASCII 11
+#define ANYOF_CNTRL 12
+#define ANYOF_NCNTRL 13
+#define ANYOF_GRAPH 14
+#define ANYOF_NGRAPH 15
+#define ANYOF_LOWER 16
+#define ANYOF_NLOWER 17
+#define ANYOF_PRINT 18
+#define ANYOF_NPRINT 19
+#define ANYOF_PUNCT 20
+#define ANYOF_NPUNCT 21
+#define ANYOF_UPPER 22
+#define ANYOF_NUPPER 23
+#define ANYOF_XDIGIT 24
+#define ANYOF_NXDIGIT 25
+#define ANYOF_PSXSPC 26 /* POSIX space: \s plus the vertical tab */
+#define ANYOF_NPSXSPC 27
+#define ANYOF_BLANK 28 /* GNU extension: space and tab: non-vertical space */
+#define ANYOF_NBLANK 29
+
+#define ANYOF_MAX 32
+
+/* pseudo classes, not stored in the class bitmap, but used as flags
+ during compilation of char classes */
+
+#define ANYOF_VERTWS (ANYOF_MAX+1)
+#define ANYOF_NVERTWS (ANYOF_MAX+2)
+#define ANYOF_HORIZWS (ANYOF_MAX+3)
+#define ANYOF_NHORIZWS (ANYOF_MAX+4)
+
+/* Backward source code compatibility. */
+
+#define ANYOF_ALNUML ANYOF_ALNUM
+#define ANYOF_NALNUML ANYOF_NALNUM
+#define ANYOF_SPACEL ANYOF_SPACE
+#define ANYOF_NSPACEL ANYOF_NSPACE
+
+/* Utility macros for the bitmap and classes of ANYOF */
+
+#define ANYOF_SIZE (sizeof(struct regnode_charclass))
+#define ANYOF_CLASS_SIZE (sizeof(struct regnode_charclass_class))
+
+#define ANYOF_FLAGS(p) ((p)->flags)
+
+#define ANYOF_BIT(c) (1 << ((c) & 7))
+
+#define ANYOF_CLASS_BYTE(p, c) (((struct regnode_charclass_class*)(p))->classflags[((c) >> 3) & 3])
+#define ANYOF_CLASS_SET(p, c) (ANYOF_CLASS_BYTE(p, c) |= ANYOF_BIT(c))
+#define ANYOF_CLASS_CLEAR(p, c) (ANYOF_CLASS_BYTE(p, c) &= ~ANYOF_BIT(c))
+#define ANYOF_CLASS_TEST(p, c) (ANYOF_CLASS_BYTE(p, c) & ANYOF_BIT(c))
+
+#define ANYOF_CLASS_ZERO(ret) Zero(((struct regnode_charclass_class*)(ret))->classflags, ANYOF_CLASSBITMAP_SIZE, char)
+#define ANYOF_BITMAP_ZERO(ret) Zero(((struct regnode_charclass*)(ret))->bitmap, ANYOF_BITMAP_SIZE, char)
+
+#define ANYOF_BITMAP(p) (((struct regnode_charclass*)(p))->bitmap)
+#define ANYOF_BITMAP_BYTE(p, c) (ANYOF_BITMAP(p)[(((U8)(c)) >> 3) & 31])
+#define ANYOF_BITMAP_SET(p, c) (ANYOF_BITMAP_BYTE(p, c) |= ANYOF_BIT(c))
+#define ANYOF_BITMAP_CLEAR(p,c) (ANYOF_BITMAP_BYTE(p, c) &= ~ANYOF_BIT(c))
+#define ANYOF_BITMAP_TEST(p, c) (ANYOF_BITMAP_BYTE(p, c) & ANYOF_BIT(c))
+
+#define ANYOF_BITMAP_SETALL(p) \
+ memset (ANYOF_BITMAP(p), 255, ANYOF_BITMAP_SIZE)
+#define ANYOF_BITMAP_CLEARALL(p) \
+ Zero (ANYOF_BITMAP(p), ANYOF_BITMAP_SIZE)
+/* Check that all 256 bits are all set. Used in S_cl_is_anything() */
+#define ANYOF_BITMAP_TESTALLSET(p) \
+ memEQ (ANYOF_BITMAP(p), "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", ANYOF_BITMAP_SIZE)
+
+#define ANYOF_SKIP ((ANYOF_SIZE - 1)/sizeof(regnode))
+#define ANYOF_CLASS_SKIP ((ANYOF_CLASS_SIZE - 1)/sizeof(regnode))
+#define ANYOF_CLASS_ADD_SKIP (ANYOF_CLASS_SKIP - ANYOF_SKIP)
+
+
+/*
+ * Utility definitions.
+ */
+#ifndef CHARMASK
+# define UCHARAT(p) ((int)*(const U8*)(p))
+#else
+# define UCHARAT(p) ((int)*(p)&CHARMASK)
+#endif
+
+#define EXTRA_SIZE(guy) ((sizeof(guy)-1)/sizeof(struct regnode))
+
+#define REG_SEEN_ZERO_LEN 0x00000001
+#define REG_SEEN_LOOKBEHIND 0x00000002
+#define REG_SEEN_GPOS 0x00000004
+#define REG_SEEN_EVAL 0x00000008
+#define REG_SEEN_CANY 0x00000010
+#define REG_SEEN_SANY REG_SEEN_CANY /* src bckwrd cmpt */
+#define REG_SEEN_RECURSE 0x00000020
+#define REG_TOP_LEVEL_BRANCHES 0x00000040
+#define REG_SEEN_VERBARG 0x00000080
+#define REG_SEEN_CUTGROUP 0x00000100
+#define REG_SEEN_RUN_ON_COMMENT 0x00000200
+
+START_EXTERN_C
+
+#ifdef PLUGGABLE_RE_EXTENSION
+#include "re_nodes.h"
+#else
+#include "regnodes.h"
+#endif
+
+/* The following have no fixed length. U8 so we can do strchr() on it. */
+#ifndef DOINIT
+EXTCONST U8 PL_varies[];
+#else
+EXTCONST U8 PL_varies[] = {
+ BRANCH, BACK, STAR, PLUS, CURLY, CURLYX, REF, REFF, REFFL,
+ WHILEM, CURLYM, CURLYN, BRANCHJ, IFTHEN, SUSPEND, CLUMP,
+ NREF, NREFF, NREFFL,
+ 0
+};
+#endif
+
+/* The following always have a length of 1. U8 we can do strchr() on it. */
+/* (Note that length 1 means "one character" under UTF8, not "one octet".) */
+#ifndef DOINIT
+EXTCONST U8 PL_simple[];
+#else
+EXTCONST U8 PL_simple[] = {
+ REG_ANY, SANY, CANY,
+ ANYOF,
+ ALNUM, ALNUML,
+ NALNUM, NALNUML,
+ SPACE, SPACEL,
+ NSPACE, NSPACEL,
+ DIGIT, NDIGIT,
+ VERTWS, NVERTWS,
+ HORIZWS, NHORIZWS,
+ 0
+};
+#endif
+
+#ifndef PLUGGABLE_RE_EXTENSION
+#ifndef DOINIT
+EXTCONST regexp_engine PL_core_reg_engine;
+#else /* DOINIT */
+EXTCONST regexp_engine PL_core_reg_engine = {
+ Perl_re_compile,
+ Perl_regexec_flags,
+ Perl_re_intuit_start,
+ Perl_re_intuit_string,
+ Perl_regfree_internal,
+ Perl_reg_numbered_buff_fetch,
+ Perl_reg_numbered_buff_store,
+ Perl_reg_numbered_buff_length,
+ Perl_reg_named_buff,
+ Perl_reg_named_buff_iter,
+ Perl_reg_qr_package,
+#if defined(USE_ITHREADS)
+ Perl_regdupe_internal
+#endif
+};
+#endif /* DOINIT */
+#endif /* PLUGGABLE_RE_EXTENSION */
+
+
+END_EXTERN_C
+
+
+/* .what is a character array with one character for each member of .data
+ * The character describes the function of the corresponding .data item:
+ * f - start-class data for regstclass optimization
+ * n - Root of op tree for (?{EVAL}) item
+ * o - Start op for (?{EVAL}) item
+ * p - Pad for (?{EVAL}) item
+ * s - swash for Unicode-style character class, and the multicharacter
+ * strings resulting from casefolding the single-character entries
+ * in the character class
+ * t - trie struct
+ * u - trie struct's widecharmap (a HV, so can't share, must dup)
+ * also used for revcharmap and words under DEBUGGING
+ * T - aho-trie struct
+ * S - sv for named capture lookup
+ * 20010712 mjd@plover.com
+ * (Remember to update re_dup() and pregfree() if you add any items.)
+ */
+struct reg_data {
+ U32 count;
+ U8 *what;
+ void* data[1];
+};
+
+/* Code in S_to_utf8_substr() and S_to_byte_substr() in regexec.c accesses
+ anchored* and float* via array indexes 0 and 1. */
+#define anchored_substr substrs->data[0].substr
+#define anchored_utf8 substrs->data[0].utf8_substr
+#define anchored_offset substrs->data[0].min_offset
+#define anchored_end_shift substrs->data[0].end_shift
+
+#define float_substr substrs->data[1].substr
+#define float_utf8 substrs->data[1].utf8_substr
+#define float_min_offset substrs->data[1].min_offset
+#define float_max_offset substrs->data[1].max_offset
+#define float_end_shift substrs->data[1].end_shift
+
+#define check_substr substrs->data[2].substr
+#define check_utf8 substrs->data[2].utf8_substr
+#define check_offset_min substrs->data[2].min_offset
+#define check_offset_max substrs->data[2].max_offset
+#define check_end_shift substrs->data[2].end_shift
+
+#define RX_ANCHORED_SUBSTR(rx) (((struct regexp *)SvANY(rx))->anchored_substr)
+#define RX_ANCHORED_UTF8(rx) (((struct regexp *)SvANY(rx))->anchored_utf8)
+#define RX_FLOAT_SUBSTR(rx) (((struct regexp *)SvANY(rx))->float_substr)
+#define RX_FLOAT_UTF8(rx) (((struct regexp *)SvANY(rx))->float_utf8)
+
+/* trie related stuff */
+
+/* a transition record for the state machine. the
+ check field determines which state "owns" the
+ transition. the char the transition is for is
+ determined by offset from the owning states base
+ field. the next field determines which state
+ is to be transitioned to if any.
+*/
+struct _reg_trie_trans {
+ U32 next;
+ U32 check;
+};
+
+/* a transition list element for the list based representation */
+struct _reg_trie_trans_list_elem {
+ U16 forid;
+ U32 newstate;
+};
+typedef struct _reg_trie_trans_list_elem reg_trie_trans_le;
+
+/* a state for compressed nodes. base is an offset
+ into an array of reg_trie_trans array. If wordnum is
+ nonzero the state is accepting. if base is zero then
+ the state has no children (and will be accepting)
+*/
+struct _reg_trie_state {
+ U16 wordnum;
+ union {
+ U32 base;
+ reg_trie_trans_le* list;
+ } trans;
+};
+
+
+
+typedef struct _reg_trie_state reg_trie_state;
+typedef struct _reg_trie_trans reg_trie_trans;
+
+
+/* anything in here that needs to be freed later
+ should be dealt with in pregfree.
+ refcount is first in both this and _reg_ac_data to allow a space
+ optimisation in Perl_regdupe. */
+struct _reg_trie_data {
+ U32 refcount; /* number of times this trie is referenced */
+ U32 lasttrans; /* last valid transition element */
+ U16 *charmap; /* byte to charid lookup array */
+ reg_trie_state *states; /* state data */
+ reg_trie_trans *trans; /* array of transition elements */
+ char *bitmap; /* stclass bitmap */
+ U32 *wordlen; /* array of lengths of words */
+ U16 *jump; /* optional 1 indexed array of offsets before tail
+ for the node following a given word. */
+ U16 *nextword; /* optional 1 indexed array to support linked list
+ of duplicate wordnums */
+ U16 uniquecharcount; /* unique chars in trie (width of trans table) */
+ U32 startstate; /* initial state - used for common prefix optimisation */
+ STRLEN minlen; /* minimum length of words in trie - build/opt only? */
+ STRLEN maxlen; /* maximum length of words in trie - build/opt only? */
+ U32 statecount; /* Build only - number of states in the states array
+ (including the unused zero state) */
+ U32 wordcount; /* Build only */
+#ifdef DEBUGGING
+ STRLEN charcount; /* Build only */
+#endif
+};
+/* There is one (3 under DEBUGGING) pointers that logically belong in this
+ structure, but are held outside as they need duplication on thread cloning,
+ whereas the rest of the structure can be read only:
+ HV *widecharmap; code points > 255 to charid
+#ifdef DEBUGGING
+ AV *words; Array of words contained in trie, for dumping
+ AV *revcharmap; Map of each charid back to its character representation
+#endif
+*/
+
+#define TRIE_WORDS_OFFSET 2
+
+typedef struct _reg_trie_data reg_trie_data;
+
+/* refcount is first in both this and _reg_trie_data to allow a space
+ optimisation in Perl_regdupe. */
+struct _reg_ac_data {
+ U32 refcount;
+ U32 trie;
+ U32 *fail;
+ reg_trie_state *states;
+};
+typedef struct _reg_ac_data reg_ac_data;
+
+/* ANY_BIT doesnt use the structure, so we can borrow it here.
+ This is simpler than refactoring all of it as wed end up with
+ three different sets... */
+
+#define TRIE_BITMAP(p) (((reg_trie_data *)(p))->bitmap)
+#define TRIE_BITMAP_BYTE(p, c) (TRIE_BITMAP(p)[(((U8)(c)) >> 3) & 31])
+#define TRIE_BITMAP_SET(p, c) (TRIE_BITMAP_BYTE(p, c) |= ANYOF_BIT((U8)c))
+#define TRIE_BITMAP_CLEAR(p,c) (TRIE_BITMAP_BYTE(p, c) &= ~ANYOF_BIT((U8)c))
+#define TRIE_BITMAP_TEST(p, c) (TRIE_BITMAP_BYTE(p, c) & ANYOF_BIT((U8)c))
+
+#define IS_ANYOF_TRIE(op) ((op)==TRIEC || (op)==AHOCORASICKC)
+#define IS_TRIE_AC(op) ((op)>=AHOCORASICK)
+
+
+#define BITMAP_BYTE(p, c) (((U8*)p)[(((U8)(c)) >> 3) & 31])
+#define BITMAP_TEST(p, c) (BITMAP_BYTE(p, c) & ANYOF_BIT((U8)c))
+
+/* these defines assume uniquecharcount is the correct variable, and state may be evaluated twice */
+#define TRIE_NODENUM(state) (((state)-1)/(trie->uniquecharcount)+1)
+#define SAFE_TRIE_NODENUM(state) ((state) ? (((state)-1)/(trie->uniquecharcount)+1) : (state))
+#define TRIE_NODEIDX(state) ((state) ? (((state)-1)*(trie->uniquecharcount)+1) : (state))
+
+#ifdef DEBUGGING
+#define TRIE_CHARCOUNT(trie) ((trie)->charcount)
+#else
+#define TRIE_CHARCOUNT(trie) (trie_charcount)
+#endif
+
+#define RE_TRIE_MAXBUF_INIT 65536
+#define RE_TRIE_MAXBUF_NAME "\022E_TRIE_MAXBUF"
+#define RE_DEBUG_FLAGS "\022E_DEBUG_FLAGS"
+
+/*
+
+RE_DEBUG_FLAGS is used to control what debug output is emitted
+its divided into three groups of options, some of which interact.
+The three groups are: Compile, Execute, Extra. There is room for a
+further group, as currently only the low three bytes are used.
+
+ Compile Options:
+
+ PARSE
+ PEEP
+ TRIE
+ PROGRAM
+ OFFSETS
+
+ Execute Options:
+
+ INTUIT
+ MATCH
+ TRIE
+
+ Extra Options
+
+ TRIE
+ OFFSETS
+
+If you modify any of these make sure you make corresponding changes to
+re.pm, especially to the documentation.
+
+*/
+
+
+/* Compile */
+#define RE_DEBUG_COMPILE_MASK 0x0000FF
+#define RE_DEBUG_COMPILE_PARSE 0x000001
+#define RE_DEBUG_COMPILE_OPTIMISE 0x000002
+#define RE_DEBUG_COMPILE_TRIE 0x000004
+#define RE_DEBUG_COMPILE_DUMP 0x000008
+#define RE_DEBUG_COMPILE_FLAGS 0x000010
+
+/* Execute */
+#define RE_DEBUG_EXECUTE_MASK 0x00FF00
+#define RE_DEBUG_EXECUTE_INTUIT 0x000100
+#define RE_DEBUG_EXECUTE_MATCH 0x000200
+#define RE_DEBUG_EXECUTE_TRIE 0x000400
+
+/* Extra */
+#define RE_DEBUG_EXTRA_MASK 0xFF0000
+#define RE_DEBUG_EXTRA_TRIE 0x010000
+#define RE_DEBUG_EXTRA_OFFSETS 0x020000
+#define RE_DEBUG_EXTRA_OFFDEBUG 0x040000
+#define RE_DEBUG_EXTRA_STATE 0x080000
+#define RE_DEBUG_EXTRA_OPTIMISE 0x100000
+#define RE_DEBUG_EXTRA_BUFFERS 0x400000
+#define RE_DEBUG_EXTRA_GPOS 0x800000
+/* combined */
+#define RE_DEBUG_EXTRA_STACK 0x280000
+
+#define RE_DEBUG_FLAG(x) (re_debug_flags & x)
+/* Compile */
+#define DEBUG_COMPILE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_MASK) x )
+#define DEBUG_PARSE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_PARSE) x )
+#define DEBUG_OPTIMISE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_OPTIMISE) x )
+#define DEBUG_PARSE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_PARSE) x )
+#define DEBUG_DUMP_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_DUMP) x )
+#define DEBUG_TRIE_COMPILE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_TRIE) x )
+#define DEBUG_FLAGS_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_COMPILE_FLAGS) x )
+/* Execute */
+#define DEBUG_EXECUTE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXECUTE_MASK) x )
+#define DEBUG_INTUIT_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXECUTE_INTUIT) x )
+#define DEBUG_MATCH_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXECUTE_MATCH) x )
+#define DEBUG_TRIE_EXECUTE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXECUTE_TRIE) x )
+
+/* Extra */
+#define DEBUG_EXTRA_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_MASK) x )
+#define DEBUG_OFFSETS_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_OFFSETS) x )
+#define DEBUG_STATE_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_STATE) x )
+#define DEBUG_STACK_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_STACK) x )
+#define DEBUG_BUFFERS_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_BUFFERS) x )
+
+#define DEBUG_OPTIMISE_MORE_r(x) DEBUG_r( \
+ if ((RE_DEBUG_EXTRA_OPTIMISE|RE_DEBUG_COMPILE_OPTIMISE) == \
+ (re_debug_flags & (RE_DEBUG_EXTRA_OPTIMISE|RE_DEBUG_COMPILE_OPTIMISE)) ) x )
+#define MJD_OFFSET_DEBUG(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_OFFDEBUG) \
+ Perl_warn_nocontext x )
+#define DEBUG_TRIE_COMPILE_MORE_r(x) DEBUG_TRIE_COMPILE_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_TRIE) x )
+#define DEBUG_TRIE_EXECUTE_MORE_r(x) DEBUG_TRIE_EXECUTE_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_TRIE) x )
+
+#define DEBUG_TRIE_r(x) DEBUG_r( \
+ if (re_debug_flags & (RE_DEBUG_COMPILE_TRIE \
+ | RE_DEBUG_EXECUTE_TRIE )) x )
+#define DEBUG_GPOS_r(x) DEBUG_r( \
+ if (re_debug_flags & RE_DEBUG_EXTRA_GPOS) x )
+
+/* initialization */
+/* get_sv() can return NULL during global destruction. */
+#define GET_RE_DEBUG_FLAGS DEBUG_r({ \
+ SV * re_debug_flags_sv = NULL; \
+ re_debug_flags_sv = get_sv(RE_DEBUG_FLAGS, 1); \
+ if (re_debug_flags_sv) { \
+ if (!SvIOK(re_debug_flags_sv)) \
+ sv_setuv(re_debug_flags_sv, RE_DEBUG_COMPILE_DUMP | RE_DEBUG_EXECUTE_MASK ); \
+ re_debug_flags=SvIV(re_debug_flags_sv); \
+ }\
+})
+
+#ifdef DEBUGGING
+
+#define GET_RE_DEBUG_FLAGS_DECL IV re_debug_flags = 0; GET_RE_DEBUG_FLAGS;
+
+#define RE_PV_COLOR_DECL(rpv,rlen,isuni,dsv,pv,l,m,c1,c2) \
+ const char * const rpv = \
+ pv_pretty((dsv), (pv), (l), (m), \
+ PL_colors[(c1)],PL_colors[(c2)], \
+ PERL_PV_ESCAPE_RE |((isuni) ? PERL_PV_ESCAPE_UNI : 0) ); \
+ const int rlen = SvCUR(dsv)
+
+#define RE_SV_ESCAPE(rpv,isuni,dsv,sv,m) \
+ const char * const rpv = \
+ pv_pretty((dsv), (SvPV_nolen_const(sv)), (SvCUR(sv)), (m), \
+ PL_colors[(c1)],PL_colors[(c2)], \
+ PERL_PV_ESCAPE_RE |((isuni) ? PERL_PV_ESCAPE_UNI : 0) )
+
+#define RE_PV_QUOTED_DECL(rpv,isuni,dsv,pv,l,m) \
+ const char * const rpv = \
+ pv_pretty((dsv), (pv), (l), (m), \
+ PL_colors[0], PL_colors[1], \
+ ( PERL_PV_PRETTY_QUOTE | PERL_PV_ESCAPE_RE | PERL_PV_PRETTY_ELLIPSES | \
+ ((isuni) ? PERL_PV_ESCAPE_UNI : 0)) \
+ )
+
+#define RE_SV_DUMPLEN(ItEm) (SvCUR(ItEm) - (SvTAIL(ItEm)!=0))
+#define RE_SV_TAIL(ItEm) (SvTAIL(ItEm) ? "$" : "")
+
+#else /* if not DEBUGGING */
+
+#define GET_RE_DEBUG_FLAGS_DECL
+#define RE_PV_COLOR_DECL(rpv,rlen,isuni,dsv,pv,l,m,c1,c2)
+#define RE_SV_ESCAPE(rpv,isuni,dsv,sv,m)
+#define RE_PV_QUOTED_DECL(rpv,isuni,dsv,pv,l,m)
+#define RE_SV_DUMPLEN(ItEm)
+#define RE_SV_TAIL(ItEm)
+
+#endif /* DEBUG RELATED DEFINES */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/regexp.h b/Master/tlpkg/tlperl/lib/CORE/regexp.h
new file mode 100644
index 00000000000..90e3406a965
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/regexp.h
@@ -0,0 +1,736 @@
+/* regexp.h
+ *
+ * Copyright (C) 1993, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
+ * 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * Definitions etc. for regexp(3) routines.
+ *
+ * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof],
+ * not the System V one.
+ */
+#ifndef PLUGGABLE_RE_EXTENSION
+/* we don't want to include this stuff if we are inside of
+ an external regex engine based on the core one - like re 'debug'*/
+
+struct regnode {
+ U8 flags;
+ U8 type;
+ U16 next_off;
+};
+
+typedef struct regnode regnode;
+
+struct reg_substr_data;
+
+struct reg_data;
+
+struct regexp_engine;
+struct regexp;
+
+struct reg_substr_datum {
+ I32 min_offset;
+ I32 max_offset;
+ SV *substr; /* non-utf8 variant */
+ SV *utf8_substr; /* utf8 variant */
+ I32 end_shift;
+};
+struct reg_substr_data {
+ struct reg_substr_datum data[3]; /* Actual array */
+};
+
+#ifdef PERL_OLD_COPY_ON_WRITE
+#define SV_SAVED_COPY SV *saved_copy; /* If non-NULL, SV which is COW from original */
+#else
+#define SV_SAVED_COPY
+#endif
+
+typedef struct regexp_paren_pair {
+ I32 start;
+ I32 end;
+} regexp_paren_pair;
+
+/*
+ The regexp/REGEXP struct, see L<perlreapi> for further documentation
+ on the individual fields. The struct is ordered so that the most
+ commonly used fields are placed at the start.
+
+ Any patch that adds items to this struct will need to include
+ changes to F<sv.c> (C<Perl_re_dup()>) and F<regcomp.c>
+ (C<pregfree()>). This involves freeing or cloning items in the
+ regexp's data array based on the data item's type.
+*/
+
+#define _REGEXP_COMMON \
+ /* what engine created this regexp? */ \
+ const struct regexp_engine* engine; \
+ REGEXP *mother_re; /* what re is this a lightweight copy of? */ \
+ /* Information about the match that the perl core uses to */ \
+ /* manage things */ \
+ U32 extflags; /* Flags used both externally and internally */ \
+ I32 minlen; /* mininum possible length of string to match */\
+ I32 minlenret; /* mininum possible length of $& */ \
+ U32 gofs; /* chars left of pos that we search from */ \
+ /* substring data about strings that must appear in the */ \
+ /* final match, used for optimisations */ \
+ struct reg_substr_data *substrs; \
+ U32 nparens; /* number of capture buffers */ \
+ /* private engine specific data */ \
+ U32 intflags; /* Engine Specific Internal flags */ \
+ void *pprivate; /* Data private to the regex engine which */ \
+ /* created this object. */ \
+ /* Data about the last/current match. These are modified */ \
+ /* during matching */ \
+ U32 lastparen; /* last open paren matched */ \
+ U32 lastcloseparen; /* last close paren matched */ \
+ regexp_paren_pair *swap; /* Unused: 5.10.1 and later */ \
+ /* Array of offsets for (@-) and (@+) */ \
+ regexp_paren_pair *offs; \
+ /* saved or original string so \digit works forever. */ \
+ char *subbeg; \
+ SV_SAVED_COPY /* If non-NULL, SV which is COW from original */\
+ I32 sublen; /* Length of string pointed by subbeg */ \
+ /* Information about the match that isn't often used */ \
+ /* offset from wrapped to the start of precomp */ \
+ PERL_BITFIELD32 pre_prefix:4; \
+ /* number of eval groups in the pattern - for security checks */\
+ PERL_BITFIELD32 seen_evals:28
+
+typedef struct regexp {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+ _REGEXP_COMMON;
+} regexp;
+
+/* HV *paren_names; Optional hash of paren names
+ now stored in the IV union */
+
+#define RXp_PAREN_NAMES(rx) ((rx)->xiv_u.xivu_hv)
+
+/* used for high speed searches */
+typedef struct re_scream_pos_data_s
+{
+ char **scream_olds; /* match pos */
+ I32 *scream_pos; /* Internal iterator of scream. */
+} re_scream_pos_data;
+
+/* regexp_engine structure. This is the dispatch table for regexes.
+ * Any regex engine implementation must be able to build one of these.
+ */
+typedef struct regexp_engine {
+ REGEXP* (*comp) (pTHX_ SV * const pattern, U32 flags);
+ I32 (*exec) (pTHX_ REGEXP * const rx, char* stringarg, char* strend,
+ char* strbeg, I32 minend, SV* screamer,
+ void* data, U32 flags);
+ char* (*intuit) (pTHX_ REGEXP * const rx, SV *sv, char *strpos,
+ char *strend, const U32 flags,
+ re_scream_pos_data *data);
+ SV* (*checkstr) (pTHX_ REGEXP * const rx);
+ void (*free) (pTHX_ REGEXP * const rx);
+ void (*numbered_buff_FETCH) (pTHX_ REGEXP * const rx, const I32 paren,
+ SV * const sv);
+ void (*numbered_buff_STORE) (pTHX_ REGEXP * const rx, const I32 paren,
+ SV const * const value);
+ I32 (*numbered_buff_LENGTH) (pTHX_ REGEXP * const rx, const SV * const sv,
+ const I32 paren);
+ SV* (*named_buff) (pTHX_ REGEXP * const rx, SV * const key,
+ SV * const value, const U32 flags);
+ SV* (*named_buff_iter) (pTHX_ REGEXP * const rx, const SV * const lastkey,
+ const U32 flags);
+ SV* (*qr_package)(pTHX_ REGEXP * const rx);
+#ifdef USE_ITHREADS
+ void* (*dupe) (pTHX_ REGEXP * const rx, CLONE_PARAMS *param);
+#endif
+} regexp_engine;
+
+/*
+ These are passed to the numbered capture variable callbacks as the
+ paren name. >= 1 is reserved for actual numbered captures, i.e. $1,
+ $2 etc.
+*/
+#define RX_BUFF_IDX_PREMATCH -2 /* $` / ${^PREMATCH} */
+#define RX_BUFF_IDX_POSTMATCH -1 /* $' / ${^POSTMATCH} */
+#define RX_BUFF_IDX_FULLMATCH 0 /* $& / ${^MATCH} */
+
+/*
+ Flags that are passed to the named_buff and named_buff_iter
+ callbacks above. Those routines are called from universal.c via the
+ Tie::Hash::NamedCapture interface for %+ and %- and the re::
+ functions in the same file.
+*/
+
+/* The Tie::Hash::NamedCapture operation this is part of, if any */
+#define RXapif_FETCH 0x0001
+#define RXapif_STORE 0x0002
+#define RXapif_DELETE 0x0004
+#define RXapif_CLEAR 0x0008
+#define RXapif_EXISTS 0x0010
+#define RXapif_SCALAR 0x0020
+#define RXapif_FIRSTKEY 0x0040
+#define RXapif_NEXTKEY 0x0080
+
+/* Whether %+ or %- is being operated on */
+#define RXapif_ONE 0x0100 /* %+ */
+#define RXapif_ALL 0x0200 /* %- */
+
+/* Whether this is being called from a re:: function */
+#define RXapif_REGNAME 0x0400
+#define RXapif_REGNAMES 0x0800
+#define RXapif_REGNAMES_COUNT 0x1000
+
+/*
+=head1 REGEXP Functions
+
+=for apidoc Am|REGEXP *|SvRX|SV *sv
+
+Convenience macro to get the REGEXP from a SV. This is approximately
+equivalent to the following snippet:
+
+ if (SvMAGICAL(sv))
+ mg_get(sv);
+ if (SvROK(sv) &&
+ (tmpsv = (SV*)SvRV(sv)) &&
+ SvTYPE(tmpsv) == SVt_PVMG &&
+ (tmpmg = mg_find(tmpsv, PERL_MAGIC_qr)))
+ {
+ return (REGEXP *)tmpmg->mg_obj;
+ }
+
+NULL will be returned if a REGEXP* is not found.
+
+=for apidoc Am|bool|SvRXOK|SV* sv
+
+Returns a boolean indicating whether the SV contains qr magic
+(PERL_MAGIC_qr).
+
+If you want to do something with the REGEXP* later use SvRX instead
+and check for NULL.
+
+=cut
+*/
+
+#define SvRX(sv) (Perl_get_re_arg(aTHX_ sv))
+#define SvRXOK(sv) (Perl_get_re_arg(aTHX_ sv) ? TRUE : FALSE)
+
+
+/* Flags stored in regexp->extflags
+ * These are used by code external to the regexp engine
+ *
+ * Note that flags starting with RXf_PMf_ have exact equivalents
+ * stored in op_pmflags and which are defined in op.h, they are defined
+ * numerically here only for clarity.
+ *
+ * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl
+ * so that regnodes.h is updated with the changes.
+ *
+ */
+
+/* 0x3F of extflags is used by (RXf_)PMf_COMPILETIME
+ * If you change these you need to change the equivalent flags in op.h, and
+ * vice versa. */
+#define RXf_PMf_MULTILINE 0x00000001 /* /m */
+#define RXf_PMf_SINGLELINE 0x00000002 /* /s */
+#define RXf_PMf_FOLD 0x00000004 /* /i */
+#define RXf_PMf_EXTENDED 0x00000008 /* /x */
+#define RXf_PMf_KEEPCOPY 0x00000010 /* /p */
+#define RXf_PMf_LOCALE 0x00000020 /* use locale */
+/* these flags are transfered from the PMOP->op_pmflags member during compilation */
+#define RXf_PMf_STD_PMMOD_SHIFT 0
+#define RXf_PMf_STD_PMMOD (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_FOLD|RXf_PMf_EXTENDED)
+#define RXf_PMf_COMPILETIME (RXf_PMf_MULTILINE|RXf_PMf_SINGLELINE|RXf_PMf_LOCALE|RXf_PMf_FOLD|RXf_PMf_EXTENDED|RXf_PMf_KEEPCOPY)
+
+#define CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl) \
+ case IGNORE_PAT_MOD: *(pmfl) |= RXf_PMf_FOLD; break; \
+ case MULTILINE_PAT_MOD: *(pmfl) |= RXf_PMf_MULTILINE; break; \
+ case SINGLE_PAT_MOD: *(pmfl) |= RXf_PMf_SINGLELINE; break; \
+ case XTENDED_PAT_MOD: *(pmfl) |= RXf_PMf_EXTENDED; break
+
+/* chars and strings used as regex pattern modifiers
+ * Singlular is a 'c'har, plural is a "string"
+ *
+ * NOTE, KEEPCOPY was originally 'k', but was changed to 'p' for preserve
+ * for compatibility reasons with Regexp::Common which highjacked (?k:...)
+ * for its own uses. So 'k' is out as well.
+ */
+#define EXEC_PAT_MOD 'e'
+#define KEEPCOPY_PAT_MOD 'p'
+#define ONCE_PAT_MOD 'o'
+#define GLOBAL_PAT_MOD 'g'
+#define CONTINUE_PAT_MOD 'c'
+#define MULTILINE_PAT_MOD 'm'
+#define SINGLE_PAT_MOD 's'
+#define IGNORE_PAT_MOD 'i'
+#define XTENDED_PAT_MOD 'x'
+
+#define ONCE_PAT_MODS "o"
+#define KEEPCOPY_PAT_MODS "p"
+#define EXEC_PAT_MODS "e"
+#define LOOP_PAT_MODS "gc"
+
+#define STD_PAT_MODS "msix"
+
+#define INT_PAT_MODS STD_PAT_MODS KEEPCOPY_PAT_MODS
+
+#define EXT_PAT_MODS ONCE_PAT_MODS KEEPCOPY_PAT_MODS
+#define QR_PAT_MODS STD_PAT_MODS EXT_PAT_MODS
+#define M_PAT_MODS QR_PAT_MODS LOOP_PAT_MODS
+#define S_PAT_MODS M_PAT_MODS EXEC_PAT_MODS
+
+/*
+ * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl
+ * so that regnodes.h is updated with the changes.
+ *
+ */
+
+/* Anchor and GPOS related stuff */
+#define RXf_ANCH_BOL 0x00000100
+#define RXf_ANCH_MBOL 0x00000200
+#define RXf_ANCH_SBOL 0x00000400
+#define RXf_ANCH_GPOS 0x00000800
+#define RXf_GPOS_SEEN 0x00001000
+#define RXf_GPOS_FLOAT 0x00002000
+/* two bits here */
+#define RXf_ANCH (RXf_ANCH_BOL|RXf_ANCH_MBOL|RXf_ANCH_GPOS|RXf_ANCH_SBOL)
+#define RXf_GPOS_CHECK (RXf_GPOS_SEEN|RXf_ANCH_GPOS)
+#define RXf_ANCH_SINGLE (RXf_ANCH_SBOL|RXf_ANCH_GPOS)
+
+/* What we have seen */
+#define RXf_LOOKBEHIND_SEEN 0x00004000
+#define RXf_EVAL_SEEN 0x00008000
+#define RXf_CANY_SEEN 0x00010000
+
+/* Special */
+#define RXf_NOSCAN 0x00020000
+#define RXf_CHECK_ALL 0x00040000
+
+/* UTF8 related */
+#define RXf_MATCH_UTF8 0x00100000
+
+/* Intuit related */
+#define RXf_USE_INTUIT_NOML 0x00200000
+#define RXf_USE_INTUIT_ML 0x00400000
+#define RXf_INTUIT_TAIL 0x00800000
+
+/*
+ Set in Perl_pmruntime if op_flags & OPf_SPECIAL, i.e. split. Will
+ be used by regex engines to check whether they should set
+ RXf_SKIPWHITE
+*/
+#define RXf_SPLIT 0x01000000
+
+#define RXf_USE_INTUIT (RXf_USE_INTUIT_NOML|RXf_USE_INTUIT_ML)
+
+/* Copy and tainted info */
+#define RXf_COPY_DONE 0x02000000
+#define RXf_TAINTED_SEEN 0x04000000
+#define RXf_TAINTED 0x08000000 /* this pattern is tainted */
+
+/* Flags indicating special patterns */
+#define RXf_START_ONLY 0x10000000 /* Pattern is /^/ */
+#define RXf_SKIPWHITE 0x20000000 /* Pattern is for a split / / */
+#define RXf_WHITE 0x40000000 /* Pattern is /\s+/ */
+#define RXf_NULL 0x80000000 /* Pattern is // */
+
+/*
+ * NOTE: if you modify any RXf flags you should run regen.pl or regcomp.pl
+ * so that regnodes.h is updated with the changes.
+ *
+ */
+
+#define RX_HAS_CUTGROUP(prog) ((prog)->intflags & PREGf_CUTGROUP_SEEN)
+#define RXp_MATCH_TAINTED(prog) (RXp_EXTFLAGS(prog) & RXf_TAINTED_SEEN)
+#define RX_MATCH_TAINTED(prog) (RX_EXTFLAGS(prog) & RXf_TAINTED_SEEN)
+#define RX_MATCH_TAINTED_on(prog) (RX_EXTFLAGS(prog) |= RXf_TAINTED_SEEN)
+#define RX_MATCH_TAINTED_off(prog) (RX_EXTFLAGS(prog) &= ~RXf_TAINTED_SEEN)
+#define RX_MATCH_TAINTED_set(prog, t) ((t) \
+ ? RX_MATCH_TAINTED_on(prog) \
+ : RX_MATCH_TAINTED_off(prog))
+
+#define RXp_MATCH_COPIED(prog) (RXp_EXTFLAGS(prog) & RXf_COPY_DONE)
+#define RX_MATCH_COPIED(prog) (RX_EXTFLAGS(prog) & RXf_COPY_DONE)
+#define RXp_MATCH_COPIED_on(prog) (RXp_EXTFLAGS(prog) |= RXf_COPY_DONE)
+#define RX_MATCH_COPIED_on(prog) (RX_EXTFLAGS(prog) |= RXf_COPY_DONE)
+#define RXp_MATCH_COPIED_off(prog) (RXp_EXTFLAGS(prog) &= ~RXf_COPY_DONE)
+#define RX_MATCH_COPIED_off(prog) (RX_EXTFLAGS(prog) &= ~RXf_COPY_DONE)
+#define RX_MATCH_COPIED_set(prog,t) ((t) \
+ ? RX_MATCH_COPIED_on(prog) \
+ : RX_MATCH_COPIED_off(prog))
+
+#define RXp_EXTFLAGS(rx) ((rx)->extflags)
+
+/* For source compatibility. We used to store these explicitly. */
+#define RX_PRECOMP(prog) (RX_WRAPPED(prog) + ((struct regexp *)SvANY(prog))->pre_prefix)
+#define RX_PRECOMP_const(prog) (RX_WRAPPED_const(prog) + ((struct regexp *)SvANY(prog))->pre_prefix)
+/* FIXME? Are we hardcoding too much here and constraining plugin extension
+ writers? Specifically, the value 1 assumes that the wrapped version always
+ has exactly one character at the end, a ')'. Will that always be true? */
+#define RX_PRELEN(prog) (RX_WRAPLEN(prog) - ((struct regexp *)SvANY(prog))->pre_prefix - 1)
+#define RX_WRAPPED(prog) SvPVX(prog)
+#define RX_WRAPPED_const(prog) SvPVX_const(prog)
+#define RX_WRAPLEN(prog) SvCUR(prog)
+#define RX_CHECK_SUBSTR(prog) (((struct regexp *)SvANY(prog))->check_substr)
+#define RX_REFCNT(prog) SvREFCNT(prog)
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define RX_EXTFLAGS(prog) \
+ (*({ \
+ const REGEXP *const _rx_extflags = (prog); \
+ assert(SvTYPE(_rx_extflags) == SVt_REGEXP); \
+ &RXp_EXTFLAGS(SvANY(_rx_extflags)); \
+ }))
+# define RX_ENGINE(prog) \
+ (*({ \
+ const REGEXP *const _rx_engine = (prog); \
+ assert(SvTYPE(_rx_engine) == SVt_REGEXP); \
+ &SvANY(_rx_engine)->engine; \
+ }))
+# define RX_SUBBEG(prog) \
+ (*({ \
+ const REGEXP *const _rx_subbeg = (prog); \
+ assert(SvTYPE(_rx_subbeg) == SVt_REGEXP); \
+ &SvANY(_rx_subbeg)->subbeg; \
+ }))
+# define RX_OFFS(prog) \
+ (*({ \
+ const REGEXP *const _rx_offs = (prog); \
+ assert(SvTYPE(_rx_offs) == SVt_REGEXP); \
+ &SvANY(_rx_offs)->offs; \
+ }))
+# define RX_NPARENS(prog) \
+ (*({ \
+ const REGEXP *const _rx_nparens = (prog); \
+ assert(SvTYPE(_rx_nparens) == SVt_REGEXP); \
+ &SvANY(_rx_nparens)->nparens; \
+ }))
+#else
+# define RX_EXTFLAGS(prog) RXp_EXTFLAGS((struct regexp *)SvANY(prog))
+# define RX_ENGINE(prog) (((struct regexp *)SvANY(prog))->engine)
+# define RX_SUBBEG(prog) (((struct regexp *)SvANY(prog))->subbeg)
+# define RX_OFFS(prog) (((struct regexp *)SvANY(prog))->offs)
+# define RX_NPARENS(prog) (((struct regexp *)SvANY(prog))->nparens)
+#endif
+#define RX_SUBLEN(prog) (((struct regexp *)SvANY(prog))->sublen)
+#define RX_MINLEN(prog) (((struct regexp *)SvANY(prog))->minlen)
+#define RX_MINLENRET(prog) (((struct regexp *)SvANY(prog))->minlenret)
+#define RX_GOFS(prog) (((struct regexp *)SvANY(prog))->gofs)
+#define RX_LASTPAREN(prog) (((struct regexp *)SvANY(prog))->lastparen)
+#define RX_LASTCLOSEPAREN(prog) (((struct regexp *)SvANY(prog))->lastcloseparen)
+#define RX_SEEN_EVALS(prog) (((struct regexp *)SvANY(prog))->seen_evals)
+#define RX_SAVED_COPY(prog) (((struct regexp *)SvANY(prog))->saved_copy)
+
+#endif /* PLUGGABLE_RE_EXTENSION */
+
+/* Stuff that needs to be included in the plugable extension goes below here */
+
+#ifdef PERL_OLD_COPY_ON_WRITE
+#define RX_MATCH_COPY_FREE(rx) \
+ STMT_START {if (RX_SAVED_COPY(rx)) { \
+ SV_CHECK_THINKFIRST_COW_DROP(RX_SAVED_COPY(rx)); \
+ } \
+ if (RX_MATCH_COPIED(rx)) { \
+ Safefree(RX_SUBBEG(rx)); \
+ RX_MATCH_COPIED_off(rx); \
+ }} STMT_END
+#else
+#define RX_MATCH_COPY_FREE(rx) \
+ STMT_START {if (RX_MATCH_COPIED(rx)) { \
+ Safefree(RX_SUBBEG(rx)); \
+ RX_MATCH_COPIED_off(rx); \
+ }} STMT_END
+#endif
+
+#define RXp_MATCH_UTF8(prog) (RXp_EXTFLAGS(prog) & RXf_MATCH_UTF8)
+#define RX_MATCH_UTF8(prog) (RX_EXTFLAGS(prog) & RXf_MATCH_UTF8)
+#define RX_MATCH_UTF8_on(prog) (RX_EXTFLAGS(prog) |= RXf_MATCH_UTF8)
+#define RX_MATCH_UTF8_off(prog) (RX_EXTFLAGS(prog) &= ~RXf_MATCH_UTF8)
+#define RX_MATCH_UTF8_set(prog, t) ((t) \
+ ? (RX_MATCH_UTF8_on(prog), (PL_reg_match_utf8 = 1)) \
+ : (RX_MATCH_UTF8_off(prog), (PL_reg_match_utf8 = 0)))
+
+/* Whether the pattern stored at RX_WRAPPED is in UTF-8 */
+#define RX_UTF8(prog) SvUTF8(prog)
+
+#define REXEC_COPY_STR 0x01 /* Need to copy the string. */
+#define REXEC_CHECKED 0x02 /* check_substr already checked. */
+#define REXEC_SCREAM 0x04 /* use scream table. */
+#define REXEC_IGNOREPOS 0x08 /* \G matches at start. */
+#define REXEC_NOT_FIRST 0x10 /* This is another iteration of //g. */
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define ReREFCNT_inc(re) \
+ ({ \
+ /* This is here to generate a casting warning if incorrect. */ \
+ REGEXP *const _rerefcnt_inc = (re); \
+ assert(SvTYPE(_rerefcnt_inc) == SVt_REGEXP); \
+ SvREFCNT_inc(_rerefcnt_inc); \
+ _rerefcnt_inc; \
+ })
+# define ReREFCNT_dec(re) \
+ ({ \
+ /* This is here to generate a casting warning if incorrect. */ \
+ REGEXP *const _rerefcnt_dec = (re); \
+ SvREFCNT_dec(_rerefcnt_dec); \
+ })
+#else
+# define ReREFCNT_dec(re) SvREFCNT_dec(re)
+# define ReREFCNT_inc(re) ((REGEXP *) SvREFCNT_inc(re))
+#endif
+
+/* FIXME for plugins. */
+
+#define FBMcf_TAIL_DOLLAR 1
+#define FBMcf_TAIL_DOLLARM 2
+#define FBMcf_TAIL_Z 4
+#define FBMcf_TAIL_z 8
+#define FBMcf_TAIL (FBMcf_TAIL_DOLLAR|FBMcf_TAIL_DOLLARM|FBMcf_TAIL_Z|FBMcf_TAIL_z)
+
+#define FBMrf_MULTILINE 1
+
+/* an accepting state/position*/
+struct _reg_trie_accepted {
+ U8 *endpos;
+ U16 wordnum;
+};
+typedef struct _reg_trie_accepted reg_trie_accepted;
+
+/* some basic information about the current match that is created by
+ * Perl_regexec_flags and then passed to regtry(), regmatch() etc */
+
+typedef struct {
+ REGEXP *prog;
+ char *bol;
+ char *till;
+ SV *sv;
+ char *ganch;
+ char *cutpoint;
+} regmatch_info;
+
+
+/* structures for holding and saving the state maintained by regmatch() */
+
+#ifndef MAX_RECURSE_EVAL_NOCHANGE_DEPTH
+#define MAX_RECURSE_EVAL_NOCHANGE_DEPTH 1000
+#endif
+
+typedef I32 CHECKPOINT;
+
+typedef struct regmatch_state {
+ int resume_state; /* where to jump to on return */
+ char *locinput; /* where to backtrack in string on failure */
+
+ union {
+
+ /* this is a fake union member that matches the first element
+ * of each member that needs to store positive backtrack
+ * information */
+ struct {
+ struct regmatch_state *prev_yes_state;
+ } yes;
+
+ /* branchlike members */
+ /* this is a fake union member that matches the first elements
+ * of each member that needs to behave like a branch */
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ U32 lastparen;
+ CHECKPOINT cp;
+
+ } branchlike;
+
+ struct {
+ /* the first elements must match u.branchlike */
+ struct regmatch_state *prev_yes_state;
+ U32 lastparen;
+ CHECKPOINT cp;
+
+ regnode *next_branch; /* next branch node */
+ } branch;
+
+ struct {
+ /* the first elements must match u.branchlike */
+ struct regmatch_state *prev_yes_state;
+ U32 lastparen;
+ CHECKPOINT cp;
+
+ reg_trie_accepted *accept_buff; /* accepting states we have seen */
+ U32 accepted; /* how many accepting states we have seen */
+ U16 *jump; /* positive offsets from me */
+ regnode *B; /* node following the trie */
+ regnode *me; /* Which node am I - needed for jump tries*/
+ } trie;
+
+ /* special types - these members are used to store state for special
+ regops like eval, if/then, lookaround and the markpoint state */
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ struct regmatch_state *prev_eval;
+ struct regmatch_state *prev_curlyx;
+ REGEXP *prev_rex;
+ U32 toggle_reg_flags; /* what bits in PL_reg_flags to
+ flip when transitioning between
+ inner and outer rexen */
+ CHECKPOINT cp; /* remember current savestack indexes */
+ CHECKPOINT lastcp;
+ U32 close_paren; /* which close bracket is our end */
+ regnode *B; /* the node following us */
+ } eval;
+
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ I32 wanted;
+ I32 logical; /* saved copy of 'logical' var */
+ regnode *me; /* the IFMATCH/SUSPEND/UNLESSM node */
+ } ifmatch; /* and SUSPEND/UNLESSM */
+
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ struct regmatch_state *prev_mark;
+ SV* mark_name;
+ char *mark_loc;
+ } mark;
+
+ struct {
+ int val;
+ } keeper;
+
+ /* quantifiers - these members are used for storing state for
+ for the regops used to implement quantifiers */
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ struct regmatch_state *prev_curlyx; /* previous cur_curlyx */
+ regnode *A, *B; /* the nodes corresponding to /A*B/ */
+ CHECKPOINT cp; /* remember current savestack index */
+ bool minmod;
+ int parenfloor;/* how far back to strip paren data */
+ int min; /* the minimal number of A's to match */
+ int max; /* the maximal number of A's to match */
+
+ /* these two are modified by WHILEM */
+ int count; /* how many instances of A we've matched */
+ char *lastloc;/* where previous A matched (0-len detect) */
+ } curlyx;
+
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ struct regmatch_state *save_curlyx;
+ CHECKPOINT cp; /* remember current savestack indexes */
+ CHECKPOINT lastcp;
+ char *save_lastloc; /* previous curlyx.lastloc */
+ I32 cache_offset;
+ I32 cache_mask;
+ } whilem;
+
+ struct {
+ /* this first element must match u.yes */
+ struct regmatch_state *prev_yes_state;
+ I32 c1, c2; /* case fold search */
+ CHECKPOINT cp;
+ I32 alen; /* length of first-matched A string */
+ I32 count;
+ bool minmod;
+ regnode *A, *B; /* the nodes corresponding to /A*B/ */
+ regnode *me; /* the curlym node */
+ } curlym;
+
+ struct {
+ U32 paren;
+ CHECKPOINT cp;
+ I32 c1, c2; /* case fold search */
+ char *maxpos; /* highest possible point in string to match */
+ char *oldloc; /* the previous locinput */
+ int count;
+ int min, max; /* {m,n} */
+ regnode *A, *B; /* the nodes corresponding to /A*B/ */
+ } curly; /* and CURLYN/PLUS/STAR */
+
+ } u;
+} regmatch_state;
+
+/* how many regmatch_state structs to allocate as a single slab.
+ * We do it in 4K blocks for efficiency. The "3" is 2 for the next/prev
+ * pointers, plus 1 for any mythical malloc overhead. */
+
+#define PERL_REGMATCH_SLAB_SLOTS \
+ ((4096 - 3 * sizeof (void*)) / sizeof(regmatch_state))
+
+typedef struct regmatch_slab {
+ regmatch_state states[PERL_REGMATCH_SLAB_SLOTS];
+ struct regmatch_slab *prev, *next;
+} regmatch_slab;
+
+#define PL_reg_flags PL_reg_state.re_state_reg_flags
+#define PL_bostr PL_reg_state.re_state_bostr
+#define PL_reginput PL_reg_state.re_state_reginput
+#define PL_regeol PL_reg_state.re_state_regeol
+#define PL_regoffs PL_reg_state.re_state_regoffs
+#define PL_reglastparen PL_reg_state.re_state_reglastparen
+#define PL_reglastcloseparen PL_reg_state.re_state_reglastcloseparen
+#define PL_reg_start_tmp PL_reg_state.re_state_reg_start_tmp
+#define PL_reg_start_tmpl PL_reg_state.re_state_reg_start_tmpl
+#define PL_reg_eval_set PL_reg_state.re_state_reg_eval_set
+#define PL_reg_match_utf8 PL_reg_state.re_state_reg_match_utf8
+#define PL_reg_magic PL_reg_state.re_state_reg_magic
+#define PL_reg_oldpos PL_reg_state.re_state_reg_oldpos
+#define PL_reg_oldcurpm PL_reg_state.re_state_reg_oldcurpm
+#define PL_reg_curpm PL_reg_state.re_state_reg_curpm
+#define PL_reg_oldsaved PL_reg_state.re_state_reg_oldsaved
+#define PL_reg_oldsavedlen PL_reg_state.re_state_reg_oldsavedlen
+#define PL_reg_maxiter PL_reg_state.re_state_reg_maxiter
+#define PL_reg_leftiter PL_reg_state.re_state_reg_leftiter
+#define PL_reg_poscache PL_reg_state.re_state_reg_poscache
+#define PL_reg_poscache_size PL_reg_state.re_state_reg_poscache_size
+#define PL_regsize PL_reg_state.re_state_regsize
+#define PL_reg_starttry PL_reg_state.re_state_reg_starttry
+#define PL_nrs PL_reg_state.re_state_nrs
+
+struct re_save_state {
+ U32 re_state_reg_flags; /* from regexec.c */
+ U32 re_state_reg_start_tmpl; /* from regexec.c */
+ I32 re_state_reg_eval_set; /* from regexec.c */
+ bool re_state_reg_match_utf8; /* from regexec.c */
+ char *re_state_bostr;
+ char *re_state_reginput; /* String-input pointer. */
+ char *re_state_regeol; /* End of input, for $ check. */
+ regexp_paren_pair *re_state_regoffs; /* Pointer to start/end pairs */
+ U32 *re_state_reglastparen; /* Similarly for lastparen. */
+ U32 *re_state_reglastcloseparen; /* Similarly for lastcloseparen. */
+ char **re_state_reg_start_tmp; /* from regexec.c */
+ MAGIC *re_state_reg_magic; /* from regexec.c */
+ PMOP *re_state_reg_oldcurpm; /* from regexec.c */
+ PMOP *re_state_reg_curpm; /* from regexec.c */
+ char *re_state_reg_oldsaved; /* old saved substr during match */
+ STRLEN re_state_reg_oldsavedlen; /* old length of saved substr during match */
+ STRLEN re_state_reg_poscache_size; /* size of pos cache of WHILEM */
+ I32 re_state_reg_oldpos; /* from regexec.c */
+ I32 re_state_reg_maxiter; /* max wait until caching pos */
+ I32 re_state_reg_leftiter; /* wait until caching pos */
+ U32 re_state_regsize; /* from regexec.c */
+ char *re_state_reg_poscache; /* cache of pos of WHILEM */
+ char *re_state_reg_starttry; /* from regexec.c */
+#ifdef PERL_OLD_COPY_ON_WRITE
+ SV *re_state_nrs; /* was placeholder: unused since 5.8.0 (5.7.2 patch #12027 for bug ID 20010815.012). Used to save rx->saved_copy */
+#endif
+};
+
+#define SAVESTACK_ALLOC_FOR_RE_SAVE_STATE \
+ (1 + ((sizeof(struct re_save_state) - 1) / sizeof(*PL_savestack)))
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/regnodes.h b/Master/tlpkg/tlperl/lib/CORE/regnodes.h
new file mode 100644
index 00000000000..79de061fb6a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/regnodes.h
@@ -0,0 +1,664 @@
+/* -*- buffer-read-only: t -*-
+ !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by regcomp.pl from regcomp.sym.
+ Any changes made here will be lost!
+*/
+
+/* Regops and State definitions */
+
+#define REGNODE_MAX 90
+#define REGMATCH_STATE_MAX 130
+
+#define END 0 /* 0000 End of program. */
+#define SUCCEED 1 /* 0x01 Return from a subroutine, basically. */
+#define BOL 2 /* 0x02 Match "" at beginning of line. */
+#define MBOL 3 /* 0x03 Same, assuming multiline. */
+#define SBOL 4 /* 0x04 Same, assuming singleline. */
+#define EOS 5 /* 0x05 Match "" at end of string. */
+#define EOL 6 /* 0x06 Match "" at end of line. */
+#define MEOL 7 /* 0x07 Same, assuming multiline. */
+#define SEOL 8 /* 0x08 Same, assuming singleline. */
+#define BOUND 9 /* 0x09 Match "" at any word boundary */
+#define BOUNDL 10 /* 0x0a Match "" at any word boundary */
+#define NBOUND 11 /* 0x0b Match "" at any word non-boundary */
+#define NBOUNDL 12 /* 0x0c Match "" at any word non-boundary */
+#define GPOS 13 /* 0x0d Matches where last m//g left off. */
+#define REG_ANY 14 /* 0x0e Match any one character (except newline). */
+#define SANY 15 /* 0x0f Match any one character. */
+#define CANY 16 /* 0x10 Match any one byte. */
+#define ANYOF 17 /* 0x11 Match character in (or not in) this class. */
+#define ALNUM 18 /* 0x12 Match any alphanumeric character */
+#define ALNUML 19 /* 0x13 Match any alphanumeric char in locale */
+#define NALNUM 20 /* 0x14 Match any non-alphanumeric character */
+#define NALNUML 21 /* 0x15 Match any non-alphanumeric char in locale */
+#define SPACE 22 /* 0x16 Match any whitespace character */
+#define SPACEL 23 /* 0x17 Match any whitespace char in locale */
+#define NSPACE 24 /* 0x18 Match any non-whitespace character */
+#define NSPACEL 25 /* 0x19 Match any non-whitespace char in locale */
+#define DIGIT 26 /* 0x1a Match any numeric character */
+#define DIGITL 27 /* 0x1b Match any numeric character in locale */
+#define NDIGIT 28 /* 0x1c Match any non-numeric character */
+#define NDIGITL 29 /* 0x1d Match any non-numeric character in locale */
+#define CLUMP 30 /* 0x1e Match any combining character sequence */
+#define BRANCH 31 /* 0x1f Match this alternative, or the next... */
+#define BACK 32 /* 0x20 Match "", "next" ptr points backward. */
+#define EXACT 33 /* 0x21 Match this string (preceded by length). */
+#define EXACTF 34 /* 0x22 Match this string, folded (prec. by length). */
+#define EXACTFL 35 /* 0x23 Match this string, folded in locale (w/len). */
+#define NOTHING 36 /* 0x24 Match empty string. */
+#define TAIL 37 /* 0x25 Match empty string. Can jump here from outside. */
+#define STAR 38 /* 0x26 Match this (simple) thing 0 or more times. */
+#define PLUS 39 /* 0x27 Match this (simple) thing 1 or more times. */
+#define CURLY 40 /* 0x28 Match this simple thing {n,m} times. */
+#define CURLYN 41 /* 0x29 Capture next-after-this simple thing */
+#define CURLYM 42 /* 0x2a Capture this medium-complex thing {n,m} times. */
+#define CURLYX 43 /* 0x2b Match this complex thing {n,m} times. */
+#define WHILEM 44 /* 0x2c Do curly processing and see if rest matches. */
+#define OPEN 45 /* 0x2d Mark this point in input as start of */
+#define CLOSE 46 /* 0x2e Analogous to OPEN. */
+#define REF 47 /* 0x2f Match some already matched string */
+#define REFF 48 /* 0x30 Match already matched string, folded */
+#define REFFL 49 /* 0x31 Match already matched string, folded in loc. */
+#define IFMATCH 50 /* 0x32 Succeeds if the following matches. */
+#define UNLESSM 51 /* 0x33 Fails if the following matches. */
+#define SUSPEND 52 /* 0x34 "Independent" sub-RE. */
+#define IFTHEN 53 /* 0x35 Switch, should be preceeded by switcher . */
+#define GROUPP 54 /* 0x36 Whether the group matched. */
+#define LONGJMP 55 /* 0x37 Jump far away. */
+#define BRANCHJ 56 /* 0x38 BRANCH with long offset. */
+#define EVAL 57 /* 0x39 Execute some Perl code. */
+#define MINMOD 58 /* 0x3a Next operator is not greedy. */
+#define LOGICAL 59 /* 0x3b Next opcode should set the flag only. */
+#define RENUM 60 /* 0x3c Group with independently numbered parens. */
+#define TRIE 61 /* 0x3d Match many EXACT(FL?)? at once. flags==type */
+#define TRIEC 62 /* 0x3e Same as TRIE, but with embedded charclass data */
+#define AHOCORASICK 63 /* 0x3f Aho Corasick stclass. flags==type */
+#define AHOCORASICKC 64 /* 0x40 Same as AHOCORASICK, but with embedded charclass data */
+#define GOSUB 65 /* 0x41 recurse to paren arg1 at (signed) ofs arg2 */
+#define GOSTART 66 /* 0x42 recurse to start of pattern */
+#define NREF 67 /* 0x43 Match some already matched string */
+#define NREFF 68 /* 0x44 Match already matched string, folded */
+#define NREFFL 69 /* 0x45 Match already matched string, folded in loc. */
+#define NGROUPP 70 /* 0x46 Whether the group matched. */
+#define INSUBP 71 /* 0x47 Whether we are in a specific recurse. */
+#define DEFINEP 72 /* 0x48 Never execute directly. */
+#define ENDLIKE 73 /* 0x49 Used only for the type field of verbs */
+#define OPFAIL 74 /* 0x4a Same as (?!) */
+#define ACCEPT 75 /* 0x4b Accepts the current matched string. */
+#define VERB 76 /* 0x4c no-sv 1 Used only for the type field of verbs */
+#define PRUNE 77 /* 0x4d Pattern fails at this startpoint if no-backtracking through this */
+#define MARKPOINT 78 /* 0x4e Push the current location for rollback by cut. */
+#define SKIP 79 /* 0x4f On failure skip forward (to the mark) before retrying */
+#define COMMIT 80 /* 0x50 Pattern fails outright if backtracking through this */
+#define CUTGROUP 81 /* 0x51 On failure go to the next alternation in the group */
+#define KEEPS 82 /* 0x52 $& begins here. */
+#define LNBREAK 83 /* 0x53 generic newline pattern */
+#define VERTWS 84 /* 0x54 vertical whitespace (Perl 6) */
+#define NVERTWS 85 /* 0x55 not vertical whitespace (Perl 6) */
+#define HORIZWS 86 /* 0x56 horizontal whitespace (Perl 6) */
+#define NHORIZWS 87 /* 0x57 not horizontal whitespace (Perl 6) */
+#define FOLDCHAR 88 /* 0x58 codepoint with tricky case folding properties. */
+#define OPTIMIZED 89 /* 0x59 Placeholder for dump. */
+#define PSEUDO 90 /* 0x5a Pseudo opcode for internal use. */
+ /* ------------ States ------------- */
+#define TRIE_next (REGNODE_MAX + 1) /* state for TRIE */
+#define TRIE_next_fail (REGNODE_MAX + 2) /* state for TRIE */
+#define EVAL_AB (REGNODE_MAX + 3) /* state for EVAL */
+#define EVAL_AB_fail (REGNODE_MAX + 4) /* state for EVAL */
+#define CURLYX_end (REGNODE_MAX + 5) /* state for CURLYX */
+#define CURLYX_end_fail (REGNODE_MAX + 6) /* state for CURLYX */
+#define WHILEM_A_pre (REGNODE_MAX + 7) /* state for WHILEM */
+#define WHILEM_A_pre_fail (REGNODE_MAX + 8) /* state for WHILEM */
+#define WHILEM_A_min (REGNODE_MAX + 9) /* state for WHILEM */
+#define WHILEM_A_min_fail (REGNODE_MAX + 10) /* state for WHILEM */
+#define WHILEM_A_max (REGNODE_MAX + 11) /* state for WHILEM */
+#define WHILEM_A_max_fail (REGNODE_MAX + 12) /* state for WHILEM */
+#define WHILEM_B_min (REGNODE_MAX + 13) /* state for WHILEM */
+#define WHILEM_B_min_fail (REGNODE_MAX + 14) /* state for WHILEM */
+#define WHILEM_B_max (REGNODE_MAX + 15) /* state for WHILEM */
+#define WHILEM_B_max_fail (REGNODE_MAX + 16) /* state for WHILEM */
+#define BRANCH_next (REGNODE_MAX + 17) /* state for BRANCH */
+#define BRANCH_next_fail (REGNODE_MAX + 18) /* state for BRANCH */
+#define CURLYM_A (REGNODE_MAX + 19) /* state for CURLYM */
+#define CURLYM_A_fail (REGNODE_MAX + 20) /* state for CURLYM */
+#define CURLYM_B (REGNODE_MAX + 21) /* state for CURLYM */
+#define CURLYM_B_fail (REGNODE_MAX + 22) /* state for CURLYM */
+#define IFMATCH_A (REGNODE_MAX + 23) /* state for IFMATCH */
+#define IFMATCH_A_fail (REGNODE_MAX + 24) /* state for IFMATCH */
+#define CURLY_B_min_known (REGNODE_MAX + 25) /* state for CURLY */
+#define CURLY_B_min_known_fail (REGNODE_MAX + 26) /* state for CURLY */
+#define CURLY_B_min (REGNODE_MAX + 27) /* state for CURLY */
+#define CURLY_B_min_fail (REGNODE_MAX + 28) /* state for CURLY */
+#define CURLY_B_max (REGNODE_MAX + 29) /* state for CURLY */
+#define CURLY_B_max_fail (REGNODE_MAX + 30) /* state for CURLY */
+#define COMMIT_next (REGNODE_MAX + 31) /* state for COMMIT */
+#define COMMIT_next_fail (REGNODE_MAX + 32) /* state for COMMIT */
+#define MARKPOINT_next (REGNODE_MAX + 33) /* state for MARKPOINT */
+#define MARKPOINT_next_fail (REGNODE_MAX + 34) /* state for MARKPOINT */
+#define SKIP_next (REGNODE_MAX + 35) /* state for SKIP */
+#define SKIP_next_fail (REGNODE_MAX + 36) /* state for SKIP */
+#define CUTGROUP_next (REGNODE_MAX + 37) /* state for CUTGROUP */
+#define CUTGROUP_next_fail (REGNODE_MAX + 38) /* state for CUTGROUP */
+#define KEEPS_next (REGNODE_MAX + 39) /* state for KEEPS */
+#define KEEPS_next_fail (REGNODE_MAX + 40) /* state for KEEPS */
+
+/* PL_regkind[] What type of regop or state is this. */
+
+#ifndef DOINIT
+EXTCONST U8 PL_regkind[];
+#else
+EXTCONST U8 PL_regkind[] = {
+ END, /* END */
+ END, /* SUCCEED */
+ BOL, /* BOL */
+ BOL, /* MBOL */
+ BOL, /* SBOL */
+ EOL, /* EOS */
+ EOL, /* EOL */
+ EOL, /* MEOL */
+ EOL, /* SEOL */
+ BOUND, /* BOUND */
+ BOUND, /* BOUNDL */
+ NBOUND, /* NBOUND */
+ NBOUND, /* NBOUNDL */
+ GPOS, /* GPOS */
+ REG_ANY, /* REG_ANY */
+ REG_ANY, /* SANY */
+ REG_ANY, /* CANY */
+ ANYOF, /* ANYOF */
+ ALNUM, /* ALNUM */
+ ALNUM, /* ALNUML */
+ NALNUM, /* NALNUM */
+ NALNUM, /* NALNUML */
+ SPACE, /* SPACE */
+ SPACE, /* SPACEL */
+ NSPACE, /* NSPACE */
+ NSPACE, /* NSPACEL */
+ DIGIT, /* DIGIT */
+ DIGIT, /* DIGITL */
+ NDIGIT, /* NDIGIT */
+ NDIGIT, /* NDIGITL */
+ CLUMP, /* CLUMP */
+ BRANCH, /* BRANCH */
+ BACK, /* BACK */
+ EXACT, /* EXACT */
+ EXACT, /* EXACTF */
+ EXACT, /* EXACTFL */
+ NOTHING, /* NOTHING */
+ NOTHING, /* TAIL */
+ STAR, /* STAR */
+ PLUS, /* PLUS */
+ CURLY, /* CURLY */
+ CURLY, /* CURLYN */
+ CURLY, /* CURLYM */
+ CURLY, /* CURLYX */
+ WHILEM, /* WHILEM */
+ OPEN, /* OPEN */
+ CLOSE, /* CLOSE */
+ REF, /* REF */
+ REF, /* REFF */
+ REF, /* REFFL */
+ BRANCHJ, /* IFMATCH */
+ BRANCHJ, /* UNLESSM */
+ BRANCHJ, /* SUSPEND */
+ BRANCHJ, /* IFTHEN */
+ GROUPP, /* GROUPP */
+ LONGJMP, /* LONGJMP */
+ BRANCHJ, /* BRANCHJ */
+ EVAL, /* EVAL */
+ MINMOD, /* MINMOD */
+ LOGICAL, /* LOGICAL */
+ BRANCHJ, /* RENUM */
+ TRIE, /* TRIE */
+ TRIE, /* TRIEC */
+ TRIE, /* AHOCORASICK */
+ TRIE, /* AHOCORASICKC */
+ GOSUB, /* GOSUB */
+ GOSTART, /* GOSTART */
+ REF, /* NREF */
+ REF, /* NREFF */
+ REF, /* NREFFL */
+ NGROUPP, /* NGROUPP */
+ INSUBP, /* INSUBP */
+ DEFINEP, /* DEFINEP */
+ ENDLIKE, /* ENDLIKE */
+ ENDLIKE, /* OPFAIL */
+ ENDLIKE, /* ACCEPT */
+ VERB, /* VERB */
+ VERB, /* PRUNE */
+ VERB, /* MARKPOINT */
+ VERB, /* SKIP */
+ VERB, /* COMMIT */
+ VERB, /* CUTGROUP */
+ KEEPS, /* KEEPS */
+ LNBREAK, /* LNBREAK */
+ VERTWS, /* VERTWS */
+ NVERTWS, /* NVERTWS */
+ HORIZWS, /* HORIZWS */
+ NHORIZWS, /* NHORIZWS */
+ FOLDCHAR, /* FOLDCHAR */
+ NOTHING, /* OPTIMIZED */
+ PSEUDO, /* PSEUDO */
+ /* ------------ States ------------- */
+ TRIE, /* TRIE_next */
+ TRIE, /* TRIE_next_fail */
+ EVAL, /* EVAL_AB */
+ EVAL, /* EVAL_AB_fail */
+ CURLYX, /* CURLYX_end */
+ CURLYX, /* CURLYX_end_fail */
+ WHILEM, /* WHILEM_A_pre */
+ WHILEM, /* WHILEM_A_pre_fail */
+ WHILEM, /* WHILEM_A_min */
+ WHILEM, /* WHILEM_A_min_fail */
+ WHILEM, /* WHILEM_A_max */
+ WHILEM, /* WHILEM_A_max_fail */
+ WHILEM, /* WHILEM_B_min */
+ WHILEM, /* WHILEM_B_min_fail */
+ WHILEM, /* WHILEM_B_max */
+ WHILEM, /* WHILEM_B_max_fail */
+ BRANCH, /* BRANCH_next */
+ BRANCH, /* BRANCH_next_fail */
+ CURLYM, /* CURLYM_A */
+ CURLYM, /* CURLYM_A_fail */
+ CURLYM, /* CURLYM_B */
+ CURLYM, /* CURLYM_B_fail */
+ IFMATCH, /* IFMATCH_A */
+ IFMATCH, /* IFMATCH_A_fail */
+ CURLY, /* CURLY_B_min_known */
+ CURLY, /* CURLY_B_min_known_fail */
+ CURLY, /* CURLY_B_min */
+ CURLY, /* CURLY_B_min_fail */
+ CURLY, /* CURLY_B_max */
+ CURLY, /* CURLY_B_max_fail */
+ COMMIT, /* COMMIT_next */
+ COMMIT, /* COMMIT_next_fail */
+ MARKPOINT, /* MARKPOINT_next */
+ MARKPOINT, /* MARKPOINT_next_fail */
+ SKIP, /* SKIP_next */
+ SKIP, /* SKIP_next_fail */
+ CUTGROUP, /* CUTGROUP_next */
+ CUTGROUP, /* CUTGROUP_next_fail */
+ KEEPS, /* KEEPS_next */
+ KEEPS, /* KEEPS_next_fail */
+};
+#endif
+
+/* regarglen[] - How large is the argument part of the node (in regnodes) */
+
+#ifdef REG_COMP_C
+static const U8 regarglen[] = {
+ 0, /* END */
+ 0, /* SUCCEED */
+ 0, /* BOL */
+ 0, /* MBOL */
+ 0, /* SBOL */
+ 0, /* EOS */
+ 0, /* EOL */
+ 0, /* MEOL */
+ 0, /* SEOL */
+ 0, /* BOUND */
+ 0, /* BOUNDL */
+ 0, /* NBOUND */
+ 0, /* NBOUNDL */
+ 0, /* GPOS */
+ 0, /* REG_ANY */
+ 0, /* SANY */
+ 0, /* CANY */
+ 0, /* ANYOF */
+ 0, /* ALNUM */
+ 0, /* ALNUML */
+ 0, /* NALNUM */
+ 0, /* NALNUML */
+ 0, /* SPACE */
+ 0, /* SPACEL */
+ 0, /* NSPACE */
+ 0, /* NSPACEL */
+ 0, /* DIGIT */
+ 0, /* DIGITL */
+ 0, /* NDIGIT */
+ 0, /* NDIGITL */
+ 0, /* CLUMP */
+ 0, /* BRANCH */
+ 0, /* BACK */
+ 0, /* EXACT */
+ 0, /* EXACTF */
+ 0, /* EXACTFL */
+ 0, /* NOTHING */
+ 0, /* TAIL */
+ 0, /* STAR */
+ 0, /* PLUS */
+ EXTRA_SIZE(struct regnode_2), /* CURLY */
+ EXTRA_SIZE(struct regnode_2), /* CURLYN */
+ EXTRA_SIZE(struct regnode_2), /* CURLYM */
+ EXTRA_SIZE(struct regnode_2), /* CURLYX */
+ 0, /* WHILEM */
+ EXTRA_SIZE(struct regnode_1), /* OPEN */
+ EXTRA_SIZE(struct regnode_1), /* CLOSE */
+ EXTRA_SIZE(struct regnode_1), /* REF */
+ EXTRA_SIZE(struct regnode_1), /* REFF */
+ EXTRA_SIZE(struct regnode_1), /* REFFL */
+ EXTRA_SIZE(struct regnode_1), /* IFMATCH */
+ EXTRA_SIZE(struct regnode_1), /* UNLESSM */
+ EXTRA_SIZE(struct regnode_1), /* SUSPEND */
+ EXTRA_SIZE(struct regnode_1), /* IFTHEN */
+ EXTRA_SIZE(struct regnode_1), /* GROUPP */
+ EXTRA_SIZE(struct regnode_1), /* LONGJMP */
+ EXTRA_SIZE(struct regnode_1), /* BRANCHJ */
+ EXTRA_SIZE(struct regnode_1), /* EVAL */
+ 0, /* MINMOD */
+ 0, /* LOGICAL */
+ EXTRA_SIZE(struct regnode_1), /* RENUM */
+ EXTRA_SIZE(struct regnode_1), /* TRIE */
+ EXTRA_SIZE(struct regnode_charclass), /* TRIEC */
+ EXTRA_SIZE(struct regnode_1), /* AHOCORASICK */
+ EXTRA_SIZE(struct regnode_charclass), /* AHOCORASICKC */
+ EXTRA_SIZE(struct regnode_2L), /* GOSUB */
+ 0, /* GOSTART */
+ EXTRA_SIZE(struct regnode_1), /* NREF */
+ EXTRA_SIZE(struct regnode_1), /* NREFF */
+ EXTRA_SIZE(struct regnode_1), /* NREFFL */
+ EXTRA_SIZE(struct regnode_1), /* NGROUPP */
+ EXTRA_SIZE(struct regnode_1), /* INSUBP */
+ EXTRA_SIZE(struct regnode_1), /* DEFINEP */
+ 0, /* ENDLIKE */
+ 0, /* OPFAIL */
+ EXTRA_SIZE(struct regnode_1), /* ACCEPT */
+ 0, /* VERB */
+ EXTRA_SIZE(struct regnode_1), /* PRUNE */
+ EXTRA_SIZE(struct regnode_1), /* MARKPOINT */
+ EXTRA_SIZE(struct regnode_1), /* SKIP */
+ EXTRA_SIZE(struct regnode_1), /* COMMIT */
+ EXTRA_SIZE(struct regnode_1), /* CUTGROUP */
+ 0, /* KEEPS */
+ 0, /* LNBREAK */
+ 0, /* VERTWS */
+ 0, /* NVERTWS */
+ 0, /* HORIZWS */
+ 0, /* NHORIZWS */
+ EXTRA_SIZE(struct regnode_1), /* FOLDCHAR */
+ 0, /* OPTIMIZED */
+ 0, /* PSEUDO */
+};
+
+/* reg_off_by_arg[] - Which argument holds the offset to the next node */
+
+static const char reg_off_by_arg[] = {
+ 0, /* END */
+ 0, /* SUCCEED */
+ 0, /* BOL */
+ 0, /* MBOL */
+ 0, /* SBOL */
+ 0, /* EOS */
+ 0, /* EOL */
+ 0, /* MEOL */
+ 0, /* SEOL */
+ 0, /* BOUND */
+ 0, /* BOUNDL */
+ 0, /* NBOUND */
+ 0, /* NBOUNDL */
+ 0, /* GPOS */
+ 0, /* REG_ANY */
+ 0, /* SANY */
+ 0, /* CANY */
+ 0, /* ANYOF */
+ 0, /* ALNUM */
+ 0, /* ALNUML */
+ 0, /* NALNUM */
+ 0, /* NALNUML */
+ 0, /* SPACE */
+ 0, /* SPACEL */
+ 0, /* NSPACE */
+ 0, /* NSPACEL */
+ 0, /* DIGIT */
+ 0, /* DIGITL */
+ 0, /* NDIGIT */
+ 0, /* NDIGITL */
+ 0, /* CLUMP */
+ 0, /* BRANCH */
+ 0, /* BACK */
+ 0, /* EXACT */
+ 0, /* EXACTF */
+ 0, /* EXACTFL */
+ 0, /* NOTHING */
+ 0, /* TAIL */
+ 0, /* STAR */
+ 0, /* PLUS */
+ 0, /* CURLY */
+ 0, /* CURLYN */
+ 0, /* CURLYM */
+ 0, /* CURLYX */
+ 0, /* WHILEM */
+ 0, /* OPEN */
+ 0, /* CLOSE */
+ 0, /* REF */
+ 0, /* REFF */
+ 0, /* REFFL */
+ 2, /* IFMATCH */
+ 2, /* UNLESSM */
+ 1, /* SUSPEND */
+ 1, /* IFTHEN */
+ 0, /* GROUPP */
+ 1, /* LONGJMP */
+ 1, /* BRANCHJ */
+ 0, /* EVAL */
+ 0, /* MINMOD */
+ 0, /* LOGICAL */
+ 1, /* RENUM */
+ 0, /* TRIE */
+ 0, /* TRIEC */
+ 0, /* AHOCORASICK */
+ 0, /* AHOCORASICKC */
+ 0, /* GOSUB */
+ 0, /* GOSTART */
+ 0, /* NREF */
+ 0, /* NREFF */
+ 0, /* NREFFL */
+ 0, /* NGROUPP */
+ 0, /* INSUBP */
+ 0, /* DEFINEP */
+ 0, /* ENDLIKE */
+ 0, /* OPFAIL */
+ 0, /* ACCEPT */
+ 0, /* VERB */
+ 0, /* PRUNE */
+ 0, /* MARKPOINT */
+ 0, /* SKIP */
+ 0, /* COMMIT */
+ 0, /* CUTGROUP */
+ 0, /* KEEPS */
+ 0, /* LNBREAK */
+ 0, /* VERTWS */
+ 0, /* NVERTWS */
+ 0, /* HORIZWS */
+ 0, /* NHORIZWS */
+ 0, /* FOLDCHAR */
+ 0, /* OPTIMIZED */
+ 0, /* PSEUDO */
+};
+
+#endif /* REG_COMP_C */
+
+/* reg_name[] - Opcode/state names in string form, for debugging */
+
+#ifndef DOINIT
+EXTCONST char * PL_reg_name[];
+#else
+EXTCONST char * const PL_reg_name[] = {
+ "END", /* 0000 */
+ "SUCCEED", /* 0x01 */
+ "BOL", /* 0x02 */
+ "MBOL", /* 0x03 */
+ "SBOL", /* 0x04 */
+ "EOS", /* 0x05 */
+ "EOL", /* 0x06 */
+ "MEOL", /* 0x07 */
+ "SEOL", /* 0x08 */
+ "BOUND", /* 0x09 */
+ "BOUNDL", /* 0x0a */
+ "NBOUND", /* 0x0b */
+ "NBOUNDL", /* 0x0c */
+ "GPOS", /* 0x0d */
+ "REG_ANY", /* 0x0e */
+ "SANY", /* 0x0f */
+ "CANY", /* 0x10 */
+ "ANYOF", /* 0x11 */
+ "ALNUM", /* 0x12 */
+ "ALNUML", /* 0x13 */
+ "NALNUM", /* 0x14 */
+ "NALNUML", /* 0x15 */
+ "SPACE", /* 0x16 */
+ "SPACEL", /* 0x17 */
+ "NSPACE", /* 0x18 */
+ "NSPACEL", /* 0x19 */
+ "DIGIT", /* 0x1a */
+ "DIGITL", /* 0x1b */
+ "NDIGIT", /* 0x1c */
+ "NDIGITL", /* 0x1d */
+ "CLUMP", /* 0x1e */
+ "BRANCH", /* 0x1f */
+ "BACK", /* 0x20 */
+ "EXACT", /* 0x21 */
+ "EXACTF", /* 0x22 */
+ "EXACTFL", /* 0x23 */
+ "NOTHING", /* 0x24 */
+ "TAIL", /* 0x25 */
+ "STAR", /* 0x26 */
+ "PLUS", /* 0x27 */
+ "CURLY", /* 0x28 */
+ "CURLYN", /* 0x29 */
+ "CURLYM", /* 0x2a */
+ "CURLYX", /* 0x2b */
+ "WHILEM", /* 0x2c */
+ "OPEN", /* 0x2d */
+ "CLOSE", /* 0x2e */
+ "REF", /* 0x2f */
+ "REFF", /* 0x30 */
+ "REFFL", /* 0x31 */
+ "IFMATCH", /* 0x32 */
+ "UNLESSM", /* 0x33 */
+ "SUSPEND", /* 0x34 */
+ "IFTHEN", /* 0x35 */
+ "GROUPP", /* 0x36 */
+ "LONGJMP", /* 0x37 */
+ "BRANCHJ", /* 0x38 */
+ "EVAL", /* 0x39 */
+ "MINMOD", /* 0x3a */
+ "LOGICAL", /* 0x3b */
+ "RENUM", /* 0x3c */
+ "TRIE", /* 0x3d */
+ "TRIEC", /* 0x3e */
+ "AHOCORASICK", /* 0x3f */
+ "AHOCORASICKC", /* 0x40 */
+ "GOSUB", /* 0x41 */
+ "GOSTART", /* 0x42 */
+ "NREF", /* 0x43 */
+ "NREFF", /* 0x44 */
+ "NREFFL", /* 0x45 */
+ "NGROUPP", /* 0x46 */
+ "INSUBP", /* 0x47 */
+ "DEFINEP", /* 0x48 */
+ "ENDLIKE", /* 0x49 */
+ "OPFAIL", /* 0x4a */
+ "ACCEPT", /* 0x4b */
+ "VERB", /* 0x4c */
+ "PRUNE", /* 0x4d */
+ "MARKPOINT", /* 0x4e */
+ "SKIP", /* 0x4f */
+ "COMMIT", /* 0x50 */
+ "CUTGROUP", /* 0x51 */
+ "KEEPS", /* 0x52 */
+ "LNBREAK", /* 0x53 */
+ "VERTWS", /* 0x54 */
+ "NVERTWS", /* 0x55 */
+ "HORIZWS", /* 0x56 */
+ "NHORIZWS", /* 0x57 */
+ "FOLDCHAR", /* 0x58 */
+ "OPTIMIZED", /* 0x59 */
+ "PSEUDO", /* 0x5a */
+ /* ------------ States ------------- */
+ "TRIE_next", /* REGNODE_MAX +0x01 */
+ "TRIE_next_fail", /* REGNODE_MAX +0x02 */
+ "EVAL_AB", /* REGNODE_MAX +0x03 */
+ "EVAL_AB_fail", /* REGNODE_MAX +0x04 */
+ "CURLYX_end", /* REGNODE_MAX +0x05 */
+ "CURLYX_end_fail", /* REGNODE_MAX +0x06 */
+ "WHILEM_A_pre", /* REGNODE_MAX +0x07 */
+ "WHILEM_A_pre_fail", /* REGNODE_MAX +0x08 */
+ "WHILEM_A_min", /* REGNODE_MAX +0x09 */
+ "WHILEM_A_min_fail", /* REGNODE_MAX +0x0a */
+ "WHILEM_A_max", /* REGNODE_MAX +0x0b */
+ "WHILEM_A_max_fail", /* REGNODE_MAX +0x0c */
+ "WHILEM_B_min", /* REGNODE_MAX +0x0d */
+ "WHILEM_B_min_fail", /* REGNODE_MAX +0x0e */
+ "WHILEM_B_max", /* REGNODE_MAX +0x0f */
+ "WHILEM_B_max_fail", /* REGNODE_MAX +0x10 */
+ "BRANCH_next", /* REGNODE_MAX +0x11 */
+ "BRANCH_next_fail", /* REGNODE_MAX +0x12 */
+ "CURLYM_A", /* REGNODE_MAX +0x13 */
+ "CURLYM_A_fail", /* REGNODE_MAX +0x14 */
+ "CURLYM_B", /* REGNODE_MAX +0x15 */
+ "CURLYM_B_fail", /* REGNODE_MAX +0x16 */
+ "IFMATCH_A", /* REGNODE_MAX +0x17 */
+ "IFMATCH_A_fail", /* REGNODE_MAX +0x18 */
+ "CURLY_B_min_known", /* REGNODE_MAX +0x19 */
+ "CURLY_B_min_known_fail", /* REGNODE_MAX +0x1a */
+ "CURLY_B_min", /* REGNODE_MAX +0x1b */
+ "CURLY_B_min_fail", /* REGNODE_MAX +0x1c */
+ "CURLY_B_max", /* REGNODE_MAX +0x1d */
+ "CURLY_B_max_fail", /* REGNODE_MAX +0x1e */
+ "COMMIT_next", /* REGNODE_MAX +0x1f */
+ "COMMIT_next_fail", /* REGNODE_MAX +0x20 */
+ "MARKPOINT_next", /* REGNODE_MAX +0x21 */
+ "MARKPOINT_next_fail", /* REGNODE_MAX +0x22 */
+ "SKIP_next", /* REGNODE_MAX +0x23 */
+ "SKIP_next_fail", /* REGNODE_MAX +0x24 */
+ "CUTGROUP_next", /* REGNODE_MAX +0x25 */
+ "CUTGROUP_next_fail", /* REGNODE_MAX +0x26 */
+ "KEEPS_next", /* REGNODE_MAX +0x27 */
+ "KEEPS_next_fail", /* REGNODE_MAX +0x28 */
+};
+#endif /* DOINIT */
+
+/* PL_reg_extflags_name[] - Opcode/state names in string form, for debugging */
+
+#ifndef DOINIT
+EXTCONST char * PL_reg_extflags_name[];
+#else
+EXTCONST char * const PL_reg_extflags_name[] = {
+ /* Bits in extflags defined: 11111111111101111111111100111111 */
+ "MULTILINE", /* 0x00000001 */
+ "SINGLELINE", /* 0x00000002 */
+ "FOLD", /* 0x00000004 */
+ "EXTENDED", /* 0x00000008 */
+ "KEEPCOPY", /* 0x00000010 */
+ "LOCALE", /* 0x00000020 */
+ "UNUSED_BIT_6", /* 0x00000040 */
+ "UNUSED_BIT_7", /* 0x00000080 */
+ "ANCH_BOL", /* 0x00000100 */
+ "ANCH_MBOL", /* 0x00000200 */
+ "ANCH_SBOL", /* 0x00000400 */
+ "ANCH_GPOS", /* 0x00000800 */
+ "GPOS_SEEN", /* 0x00001000 */
+ "GPOS_FLOAT", /* 0x00002000 */
+ "LOOKBEHIND_SEEN", /* 0x00004000 */
+ "EVAL_SEEN", /* 0x00008000 */
+ "CANY_SEEN", /* 0x00010000 */
+ "NOSCAN", /* 0x00020000 */
+ "CHECK_ALL", /* 0x00040000 */
+ "UNUSED_BIT_19", /* 0x00080000 */
+ "MATCH_UTF8", /* 0x00100000 */
+ "USE_INTUIT_NOML", /* 0x00200000 */
+ "USE_INTUIT_ML", /* 0x00400000 */
+ "INTUIT_TAIL", /* 0x00800000 */
+ "SPLIT", /* 0x01000000 */
+ "COPY_DONE", /* 0x02000000 */
+ "TAINTED_SEEN", /* 0x04000000 */
+ "TAINTED", /* 0x08000000 */
+ "START_ONLY", /* 0x10000000 */
+ "SKIPWHITE", /* 0x20000000 */
+ "WHITE", /* 0x40000000 */
+ "NULL", /* 0x80000000 */
+};
+#endif /* DOINIT */
+
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/scope.h b/Master/tlpkg/tlperl/lib/CORE/scope.h
new file mode 100644
index 00000000000..64e7e279f1f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/scope.h
@@ -0,0 +1,278 @@
+/* scope.h
+ *
+ * Copyright (C) 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
+ * 2002, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#define SAVEt_ITEM 0
+#define SAVEt_SV 1
+#define SAVEt_AV 2
+#define SAVEt_HV 3
+#define SAVEt_INT 4
+#define SAVEt_LONG 5
+#define SAVEt_I32 6
+#define SAVEt_IV 7
+#define SAVEt_SPTR 8
+#define SAVEt_APTR 9
+#define SAVEt_HPTR 10
+#define SAVEt_PPTR 11
+#define SAVEt_NSTAB 12
+#define SAVEt_SVREF 13
+#define SAVEt_GP 14
+#define SAVEt_FREESV 15
+#define SAVEt_FREEOP 16
+#define SAVEt_FREEPV 17
+#define SAVEt_CLEARSV 18
+#define SAVEt_DELETE 19
+#define SAVEt_DESTRUCTOR 20
+#define SAVEt_REGCONTEXT 21
+#define SAVEt_STACK_POS 22
+#define SAVEt_I16 23
+#define SAVEt_AELEM 24
+#define SAVEt_HELEM 25
+#define SAVEt_OP 26
+#define SAVEt_HINTS 27
+#define SAVEt_ALLOC 28
+#define SAVEt_GENERIC_SVREF 29
+#define SAVEt_DESTRUCTOR_X 30
+#define SAVEt_VPTR 31
+#define SAVEt_I8 32
+#define SAVEt_COMPPAD 33
+#define SAVEt_GENERIC_PVREF 34
+#define SAVEt_PADSV_AND_MORTALIZE 35
+#define SAVEt_MORTALIZESV 36
+#define SAVEt_SHARED_PVREF 37
+#define SAVEt_BOOL 38
+#define SAVEt_SET_SVFLAGS 39
+#define SAVEt_SAVESWITCHSTACK 40
+#define SAVEt_COP_ARYBASE 41
+#define SAVEt_RE_STATE 42
+#define SAVEt_COMPILE_WARNINGS 43
+#define SAVEt_STACK_CXPOS 44
+#define SAVEt_PARSER 45
+#define SAVEt_ADELETE 46
+
+#define SAVEf_SETMAGIC 1
+#define SAVEf_KEEPOLDELEM 2
+
+#define save_aelem(av,idx,sptr) save_aelem_flags(av,idx,sptr,SAVEf_SETMAGIC)
+#define save_helem(hv,key,sptr) save_helem_flags(hv,key,sptr,SAVEf_SETMAGIC)
+
+#ifndef SCOPE_SAVES_SIGNAL_MASK
+#define SCOPE_SAVES_SIGNAL_MASK 0
+#endif
+
+#define SSCHECK(need) if (PL_savestack_ix + (I32)(need) > PL_savestack_max) savestack_grow()
+#define SSGROW(need) if (PL_savestack_ix + (I32)(need) > PL_savestack_max) savestack_grow_cnt(need)
+#define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
+#define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
+#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
+#define SSPUSHIV(i) (PL_savestack[PL_savestack_ix++].any_iv = (IV)(i))
+#define SSPUSHPTR(p) (PL_savestack[PL_savestack_ix++].any_ptr = (void*)(p))
+#define SSPUSHDPTR(p) (PL_savestack[PL_savestack_ix++].any_dptr = (p))
+#define SSPUSHDXPTR(p) (PL_savestack[PL_savestack_ix++].any_dxptr = (p))
+#define SSPOPINT (PL_savestack[--PL_savestack_ix].any_i32)
+#define SSPOPLONG (PL_savestack[--PL_savestack_ix].any_long)
+#define SSPOPBOOL (PL_savestack[--PL_savestack_ix].any_bool)
+#define SSPOPIV (PL_savestack[--PL_savestack_ix].any_iv)
+#define SSPOPPTR (PL_savestack[--PL_savestack_ix].any_ptr)
+#define SSPOPDPTR (PL_savestack[--PL_savestack_ix].any_dptr)
+#define SSPOPDXPTR (PL_savestack[--PL_savestack_ix].any_dxptr)
+
+/*
+=head1 Callback Functions
+
+=for apidoc Ams||SAVETMPS
+Opening bracket for temporaries on a callback. See C<FREETMPS> and
+L<perlcall>.
+
+=for apidoc Ams||FREETMPS
+Closing bracket for temporaries on a callback. See C<SAVETMPS> and
+L<perlcall>.
+
+=for apidoc Ams||ENTER
+Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
+
+=for apidoc Ams||LEAVE
+Closing bracket on a callback. See C<ENTER> and L<perlcall>.
+
+=over
+
+=item ENTER_with_name(name)
+
+Same as C<ENTER>, but when debugging is enabled it also associates the
+given literal string with the new scope.
+
+=item LEAVE_with_name(name)
+
+Same as C<LEAVE>, but when debugging is enabled it first checks that the
+scope has the given name. Name must be a literal string.
+
+=back
+
+=cut
+*/
+
+#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tmps_ix
+#define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()
+
+#ifdef DEBUGGING
+#define ENTER \
+ STMT_START { \
+ push_scope(); \
+ DEBUG_SCOPE("ENTER") \
+ } STMT_END
+#define LEAVE \
+ STMT_START { \
+ DEBUG_SCOPE("LEAVE") \
+ pop_scope(); \
+ } STMT_END
+#define ENTER_with_name(name) \
+ STMT_START { \
+ push_scope(); \
+ if (PL_scopestack_name) \
+ PL_scopestack_name[PL_scopestack_ix-1] = name; \
+ DEBUG_SCOPE("ENTER \"" name "\"") \
+ } STMT_END
+#define LEAVE_with_name(name) \
+ STMT_START { \
+ DEBUG_SCOPE("LEAVE \"" name "\"") \
+ if (PL_scopestack_name) { \
+ assert(((char*)PL_scopestack_name[PL_scopestack_ix-1] \
+ == (char*)name) \
+ || strEQ(PL_scopestack_name[PL_scopestack_ix-1], name)); \
+ } \
+ pop_scope(); \
+ } STMT_END
+#else
+#define ENTER push_scope()
+#define LEAVE pop_scope()
+#define ENTER_with_name(name) ENTER
+#define LEAVE_with_name(name) LEAVE
+#endif
+#define LEAVE_SCOPE(old) if (PL_savestack_ix > old) leave_scope(old)
+
+#define SAVEI8(i) save_I8((I8*)&(i))
+#define SAVEI16(i) save_I16((I16*)&(i))
+#define SAVEI32(i) save_I32((I32*)&(i))
+#define SAVEINT(i) save_int((int*)&(i))
+#define SAVEIV(i) save_iv((IV*)&(i))
+#define SAVELONG(l) save_long((long*)&(l))
+#define SAVEBOOL(b) save_bool((bool*)&(b))
+#define SAVESPTR(s) save_sptr((SV**)&(s))
+#define SAVEPPTR(s) save_pptr((char**)&(s))
+#define SAVEVPTR(s) save_vptr((void*)&(s))
+#define SAVEPADSVANDMORTALIZE(s) save_padsv_and_mortalize(s)
+#define SAVEFREESV(s) save_freesv(MUTABLE_SV(s))
+#define SAVEMORTALIZESV(s) save_mortalizesv(MUTABLE_SV(s))
+#define SAVEFREEOP(o) save_freeop((OP*)(o))
+#define SAVEFREEPV(p) save_freepv((char*)(p))
+#define SAVECLEARSV(sv) save_clearsv((SV**)&(sv))
+#define SAVEGENERICSV(s) save_generic_svref((SV**)&(s))
+#define SAVEGENERICPV(s) save_generic_pvref((char**)&(s))
+#define SAVESHAREDPV(s) save_shared_pvref((char**)&(s))
+#define SAVESETSVFLAGS(sv,mask,val) save_set_svflags(sv,mask,val)
+#define SAVEDELETE(h,k,l) \
+ save_delete(MUTABLE_HV(h), (char*)(k), (I32)(l))
+#define SAVEHDELETE(h,s) \
+ save_hdelete(MUTABLE_HV(h), (s))
+#define SAVEADELETE(a,k) \
+ save_adelete(MUTABLE_AV(a), (I32)(k))
+#define SAVEDESTRUCTOR(f,p) \
+ save_destructor((DESTRUCTORFUNC_NOCONTEXT_t)(f), (void*)(p))
+
+#define SAVEDESTRUCTOR_X(f,p) \
+ save_destructor_x((DESTRUCTORFUNC_t)(f), (void*)(p))
+
+#define SAVESTACK_POS() \
+ STMT_START { \
+ SSCHECK(2); \
+ SSPUSHINT(PL_stack_sp - PL_stack_base); \
+ SSPUSHINT(SAVEt_STACK_POS); \
+ } STMT_END
+
+#define SAVEOP() save_op()
+
+#define SAVEHINTS() save_hints()
+
+#define SAVECOMPPAD() save_pushptr(MUTABLE_SV(PL_comppad), SAVEt_COMPPAD)
+
+#define SAVESWITCHSTACK(f,t) \
+ STMT_START { \
+ save_pushptrptr(MUTABLE_SV(f), MUTABLE_SV(t), SAVEt_SAVESWITCHSTACK); \
+ SWITCHSTACK((f),(t)); \
+ PL_curstackinfo->si_stack = (t); \
+ } STMT_END
+
+#define SAVECOPARYBASE(c) save_pushi32ptr(CopARYBASE_get(c), c, SAVEt_COP_ARYBASE);
+
+/* Need to do the cop warnings like this, rather than a "SAVEFREESHAREDPV",
+ because realloc() means that the value can actually change. Possibly
+ could have done savefreesharedpvREF, but this way actually seems cleaner,
+ as it simplifies the code that does the saves, and reduces the load on the
+ save stack. */
+#define SAVECOMPILEWARNINGS() save_pushptr(PL_compiling.cop_warnings, SAVEt_COMPILE_WARNINGS)
+
+#define SAVESTACK_CXPOS() \
+ STMT_START { \
+ SSCHECK(3); \
+ SSPUSHINT(cxstack[cxstack_ix].blk_oldsp); \
+ SSPUSHINT(cxstack_ix); \
+ SSPUSHINT(SAVEt_STACK_CXPOS); \
+ } STMT_END
+
+#define SAVEPARSER(p) save_pushptr((p), SAVEt_PARSER)
+
+#ifdef USE_ITHREADS
+# define SAVECOPSTASH(c) SAVEPPTR(CopSTASHPV(c))
+# define SAVECOPSTASH_FREE(c) SAVESHAREDPV(CopSTASHPV(c))
+# define SAVECOPFILE(c) SAVEPPTR(CopFILE(c))
+# define SAVECOPFILE_FREE(c) SAVESHAREDPV(CopFILE(c))
+#else
+# define SAVECOPSTASH(c) SAVESPTR(CopSTASH(c))
+# define SAVECOPSTASH_FREE(c) SAVECOPSTASH(c) /* XXX not refcounted */
+# define SAVECOPFILE(c) SAVESPTR(CopFILEGV(c))
+# define SAVECOPFILE_FREE(c) SAVEGENERICSV(CopFILEGV(c))
+#endif
+
+#define SAVECOPLINE(c) SAVEI32(CopLINE(c))
+
+/* SSNEW() temporarily allocates a specified number of bytes of data on the
+ * savestack. It returns an integer index into the savestack, because a
+ * pointer would get broken if the savestack is moved on reallocation.
+ * SSNEWa() works like SSNEW(), but also aligns the data to the specified
+ * number of bytes. MEM_ALIGNBYTES is perhaps the most useful. The
+ * alignment will be preserved therough savestack reallocation *only* if
+ * realloc returns data aligned to a size divisible by "align"!
+ *
+ * SSPTR() converts the index returned by SSNEW/SSNEWa() into a pointer.
+ */
+
+#define SSNEW(size) Perl_save_alloc(aTHX_ (size), 0)
+#define SSNEWt(n,t) SSNEW((n)*sizeof(t))
+#define SSNEWa(size,align) Perl_save_alloc(aTHX_ (size), \
+ (I32)(align - ((size_t)((caddr_t)&PL_savestack[PL_savestack_ix]) % align)) % align)
+#define SSNEWat(n,t,align) SSNEWa((n)*sizeof(t), align)
+
+#define SSPTR(off,type) ((type) ((char*)PL_savestack + off))
+#define SSPTRt(off,type) ((type*) ((char*)PL_savestack + off))
+
+#define save_freesv(op) save_pushptr((void *)(op), SAVEt_FREESV)
+#define save_mortalizesv(op) save_pushptr((void *)(op), SAVEt_MORTALIZESV)
+#define save_freeop(op) save_pushptr((void *)(op), SAVEt_FREEOP)
+#define save_freepv(pv) save_pushptr((void *)(pv), SAVEt_FREEPV)
+#define save_op() save_pushptr((void *)(PL_op), SAVEt_OP)
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/sv.h b/Master/tlpkg/tlperl/lib/CORE/sv.h
new file mode 100644
index 00000000000..fc1b475a65e
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/sv.h
@@ -0,0 +1,2014 @@
+/* sv.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+ * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef sv_flags
+#undef sv_flags /* Convex has this in <signal.h> for sigvec() */
+#endif
+
+/*
+=head1 SV Flags
+
+=for apidoc AmU||svtype
+An enum of flags for Perl types. These are found in the file B<sv.h>
+in the C<svtype> enum. Test these flags with the C<SvTYPE> macro.
+
+=for apidoc AmU||SVt_PV
+Pointer type flag for scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_IV
+Integer type flag for scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_NV
+Double type flag for scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_PVMG
+Type flag for blessed scalars. See C<svtype>.
+
+=for apidoc AmU||SVt_PVAV
+Type flag for arrays. See C<svtype>.
+
+=for apidoc AmU||SVt_PVHV
+Type flag for hashes. See C<svtype>.
+
+=for apidoc AmU||SVt_PVCV
+Type flag for code refs. See C<svtype>.
+
+=cut
+*/
+
+typedef enum {
+ SVt_NULL, /* 0 */
+ SVt_BIND, /* 1 */
+ SVt_IV, /* 2 */
+ SVt_NV, /* 3 */
+ /* RV was here, before it was merged with IV. */
+ SVt_PV, /* 4 */
+ SVt_PVIV, /* 5 */
+ SVt_PVNV, /* 6 */
+ SVt_PVMG, /* 7 */
+ SVt_REGEXP, /* 8 */
+ /* PVBM was here, before BIND replaced it. */
+ SVt_PVGV, /* 9 */
+ SVt_PVLV, /* 10 */
+ SVt_PVAV, /* 11 */
+ SVt_PVHV, /* 12 */
+ SVt_PVCV, /* 13 */
+ SVt_PVFM, /* 14 */
+ SVt_PVIO, /* 15 */
+ SVt_LAST /* keep last in enum. used to size arrays */
+} svtype;
+
+#ifndef PERL_CORE
+/* Although Fast Boyer Moore tables are now being stored in PVGVs, for most
+ purposes eternal code wanting to consider PVBM probably needs to think of
+ PVMG instead. */
+# define SVt_PVBM SVt_PVMG
+/* Anything wanting to create a reference from clean should ensure that it has
+ a scalar of type SVt_IV now: */
+# define SVt_RV SVt_IV
+#endif
+
+/* There is collusion here with sv_clear - sv_clear exits early for SVt_NULL
+ and SVt_IV, so never reaches the clause at the end that uses
+ sv_type_details->body_size to determine whether to call safefree(). Hence
+ body_size can be set no-zero to record the size of PTEs and HEs, without
+ fear of bogus frees. */
+#ifdef PERL_IN_SV_C
+#define PTE_SVSLOT SVt_IV
+#endif
+#if defined(PERL_IN_HV_C) || defined(PERL_IN_XS_APITEST)
+#define HE_SVSLOT SVt_NULL
+#endif
+
+#define PERL_ARENA_ROOTS_SIZE (SVt_LAST)
+
+/* typedefs to eliminate some typing */
+typedef struct he HE;
+typedef struct hek HEK;
+
+/* Using C's structural equivalence to help emulate C++ inheritance here... */
+
+/* start with 2 sv-head building blocks */
+#define _SV_HEAD(ptrtype) \
+ ptrtype sv_any; /* pointer to body */ \
+ U32 sv_refcnt; /* how many references to us */ \
+ U32 sv_flags /* what we are */
+
+#define _SV_HEAD_UNION \
+ union { \
+ char* svu_pv; /* pointer to malloced string */ \
+ IV svu_iv; \
+ UV svu_uv; \
+ SV* svu_rv; /* pointer to another SV */ \
+ SV** svu_array; \
+ HE** svu_hash; \
+ GP* svu_gp; \
+ } sv_u
+
+
+struct STRUCT_SV { /* struct sv { */
+ _SV_HEAD(void*);
+ _SV_HEAD_UNION;
+#ifdef DEBUG_LEAKING_SCALARS
+ PERL_BITFIELD32 sv_debug_optype:9; /* the type of OP that allocated us */
+ PERL_BITFIELD32 sv_debug_inpad:1; /* was allocated in a pad for an OP */
+ PERL_BITFIELD32 sv_debug_cloned:1; /* was cloned for an ithread */
+ PERL_BITFIELD32 sv_debug_line:16; /* the line where we were allocated */
+ U32 sv_debug_serial; /* serial number of sv allocation */
+ char * sv_debug_file; /* the file where we were allocated */
+#endif
+};
+
+struct gv {
+ _SV_HEAD(XPVGV*); /* pointer to xpvgv body */
+ _SV_HEAD_UNION;
+};
+
+struct cv {
+ _SV_HEAD(XPVCV*); /* pointer to xpvcv body */
+ _SV_HEAD_UNION;
+};
+
+struct av {
+ _SV_HEAD(XPVAV*); /* pointer to xpvav body */
+ _SV_HEAD_UNION;
+};
+
+struct hv {
+ _SV_HEAD(XPVHV*); /* pointer to xpvhv body */
+ _SV_HEAD_UNION;
+};
+
+struct io {
+ _SV_HEAD(XPVIO*); /* pointer to xpvio body */
+ _SV_HEAD_UNION;
+};
+
+struct p5rx {
+ _SV_HEAD(struct regexp*); /* pointer to regexp body */
+ _SV_HEAD_UNION;
+};
+
+#undef _SV_HEAD
+#undef _SV_HEAD_UNION /* ensure no pollution */
+
+/*
+=head1 SV Manipulation Functions
+
+=for apidoc Am|U32|SvREFCNT|SV* sv
+Returns the value of the object's reference count.
+
+=for apidoc Am|SV*|SvREFCNT_inc|SV* sv
+Increments the reference count of the given SV.
+
+All of the following SvREFCNT_inc* macros are optimized versions of
+SvREFCNT_inc, and can be replaced with SvREFCNT_inc.
+
+=for apidoc Am|SV*|SvREFCNT_inc_NN|SV* sv
+Same as SvREFCNT_inc, but can only be used if you know I<sv>
+is not NULL. Since we don't have to check the NULLness, it's faster
+and smaller.
+
+=for apidoc Am|void|SvREFCNT_inc_void|SV* sv
+Same as SvREFCNT_inc, but can only be used if you don't need the
+return value. The macro doesn't need to return a meaningful value.
+
+=for apidoc Am|void|SvREFCNT_inc_void_NN|SV* sv
+Same as SvREFCNT_inc, but can only be used if you don't need the return
+value, and you know that I<sv> is not NULL. The macro doesn't need
+to return a meaningful value, or check for NULLness, so it's smaller
+and faster.
+
+=for apidoc Am|SV*|SvREFCNT_inc_simple|SV* sv
+Same as SvREFCNT_inc, but can only be used with expressions without side
+effects. Since we don't have to store a temporary value, it's faster.
+
+=for apidoc Am|SV*|SvREFCNT_inc_simple_NN|SV* sv
+Same as SvREFCNT_inc_simple, but can only be used if you know I<sv>
+is not NULL. Since we don't have to check the NULLness, it's faster
+and smaller.
+
+=for apidoc Am|void|SvREFCNT_inc_simple_void|SV* sv
+Same as SvREFCNT_inc_simple, but can only be used if you don't need the
+return value. The macro doesn't need to return a meaningful value.
+
+=for apidoc Am|void|SvREFCNT_inc_simple_void_NN|SV* sv
+Same as SvREFCNT_inc, but can only be used if you don't need the return
+value, and you know that I<sv> is not NULL. The macro doesn't need
+to return a meaningful value, or check for NULLness, so it's smaller
+and faster.
+
+=for apidoc Am|void|SvREFCNT_dec|SV* sv
+Decrements the reference count of the given SV.
+
+=for apidoc Am|svtype|SvTYPE|SV* sv
+Returns the type of the SV. See C<svtype>.
+
+=for apidoc Am|void|SvUPGRADE|SV* sv|svtype type
+Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
+perform the upgrade if necessary. See C<svtype>.
+
+=cut
+*/
+
+#define SvANY(sv) (sv)->sv_any
+#define SvFLAGS(sv) (sv)->sv_flags
+#define SvREFCNT(sv) (sv)->sv_refcnt
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define SvREFCNT_inc(sv) \
+ ({ \
+ SV * const _sv = MUTABLE_SV(sv); \
+ if (_sv) \
+ (SvREFCNT(_sv))++; \
+ _sv; \
+ })
+# define SvREFCNT_inc_simple(sv) \
+ ({ \
+ if (sv) \
+ (SvREFCNT(sv))++; \
+ MUTABLE_SV(sv); \
+ })
+# define SvREFCNT_inc_NN(sv) \
+ ({ \
+ SV * const _sv = MUTABLE_SV(sv); \
+ SvREFCNT(_sv)++; \
+ _sv; \
+ })
+# define SvREFCNT_inc_void(sv) \
+ ({ \
+ SV * const _sv = MUTABLE_SV(sv); \
+ if (_sv) \
+ (void)(SvREFCNT(_sv)++); \
+ })
+#else
+# define SvREFCNT_inc(sv) \
+ ((PL_Sv=MUTABLE_SV(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+# define SvREFCNT_inc_simple(sv) \
+ ((sv) ? (SvREFCNT(sv)++,MUTABLE_SV(sv)) : NULL)
+# define SvREFCNT_inc_NN(sv) \
+ (PL_Sv=MUTABLE_SV(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+# define SvREFCNT_inc_void(sv) \
+ (void)((PL_Sv=MUTABLE_SV(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+#endif
+
+/* These guys don't need the curly blocks */
+#define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#define SvREFCNT_inc_simple_NN(sv) (++(SvREFCNT(sv)),MUTABLE_SV(sv))
+#define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT(MUTABLE_SV(sv)))
+#define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT(MUTABLE_SV(sv)))
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define SvREFCNT_dec(sv) \
+ ({ \
+ SV * const _sv = MUTABLE_SV(sv); \
+ if (_sv) { \
+ if (SvREFCNT(_sv)) { \
+ if (--(SvREFCNT(_sv)) == 0) \
+ Perl_sv_free2(aTHX_ _sv); \
+ } else { \
+ sv_free(_sv); \
+ } \
+ } \
+ })
+#else
+#define SvREFCNT_dec(sv) sv_free(MUTABLE_SV(sv))
+#endif
+
+#define SVTYPEMASK 0xff
+#define SvTYPE(sv) ((svtype)((sv)->sv_flags & SVTYPEMASK))
+
+/* Sadly there are some parts of the core that have pointers to already-freed
+ SV heads, and rely on being able to tell that they are now free. So mark
+ them all by using a consistent macro. */
+#define SvIS_FREED(sv) ((sv)->sv_flags == SVTYPEMASK)
+
+#define SvUPGRADE(sv, mt) (SvTYPE(sv) >= (mt) || (sv_upgrade(sv, mt), 1))
+
+#define SVf_IOK 0x00000100 /* has valid public integer value */
+#define SVf_NOK 0x00000200 /* has valid public numeric value */
+#define SVf_POK 0x00000400 /* has valid public pointer value */
+#define SVf_ROK 0x00000800 /* has a valid reference pointer */
+
+#define SVp_IOK 0x00001000 /* has valid non-public integer value */
+#define SVp_NOK 0x00002000 /* has valid non-public numeric value */
+#define SVp_POK 0x00004000 /* has valid non-public pointer value */
+#define SVp_SCREAM 0x00008000 /* has been studied? */
+#define SVphv_CLONEABLE SVp_SCREAM /* PVHV (stashes) clone its objects */
+#define SVpgv_GP SVp_SCREAM /* GV has a valid GP */
+#define SVprv_PCS_IMPORTED SVp_SCREAM /* RV is a proxy for a constant
+ subroutine in another package. Set the
+ CvIMPORTED_CV_ON() if it needs to be
+ expanded to a real GV */
+
+#define SVs_PADSTALE 0x00010000 /* lexical has gone out of scope */
+#define SVpad_STATE 0x00010000 /* pad name is a "state" var */
+#define SVs_PADTMP 0x00020000 /* in use as tmp */
+#define SVpad_TYPED 0x00020000 /* pad name is a Typed Lexical */
+#define SVs_PADMY 0x00040000 /* in use a "my" variable */
+#define SVpad_OUR 0x00040000 /* pad name is "our" instead of "my" */
+#define SVs_TEMP 0x00080000 /* string is stealable? */
+#define SVs_OBJECT 0x00100000 /* is "blessed" */
+#define SVs_GMG 0x00200000 /* has magical get method */
+#define SVs_SMG 0x00400000 /* has magical set method */
+#define SVs_RMG 0x00800000 /* has random magical methods */
+
+#define SVf_FAKE 0x01000000 /* 0: glob or lexical is just a copy
+ 1: SV head arena wasn't malloc()ed
+ 2: in conjunction with SVf_READONLY
+ marks a shared hash key scalar
+ (SvLEN == 0) or a copy on write
+ string (SvLEN != 0) [SvIsCOW(sv)]
+ 3: For PVCV, whether CvUNIQUE(cv)
+ refers to an eval or once only
+ [CvEVAL(cv), CvSPECIAL(cv)]
+ 4: On a pad name SV, that slot in the
+ frame AV is a REFCNT'ed reference
+ to a lexical from "outside". */
+#define SVphv_REHASH SVf_FAKE /* 5: On a PVHV, hash values are being
+ recalculated */
+#define SVf_OOK 0x02000000 /* has valid offset value. For a PVHV this
+ means that a hv_aux struct is present
+ after the main array */
+#define SVf_BREAK 0x04000000 /* refcnt is artificially low - used by
+ SVs in final arena cleanup.
+ Set in S_regtry on PL_reg_curpm, so that
+ perl_destruct will skip it. */
+#define SVf_READONLY 0x08000000 /* may not be modified */
+
+
+
+
+#define SVf_THINKFIRST (SVf_READONLY|SVf_ROK|SVf_FAKE)
+
+#define SVf_OK (SVf_IOK|SVf_NOK|SVf_POK|SVf_ROK| \
+ SVp_IOK|SVp_NOK|SVp_POK|SVpgv_GP)
+
+#define PRIVSHIFT 4 /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */
+
+#define SVf_AMAGIC 0x10000000 /* has magical overloaded methods */
+
+/* Ensure this value does not clash with the GV_ADD* flags in gv.h: */
+#define SVf_UTF8 0x20000000 /* SvPV is UTF-8 encoded
+ This is also set on RVs whose overloaded
+ stringification is UTF-8. This might
+ only happen as a side effect of SvPV() */
+
+
+/* Some private flags. */
+
+/* PVAV could probably use 0x2000000 without conflict. I assume that PVFM can
+ be UTF-8 encoded, and PVCVs could well have UTF-8 prototypes. PVIOs haven't
+ been restructured, so sometimes get used as string buffers. */
+
+/* PVHV */
+#define SVphv_SHAREKEYS 0x20000000 /* PVHV keys live on shared string table */
+/* PVNV, PVMG, presumably only inside pads */
+#define SVpad_NAME 0x40000000 /* This SV is a name in the PAD, so
+ SVpad_TYPED, SVpad_OUR and SVpad_STATE
+ apply */
+/* PVAV */
+#define SVpav_REAL 0x40000000 /* free old entries */
+/* PVHV */
+#define SVphv_LAZYDEL 0x40000000 /* entry in xhv_eiter must be deleted */
+/* This is only set true on a PVGV when it's playing "PVBM", but is tested for
+ on any regular scalar (anything <= PVLV) */
+#define SVpbm_VALID 0x40000000
+/* ??? */
+#define SVrepl_EVAL 0x40000000 /* Replacement part of s///e */
+
+/* IV, PVIV, PVNV, PVMG, PVGV and (I assume) PVLV */
+/* Presumably IVs aren't stored in pads */
+#define SVf_IVisUV 0x80000000 /* use XPVUV instead of XPVIV */
+/* PVAV */
+#define SVpav_REIFY 0x80000000 /* can become real */
+/* PVHV */
+#define SVphv_HASKFLAGS 0x80000000 /* keys have flag byte after hash */
+/* PVFM */
+#define SVpfm_COMPILED 0x80000000 /* FORMLINE is compiled */
+/* PVGV when SVpbm_VALID is true */
+#define SVpbm_TAIL 0x80000000
+/* RV upwards. However, SVf_ROK and SVp_IOK are exclusive */
+#define SVprv_WEAKREF 0x80000000 /* Weak reference */
+
+#define _XPV_HEAD \
+ union _xnvu xnv_u; \
+ STRLEN xpv_cur; /* length of svu_pv as a C string */ \
+ STRLEN xpv_len /* allocated size */
+
+union _xnvu {
+ NV xnv_nv; /* numeric value, if any */
+ HV * xgv_stash;
+ struct {
+ U32 xlow;
+ U32 xhigh;
+ } xpad_cop_seq; /* used by pad.c for cop_sequence */
+ struct {
+ U32 xbm_previous; /* how many characters in string before rare? */
+ U8 xbm_flags;
+ U8 xbm_rare; /* rarest character in string */
+ } xbm_s; /* fields from PVBM */
+};
+
+union _xivu {
+ IV xivu_iv; /* integer value */
+ /* xpvfm: lines */
+ UV xivu_uv;
+ void * xivu_p1;
+ I32 xivu_i32;
+ HEK * xivu_namehek; /* xpvlv, xpvgv: GvNAME */
+ HV * xivu_hv; /* regexp: paren_names */
+};
+
+union _xmgu {
+ MAGIC* xmg_magic; /* linked list of magicalness */
+ HV* xmg_ourstash; /* Stash for our (when SvPAD_OUR is true) */
+};
+
+struct xpv {
+ _XPV_HEAD;
+};
+
+struct xpviv {
+ _XPV_HEAD;
+ union _xivu xiv_u;
+};
+
+#define xiv_iv xiv_u.xivu_iv
+
+struct xpvuv {
+ _XPV_HEAD;
+ union _xivu xuv_u;
+};
+
+#define xuv_uv xuv_u.xivu_uv
+
+struct xpvnv {
+ _XPV_HEAD;
+ union _xivu xiv_u;
+};
+
+#define _XPVMG_HEAD \
+ union _xivu xiv_u; \
+ union _xmgu xmg_u; \
+ HV* xmg_stash /* class package */
+
+/* This structure must match the beginning of struct xpvhv in hv.h. */
+struct xpvmg {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+};
+
+struct xpvlv {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+
+ STRLEN xlv_targoff;
+ STRLEN xlv_targlen;
+ SV* xlv_targ;
+ char xlv_type; /* k=keys .=pos x=substr v=vec /=join/re
+ * y=alem/helem/iter t=tie T=tied HE */
+};
+
+/* This structure works in 3 ways - regular scalar, GV with GP, or fast
+ Boyer-Moore. */
+struct xpvgv {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+};
+
+/* This structure must match XPVCV in cv.h */
+
+typedef U16 cv_flags_t;
+
+#define _XPVCV_COMMON \
+ HV * xcv_stash; \
+ union { \
+ OP * xcv_start; \
+ ANY xcv_xsubany; \
+ } xcv_start_u; \
+ union { \
+ OP * xcv_root; \
+ void (*xcv_xsub) (pTHX_ CV*); \
+ } xcv_root_u; \
+ GV * xcv_gv; \
+ char * xcv_file; \
+ AV * xcv_padlist; \
+ CV * xcv_outside; \
+ U32 xcv_outside_seq; /* the COP sequence (at the point of our \
+ * compilation) in the lexically enclosing \
+ * sub */ \
+ cv_flags_t xcv_flags
+
+struct xpvfm {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+ _XPVCV_COMMON;
+};
+
+#define _XPVIO_TAIL \
+ PerlIO * xio_ifp; /* ifp and ofp are normally the same */ \
+ PerlIO * xio_ofp; /* but sockets need separate streams */ \
+ /* Cray addresses everything by word boundaries (64 bits) and \
+ * code and data pointers cannot be mixed (which is exactly what \
+ * Perl_filter_add() tries to do with the dirp), hence the \
+ * following union trick (as suggested by Gurusamy Sarathy). \
+ * For further information see Geir Johansen's problem report \
+ * titled [ID 20000612.002] Perl problem on Cray system \
+ * The any pointer (known as IoANY()) will also be a good place \
+ * to hang any IO disciplines to. \
+ */ \
+ union { \
+ DIR * xiou_dirp; /* for opendir, readdir, etc */ \
+ void * xiou_any; /* for alignment */ \
+ } xio_dirpu; \
+ /* IV xio_lines is now in IVX $. */ \
+ IV xio_page; /* $% */ \
+ IV xio_page_len; /* $= */ \
+ IV xio_lines_left; /* $- */ \
+ char * xio_top_name; /* $^ */ \
+ GV * xio_top_gv; /* $^ */ \
+ char * xio_fmt_name; /* $~ */ \
+ GV * xio_fmt_gv; /* $~ */ \
+ char * xio_bottom_name;/* $^B */ \
+ GV * xio_bottom_gv; /* $^B */ \
+ char xio_type; \
+ U8 xio_flags
+
+
+struct xpvio {
+ _XPV_HEAD;
+ _XPVMG_HEAD;
+ _XPVIO_TAIL;
+};
+
+#define xio_dirp xio_dirpu.xiou_dirp
+#define xio_any xio_dirpu.xiou_any
+
+#define IOf_ARGV 1 /* this fp iterates over ARGV */
+#define IOf_START 2 /* check for null ARGV and substitute '-' */
+#define IOf_FLUSH 4 /* this fp wants a flush after write op */
+#define IOf_DIDTOP 8 /* just did top of form */
+#define IOf_UNTAINT 16 /* consider this fp (and its data) "safe" */
+#define IOf_NOLINE 32 /* slurped a pseudo-line from empty file */
+#define IOf_FAKE_DIRP 64 /* xio_dirp is fake (source filters kludge) */
+
+/* The following macros define implementation-independent predicates on SVs. */
+
+/*
+=for apidoc Am|U32|SvNIOK|SV* sv
+Returns a U32 value indicating whether the SV contains a number, integer or
+double.
+
+=for apidoc Am|U32|SvNIOKp|SV* sv
+Returns a U32 value indicating whether the SV contains a number, integer or
+double. Checks the B<private> setting. Use C<SvNIOK> instead.
+
+=for apidoc Am|void|SvNIOK_off|SV* sv
+Unsets the NV/IV status of an SV.
+
+=for apidoc Am|U32|SvOK|SV* sv
+Returns a U32 value indicating whether the value is defined. This is
+only meaningful for scalars.
+
+=for apidoc Am|U32|SvIOKp|SV* sv
+Returns a U32 value indicating whether the SV contains an integer. Checks
+the B<private> setting. Use C<SvIOK> instead.
+
+=for apidoc Am|U32|SvNOKp|SV* sv
+Returns a U32 value indicating whether the SV contains a double. Checks the
+B<private> setting. Use C<SvNOK> instead.
+
+=for apidoc Am|U32|SvPOKp|SV* sv
+Returns a U32 value indicating whether the SV contains a character string.
+Checks the B<private> setting. Use C<SvPOK> instead.
+
+=for apidoc Am|U32|SvIOK|SV* sv
+Returns a U32 value indicating whether the SV contains an integer.
+
+=for apidoc Am|void|SvIOK_on|SV* sv
+Tells an SV that it is an integer.
+
+=for apidoc Am|void|SvIOK_off|SV* sv
+Unsets the IV status of an SV.
+
+=for apidoc Am|void|SvIOK_only|SV* sv
+Tells an SV that it is an integer and disables all other OK bits.
+
+=for apidoc Am|void|SvIOK_only_UV|SV* sv
+Tells and SV that it is an unsigned integer and disables all other OK bits.
+
+=for apidoc Am|bool|SvIOK_UV|SV* sv
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+=for apidoc Am|bool|SvUOK|SV* sv
+Returns a boolean indicating whether the SV contains an unsigned integer.
+
+=for apidoc Am|bool|SvIOK_notUV|SV* sv
+Returns a boolean indicating whether the SV contains a signed integer.
+
+=for apidoc Am|U32|SvNOK|SV* sv
+Returns a U32 value indicating whether the SV contains a double.
+
+=for apidoc Am|void|SvNOK_on|SV* sv
+Tells an SV that it is a double.
+
+=for apidoc Am|void|SvNOK_off|SV* sv
+Unsets the NV status of an SV.
+
+=for apidoc Am|void|SvNOK_only|SV* sv
+Tells an SV that it is a double and disables all other OK bits.
+
+=for apidoc Am|U32|SvPOK|SV* sv
+Returns a U32 value indicating whether the SV contains a character
+string.
+
+=for apidoc Am|void|SvPOK_on|SV* sv
+Tells an SV that it is a string.
+
+=for apidoc Am|void|SvPOK_off|SV* sv
+Unsets the PV status of an SV.
+
+=for apidoc Am|void|SvPOK_only|SV* sv
+Tells an SV that it is a string and disables all other OK bits.
+Will also turn off the UTF-8 status.
+
+=for apidoc Am|bool|SvVOK|SV* sv
+Returns a boolean indicating whether the SV contains a v-string.
+
+=for apidoc Am|U32|SvOOK|SV* sv
+Returns a U32 indicating whether the pointer to the string buffer is offset.
+This hack is used internally to speed up removal of characters from the
+beginning of a SvPV. When SvOOK is true, then the start of the
+allocated string buffer is actually C<SvOOK_offset()> bytes before SvPVX.
+This offset used to be stored in SvIVX, but is now stored within the spare
+part of the buffer.
+
+=for apidoc Am|U32|SvROK|SV* sv
+Tests if the SV is an RV.
+
+=for apidoc Am|void|SvROK_on|SV* sv
+Tells an SV that it is an RV.
+
+=for apidoc Am|void|SvROK_off|SV* sv
+Unsets the RV status of an SV.
+
+=for apidoc Am|SV*|SvRV|SV* sv
+Dereferences an RV to return the SV.
+
+=for apidoc Am|IV|SvIVX|SV* sv
+Returns the raw value in the SV's IV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvIV()>.
+
+=for apidoc Am|UV|SvUVX|SV* sv
+Returns the raw value in the SV's UV slot, without checks or conversions.
+Only use when you are sure SvIOK is true. See also C<SvUV()>.
+
+=for apidoc Am|NV|SvNVX|SV* sv
+Returns the raw value in the SV's NV slot, without checks or conversions.
+Only use when you are sure SvNOK is true. See also C<SvNV()>.
+
+=for apidoc Am|char*|SvPVX|SV* sv
+Returns a pointer to the physical string in the SV. The SV must contain a
+string.
+
+=for apidoc Am|STRLEN|SvCUR|SV* sv
+Returns the length of the string which is in the SV. See C<SvLEN>.
+
+=for apidoc Am|STRLEN|SvLEN|SV* sv
+Returns the size of the string buffer in the SV, not including any part
+attributable to C<SvOOK>. See C<SvCUR>.
+
+=for apidoc Am|char*|SvEND|SV* sv
+Returns a pointer to the last character in the string which is in the SV.
+See C<SvCUR>. Access the character as *(SvEND(sv)).
+
+=for apidoc Am|HV*|SvSTASH|SV* sv
+Returns the stash of the SV.
+
+=for apidoc Am|void|SvIV_set|SV* sv|IV val
+Set the value of the IV pointer in sv to val. It is possible to perform
+the same function of this macro with an lvalue assignment to C<SvIVX>.
+With future Perls, however, it will be more efficient to use
+C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
+
+=for apidoc Am|void|SvNV_set|SV* sv|NV val
+Set the value of the NV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvPV_set|SV* sv|char* val
+Set the value of the PV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvUV_set|SV* sv|UV val
+Set the value of the UV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvRV_set|SV* sv|SV* val
+Set the value of the RV pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvMAGIC_set|SV* sv|MAGIC* val
+Set the value of the MAGIC pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvSTASH_set|SV* sv|HV* val
+Set the value of the STASH pointer in sv to val. See C<SvIV_set>.
+
+=for apidoc Am|void|SvCUR_set|SV* sv|STRLEN len
+Set the current length of the string which is in the SV. See C<SvCUR>
+and C<SvIV_set>.
+
+=for apidoc Am|void|SvLEN_set|SV* sv|STRLEN len
+Set the actual length of the string which is in the SV. See C<SvIV_set>.
+
+=cut
+*/
+
+#define SvNIOK(sv) (SvFLAGS(sv) & (SVf_IOK|SVf_NOK))
+#define SvNIOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK))
+#define SvNIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK| \
+ SVp_IOK|SVp_NOK|SVf_IVisUV))
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+#define assert_not_ROK(sv) ({assert(!SvROK(sv) || !SvRV(sv));}),
+#define assert_not_glob(sv) ({assert(!isGV_with_GP(sv));}),
+#else
+#define assert_not_ROK(sv)
+#define assert_not_glob(sv)
+#endif
+
+#define SvOK(sv) ((SvTYPE(sv) == SVt_BIND) \
+ ? (SvFLAGS(SvRV(sv)) & SVf_OK) \
+ : (SvFLAGS(sv) & SVf_OK))
+#define SvOK_off(sv) (assert_not_ROK(sv) assert_not_glob(sv) \
+ SvFLAGS(sv) &= ~(SVf_OK| \
+ SVf_IVisUV|SVf_UTF8), \
+ SvOOK_off(sv))
+#define SvOK_off_exc_UV(sv) (assert_not_ROK(sv) \
+ SvFLAGS(sv) &= ~(SVf_OK| \
+ SVf_UTF8), \
+ SvOOK_off(sv))
+
+#define SvOKp(sv) (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK))
+#define SvIOKp(sv) (SvFLAGS(sv) & SVp_IOK)
+#define SvIOKp_on(sv) (assert_not_glob(sv) SvRELEASE_IVX_(sv) \
+ SvFLAGS(sv) |= SVp_IOK)
+#define SvNOKp(sv) (SvFLAGS(sv) & SVp_NOK)
+#define SvNOKp_on(sv) (assert_not_glob(sv) SvFLAGS(sv) |= SVp_NOK)
+#define SvPOKp(sv) (SvFLAGS(sv) & SVp_POK)
+#define SvPOKp_on(sv) (assert_not_ROK(sv) assert_not_glob(sv) \
+ SvFLAGS(sv) |= SVp_POK)
+
+#define SvIOK(sv) (SvFLAGS(sv) & SVf_IOK)
+#define SvIOK_on(sv) (assert_not_glob(sv) SvRELEASE_IVX_(sv) \
+ SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+#define SvIOK_off(sv) (SvFLAGS(sv) &= ~(SVf_IOK|SVp_IOK|SVf_IVisUV))
+#define SvIOK_only(sv) (SvOK_off(sv), \
+ SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+#define SvIOK_only_UV(sv) (assert_not_glob(sv) SvOK_off_exc_UV(sv), \
+ SvFLAGS(sv) |= (SVf_IOK|SVp_IOK))
+
+#define SvIOK_UV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
+ == (SVf_IOK|SVf_IVisUV))
+#define SvUOK(sv) SvIOK_UV(sv)
+#define SvIOK_notUV(sv) ((SvFLAGS(sv) & (SVf_IOK|SVf_IVisUV)) \
+ == SVf_IOK)
+
+#define SvIsUV(sv) (SvFLAGS(sv) & SVf_IVisUV)
+#define SvIsUV_on(sv) (SvFLAGS(sv) |= SVf_IVisUV)
+#define SvIsUV_off(sv) (SvFLAGS(sv) &= ~SVf_IVisUV)
+
+#define SvNOK(sv) (SvFLAGS(sv) & SVf_NOK)
+#define SvNOK_on(sv) (assert_not_glob(sv) \
+ SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
+#define SvNOK_off(sv) (SvFLAGS(sv) &= ~(SVf_NOK|SVp_NOK))
+#define SvNOK_only(sv) (SvOK_off(sv), \
+ SvFLAGS(sv) |= (SVf_NOK|SVp_NOK))
+
+/*
+=for apidoc Am|U32|SvUTF8|SV* sv
+Returns a U32 value indicating whether the SV contains UTF-8 encoded data.
+Call this after SvPV() in case any call to string overloading updates the
+internal flag.
+
+=for apidoc Am|void|SvUTF8_on|SV *sv
+Turn on the UTF-8 status of an SV (the data is not changed, just the flag).
+Do not use frivolously.
+
+=for apidoc Am|void|SvUTF8_off|SV *sv
+Unsets the UTF-8 status of an SV.
+
+=for apidoc Am|void|SvPOK_only_UTF8|SV* sv
+Tells an SV that it is a string and disables all other OK bits,
+and leaves the UTF-8 status as it was.
+
+=cut
+ */
+
+/* Ensure the return value of this macro does not clash with the GV_ADD* flags
+in gv.h: */
+#define SvUTF8(sv) (SvFLAGS(sv) & SVf_UTF8)
+#define SvUTF8_on(sv) (SvFLAGS(sv) |= (SVf_UTF8))
+#define SvUTF8_off(sv) (SvFLAGS(sv) &= ~(SVf_UTF8))
+
+#define SvPOK(sv) (SvFLAGS(sv) & SVf_POK)
+#define SvPOK_on(sv) (assert_not_ROK(sv) assert_not_glob(sv) \
+ SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#define SvPOK_off(sv) (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
+#define SvPOK_only(sv) (assert_not_ROK(sv) assert_not_glob(sv) \
+ SvFLAGS(sv) &= ~(SVf_OK| \
+ SVf_IVisUV|SVf_UTF8), \
+ SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#define SvPOK_only_UTF8(sv) (assert_not_ROK(sv) assert_not_glob(sv) \
+ SvFLAGS(sv) &= ~(SVf_OK| \
+ SVf_IVisUV), \
+ SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+
+#define SvVOK(sv) (SvMAGICAL(sv) \
+ && mg_find(sv,PERL_MAGIC_vstring))
+/* returns the vstring magic, if any */
+#define SvVSTRING_mg(sv) (SvMAGICAL(sv) \
+ ? mg_find(sv,PERL_MAGIC_vstring) : NULL)
+
+#define SvOOK(sv) (SvFLAGS(sv) & SVf_OOK)
+#define SvOOK_on(sv) ((void)SvIOK_off(sv), SvFLAGS(sv) |= SVf_OOK)
+#define SvOOK_off(sv) ((void)(SvOOK(sv) && sv_backoff(sv)))
+
+#define SvFAKE(sv) (SvFLAGS(sv) & SVf_FAKE)
+#define SvFAKE_on(sv) (SvFLAGS(sv) |= SVf_FAKE)
+#define SvFAKE_off(sv) (SvFLAGS(sv) &= ~SVf_FAKE)
+
+#define SvROK(sv) (SvFLAGS(sv) & SVf_ROK)
+#define SvROK_on(sv) (SvFLAGS(sv) |= SVf_ROK)
+#define SvROK_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK))
+
+#define SvMAGICAL(sv) (SvFLAGS(sv) & (SVs_GMG|SVs_SMG|SVs_RMG))
+#define SvMAGICAL_on(sv) (SvFLAGS(sv) |= (SVs_GMG|SVs_SMG|SVs_RMG))
+#define SvMAGICAL_off(sv) (SvFLAGS(sv) &= ~(SVs_GMG|SVs_SMG|SVs_RMG))
+
+#define SvGMAGICAL(sv) (SvFLAGS(sv) & SVs_GMG)
+#define SvGMAGICAL_on(sv) (SvFLAGS(sv) |= SVs_GMG)
+#define SvGMAGICAL_off(sv) (SvFLAGS(sv) &= ~SVs_GMG)
+
+#define SvSMAGICAL(sv) (SvFLAGS(sv) & SVs_SMG)
+#define SvSMAGICAL_on(sv) (SvFLAGS(sv) |= SVs_SMG)
+#define SvSMAGICAL_off(sv) (SvFLAGS(sv) &= ~SVs_SMG)
+
+#define SvRMAGICAL(sv) (SvFLAGS(sv) & SVs_RMG)
+#define SvRMAGICAL_on(sv) (SvFLAGS(sv) |= SVs_RMG)
+#define SvRMAGICAL_off(sv) (SvFLAGS(sv) &= ~SVs_RMG)
+
+#define SvAMAGIC(sv) (SvROK(sv) && (SvFLAGS(SvRV(sv)) & SVf_AMAGIC))
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define SvAMAGIC_on(sv) ({ SV * const kloink = sv; \
+ assert(SvROK(kloink)); \
+ SvFLAGS(SvRV(kloink)) |= SVf_AMAGIC; \
+ })
+# define SvAMAGIC_off(sv) ({ SV * const kloink = sv; \
+ if(SvROK(kloink)) \
+ SvFLAGS(SvRV(kloink)) &= ~SVf_AMAGIC;\
+ })
+#else
+# define SvAMAGIC_on(sv) (SvFLAGS(SvRV(sv)) |= SVf_AMAGIC)
+# define SvAMAGIC_off(sv) \
+ (SvROK(sv) && (SvFLAGS(SvRV(sv)) &= ~SVf_AMAGIC))
+#endif
+
+/*
+=for apidoc Am|U32|SvGAMAGIC|SV* sv
+
+Returns true if the SV has get magic or overloading. If either is true then
+the scalar is active data, and has the potential to return a new value every
+time it is accessed. Hence you must be careful to only read it once per user
+logical operation and work with that returned value. If neither is true then
+the scalar's value cannot change unless written to.
+
+=cut
+*/
+
+#define SvGAMAGIC(sv) (SvGMAGICAL(sv) || SvAMAGIC(sv))
+
+#define Gv_AMG(stash) (PL_amagic_generation && Gv_AMupdate(stash, FALSE))
+
+#define SvWEAKREF(sv) ((SvFLAGS(sv) & (SVf_ROK|SVprv_WEAKREF)) \
+ == (SVf_ROK|SVprv_WEAKREF))
+#define SvWEAKREF_on(sv) (SvFLAGS(sv) |= (SVf_ROK|SVprv_WEAKREF))
+#define SvWEAKREF_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK|SVprv_WEAKREF))
+
+#define SvPCS_IMPORTED(sv) ((SvFLAGS(sv) & (SVf_ROK|SVprv_PCS_IMPORTED)) \
+ == (SVf_ROK|SVprv_PCS_IMPORTED))
+#define SvPCS_IMPORTED_on(sv) (SvFLAGS(sv) |= (SVf_ROK|SVprv_PCS_IMPORTED))
+#define SvPCS_IMPORTED_off(sv) (SvFLAGS(sv) &= ~(SVf_ROK|SVprv_PCS_IMPORTED))
+
+#define SvTHINKFIRST(sv) (SvFLAGS(sv) & SVf_THINKFIRST)
+
+#define SvPADSTALE(sv) (SvFLAGS(sv) & SVs_PADSTALE)
+#define SvPADSTALE_on(sv) (SvFLAGS(sv) |= SVs_PADSTALE)
+#define SvPADSTALE_off(sv) (SvFLAGS(sv) &= ~SVs_PADSTALE)
+
+#define SvPADTMP(sv) (SvFLAGS(sv) & SVs_PADTMP)
+#define SvPADTMP_on(sv) (SvFLAGS(sv) |= SVs_PADTMP)
+#define SvPADTMP_off(sv) (SvFLAGS(sv) &= ~SVs_PADTMP)
+
+#define SvPADMY(sv) (SvFLAGS(sv) & SVs_PADMY)
+#define SvPADMY_on(sv) (SvFLAGS(sv) |= SVs_PADMY)
+
+#define SvTEMP(sv) (SvFLAGS(sv) & SVs_TEMP)
+#define SvTEMP_on(sv) (SvFLAGS(sv) |= SVs_TEMP)
+#define SvTEMP_off(sv) (SvFLAGS(sv) &= ~SVs_TEMP)
+
+#define SvOBJECT(sv) (SvFLAGS(sv) & SVs_OBJECT)
+#define SvOBJECT_on(sv) (SvFLAGS(sv) |= SVs_OBJECT)
+#define SvOBJECT_off(sv) (SvFLAGS(sv) &= ~SVs_OBJECT)
+
+#define SvREADONLY(sv) (SvFLAGS(sv) & SVf_READONLY)
+#define SvREADONLY_on(sv) (SvFLAGS(sv) |= SVf_READONLY)
+#define SvREADONLY_off(sv) (SvFLAGS(sv) &= ~SVf_READONLY)
+
+#define SvSCREAM(sv) ((SvFLAGS(sv) & (SVp_SCREAM|SVp_POK)) == (SVp_SCREAM|SVp_POK))
+#define SvSCREAM_on(sv) (SvFLAGS(sv) |= SVp_SCREAM)
+#define SvSCREAM_off(sv) (SvFLAGS(sv) &= ~SVp_SCREAM)
+
+#define SvCOMPILED(sv) (SvFLAGS(sv) & SVpfm_COMPILED)
+#define SvCOMPILED_on(sv) (SvFLAGS(sv) |= SVpfm_COMPILED)
+#define SvCOMPILED_off(sv) (SvFLAGS(sv) &= ~SVpfm_COMPILED)
+
+#define SvEVALED(sv) (SvFLAGS(sv) & SVrepl_EVAL)
+#define SvEVALED_on(sv) (SvFLAGS(sv) |= SVrepl_EVAL)
+#define SvEVALED_off(sv) (SvFLAGS(sv) &= ~SVrepl_EVAL)
+
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define SvVALID(sv) ({ const SV *const _svvalid = (const SV*)(sv); \
+ if (SvFLAGS(_svvalid) & SVpbm_VALID) \
+ assert(!isGV_with_GP(_svvalid)); \
+ (SvFLAGS(_svvalid) & SVpbm_VALID); \
+ })
+# define SvVALID_on(sv) ({ SV *const _svvalid = MUTABLE_SV(sv); \
+ assert(!isGV_with_GP(_svvalid)); \
+ (SvFLAGS(_svvalid) |= SVpbm_VALID); \
+ })
+# define SvVALID_off(sv) ({ SV *const _svvalid = MUTABLE_SV(sv); \
+ assert(!isGV_with_GP(_svvalid)); \
+ (SvFLAGS(_svvalid) &= ~SVpbm_VALID); \
+ })
+
+# define SvTAIL(sv) ({ const SV *const _svtail = (const SV *)(sv); \
+ assert(SvTYPE(_svtail) != SVt_PVAV); \
+ assert(SvTYPE(_svtail) != SVt_PVHV); \
+ (SvFLAGS(sv) & (SVpbm_TAIL|SVpbm_VALID)) \
+ == (SVpbm_TAIL|SVpbm_VALID); \
+ })
+#else
+# define SvVALID(sv) (SvFLAGS(sv) & SVpbm_VALID)
+# define SvVALID_on(sv) (SvFLAGS(sv) |= SVpbm_VALID)
+# define SvVALID_off(sv) (SvFLAGS(sv) &= ~SVpbm_VALID)
+# define SvTAIL(sv) ((SvFLAGS(sv) & (SVpbm_TAIL|SVpbm_VALID)) \
+ == (SVpbm_TAIL|SVpbm_VALID))
+
+#endif
+#define SvTAIL_on(sv) (SvFLAGS(sv) |= SVpbm_TAIL)
+#define SvTAIL_off(sv) (SvFLAGS(sv) &= ~SVpbm_TAIL)
+
+
+#define SvPAD_TYPED(sv) \
+ ((SvFLAGS(sv) & (SVpad_NAME|SVpad_TYPED)) == (SVpad_NAME|SVpad_TYPED))
+
+#define SvPAD_OUR(sv) \
+ ((SvFLAGS(sv) & (SVpad_NAME|SVpad_OUR)) == (SVpad_NAME|SVpad_OUR))
+
+#define SvPAD_STATE(sv) \
+ ((SvFLAGS(sv) & (SVpad_NAME|SVpad_STATE)) == (SVpad_NAME|SVpad_STATE))
+
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define SvPAD_TYPED_on(sv) ({ \
+ SV *const _svpad = MUTABLE_SV(sv); \
+ assert(SvTYPE(_svpad) == SVt_PVMG); \
+ (SvFLAGS(_svpad) |= SVpad_NAME|SVpad_TYPED); \
+ })
+#define SvPAD_OUR_on(sv) ({ \
+ SV *const _svpad = MUTABLE_SV(sv); \
+ assert(SvTYPE(_svpad) == SVt_PVMG); \
+ (SvFLAGS(_svpad) |= SVpad_NAME|SVpad_OUR); \
+ })
+#define SvPAD_STATE_on(sv) ({ \
+ SV *const _svpad = MUTABLE_SV(sv); \
+ assert(SvTYPE(_svpad) == SVt_PVNV || SvTYPE(_svpad) == SVt_PVMG); \
+ (SvFLAGS(_svpad) |= SVpad_NAME|SVpad_STATE); \
+ })
+#else
+# define SvPAD_TYPED_on(sv) (SvFLAGS(sv) |= SVpad_NAME|SVpad_TYPED)
+# define SvPAD_OUR_on(sv) (SvFLAGS(sv) |= SVpad_NAME|SVpad_OUR)
+# define SvPAD_STATE_on(sv) (SvFLAGS(sv) |= SVpad_NAME|SVpad_STATE)
+#endif
+
+#define SvOURSTASH(sv) \
+ (SvPAD_OUR(sv) ? ((XPVMG*) SvANY(sv))->xmg_u.xmg_ourstash : NULL)
+#define SvOURSTASH_set(sv, st) \
+ STMT_START { \
+ assert(SvTYPE(sv) == SVt_PVMG); \
+ ((XPVMG*) SvANY(sv))->xmg_u.xmg_ourstash = st; \
+ } STMT_END
+
+#ifdef PERL_DEBUG_COW
+#else
+#endif
+#define SvRVx(sv) SvRV(sv)
+
+#ifdef PERL_DEBUG_COW
+/* Need -0.0 for SvNVX to preserve IEEE FP "negative zero" because
+ +0.0 + -0.0 => +0.0 but -0.0 + -0.0 => -0.0 */
+# define SvIVX(sv) (0 + ((XPVIV*) SvANY(sv))->xiv_iv)
+# define SvUVX(sv) (0 + ((XPVUV*) SvANY(sv))->xuv_uv)
+# define SvNVX(sv) (-0.0 + ((XPVNV*) SvANY(sv))->xnv_u.xnv_nv)
+# define SvRV(sv) (0 + (sv)->sv_u.svu_rv)
+# define SvRV_const(sv) (0 + (sv)->sv_u.svu_rv)
+/* Don't test the core XS code yet. */
+# if defined (PERL_CORE) && PERL_DEBUG_COW > 1
+# define SvPVX(sv) (0 + (assert(!SvREADONLY(sv)), (sv)->sv_u.svu_pv))
+# else
+# define SvPVX(sv) SvPVX_mutable(sv)
+# endif
+# define SvCUR(sv) (0 + ((XPV*) SvANY(sv))->xpv_cur)
+# define SvLEN(sv) (0 + ((XPV*) SvANY(sv))->xpv_len)
+# define SvEND(sv) ((sv)->sv_u.svu_pv + ((XPV*)SvANY(sv))->xpv_cur)
+
+# ifdef DEBUGGING
+# define SvMAGIC(sv) (0 + *(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_u.xmg_magic))
+# define SvSTASH(sv) (0 + *(assert(SvTYPE(sv) >= SVt_PVMG), &((XPVMG*) SvANY(sv))->xmg_stash))
+# else
+# define SvMAGIC(sv) (0 + ((XPVMG*) SvANY(sv))->xmg_u.xmg_magic)
+# define SvSTASH(sv) (0 + ((XPVMG*) SvANY(sv))->xmg_stash)
+# endif
+#else
+# define SvLEN(sv) ((XPV*) SvANY(sv))->xpv_len
+# define SvEND(sv) ((sv)->sv_u.svu_pv + ((XPV*)SvANY(sv))->xpv_cur)
+
+# if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+/* These get expanded inside other macros that already use a variable _sv */
+# define SvPVX(sv) \
+ (*({ SV *const _svpvx = MUTABLE_SV(sv); \
+ assert(SvTYPE(_svpvx) >= SVt_PV); \
+ assert(SvTYPE(_svpvx) != SVt_PVAV); \
+ assert(SvTYPE(_svpvx) != SVt_PVHV); \
+ assert(!isGV_with_GP(_svpvx)); \
+ &((_svpvx)->sv_u.svu_pv); \
+ }))
+# define SvCUR(sv) \
+ (*({ const SV *const _svcur = (const SV *)(sv); \
+ assert(SvTYPE(_svcur) >= SVt_PV); \
+ assert(SvTYPE(_svcur) != SVt_PVAV); \
+ assert(SvTYPE(_svcur) != SVt_PVHV); \
+ assert(!isGV_with_GP(_svcur)); \
+ &(((XPV*) MUTABLE_PTR(SvANY(_svcur)))->xpv_cur); \
+ }))
+# define SvIVX(sv) \
+ (*({ const SV *const _svivx = (const SV *)(sv); \
+ assert(SvTYPE(_svivx) == SVt_IV || SvTYPE(_svivx) >= SVt_PVIV); \
+ assert(SvTYPE(_svivx) != SVt_PVAV); \
+ assert(SvTYPE(_svivx) != SVt_PVHV); \
+ assert(SvTYPE(_svivx) != SVt_PVCV); \
+ assert(SvTYPE(_svivx) != SVt_PVFM); \
+ assert(SvTYPE(_svivx) != SVt_PVIO); \
+ assert(!isGV_with_GP(_svivx)); \
+ &(((XPVIV*) MUTABLE_PTR(SvANY(_svivx)))->xiv_iv); \
+ }))
+# define SvUVX(sv) \
+ (*({ const SV *const _svuvx = (const SV *)(sv); \
+ assert(SvTYPE(_svuvx) == SVt_IV || SvTYPE(_svuvx) >= SVt_PVIV); \
+ assert(SvTYPE(_svuvx) != SVt_PVAV); \
+ assert(SvTYPE(_svuvx) != SVt_PVHV); \
+ assert(SvTYPE(_svuvx) != SVt_PVCV); \
+ assert(SvTYPE(_svuvx) != SVt_PVFM); \
+ assert(SvTYPE(_svuvx) != SVt_PVIO); \
+ assert(!isGV_with_GP(_svuvx)); \
+ &(((XPVUV*) MUTABLE_PTR(SvANY(_svuvx)))->xuv_uv); \
+ }))
+# define SvNVX(sv) \
+ (*({ const SV *const _svnvx = (const SV *)(sv); \
+ assert(SvTYPE(_svnvx) == SVt_NV || SvTYPE(_svnvx) >= SVt_PVNV); \
+ assert(SvTYPE(_svnvx) != SVt_PVAV); \
+ assert(SvTYPE(_svnvx) != SVt_PVHV); \
+ assert(SvTYPE(_svnvx) != SVt_PVCV); \
+ assert(SvTYPE(_svnvx) != SVt_PVFM); \
+ assert(SvTYPE(_svnvx) != SVt_PVIO); \
+ assert(!isGV_with_GP(_svnvx)); \
+ &(((XPVNV*) MUTABLE_PTR(SvANY(_svnvx)))->xnv_u.xnv_nv); \
+ }))
+# define SvRV(sv) \
+ (*({ SV *const _svrv = MUTABLE_SV(sv); \
+ assert(SvTYPE(_svrv) >= SVt_PV || SvTYPE(_svrv) == SVt_IV); \
+ assert(SvTYPE(_svrv) != SVt_PVAV); \
+ assert(SvTYPE(_svrv) != SVt_PVHV); \
+ assert(SvTYPE(_svrv) != SVt_PVCV); \
+ assert(SvTYPE(_svrv) != SVt_PVFM); \
+ assert(!isGV_with_GP(_svrv)); \
+ &((_svrv)->sv_u.svu_rv); \
+ }))
+# define SvRV_const(sv) \
+ ({ const SV *const _svrv = (const SV *)(sv); \
+ assert(SvTYPE(_svrv) >= SVt_PV || SvTYPE(_svrv) == SVt_IV); \
+ assert(SvTYPE(_svrv) != SVt_PVAV); \
+ assert(SvTYPE(_svrv) != SVt_PVHV); \
+ assert(SvTYPE(_svrv) != SVt_PVCV); \
+ assert(SvTYPE(_svrv) != SVt_PVFM); \
+ assert(!isGV_with_GP(_svrv)); \
+ (_svrv)->sv_u.svu_rv; \
+ })
+# define SvMAGIC(sv) \
+ (*({ const SV *const _svmagic = (const SV *)(sv); \
+ assert(SvTYPE(_svmagic) >= SVt_PVMG); \
+ if(SvTYPE(_svmagic) == SVt_PVMG) \
+ assert(!SvPAD_OUR(_svmagic)); \
+ &(((XPVMG*) MUTABLE_PTR(SvANY(_svmagic)))->xmg_u.xmg_magic); \
+ }))
+# define SvSTASH(sv) \
+ (*({ const SV *const _svstash = (const SV *)(sv); \
+ assert(SvTYPE(_svstash) >= SVt_PVMG); \
+ &(((XPVMG*) MUTABLE_PTR(SvANY(_svstash)))->xmg_stash); \
+ }))
+# else
+# define SvPVX(sv) ((sv)->sv_u.svu_pv)
+# define SvCUR(sv) ((XPV*) SvANY(sv))->xpv_cur
+# define SvIVX(sv) ((XPVIV*) SvANY(sv))->xiv_iv
+# define SvUVX(sv) ((XPVUV*) SvANY(sv))->xuv_uv
+# define SvNVX(sv) ((XPVNV*) SvANY(sv))->xnv_u.xnv_nv
+# define SvRV(sv) ((sv)->sv_u.svu_rv)
+# define SvRV_const(sv) (0 + (sv)->sv_u.svu_rv)
+# define SvMAGIC(sv) ((XPVMG*) SvANY(sv))->xmg_u.xmg_magic
+# define SvSTASH(sv) ((XPVMG*) SvANY(sv))->xmg_stash
+# endif
+#endif
+
+#ifndef PERL_POISON
+/* Given that these two are new, there can't be any existing code using them
+ * as LVALUEs */
+# define SvPVX_mutable(sv) (0 + (sv)->sv_u.svu_pv)
+# define SvPVX_const(sv) ((const char*)(0 + (sv)->sv_u.svu_pv))
+#else
+/* Except for the poison code, which uses & to scribble over the pointer after
+ free() is called. */
+# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv)
+# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv))
+#endif
+
+#define SvIVXx(sv) SvIVX(sv)
+#define SvUVXx(sv) SvUVX(sv)
+#define SvNVXx(sv) SvNVX(sv)
+#define SvPVXx(sv) SvPVX(sv)
+#define SvLENx(sv) SvLEN(sv)
+#define SvENDx(sv) ((PL_Sv = (sv)), SvEND(PL_Sv))
+
+
+/* Ask a scalar nicely to try to become an IV, if possible.
+ Not guaranteed to stay returning void */
+/* Macro won't actually call sv_2iv if already IOK */
+#define SvIV_please(sv) \
+ STMT_START {if (!SvIOKp(sv) && (SvNOK(sv) || SvPOK(sv))) \
+ (void) SvIV(sv); } STMT_END
+#define SvIV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ assert(SvTYPE(sv) != SVt_PVAV); \
+ assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(SvTYPE(sv) != SVt_PVCV); \
+ assert(!isGV_with_GP(sv)); \
+ (((XPVIV*) SvANY(sv))->xiv_iv = (val)); } STMT_END
+#define SvNV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_NV || SvTYPE(sv) >= SVt_PVNV); \
+ assert(SvTYPE(sv) != SVt_PVAV); assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(SvTYPE(sv) != SVt_PVCV); assert(SvTYPE(sv) != SVt_PVFM); \
+ assert(SvTYPE(sv) != SVt_PVIO); \
+ assert(!isGV_with_GP(sv)); \
+ (((XPVNV*)SvANY(sv))->xnv_u.xnv_nv = (val)); } STMT_END
+#define SvPV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ assert(SvTYPE(sv) != SVt_PVAV); \
+ assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(!isGV_with_GP(sv)); \
+ ((sv)->sv_u.svu_pv = (val)); } STMT_END
+#define SvUV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+ assert(SvTYPE(sv) != SVt_PVAV); \
+ assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(SvTYPE(sv) != SVt_PVCV); \
+ assert(!isGV_with_GP(sv)); \
+ (((XPVUV*)SvANY(sv))->xuv_uv = (val)); } STMT_END
+#define SvRV_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV || SvTYPE(sv) == SVt_IV); \
+ assert(SvTYPE(sv) != SVt_PVAV); \
+ assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(SvTYPE(sv) != SVt_PVCV); \
+ assert(SvTYPE(sv) != SVt_PVFM); \
+ assert(!isGV_with_GP(sv)); \
+ ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#define SvMAGIC_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*)SvANY(sv))->xmg_u.xmg_magic = (val)); } STMT_END
+#define SvSTASH_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+#define SvCUR_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ assert(SvTYPE(sv) != SVt_PVAV); \
+ assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(!isGV_with_GP(sv)); \
+ (((XPV*) SvANY(sv))->xpv_cur = (val)); } STMT_END
+#define SvLEN_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ assert(SvTYPE(sv) != SVt_PVAV); \
+ assert(SvTYPE(sv) != SVt_PVHV); \
+ assert(!isGV_with_GP(sv)); \
+ (((XPV*) SvANY(sv))->xpv_len = (val)); } STMT_END
+#define SvEND_set(sv, val) \
+ STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
+ SvCUR_set(sv, (val) - SvPVX(sv)); } STMT_END
+
+#define SvPV_renew(sv,n) \
+ STMT_START { SvLEN_set(sv, n); \
+ SvPV_set((sv), (MEM_WRAP_CHECK_(n,char) \
+ (char*)saferealloc((Malloc_t)SvPVX(sv), \
+ (MEM_SIZE)((n))))); \
+ } STMT_END
+
+#define SvPV_shrink_to_cur(sv) STMT_START { \
+ const STRLEN _lEnGtH = SvCUR(sv) + 1; \
+ SvPV_renew(sv, _lEnGtH); \
+ } STMT_END
+
+#define SvPV_free(sv) \
+ STMT_START { \
+ assert(SvTYPE(sv) >= SVt_PV); \
+ if (SvLEN(sv)) { \
+ assert(!SvROK(sv)); \
+ if(SvOOK(sv)) { \
+ STRLEN zok; \
+ SvOOK_offset(sv, zok); \
+ SvPV_set(sv, SvPVX_mutable(sv) - zok); \
+ SvFLAGS(sv) &= ~SVf_OOK; \
+ } \
+ Safefree(SvPVX(sv)); \
+ } \
+ } STMT_END
+
+#ifdef PERL_CORE
+/* Code that crops up in three places to take a scalar and ready it to hold
+ a reference */
+# define prepare_SV_for_RV(sv) \
+ STMT_START { \
+ if (SvTYPE(sv) < SVt_PV && SvTYPE(sv) != SVt_IV) \
+ sv_upgrade(sv, SVt_IV); \
+ else if (SvTYPE(sv) >= SVt_PV) { \
+ SvPV_free(sv); \
+ SvLEN_set(sv, 0); \
+ SvCUR_set(sv, 0); \
+ } \
+ } STMT_END
+#endif
+
+#define PERL_FBM_TABLE_OFFSET 1 /* Number of bytes between EOS and table */
+
+/* SvPOKp not SvPOK in the assertion because the string can be tainted! eg
+ perl -T -e '/$^X/'
+*/
+#if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+# define BmFLAGS(sv) \
+ (*({ SV *const _bmflags = MUTABLE_SV(sv); \
+ assert(SvTYPE(_bmflags) == SVt_PVGV); \
+ assert(SvVALID(_bmflags)); \
+ &(((XPVGV*) SvANY(_bmflags))->xnv_u.xbm_s.xbm_flags); \
+ }))
+# define BmRARE(sv) \
+ (*({ SV *const _bmrare = MUTABLE_SV(sv); \
+ assert(SvTYPE(_bmrare) == SVt_PVGV); \
+ assert(SvVALID(_bmrare)); \
+ &(((XPVGV*) SvANY(_bmrare))->xnv_u.xbm_s.xbm_rare); \
+ }))
+# define BmUSEFUL(sv) \
+ (*({ SV *const _bmuseful = MUTABLE_SV(sv); \
+ assert(SvTYPE(_bmuseful) == SVt_PVGV); \
+ assert(SvVALID(_bmuseful)); \
+ assert(!SvIOK(_bmuseful)); \
+ &(((XPVGV*) SvANY(_bmuseful))->xiv_u.xivu_i32); \
+ }))
+# define BmPREVIOUS(sv) \
+ (*({ SV *const _bmprevious = MUTABLE_SV(sv); \
+ assert(SvTYPE(_bmprevious) == SVt_PVGV); \
+ assert(SvVALID(_bmprevious)); \
+ &(((XPVGV*) SvANY(_bmprevious))->xnv_u.xbm_s.xbm_previous); \
+ }))
+#else
+# define BmFLAGS(sv) ((XPVGV*) SvANY(sv))->xnv_u.xbm_s.xbm_flags
+# define BmRARE(sv) ((XPVGV*) SvANY(sv))->xnv_u.xbm_s.xbm_rare
+# define BmUSEFUL(sv) ((XPVGV*) SvANY(sv))->xiv_u.xivu_i32
+# define BmPREVIOUS(sv) ((XPVGV*) SvANY(sv))->xnv_u.xbm_s.xbm_previous
+
+#endif
+
+#define FmLINES(sv) ((XPVFM*) SvANY(sv))->xiv_u.xivu_iv
+
+#define LvTYPE(sv) ((XPVLV*) SvANY(sv))->xlv_type
+#define LvTARG(sv) ((XPVLV*) SvANY(sv))->xlv_targ
+#define LvTARGOFF(sv) ((XPVLV*) SvANY(sv))->xlv_targoff
+#define LvTARGLEN(sv) ((XPVLV*) SvANY(sv))->xlv_targlen
+
+#define IoIFP(sv) ((XPVIO*) SvANY(sv))->xio_ifp
+#define IoOFP(sv) ((XPVIO*) SvANY(sv))->xio_ofp
+#define IoDIRP(sv) ((XPVIO*) SvANY(sv))->xio_dirp
+#define IoANY(sv) ((XPVIO*) SvANY(sv))->xio_any
+#define IoLINES(sv) ((XPVIO*) SvANY(sv))->xiv_u.xivu_iv
+#define IoPAGE(sv) ((XPVIO*) SvANY(sv))->xio_page
+#define IoPAGE_LEN(sv) ((XPVIO*) SvANY(sv))->xio_page_len
+#define IoLINES_LEFT(sv)((XPVIO*) SvANY(sv))->xio_lines_left
+#define IoTOP_NAME(sv) ((XPVIO*) SvANY(sv))->xio_top_name
+#define IoTOP_GV(sv) ((XPVIO*) SvANY(sv))->xio_top_gv
+#define IoFMT_NAME(sv) ((XPVIO*) SvANY(sv))->xio_fmt_name
+#define IoFMT_GV(sv) ((XPVIO*) SvANY(sv))->xio_fmt_gv
+#define IoBOTTOM_NAME(sv)((XPVIO*) SvANY(sv))->xio_bottom_name
+#define IoBOTTOM_GV(sv) ((XPVIO*) SvANY(sv))->xio_bottom_gv
+#define IoTYPE(sv) ((XPVIO*) SvANY(sv))->xio_type
+#define IoFLAGS(sv) ((XPVIO*) SvANY(sv))->xio_flags
+
+/* IoTYPE(sv) is a single character telling the type of I/O connection. */
+#define IoTYPE_RDONLY '<'
+#define IoTYPE_WRONLY '>'
+#define IoTYPE_RDWR '+'
+#define IoTYPE_APPEND 'a'
+#define IoTYPE_PIPE '|'
+#define IoTYPE_STD '-' /* stdin or stdout */
+#define IoTYPE_SOCKET 's'
+#define IoTYPE_CLOSED ' '
+#define IoTYPE_IMPLICIT 'I' /* stdin or stdout or stderr */
+#define IoTYPE_NUMERIC '#' /* fdopen */
+
+/*
+=for apidoc Am|bool|SvTAINTED|SV* sv
+Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
+not.
+
+=for apidoc Am|void|SvTAINTED_on|SV* sv
+Marks an SV as tainted if tainting is enabled.
+
+=for apidoc Am|void|SvTAINTED_off|SV* sv
+Untaints an SV. Be I<very> careful with this routine, as it short-circuits
+some of Perl's fundamental security features. XS module authors should not
+use this function unless they fully understand all the implications of
+unconditionally untainting the value. Untainting should be done in the
+standard perl fashion, via a carefully crafted regexp, rather than directly
+untainting variables.
+
+=for apidoc Am|void|SvTAINT|SV* sv
+Taints an SV if tainting is enabled.
+
+=cut
+*/
+
+#define sv_taint(sv) sv_magic((sv), NULL, PERL_MAGIC_taint, NULL, 0)
+
+#define SvTAINTED(sv) (SvMAGICAL(sv) && sv_tainted(sv))
+#define SvTAINTED_on(sv) STMT_START{ if(PL_tainting){sv_taint(sv);} }STMT_END
+#define SvTAINTED_off(sv) STMT_START{ if(PL_tainting){sv_untaint(sv);} }STMT_END
+
+#define SvTAINT(sv) \
+ STMT_START { \
+ if (PL_tainting) { \
+ if (PL_tainted) \
+ SvTAINTED_on(sv); \
+ } \
+ } STMT_END
+
+/*
+=for apidoc Am|char*|SvPV_force|SV* sv|STRLEN len
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>). You want force if you are going to update the C<SvPVX>
+directly.
+
+=for apidoc Am|char*|SvPV_force_nomg|SV* sv|STRLEN len
+Like C<SvPV> but will force the SV into containing just a string
+(C<SvPOK_only>). You want force if you are going to update the C<SvPVX>
+directly. Doesn't process magic.
+
+=for apidoc Am|char*|SvPV|SV* sv|STRLEN len
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string. The SV may cache the
+stringified version becoming C<SvPOK>. Handles 'get' magic. See also
+C<SvPVx> for a version which guarantees to evaluate sv only once.
+
+=for apidoc Am|char*|SvPVx|SV* sv|STRLEN len
+A version of C<SvPV> which guarantees to evaluate C<sv> only once.
+Only use this if C<sv> is an expression with side effects, otherwise use the
+more efficient C<SvPVX>.
+
+=for apidoc Am|char*|SvPV_nomg|SV* sv|STRLEN len
+Like C<SvPV> but doesn't process magic.
+
+=for apidoc Am|char*|SvPV_nolen|SV* sv
+Returns a pointer to the string in the SV, or a stringified form of
+the SV if the SV does not contain a string. The SV may cache the
+stringified form becoming C<SvPOK>. Handles 'get' magic.
+
+=for apidoc Am|IV|SvIV|SV* sv
+Coerces the given SV to an integer and returns it. See C<SvIVx> for a
+version which guarantees to evaluate sv only once.
+
+=for apidoc Am|IV|SvIV_nomg|SV* sv
+Like C<SvIV> but doesn't process magic.
+
+=for apidoc Am|IV|SvIVx|SV* sv
+Coerces the given SV to an integer and returns it. Guarantees to evaluate
+C<sv> only once. Only use this if C<sv> is an expression with side effects,
+otherwise use the more efficient C<SvIV>.
+
+=for apidoc Am|NV|SvNV|SV* sv
+Coerce the given SV to a double and return it. See C<SvNVx> for a version
+which guarantees to evaluate sv only once.
+
+=for apidoc Am|NV|SvNVx|SV* sv
+Coerces the given SV to a double and returns it. Guarantees to evaluate
+C<sv> only once. Only use this if C<sv> is an expression with side effects,
+otherwise use the more efficient C<SvNV>.
+
+=for apidoc Am|UV|SvUV|SV* sv
+Coerces the given SV to an unsigned integer and returns it. See C<SvUVx>
+for a version which guarantees to evaluate sv only once.
+
+=for apidoc Am|UV|SvUV_nomg|SV* sv
+Like C<SvUV> but doesn't process magic.
+
+=for apidoc Am|UV|SvUVx|SV* sv
+Coerces the given SV to an unsigned integer and returns it. Guarantees to
+C<sv> only once. Only use this if C<sv> is an expression with side effects,
+otherwise use the more efficient C<SvUV>.
+
+=for apidoc Am|bool|SvTRUE|SV* sv
+Returns a boolean indicating whether Perl would evaluate the SV as true or
+false. See SvOK() for a defined/undefined test. Does not handle 'get' magic.
+
+=for apidoc Am|char*|SvPVutf8_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+
+=for apidoc Am|char*|SvPVutf8|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+
+=for apidoc Am|char*|SvPVutf8_nolen|SV* sv
+Like C<SvPV_nolen>, but converts sv to utf8 first if necessary.
+
+=for apidoc Am|char*|SvPVbyte_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+
+=for apidoc Am|char*|SvPVbyte|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+
+=for apidoc Am|char*|SvPVbyte_nolen|SV* sv
+Like C<SvPV_nolen>, but converts sv to byte representation first if necessary.
+
+=for apidoc Am|char*|SvPVutf8x_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8_force>
+otherwise.
+
+=for apidoc Am|char*|SvPVutf8x|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to utf8 first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8>
+otherwise.
+
+=for apidoc Am|char*|SvPVbytex_force|SV* sv|STRLEN len
+Like C<SvPV_force>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte_force>
+otherwise.
+
+=for apidoc Am|char*|SvPVbytex|SV* sv|STRLEN len
+Like C<SvPV>, but converts sv to byte representation first if necessary.
+Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte>
+otherwise.
+
+=for apidoc Am|bool|SvIsCOW|SV* sv
+Returns a boolean indicating whether the SV is Copy-On-Write. (either shared
+hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for
+COW)
+
+=for apidoc Am|bool|SvIsCOW_shared_hash|SV* sv
+Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
+scalar.
+
+=for apidoc Am|void|sv_catpvn_nomg|SV* sv|const char* ptr|STRLEN len
+Like C<sv_catpvn> but doesn't process magic.
+
+=for apidoc Am|void|sv_setsv_nomg|SV* dsv|SV* ssv
+Like C<sv_setsv> but doesn't process magic.
+
+=for apidoc Am|void|sv_catsv_nomg|SV* dsv|SV* ssv
+Like C<sv_catsv> but doesn't process magic.
+
+=for apidoc Amdb|STRLEN|sv_utf8_upgrade_nomg|NN SV *sv
+
+Like sv_utf8_upgrade, but doesn't do magic on C<sv>
+
+=cut
+*/
+
+/* Let us hope that bitmaps for UV and IV are the same */
+#define SvIV(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv))
+#define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#define SvNV(sv) (SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv))
+
+#define SvIV_nomg(sv) (SvIOK(sv) ? SvIVX(sv) : sv_2iv_flags(sv, 0))
+#define SvUV_nomg(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv_flags(sv, 0))
+
+/* ----*/
+
+#define SvPV(sv, lp) SvPV_flags(sv, lp, SV_GMAGIC)
+#define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC)
+#define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+
+#define SvPV_flags(sv, lp, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+#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))
+#define SvPV_flags_const_nolen(sv, flags) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX_const(sv) : \
+ (const char*) sv_2pv_flags(sv, 0, flags|SV_CONST_RETURN))
+#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))
+
+#define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC)
+#define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+
+#define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0)
+#define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
+
+#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))
+#define SvPV_force_flags_nolen(sv, flags) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+ ? SvPVX(sv) : sv_pvn_force_flags(sv, 0, flags))
+#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))
+
+#define SvPV_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC))
+
+#define SvPV_nolen_const(sv) \
+ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+ ? SvPVX_const(sv) : sv_2pv_flags(sv, 0, SV_GMAGIC|SV_CONST_RETURN))
+
+#define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0)
+#define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0)
+#define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
+
+/* ----*/
+
+#define SvPVutf8(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvutf8(sv, &lp))
+
+#define SvPVutf8_force(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8|SVf_THINKFIRST)) == (SVf_POK|SVf_UTF8) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvutf8n_force(sv, &lp))
+
+
+#define SvPVutf8_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK|SVf_UTF8)\
+ ? SvPVX(sv) : sv_2pvutf8(sv, 0))
+
+/* ----*/
+
+#define SvPVbyte(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#define SvPVbyte_force(sv, lp) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8|SVf_THINKFIRST)) == (SVf_POK) \
+ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvbyten_force(sv, &lp))
+
+#define SvPVbyte_nolen(sv) \
+ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)\
+ ? SvPVX(sv) : sv_2pvbyte(sv, 0))
+
+
+
+/* define FOOx(): idempotent versions of FOO(). If possible, use a local
+ * var to evaluate the arg once; failing that, use a global if possible;
+ * failing that, call a function to do the work
+ */
+
+#define SvPVx_force(sv, lp) sv_pvn_force(sv, &lp)
+#define SvPVutf8x_force(sv, lp) sv_pvutf8n_force(sv, &lp)
+#define SvPVbytex_force(sv, lp) sv_pvbyten_force(sv, &lp)
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
+
+# define SvIVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvIV(_sv); })
+# define SvUVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvUV(_sv); })
+# define SvNVx(sv) ({SV *_sv = MUTABLE_SV(sv); SvNV(_sv); })
+# define SvPVx(sv, lp) ({SV *_sv = (sv); SvPV(_sv, lp); })
+# define SvPVx_const(sv, lp) ({SV *_sv = (sv); SvPV_const(_sv, lp); })
+# define SvPVx_nolen(sv) ({SV *_sv = (sv); SvPV_nolen(_sv); })
+# define SvPVx_nolen_const(sv) ({SV *_sv = (sv); SvPV_nolen_const(_sv); })
+# define SvPVutf8x(sv, lp) ({SV *_sv = (sv); SvPVutf8(_sv, lp); })
+# define SvPVbytex(sv, lp) ({SV *_sv = (sv); SvPVbyte(_sv, lp); })
+# define SvPVbytex_nolen(sv) ({SV *_sv = (sv); SvPVbyte_nolen(_sv); })
+# define SvTRUE(sv) ( \
+ !sv \
+ ? 0 \
+ : SvPOK(sv) \
+ ? (({XPV *nxpv = (XPV*)SvANY(sv); \
+ nxpv && \
+ (nxpv->xpv_cur > 1 || \
+ (nxpv->xpv_cur && *(sv)->sv_u.svu_pv != '0')); }) \
+ ? 1 \
+ : 0) \
+ : \
+ SvIOK(sv) \
+ ? SvIVX(sv) != 0 \
+ : SvNOK(sv) \
+ ? SvNVX(sv) != 0.0 \
+ : sv_2bool(sv) )
+# define SvTRUEx(sv) ({SV *_sv = (sv); SvTRUE(_sv); })
+
+#else /* __GNUC__ */
+
+/* These inlined macros use globals, which will require a thread
+ * declaration in user code, so we avoid them under threads */
+
+# define SvIVx(sv) ((PL_Sv = (sv)), SvIV(PL_Sv))
+# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+# define SvNVx(sv) ((PL_Sv = (sv)), SvNV(PL_Sv))
+# define SvPVx(sv, lp) ((PL_Sv = (sv)), SvPV(PL_Sv, lp))
+# define SvPVx_const(sv, lp) ((PL_Sv = (sv)), SvPV_const(PL_Sv, lp))
+# define SvPVx_nolen(sv) ((PL_Sv = (sv)), SvPV_nolen(PL_Sv))
+# define SvPVx_nolen_const(sv) ((PL_Sv = (sv)), SvPV_nolen_const(PL_Sv))
+# define SvPVutf8x(sv, lp) ((PL_Sv = (sv)), SvPVutf8(PL_Sv, lp))
+# define SvPVbytex(sv, lp) ((PL_Sv = (sv)), SvPVbyte(PL_Sv, lp))
+# define SvPVbytex_nolen(sv) ((PL_Sv = (sv)), SvPVbyte_nolen(PL_Sv))
+# define SvTRUE(sv) ( \
+ !sv \
+ ? 0 \
+ : SvPOK(sv) \
+ ? ((PL_Xpv = (XPV*)SvANY(PL_Sv = (sv))) && \
+ (PL_Xpv->xpv_cur > 1 || \
+ (PL_Xpv->xpv_cur && *PL_Sv->sv_u.svu_pv != '0')) \
+ ? 1 \
+ : 0) \
+ : \
+ SvIOK(sv) \
+ ? SvIVX(sv) != 0 \
+ : SvNOK(sv) \
+ ? SvNVX(sv) != 0.0 \
+ : sv_2bool(sv) )
+# define SvTRUEx(sv) ((PL_Sv = (sv)), SvTRUE(PL_Sv))
+#endif /* __GNU__ */
+
+#define SvIsCOW(sv) ((SvFLAGS(sv) & (SVf_FAKE | SVf_READONLY)) == \
+ (SVf_FAKE | SVf_READONLY))
+#define SvIsCOW_shared_hash(sv) (SvIsCOW(sv) && SvLEN(sv) == 0)
+
+#define SvSHARED_HEK_FROM_PV(pvx) \
+ ((struct hek*)(pvx - STRUCT_OFFSET(struct hek, hek_key)))
+#define SvSHARED_HASH(sv) (0 + SvSHARED_HEK_FROM_PV(SvPVX_const(sv))->hek_hash)
+
+/* flag values for sv_*_flags functions */
+#define SV_IMMEDIATE_UNREF 1
+#define SV_GMAGIC 2
+#define SV_COW_DROP_PV 4
+#define SV_UTF8_NO_ENCODING 8
+#define SV_NOSTEAL 16
+#define SV_CONST_RETURN 32
+#define SV_MUTABLE_RETURN 64
+#define SV_SMAGIC 128
+#define SV_HAS_TRAILING_NUL 256
+#define SV_COW_SHARED_HASH_KEYS 512
+/* This one is only enabled for PERL_OLD_COPY_ON_WRITE */
+#define SV_COW_OTHER_PVS 1024
+/* Make sv_2pv_flags return NULL if something is undefined. */
+#define SV_UNDEF_RETURNS_NULL 2048
+/* Tell sv_utf8_upgrade() to not check to see if an upgrade is really needed.
+ * This is used when the caller has already determined it is, and avoids
+ * redundant work */
+#define SV_FORCE_UTF8_UPGRADE 4096
+
+/* The core is safe for this COW optimisation. XS code on CPAN may not be.
+ So only default to doing the COW setup if we're in the core.
+ */
+#ifdef PERL_CORE
+# ifndef SV_DO_COW_SVSETSV
+# define SV_DO_COW_SVSETSV SV_COW_SHARED_HASH_KEYS|SV_COW_OTHER_PVS
+# endif
+#endif
+
+#ifndef SV_DO_COW_SVSETSV
+# define SV_DO_COW_SVSETSV 0
+#endif
+
+
+#define sv_unref(sv) sv_unref_flags(sv, 0)
+#define sv_force_normal(sv) sv_force_normal_flags(sv, 0)
+#define sv_usepvn(sv, p, l) sv_usepvn_flags(sv, p, l, 0)
+#define sv_usepvn_mg(sv, p, l) sv_usepvn_flags(sv, p, l, SV_SMAGIC)
+
+/* We are about to replace the SV's current value. So if it's copy on write
+ we need to normalise it. Use the SV_COW_DROP_PV flag hint to say that
+ the value is about to get thrown away, so drop the PV rather than go to
+ the effort of making a read-write copy only for it to get immediately
+ discarded. */
+
+#define SV_CHECK_THINKFIRST_COW_DROP(sv) if (SvTHINKFIRST(sv)) \
+ sv_force_normal_flags(sv, SV_COW_DROP_PV)
+
+#ifdef PERL_OLD_COPY_ON_WRITE
+#define SvRELEASE_IVX(sv) \
+ ((SvIsCOW(sv) ? sv_force_normal_flags(sv, 0) : (void) 0), 0)
+# define SvIsCOW_normal(sv) (SvIsCOW(sv) && SvLEN(sv))
+# define SvRELEASE_IVX_(sv) SvRELEASE_IVX(sv),
+#else
+# define SvRELEASE_IVX(sv) 0
+/* This little game brought to you by the need to shut this warning up:
+mg.c: In function `Perl_magic_get':
+mg.c:1024: warning: left-hand operand of comma expression has no effect
+*/
+# define SvRELEASE_IVX_(sv) /**/
+#endif /* PERL_OLD_COPY_ON_WRITE */
+
+#define CAN_COW_MASK (SVs_OBJECT|SVs_GMG|SVs_SMG|SVs_RMG|SVf_IOK|SVf_NOK| \
+ SVf_POK|SVf_ROK|SVp_IOK|SVp_NOK|SVp_POK|SVf_FAKE| \
+ SVf_OOK|SVf_BREAK|SVf_READONLY)
+#define CAN_COW_FLAGS (SVp_POK|SVf_POK)
+
+#define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) \
+ sv_force_normal_flags(sv, 0)
+
+
+/* all these 'functions' are now just macros */
+
+#define sv_pv(sv) SvPV_nolen(sv)
+#define sv_pvutf8(sv) SvPVutf8_nolen(sv)
+#define sv_pvbyte(sv) SvPVbyte_nolen(sv)
+
+#define sv_pvn_force_nomg(sv, lp) sv_pvn_force_flags(sv, lp, 0)
+#define sv_utf8_upgrade_flags(sv, flags) sv_utf8_upgrade_flags_grow(sv, flags, 0)
+#define sv_utf8_upgrade_nomg(sv) sv_utf8_upgrade_flags(sv, 0)
+#define sv_catpvn_nomg(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, 0)
+#define sv_setsv(dsv, ssv) \
+ sv_setsv_flags(dsv, ssv, SV_GMAGIC|SV_DO_COW_SVSETSV)
+#define sv_setsv_nomg(dsv, ssv) sv_setsv_flags(dsv, ssv, SV_DO_COW_SVSETSV)
+#define sv_catsv(dsv, ssv) sv_catsv_flags(dsv, ssv, SV_GMAGIC)
+#define sv_catsv_nomg(dsv, ssv) sv_catsv_flags(dsv, ssv, 0)
+#define sv_catsv_mg(dsv, ssv) sv_catsv_flags(dsv, ssv, SV_GMAGIC|SV_SMAGIC)
+#define sv_catpvn(dsv, sstr, slen) sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC)
+#define sv_catpvn_mg(sv, sstr, slen) \
+ sv_catpvn_flags(sv, sstr, slen, SV_GMAGIC|SV_SMAGIC);
+#define sv_2pv(sv, lp) sv_2pv_flags(sv, lp, SV_GMAGIC)
+#define sv_2pv_nolen(sv) sv_2pv(sv, 0)
+#define sv_2pvbyte_nolen(sv) sv_2pvbyte(sv, 0)
+#define sv_2pvutf8_nolen(sv) sv_2pvutf8(sv, 0)
+#define sv_2pv_nomg(sv, lp) sv_2pv_flags(sv, lp, 0)
+#define sv_pvn_force(sv, lp) sv_pvn_force_flags(sv, lp, SV_GMAGIC)
+#define sv_utf8_upgrade(sv) sv_utf8_upgrade_flags(sv, SV_GMAGIC)
+#define sv_2iv(sv) sv_2iv_flags(sv, SV_GMAGIC)
+#define sv_2uv(sv) sv_2uv_flags(sv, SV_GMAGIC)
+#define sv_insert(bigstr, offset, len, little, littlelen) \
+ Perl_sv_insert_flags(aTHX_ (bigstr),(offset), (len), (little), \
+ (littlelen), SV_GMAGIC)
+
+/* Should be named SvCatPVN_utf8_upgrade? */
+#define sv_catpvn_utf8_upgrade(dsv, sstr, slen, nsv) \
+ STMT_START { \
+ if (!(nsv)) \
+ nsv = newSVpvn_flags(sstr, slen, SVs_TEMP); \
+ else \
+ sv_setpvn(nsv, sstr, slen); \
+ SvUTF8_off(nsv); \
+ sv_utf8_upgrade(nsv); \
+ sv_catsv(dsv, nsv); \
+ } STMT_END
+
+/*
+=for apidoc Am|SV*|newRV_inc|SV* sv
+
+Creates an RV wrapper for an SV. The reference count for the original SV is
+incremented.
+
+=cut
+*/
+
+#define newRV_inc(sv) newRV(sv)
+
+/* the following macros update any magic values this sv is associated with */
+
+/*
+=head1 Magical Functions
+
+=for apidoc Am|void|SvGETMAGIC|SV* sv
+Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates its
+argument more than once.
+
+=for apidoc Am|void|SvSETMAGIC|SV* sv
+Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates its
+argument more than once.
+
+=for apidoc Am|void|SvSetSV|SV* dsb|SV* ssv
+Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
+more than once.
+
+=for apidoc Am|void|SvSetSV_nosteal|SV* dsv|SV* ssv
+Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
+ssv. May evaluate arguments more than once.
+
+=for apidoc Am|void|SvSetMagicSV|SV* dsb|SV* ssv
+Like C<SvSetSV>, but does any set magic required afterwards.
+
+=for apidoc Am|void|SvSetMagicSV_nosteal|SV* dsv|SV* ssv
+Like C<SvSetSV_nosteal>, but does any set magic required afterwards.
+
+=for apidoc Am|void|SvSHARE|SV* sv
+Arranges for sv to be shared between threads if a suitable module
+has been loaded.
+
+=for apidoc Am|void|SvLOCK|SV* sv
+Arranges for a mutual exclusion lock to be obtained on sv if a suitable module
+has been loaded.
+
+=for apidoc Am|void|SvUNLOCK|SV* sv
+Releases a mutual exclusion lock on sv if a suitable module
+has been loaded.
+
+=head1 SV Manipulation Functions
+
+=for apidoc Am|char *|SvGROW|SV* sv|STRLEN len
+Expands the character buffer in the SV so that it has room for the
+indicated number of bytes (remember to reserve space for an extra trailing
+NUL character). Calls C<sv_grow> to perform the expansion if necessary.
+Returns a pointer to the character buffer.
+
+=cut
+*/
+
+#define SvSHARE(sv) CALL_FPTR(PL_sharehook)(aTHX_ sv)
+#define SvLOCK(sv) CALL_FPTR(PL_lockhook)(aTHX_ sv)
+#define SvUNLOCK(sv) CALL_FPTR(PL_unlockhook)(aTHX_ sv)
+#define SvDESTROYABLE(sv) CALL_FPTR(PL_destroyhook)(aTHX_ sv)
+
+#define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#define SvSETMAGIC(x) STMT_START { if (SvSMAGICAL(x)) mg_set(x); } STMT_END
+
+#define SvSetSV_and(dst,src,finally) \
+ STMT_START { \
+ if ((dst) != (src)) { \
+ sv_setsv(dst, src); \
+ finally; \
+ } \
+ } STMT_END
+#define SvSetSV_nosteal_and(dst,src,finally) \
+ STMT_START { \
+ if ((dst) != (src)) { \
+ sv_setsv_flags(dst, src, SV_GMAGIC | SV_NOSTEAL | SV_DO_COW_SVSETSV); \
+ finally; \
+ } \
+ } STMT_END
+
+#define SvSetSV(dst,src) \
+ SvSetSV_and(dst,src,/*nothing*/;)
+#define SvSetSV_nosteal(dst,src) \
+ SvSetSV_nosteal_and(dst,src,/*nothing*/;)
+
+#define SvSetMagicSV(dst,src) \
+ SvSetSV_and(dst,src,SvSETMAGIC(dst))
+#define SvSetMagicSV_nosteal(dst,src) \
+ SvSetSV_nosteal_and(dst,src,SvSETMAGIC(dst))
+
+
+#if !defined(SKIP_DEBUGGING)
+#define SvPEEK(sv) sv_peek(sv)
+#else
+#define SvPEEK(sv) ""
+#endif
+
+#define SvIMMORTAL(sv) ((sv)==&PL_sv_undef || (sv)==&PL_sv_yes || (sv)==&PL_sv_no || (sv)==&PL_sv_placeholder)
+
+#define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
+
+#define isGV(sv) (SvTYPE(sv) == SVt_PVGV)
+/* If I give every macro argument a different name, then there won't be bugs
+ where nested macros get confused. Been there, done that. */
+#define isGV_with_GP(pwadak) \
+ (((SvFLAGS(pwadak) & (SVp_POK|SVpgv_GP)) == SVpgv_GP) \
+ && (SvTYPE(pwadak) == SVt_PVGV || SvTYPE(pwadak) == SVt_PVLV))
+#define isGV_with_GP_on(sv) STMT_START { \
+ assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \
+ assert (!SvPOKp(sv)); \
+ assert (!SvIOKp(sv)); \
+ (SvFLAGS(sv) |= SVpgv_GP); \
+ } STMT_END
+#define isGV_with_GP_off(sv) STMT_START { \
+ assert (SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV); \
+ assert (!SvPOKp(sv)); \
+ assert (!SvIOKp(sv)); \
+ (SvFLAGS(sv) &= ~SVpgv_GP); \
+ } STMT_END
+
+
+#define SvGROW(sv,len) (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX(sv))
+#define SvGROW_mutable(sv,len) \
+ (SvLEN(sv) < (len) ? sv_grow(sv,len) : SvPVX_mutable(sv))
+#define Sv_Grow sv_grow
+
+#define CLONEf_COPY_STACKS 1
+#define CLONEf_KEEP_PTR_TABLE 2
+#define CLONEf_CLONE_HOST 4
+#define CLONEf_JOIN_IN 8
+
+struct clone_params {
+ AV* stashes;
+ UV flags;
+ PerlInterpreter *proto_perl;
+};
+
+/*
+=for apidoc Am|SV*|newSVpvn_utf8|NULLOK const char* s|STRLEN len|U32 utf8
+
+Creates a new SV and copies a string into it. If utf8 is true, calls
+C<SvUTF8_on> on the new SV. Implemented as a wrapper around C<newSVpvn_flags>.
+
+=cut
+*/
+
+#define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+
+/*
+=for apidoc Am|void|SvOOK_offset|NN SV*sv|STRLEN len
+
+Reads into I<len> the offset from SvPVX back to the true start of the
+allocated buffer, which will be non-zero if C<sv_chop> has been used to
+efficiently remove characters from start of the buffer. Implemented as a
+macro, which takes the address of I<len>, which must be of type C<STRLEN>.
+Evaluates I<sv> more than once. Sets I<len> to 0 if C<SvOOK(sv)> is false.
+
+=cut
+*/
+
+#ifdef DEBUGGING
+/* Does the bot know something I don't?
+10:28 <@Nicholas> metabatman
+10:28 <+meta> Nicholas: crash
+*/
+# define SvOOK_offset(sv, offset) STMT_START { \
+ assert(sizeof(offset) == sizeof(STRLEN)); \
+ if (SvOOK(sv)) { \
+ const U8 *crash = (U8*)SvPVX_const(sv); \
+ offset = *--crash; \
+ if (!offset) { \
+ crash -= sizeof(STRLEN); \
+ Copy(crash, (U8 *)&offset, sizeof(STRLEN), U8); \
+ } \
+ { \
+ /* Validate the preceding buffer's sentinels to \
+ verify that no-one is using it. */ \
+ const U8 *const bonk = (U8 *) SvPVX_const(sv) - offset; \
+ while (crash > bonk) { \
+ --crash; \
+ assert (*crash == (U8)PTR2UV(crash)); \
+ } \
+ } \
+ } else { \
+ offset = 0; \
+ } \
+ } STMT_END
+#else
+ /* This is the same code, but avoids using any temporary variables: */
+# define SvOOK_offset(sv, offset) STMT_START { \
+ assert(sizeof(offset) == sizeof(STRLEN)); \
+ if (SvOOK(sv)) { \
+ offset = ((U8*)SvPVX_const(sv))[-1]; \
+ if (!offset) { \
+ Copy(SvPVX_const(sv) - 1 - sizeof(STRLEN), \
+ (U8 *)&offset, sizeof(STRLEN), U8); \
+ } \
+ } else { \
+ offset = 0; \
+ } \
+ } STMT_END
+#endif
+
+#define newIO() MUTABLE_IO(newSV_type(SVt_PVIO))
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/sys/socket.h b/Master/tlpkg/tlperl/lib/CORE/sys/socket.h
new file mode 100644
index 00000000000..a3c53b0e883
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/sys/socket.h
@@ -0,0 +1,189 @@
+/* sys/socket.h */
+
+/* djl */
+/* Provide UNIX compatibility */
+
+#ifndef _INC_SYS_SOCKET
+#define _INC_SYS_SOCKET
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef __GNUC__
+# define Win32_Winsock
+#endif
+#include <windows.h>
+
+
+/* Too late to include winsock2.h if winsock.h has already been loaded */
+#ifndef _WINSOCKAPI_
+# if defined(UNDER_CE) && UNDER_CE <= 300
+ /* winsock2 only for 4.00+ */
+# include <winsock.h>
+# else
+# include <winsock2.h>
+#endif
+#endif
+
+#include "win32.h"
+
+#define ENOTSOCK WSAENOTSOCK
+
+#ifdef USE_SOCKETS_AS_HANDLES
+
+#ifndef PERL_FD_SETSIZE
+#define PERL_FD_SETSIZE 64
+#endif
+
+#define PERL_BITS_PER_BYTE 8
+#define PERL_NFDBITS (sizeof(Perl_fd_mask)*PERL_BITS_PER_BYTE)
+
+typedef int Perl_fd_mask;
+
+typedef struct Perl_fd_set {
+ Perl_fd_mask bits[(PERL_FD_SETSIZE+PERL_NFDBITS-1)/PERL_NFDBITS];
+} Perl_fd_set;
+
+#define PERL_FD_CLR(n,p) \
+ ((p)->bits[(n)/PERL_NFDBITS] &= ~((unsigned)1 << ((n)%PERL_NFDBITS)))
+
+#define PERL_FD_SET(n,p) \
+ ((p)->bits[(n)/PERL_NFDBITS] |= ((unsigned)1 << ((n)%PERL_NFDBITS)))
+
+#define PERL_FD_ZERO(p) memset((char *)(p),0,sizeof(*(p)))
+
+#define PERL_FD_ISSET(n,p) \
+ ((p)->bits[(n)/PERL_NFDBITS] & ((unsigned)1 << ((n)%PERL_NFDBITS)))
+
+#else /* USE_SOCKETS_AS_HANDLES */
+
+#define Perl_fd_set fd_set
+#define PERL_FD_SET(n,p) FD_SET(n,p)
+#define PERL_FD_CLR(n,p) FD_CLR(n,p)
+#define PERL_FD_ISSET(n,p) FD_ISSET(n,p)
+#define PERL_FD_ZERO(p) FD_ZERO(p)
+
+#endif /* USE_SOCKETS_AS_HANDLES */
+
+SOCKET win32_accept (SOCKET s, struct sockaddr *addr, int *addrlen);
+int win32_bind (SOCKET s, const struct sockaddr *addr, int namelen);
+int win32_closesocket (SOCKET s);
+int win32_connect (SOCKET s, const struct sockaddr *name, int namelen);
+int win32_ioctlsocket (SOCKET s, long cmd, u_long *argp);
+int win32_getpeername (SOCKET s, struct sockaddr *name, int * namelen);
+int win32_getsockname (SOCKET s, struct sockaddr *name, int * namelen);
+int win32_getsockopt (SOCKET s, int level, int optname, char * optval, int *optlen);
+u_long win32_htonl (u_long hostlong);
+u_short win32_htons (u_short hostshort);
+unsigned long win32_inet_addr (const char * cp);
+char * win32_inet_ntoa (struct in_addr in);
+int win32_listen (SOCKET s, int backlog);
+u_long win32_ntohl (u_long netlong);
+u_short win32_ntohs (u_short netshort);
+int win32_recv (SOCKET s, char * buf, int len, int flags);
+int win32_recvfrom (SOCKET s, char * buf, int len, int flags,
+ struct sockaddr *from, int * fromlen);
+int win32_select (int nfds, Perl_fd_set *rfds, Perl_fd_set *wfds, Perl_fd_set *xfds,
+ const struct timeval *timeout);
+int win32_send (SOCKET s, const char * buf, int len, int flags);
+int win32_sendto (SOCKET s, const char * buf, int len, int flags,
+ const struct sockaddr *to, int tolen);
+int win32_setsockopt (SOCKET s, int level, int optname,
+ const char * optval, int optlen);
+SOCKET win32_socket (int af, int type, int protocol);
+int win32_shutdown (SOCKET s, int how);
+
+/* Database function prototypes */
+
+struct hostent * win32_gethostbyaddr(const char * addr, int len, int type);
+struct hostent * win32_gethostbyname(const char * name);
+int win32_gethostname (char * name, int namelen);
+struct servent * win32_getservbyport(int port, const char * proto);
+struct servent * win32_getservbyname(const char * name, const char * proto);
+struct protoent * win32_getprotobynumber(int proto);
+struct protoent * win32_getprotobyname(const char * name);
+struct protoent *win32_getprotoent(void);
+struct servent *win32_getservent(void);
+void win32_sethostent(int stayopen);
+void win32_setnetent(int stayopen);
+struct netent * win32_getnetent(void);
+struct netent * win32_getnetbyname(char *name);
+struct netent * win32_getnetbyaddr(long net, int type);
+void win32_setprotoent(int stayopen);
+void win32_setservent(int stayopen);
+void win32_endhostent(void);
+void win32_endnetent(void);
+void win32_endprotoent(void);
+void win32_endservent(void);
+
+#ifndef WIN32SCK_IS_STDSCK
+
+/* direct to our version */
+
+#define htonl win32_htonl
+#define htons win32_htons
+#define ntohl win32_ntohl
+#define ntohs win32_ntohs
+#define inet_addr win32_inet_addr
+#define inet_ntoa win32_inet_ntoa
+
+#define socket win32_socket
+#define bind win32_bind
+#define listen win32_listen
+#define accept win32_accept
+#define connect win32_connect
+#define send win32_send
+#define sendto win32_sendto
+#define recv win32_recv
+#define recvfrom win32_recvfrom
+#define shutdown win32_shutdown
+#define closesocket win32_closesocket
+#define ioctlsocket win32_ioctlsocket
+#define setsockopt win32_setsockopt
+#define getsockopt win32_getsockopt
+#define getpeername win32_getpeername
+#define getsockname win32_getsockname
+#define gethostname win32_gethostname
+#define gethostbyname win32_gethostbyname
+#define gethostbyaddr win32_gethostbyaddr
+#define getprotobyname win32_getprotobyname
+#define getprotobynumber win32_getprotobynumber
+#define getservbyname win32_getservbyname
+#define getservbyport win32_getservbyport
+#define select win32_select
+#define endhostent win32_endhostent
+#define endnetent win32_endnetent
+#define endprotoent win32_endprotoent
+#define endservent win32_endservent
+#define getnetent win32_getnetent
+#define getnetbyname win32_getnetbyname
+#define getnetbyaddr win32_getnetbyaddr
+#define getprotoent win32_getprotoent
+#define getservent win32_getservent
+#define sethostent win32_sethostent
+#define setnetent win32_setnetent
+#define setprotoent win32_setprotoent
+#define setservent win32_setservent
+
+#ifdef USE_SOCKETS_AS_HANDLES
+#undef fd_set
+#undef FD_SET
+#undef FD_CLR
+#undef FD_ISSET
+#undef FD_ZERO
+#define fd_set Perl_fd_set
+#define FD_SET(n,p) PERL_FD_SET(n,p)
+#define FD_CLR(n,p) PERL_FD_CLR(n,p)
+#define FD_ISSET(n,p) PERL_FD_ISSET(n,p)
+#define FD_ZERO(p) PERL_FD_ZERO(p)
+#endif /* USE_SOCKETS_AS_HANDLES */
+
+#endif /* WIN32SCK_IS_STDSCK */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INC_SYS_SOCKET */
diff --git a/Master/tlpkg/tlperl/lib/CORE/thread.h b/Master/tlpkg/tlperl/lib/CORE/thread.h
new file mode 100644
index 00000000000..3b84f369f74
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/thread.h
@@ -0,0 +1,448 @@
+/* thread.h
+ *
+ * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ * by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#if defined(USE_ITHREADS)
+
+#if defined(VMS)
+#include <builtins.h>
+#endif
+
+#ifdef WIN32
+# include <win32thread.h>
+#else
+#ifdef NETWARE
+# include <nw5thread.h>
+#else
+# ifdef OLD_PTHREADS_API /* Here be dragons. */
+# define DETACH(t) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_detach(&(t)->self))) { \
+ MUTEX_UNLOCK(&(t)->mutex); \
+ Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } \
+ } STMT_END
+
+# define PERL_GET_CONTEXT Perl_get_context()
+# define PERL_SET_CONTEXT(t) Perl_set_context((void*)t)
+
+# define PTHREAD_GETSPECIFIC_INT
+# ifdef DJGPP
+# define pthread_addr_t any_t
+# define NEED_PTHREAD_INIT
+# define PTHREAD_CREATE_JOINABLE (1)
+# endif
+# ifdef __OPEN_VM
+# define pthread_addr_t void *
+# endif
+# ifdef OEMVS
+# define pthread_addr_t void *
+# define pthread_create(t,a,s,d) pthread_create(t,&(a),s,d)
+# define pthread_keycreate pthread_key_create
+# endif
+# ifdef VMS
+# define pthread_attr_init(a) pthread_attr_create(a)
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_setdetach_np(a,s)
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
+# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
+# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
+# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
+# endif
+# if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020
+# define pthread_attr_init(a) pthread_attr_create(a)
+ /* XXX pthread_setdetach_np() missing in DCE threads on HP-UX 10.20 */
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) (0)
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,a,s,d)
+# define pthread_key_create(k,d) pthread_keycreate(k,(pthread_destructor_t)(d))
+# define pthread_mutexattr_init(a) pthread_mutexattr_create(a)
+# define pthread_mutexattr_settype(a,t) pthread_mutexattr_setkind_np(a,t)
+# endif
+# if defined(DJGPP) || defined(__OPEN_VM) || defined(OEMVS)
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,&(s))
+# define YIELD pthread_yield(NULL)
+# endif
+# endif
+# if !defined(__hpux) || !defined(__ux_version) || __ux_version > 1020
+# define pthread_mutexattr_default NULL
+# define pthread_condattr_default NULL
+# endif
+#endif /* NETWARE */
+#endif
+
+#ifndef PTHREAD_CREATE
+/* You are not supposed to pass NULL as the 2nd arg of PTHREAD_CREATE(). */
+# define PTHREAD_CREATE(t,a,s,d) pthread_create(t,&(a),s,d)
+#endif
+
+#ifndef PTHREAD_ATTR_SETDETACHSTATE
+# define PTHREAD_ATTR_SETDETACHSTATE(a,s) pthread_attr_setdetachstate(a,s)
+#endif
+
+#ifndef PTHREAD_CREATE_JOINABLE
+# ifdef OLD_PTHREAD_CREATE_JOINABLE
+# define PTHREAD_CREATE_JOINABLE OLD_PTHREAD_CREATE_JOINABLE
+# else
+# define PTHREAD_CREATE_JOINABLE 0 /* Panic? No, guess. */
+# endif
+#endif
+
+#ifdef DGUX
+# define THREAD_CREATE_NEEDS_STACK (32*1024)
+#endif
+
+#ifdef __VMS
+ /* Default is 1024 on VAX, 8192 otherwise */
+# ifdef __ia64
+# define THREAD_CREATE_NEEDS_STACK (48*1024)
+# else
+# define THREAD_CREATE_NEEDS_STACK (32*1024)
+# endif
+#endif
+
+#ifdef I_MACH_CTHREADS
+
+/* cthreads interface */
+
+/* #include <mach/cthreads.h> is in perl.h #ifdef I_MACH_CTHREADS */
+
+#define MUTEX_INIT(m) \
+ STMT_START { \
+ *m = mutex_alloc(); \
+ if (*m) { \
+ mutex_init(*m); \
+ } else { \
+ Perl_croak_nocontext("panic: MUTEX_INIT [%s:%d]", \
+ __FILE__, __LINE__); \
+ } \
+ } STMT_END
+
+#define MUTEX_LOCK(m) mutex_lock(*m)
+#define MUTEX_UNLOCK(m) mutex_unlock(*m)
+#define MUTEX_DESTROY(m) \
+ STMT_START { \
+ mutex_free(*m); \
+ *m = 0; \
+ } STMT_END
+
+#define COND_INIT(c) \
+ STMT_START { \
+ *c = condition_alloc(); \
+ if (*c) { \
+ condition_init(*c); \
+ } \
+ else { \
+ Perl_croak_nocontext("panic: COND_INIT [%s:%d]", \
+ __FILE__, __LINE__); \
+ } \
+ } STMT_END
+
+#define COND_SIGNAL(c) condition_signal(*c)
+#define COND_BROADCAST(c) condition_broadcast(*c)
+#define COND_WAIT(c, m) condition_wait(*c, *m)
+#define COND_DESTROY(c) \
+ STMT_START { \
+ condition_free(*c); \
+ *c = 0; \
+ } STMT_END
+
+#define THREAD_CREATE(thr, f) (thr->self = cthread_fork(f, thr), 0)
+#define THREAD_POST_CREATE(thr)
+
+#define THREAD_RET_TYPE any_t
+#define THREAD_RET_CAST(x) ((any_t) x)
+
+#define DETACH(t) cthread_detach(t->self)
+#define JOIN(t, avp) (*(avp) = MUTABLE_AV(cthread_join(t->self)))
+
+#define PERL_SET_CONTEXT(t) cthread_set_data(cthread_self(), t)
+#define PERL_GET_CONTEXT cthread_data(cthread_self())
+
+#define INIT_THREADS cthread_init()
+#define YIELD cthread_yield()
+#define ALLOC_THREAD_KEY NOOP
+#define FREE_THREAD_KEY NOOP
+#define SET_THREAD_SELF(thr) (thr->self = cthread_self())
+
+#endif /* I_MACH_CTHREADS */
+
+#ifndef YIELD
+# ifdef SCHED_YIELD
+# define YIELD SCHED_YIELD
+# else
+# ifdef HAS_SCHED_YIELD
+# define YIELD sched_yield()
+# else
+# ifdef HAS_PTHREAD_YIELD
+ /* pthread_yield(NULL) platforms are expected
+ * to have #defined YIELD for themselves. */
+# define YIELD pthread_yield()
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __hpux
+# define MUTEX_INIT_NEEDS_MUTEX_ZEROED
+#endif
+
+#ifndef MUTEX_INIT
+
+# ifdef MUTEX_INIT_NEEDS_MUTEX_ZEROED
+ /* Temporary workaround, true bug is deeper. --jhi 1999-02-25 */
+# define MUTEX_INIT(m) \
+ STMT_START { \
+ int _eC_; \
+ Zero((m), 1, perl_mutex); \
+ if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \
+ Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+# else
+# define MUTEX_INIT(m) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_mutex_init((m), pthread_mutexattr_default))) \
+ Perl_croak_nocontext("panic: MUTEX_INIT (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+# endif
+
+# define MUTEX_LOCK(m) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_mutex_lock((m)))) \
+ Perl_croak_nocontext("panic: MUTEX_LOCK (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+
+# define MUTEX_UNLOCK(m) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_mutex_unlock((m)))) \
+ Perl_croak_nocontext("panic: MUTEX_UNLOCK (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+
+# define MUTEX_DESTROY(m) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_mutex_destroy((m)))) \
+ Perl_croak_nocontext("panic: MUTEX_DESTROY (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+#endif /* MUTEX_INIT */
+
+#ifndef COND_INIT
+# define COND_INIT(c) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_cond_init((c), pthread_condattr_default))) \
+ Perl_croak_nocontext("panic: COND_INIT (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+
+# define COND_SIGNAL(c) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_cond_signal((c)))) \
+ Perl_croak_nocontext("panic: COND_SIGNAL (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+
+# define COND_BROADCAST(c) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_cond_broadcast((c)))) \
+ Perl_croak_nocontext("panic: COND_BROADCAST (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+
+# define COND_WAIT(c, m) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_cond_wait((c), (m)))) \
+ Perl_croak_nocontext("panic: COND_WAIT (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+
+# define COND_DESTROY(c) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_cond_destroy((c)))) \
+ Perl_croak_nocontext("panic: COND_DESTROY (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+#endif /* COND_INIT */
+
+/* DETACH(t) must only be called while holding t->mutex */
+#ifndef DETACH
+# define DETACH(t) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_detach((t)->self))) { \
+ MUTEX_UNLOCK(&(t)->mutex); \
+ Perl_croak_nocontext("panic: DETACH (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } \
+ } STMT_END
+#endif /* DETACH */
+
+#ifndef JOIN
+# define JOIN(t, avp) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_join((t)->self, (void**)(avp)))) \
+ Perl_croak_nocontext("panic: pthread_join (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+#endif /* JOIN */
+
+/* Use an unchecked fetch of thread-specific data instead of a checked one.
+ * It would fail if the key were bogus, but if the key were bogus then
+ * Really Bad Things would be happening anyway. --dan */
+#if (defined(__ALPHA) && (__VMS_VER >= 70000000)) || \
+ (defined(__alpha) && defined(__osf__) && !defined(__GNUC__)) /* Available only on >= 4.0 */
+# define HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP /* Configure test needed */
+#endif
+
+#ifdef HAS_PTHREAD_UNCHECKED_GETSPECIFIC_NP
+# define PTHREAD_GETSPECIFIC(key) pthread_unchecked_getspecific_np(key)
+#else
+# define PTHREAD_GETSPECIFIC(key) pthread_getspecific(key)
+#endif
+
+#ifndef PERL_GET_CONTEXT
+# define PERL_GET_CONTEXT PTHREAD_GETSPECIFIC(PL_thr_key)
+#endif
+
+#ifndef PERL_SET_CONTEXT
+# define PERL_SET_CONTEXT(t) \
+ STMT_START { \
+ int _eC_; \
+ if ((_eC_ = pthread_setspecific(PL_thr_key, (void *)(t)))) \
+ Perl_croak_nocontext("panic: pthread_setspecific (%d) [%s:%d]", \
+ _eC_, __FILE__, __LINE__); \
+ } STMT_END
+#endif /* PERL_SET_CONTEXT */
+
+#ifndef INIT_THREADS
+# ifdef NEED_PTHREAD_INIT
+# define INIT_THREADS pthread_init()
+# endif
+#endif
+
+#ifndef ALLOC_THREAD_KEY
+# define ALLOC_THREAD_KEY \
+ STMT_START { \
+ if (pthread_key_create(&PL_thr_key, 0)) { \
+ write(2, STR_WITH_LEN("panic: pthread_key_create failed\n")); \
+ exit(1); \
+ } \
+ } STMT_END
+#endif
+
+#ifndef FREE_THREAD_KEY
+# define FREE_THREAD_KEY \
+ STMT_START { \
+ pthread_key_delete(PL_thr_key); \
+ } STMT_END
+#endif
+
+#ifndef PTHREAD_ATFORK
+# ifdef HAS_PTHREAD_ATFORK
+# define PTHREAD_ATFORK(prepare,parent,child) \
+ pthread_atfork(prepare,parent,child)
+# else
+# define PTHREAD_ATFORK(prepare,parent,child) \
+ NOOP
+# endif
+#endif
+
+#ifndef THREAD_RET_TYPE
+# define THREAD_RET_TYPE void *
+# define THREAD_RET_CAST(p) ((void *)(p))
+#endif /* THREAD_RET */
+
+# define LOCK_DOLLARZERO_MUTEX MUTEX_LOCK(&PL_dollarzero_mutex)
+# define UNLOCK_DOLLARZERO_MUTEX MUTEX_UNLOCK(&PL_dollarzero_mutex)
+
+#endif /* USE_ITHREADS */
+
+#ifndef MUTEX_LOCK
+# define MUTEX_LOCK(m)
+#endif
+
+#ifndef MUTEX_UNLOCK
+# define MUTEX_UNLOCK(m)
+#endif
+
+#ifndef MUTEX_INIT
+# define MUTEX_INIT(m)
+#endif
+
+#ifndef MUTEX_DESTROY
+# define MUTEX_DESTROY(m)
+#endif
+
+#ifndef COND_INIT
+# define COND_INIT(c)
+#endif
+
+#ifndef COND_SIGNAL
+# define COND_SIGNAL(c)
+#endif
+
+#ifndef COND_BROADCAST
+# define COND_BROADCAST(c)
+#endif
+
+#ifndef COND_WAIT
+# define COND_WAIT(c, m)
+#endif
+
+#ifndef COND_DESTROY
+# define COND_DESTROY(c)
+#endif
+
+#ifndef LOCK_DOLLARZERO_MUTEX
+# define LOCK_DOLLARZERO_MUTEX
+#endif
+
+#ifndef UNLOCK_DOLLARZERO_MUTEX
+# define UNLOCK_DOLLARZERO_MUTEX
+#endif
+
+/* THR, SET_THR, and dTHR are there for compatibility with old versions */
+#ifndef THR
+# define THR PERL_GET_THX
+#endif
+
+#ifndef SET_THR
+# define SET_THR(t) PERL_SET_THX(t)
+#endif
+
+#ifndef dTHR
+# define dTHR dNOOP
+#endif
+
+#ifndef INIT_THREADS
+# define INIT_THREADS NOOP
+#endif
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/time64.h b/Master/tlpkg/tlperl/lib/CORE/time64.h
new file mode 100644
index 00000000000..07bb33fd849
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/time64.h
@@ -0,0 +1,66 @@
+#include <time.h>
+#include "time64_config.h"
+
+#ifndef TIME64_H
+# define TIME64_H
+
+
+/* Set our custom types */
+typedef INT_64_T Int64;
+typedef Int64 Time64_T;
+typedef I32 Year;
+
+
+/* A copy of the tm struct but with a 64 bit year */
+struct TM64 {
+ int tm_sec;
+ int tm_min;
+ int tm_hour;
+ int tm_mday;
+ int tm_mon;
+ Year tm_year;
+ int tm_wday;
+ int tm_yday;
+ int tm_isdst;
+
+#ifdef HAS_TM_TM_GMTOFF
+ long tm_gmtoff;
+#endif
+
+#ifdef HAS_TM_TM_ZONE
+# ifdef __GLIBC__
+ const char *tm_zone;
+# else
+ char *tm_zone;
+# endif
+#endif
+};
+
+
+/* Decide which tm struct to use */
+#ifdef USE_TM64
+#define TM TM64
+#else
+#define TM tm
+#endif
+
+
+/* Declare functions */
+static struct TM *S_gmtime64_r (const Time64_T *, struct TM *);
+static struct TM *S_localtime64_r (const Time64_T *, struct TM *);
+static Time64_T S_timegm64 (struct TM *);
+
+
+/* Not everyone has gm/localtime_r(), provide a replacement */
+#ifdef HAS_LOCALTIME_R
+# define LOCALTIME_R(clock, result) (L_R_TZSET localtime_r(clock, result))
+#else
+# define LOCALTIME_R(clock, result) (L_R_TZSET S_localtime_r(clock, result))
+#endif
+#ifdef HAS_GMTIME_R
+# define GMTIME_R(clock, result) gmtime_r(clock, result)
+#else
+# define GMTIME_R(clock, result) S_gmtime_r(clock, result)
+#endif
+
+#endif
diff --git a/Master/tlpkg/tlperl/lib/CORE/time64_config.h b/Master/tlpkg/tlperl/lib/CORE/time64_config.h
new file mode 100644
index 00000000000..42cc12c88e4
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/time64_config.h
@@ -0,0 +1,85 @@
+#ifndef TIME64_CONFIG_H
+# define TIME64_CONFIG_H
+
+/* Configuration
+ -------------
+ Define as appropriate for your system.
+ Sensible defaults provided.
+*/
+
+/* Debugging
+ TIME_64_DEBUG
+ Define if you want debugging messages
+*/
+/* #define TIME_64_DEBUG */
+
+
+/* INT_64_T
+ A numeric type to store time and others.
+ Must be defined.
+*/
+#define INT_64_T NV
+
+
+/* USE_TM64
+ Should we use a 64 bit safe replacement for tm? This will
+ let you go past year 2 billion but the struct will be incompatible
+ with tm. Conversion functions will be provided.
+*/
+#define USE_TM64
+
+
+/* Availability of system functions.
+
+ HAS_GMTIME_R
+ Define if your system has gmtime_r()
+
+ HAS_LOCALTIME_R
+ Define if your system has localtime_r()
+
+ HAS_TIMEGM
+ Define if your system has timegm(), a GNU extension.
+*/
+/* Set in config.h */
+
+
+/* Details of non-standard tm struct elements.
+
+ HAS_TM_TM_GMTOFF
+ True if your tm struct has a "tm_gmtoff" element.
+ A BSD extension.
+
+ HAS_TM_TM_ZONE
+ True if your tm struct has a "tm_zone" element.
+ A BSD extension.
+*/
+/* Set in config.h */
+
+
+/* USE_SYSTEM_LOCALTIME
+ USE_SYSTEM_GMTIME
+ Should we use the system functions if the time is inside their range?
+ Your system localtime() is probably more accurate, but our gmtime() is
+ fast and safe. Except on VMS, where we need the homegrown gmtime()
+ override to shift between UTC and local for the vmsish 'time' pragma.
+*/
+#define USE_SYSTEM_LOCALTIME
+#ifdef VMS
+# define USE_SYSTEM_GMTIME
+#endif
+
+
+/* SYSTEM_LOCALTIME_MAX
+ SYSTEM_LOCALTIME_MIN
+ SYSTEM_GMTIME_MAX
+ SYSTEM_GMTIME_MIN
+ Maximum and minimum values your system's gmtime() and localtime()
+ can handle. We will use your system functions if the time falls
+ inside these ranges.
+*/
+#define SYSTEM_LOCALTIME_MAX CAT2(LOCALTIME_MAX,.0)
+#define SYSTEM_LOCALTIME_MIN CAT2(LOCALTIME_MIN,.0)
+#define SYSTEM_GMTIME_MAX CAT2(GMTIME_MAX,.0)
+#define SYSTEM_GMTIME_MIN CAT2(GMTIME_MIN,.0)
+
+#endif /* TIME64_CONFIG_H */
diff --git a/Master/tlpkg/tlperl/lib/CORE/uconfig.h b/Master/tlpkg/tlperl/lib/CORE/uconfig.h
new file mode 100644
index 00000000000..511a00b8cb1
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/uconfig.h
@@ -0,0 +1,4595 @@
+/*
+ * This file was produced by running the config_h.SH script, which
+ * gets its values from uconfig.sh, which is generally produced by
+ * running Configure.
+ *
+ * Feel free to modify any of this as the need arises. Note, however,
+ * that running config_h.SH again will wipe out any changes you've made.
+ * For a more permanent change edit uconfig.sh and rerun config_h.SH.
+ *
+ * $Id: Config_h.U 1 2006-08-24 12:32:52Z rmanfredi $
+ */
+
+/*
+ * Package name : perl5
+ * Source directory : .
+ * Configuration time: Thu Jan 1 00:00:00 GMT 1970
+ * Configured by : root@localhost
+ * Target system : unknown
+ */
+
+#ifndef _config_h_
+#define _config_h_
+
+/* LOC_SED:
+ * This symbol holds the complete pathname to the sed program.
+ */
+#define LOC_SED "" /**/
+
+/* HAS_ALARM:
+ * This symbol, if defined, indicates that the alarm routine is
+ * available.
+ */
+/*#define HAS_ALARM / **/
+
+/* HAS_BCMP:
+ * This symbol is defined if the bcmp() routine is available to
+ * compare blocks of memory.
+ */
+/*#define HAS_BCMP / **/
+
+/* HAS_BCOPY:
+ * This symbol is defined if the bcopy() routine is available to
+ * copy blocks of memory.
+ */
+/*#define HAS_BCOPY / **/
+
+/* HAS_BZERO:
+ * This symbol is defined if the bzero() routine is available to
+ * set a memory block to 0.
+ */
+/*#define HAS_BZERO / **/
+
+/* HAS_CHOWN:
+ * This symbol, if defined, indicates that the chown routine is
+ * available.
+ */
+/*#define HAS_CHOWN / **/
+
+/* HAS_CHROOT:
+ * This symbol, if defined, indicates that the chroot routine is
+ * available.
+ */
+/*#define HAS_CHROOT / **/
+
+/* HAS_CHSIZE:
+ * This symbol, if defined, indicates that the chsize routine is available
+ * to truncate files. You might need a -lx to get this routine.
+ */
+/*#define HAS_CHSIZE / **/
+
+/* HAS_CRYPT:
+ * This symbol, if defined, indicates that the crypt routine is available
+ * to encrypt passwords and the like.
+ */
+/*#define HAS_CRYPT / **/
+
+/* HAS_CTERMID:
+ * This symbol, if defined, indicates that the ctermid routine is
+ * available to generate filename for terminal.
+ */
+/*#define HAS_CTERMID / **/
+
+/* HAS_CUSERID:
+ * This symbol, if defined, indicates that the cuserid routine is
+ * available to get character login names.
+ */
+/*#define HAS_CUSERID / **/
+
+/* HAS_DBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol DBL_DIG, which is the number
+ * of significant digits in a double precision number. If this
+ * symbol is not defined, a guess of 15 is usually pretty good.
+ */
+/*#define HAS_DBL_DIG / * */
+
+/* HAS_DIFFTIME:
+ * This symbol, if defined, indicates that the difftime routine is
+ * available.
+ */
+/*#define HAS_DIFFTIME / **/
+
+/* HAS_DLERROR:
+ * This symbol, if defined, indicates that the dlerror routine is
+ * available to return a string describing the last error that
+ * occurred from a call to dlopen(), dlclose() or dlsym().
+ */
+/*#define HAS_DLERROR / **/
+
+/* SETUID_SCRIPTS_ARE_SECURE_NOW:
+ * This symbol, if defined, indicates that the bug that prevents
+ * setuid scripts from being secure is not present in this kernel.
+ */
+/* DOSUID:
+ * This symbol, if defined, indicates that the C program should
+ * check the script that it is executing for setuid/setgid bits, and
+ * attempt to emulate setuid/setgid on systems that have disabled
+ * setuid #! scripts because the kernel can't do it securely.
+ * It is up to the package designer to make sure that this emulation
+ * is done securely. Among other things, it should do an fstat on
+ * the script it just opened to make sure it really is a setuid/setgid
+ * script, it should make sure the arguments passed correspond exactly
+ * to the argument on the #! line, and it should not trust any
+ * subprocesses to which it must pass the filename rather than the
+ * file descriptor of the script to be executed.
+ */
+/*#define SETUID_SCRIPTS_ARE_SECURE_NOW / **/
+/*#define DOSUID / **/
+
+/* HAS_DUP2:
+ * This symbol, if defined, indicates that the dup2 routine is
+ * available to duplicate file descriptors.
+ */
+/*#define HAS_DUP2 / **/
+
+/* HAS_FCHMOD:
+ * This symbol, if defined, indicates that the fchmod routine is available
+ * to change mode of opened files. If unavailable, use chmod().
+ */
+/*#define HAS_FCHMOD / **/
+
+/* HAS_FCHOWN:
+ * This symbol, if defined, indicates that the fchown routine is available
+ * to change ownership of opened files. If unavailable, use chown().
+ */
+/*#define HAS_FCHOWN / **/
+
+/* HAS_FCNTL:
+ * This symbol, if defined, indicates to the C program that
+ * the fcntl() function exists.
+ */
+/*#define HAS_FCNTL / **/
+
+/* HAS_FGETPOS:
+ * This symbol, if defined, indicates that the fgetpos routine is
+ * available to get the file position indicator, similar to ftell().
+ */
+/*#define HAS_FGETPOS / **/
+
+/* HAS_FLOCK:
+ * This symbol, if defined, indicates that the flock routine is
+ * available to do file locking.
+ */
+/*#define HAS_FLOCK / **/
+
+/* HAS_FORK:
+ * This symbol, if defined, indicates that the fork routine is
+ * available.
+ */
+#define HAS_FORK /**/
+
+/* HAS_FSETPOS:
+ * This symbol, if defined, indicates that the fsetpos routine is
+ * available to set the file position indicator, similar to fseek().
+ */
+/*#define HAS_FSETPOS / **/
+
+/* HAS_GETTIMEOFDAY:
+ * This symbol, if defined, indicates that the gettimeofday() system
+ * call is available for a sub-second accuracy clock. Usually, the file
+ * <sys/resource.h> needs to be included (see I_SYS_RESOURCE).
+ * The type "Timeval" should be used to refer to "struct timeval".
+ */
+/*#define HAS_GETTIMEOFDAY / **/
+#ifdef HAS_GETTIMEOFDAY
+#define Timeval struct timeval /* Structure used by gettimeofday() */
+#endif
+
+/* HAS_GETGROUPS:
+ * This symbol, if defined, indicates that the getgroups() routine is
+ * available to get the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define HAS_GETGROUPS / **/
+
+/* HAS_GETLOGIN:
+ * This symbol, if defined, indicates that the getlogin routine is
+ * available to get the login name.
+ */
+/*#define HAS_GETLOGIN / **/
+
+/* HAS_GETPGID:
+ * This symbol, if defined, indicates to the C program that
+ * the getpgid(pid) function is available to get the
+ * process group id.
+ */
+/*#define HAS_GETPGID / **/
+
+/* HAS_GETPGRP2:
+ * This symbol, if defined, indicates that the getpgrp2() (as in DG/UX)
+ * routine is available to get the current process group.
+ */
+/*#define HAS_GETPGRP2 / **/
+
+/* HAS_GETPPID:
+ * This symbol, if defined, indicates that the getppid routine is
+ * available to get the parent process ID.
+ */
+/*#define HAS_GETPPID / **/
+
+/* HAS_GETPRIORITY:
+ * This symbol, if defined, indicates that the getpriority routine is
+ * available to get a process's priority.
+ */
+/*#define HAS_GETPRIORITY / **/
+
+/* HAS_INET_ATON:
+ * This symbol, if defined, indicates to the C program that the
+ * inet_aton() function is available to parse IP address "dotted-quad"
+ * strings.
+ */
+/*#define HAS_INET_ATON / **/
+
+/* HAS_KILLPG:
+ * This symbol, if defined, indicates that the killpg routine is available
+ * to kill process groups. If unavailable, you probably should use kill
+ * with a negative process number.
+ */
+/*#define HAS_KILLPG / **/
+
+/* HAS_LINK:
+ * This symbol, if defined, indicates that the link routine is
+ * available to create hard links.
+ */
+/*#define HAS_LINK / **/
+
+/* HAS_LOCALECONV:
+ * This symbol, if defined, indicates that the localeconv routine is
+ * available for numeric and monetary formatting conventions.
+ */
+/*#define HAS_LOCALECONV / **/
+
+/* HAS_LOCKF:
+ * This symbol, if defined, indicates that the lockf routine is
+ * available to do file locking.
+ */
+/*#define HAS_LOCKF / **/
+
+/* HAS_LSTAT:
+ * This symbol, if defined, indicates that the lstat routine is
+ * available to do file stats on symbolic links.
+ */
+/*#define HAS_LSTAT / **/
+
+/* HAS_MBLEN:
+ * This symbol, if defined, indicates that the mblen routine is available
+ * to find the number of bytes in a multibye character.
+ */
+/*#define HAS_MBLEN / **/
+
+/* HAS_MBSTOWCS:
+ * This symbol, if defined, indicates that the mbstowcs routine is
+ * available to covert a multibyte string into a wide character string.
+ */
+/*#define HAS_MBSTOWCS / **/
+
+/* HAS_MBTOWC:
+ * This symbol, if defined, indicates that the mbtowc routine is available
+ * to covert a multibyte to a wide character.
+ */
+/*#define HAS_MBTOWC / **/
+
+/* HAS_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * to compare blocks of memory.
+ */
+#define HAS_MEMCMP /**/
+
+/* HAS_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy blocks of memory.
+ */
+#define HAS_MEMCPY /**/
+
+/* HAS_MEMMOVE:
+ * This symbol, if defined, indicates that the memmove routine is available
+ * to copy potentially overlapping blocks of memory. This should be used
+ * only when HAS_SAFE_BCOPY is not defined. If neither is there, roll your
+ * own version.
+ */
+/*#define HAS_MEMMOVE / **/
+
+/* HAS_MEMSET:
+ * This symbol, if defined, indicates that the memset routine is available
+ * to set blocks of memory.
+ */
+/*#define HAS_MEMSET / **/
+
+/* HAS_MKDIR:
+ * This symbol, if defined, indicates that the mkdir routine is available
+ * to create directories. Otherwise you should fork off a new process to
+ * exec /bin/mkdir.
+ */
+/*#define HAS_MKDIR / **/
+
+/* HAS_MKFIFO:
+ * This symbol, if defined, indicates that the mkfifo routine is
+ * available to create FIFOs. Otherwise, mknod should be able to
+ * do it for you. However, if mkfifo is there, mknod might require
+ * super-user privileges which mkfifo will not.
+ */
+/*#define HAS_MKFIFO / **/
+
+/* HAS_MKTIME:
+ * This symbol, if defined, indicates that the mktime routine is
+ * available.
+ */
+/*#define HAS_MKTIME / **/
+
+/* HAS_MSYNC:
+ * This symbol, if defined, indicates that the msync system call is
+ * available to synchronize a mapped file.
+ */
+/*#define HAS_MSYNC / **/
+
+/* HAS_MUNMAP:
+ * This symbol, if defined, indicates that the munmap system call is
+ * available to unmap a region, usually mapped by mmap().
+ */
+/*#define HAS_MUNMAP / **/
+
+/* HAS_NICE:
+ * This symbol, if defined, indicates that the nice routine is
+ * available.
+ */
+/*#define HAS_NICE / **/
+
+/* HAS_PATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given filename.
+ */
+/* HAS_FPATHCONF:
+ * This symbol, if defined, indicates that pathconf() is available
+ * to determine file-system related limits and options associated
+ * with a given open file descriptor.
+ */
+/*#define HAS_PATHCONF / **/
+/*#define HAS_FPATHCONF / **/
+
+/* HAS_PAUSE:
+ * This symbol, if defined, indicates that the pause routine is
+ * available to suspend a process until a signal is received.
+ */
+/*#define HAS_PAUSE / **/
+
+/* HAS_PIPE:
+ * This symbol, if defined, indicates that the pipe routine is
+ * available to create an inter-process channel.
+ */
+/*#define HAS_PIPE / **/
+
+/* HAS_POLL:
+ * This symbol, if defined, indicates that the poll routine is
+ * available to poll active file descriptors. Please check I_POLL and
+ * I_SYS_POLL to know which header should be included as well.
+ */
+/*#define HAS_POLL / **/
+
+/* HAS_READDIR:
+ * This symbol, if defined, indicates that the readdir routine is
+ * available to read directory entries. You may have to include
+ * <dirent.h>. See I_DIRENT.
+ */
+#define HAS_READDIR /**/
+
+/* HAS_SEEKDIR:
+ * This symbol, if defined, indicates that the seekdir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_SEEKDIR / **/
+
+/* HAS_TELLDIR:
+ * This symbol, if defined, indicates that the telldir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_TELLDIR / **/
+
+/* HAS_REWINDDIR:
+ * This symbol, if defined, indicates that the rewinddir routine is
+ * available. You may have to include <dirent.h>. See I_DIRENT.
+ */
+/*#define HAS_REWINDDIR / **/
+
+/* HAS_READLINK:
+ * This symbol, if defined, indicates that the readlink routine is
+ * available to read the value of a symbolic link.
+ */
+/*#define HAS_READLINK / **/
+
+/* HAS_RENAME:
+ * This symbol, if defined, indicates that the rename routine is available
+ * to rename files. Otherwise you should do the unlink(), link(), unlink()
+ * trick.
+ */
+#define HAS_RENAME /**/
+
+/* HAS_RMDIR:
+ * This symbol, if defined, indicates that the rmdir routine is
+ * available to remove directories. Otherwise you should fork off a
+ * new process to exec /bin/rmdir.
+ */
+/*#define HAS_RMDIR / **/
+
+/* HAS_SELECT:
+ * This symbol, if defined, indicates that the select routine is
+ * available to select active file descriptors. If the timeout field
+ * is used, <sys/time.h> may need to be included.
+ */
+/*#define HAS_SELECT / **/
+
+/* HAS_SETEGID:
+ * This symbol, if defined, indicates that the setegid routine is available
+ * to change the effective gid of the current program.
+ */
+/*#define HAS_SETEGID / **/
+
+/* HAS_SETEUID:
+ * This symbol, if defined, indicates that the seteuid routine is available
+ * to change the effective uid of the current program.
+ */
+/*#define HAS_SETEUID / **/
+
+/* HAS_SETGROUPS:
+ * This symbol, if defined, indicates that the setgroups() routine is
+ * available to set the list of process groups. If unavailable, multiple
+ * groups are probably not supported.
+ */
+/*#define HAS_SETGROUPS / **/
+
+/* HAS_SETLINEBUF:
+ * This symbol, if defined, indicates that the setlinebuf routine is
+ * available to change stderr or stdout from block-buffered or unbuffered
+ * to a line-buffered mode.
+ */
+/*#define HAS_SETLINEBUF / **/
+
+/* HAS_SETLOCALE:
+ * This symbol, if defined, indicates that the setlocale routine is
+ * available to handle locale-specific ctype implementations.
+ */
+/*#define HAS_SETLOCALE / **/
+
+/* HAS_SETPGID:
+ * This symbol, if defined, indicates that the setpgid(pid, gpid)
+ * routine is available to set process group ID.
+ */
+/*#define HAS_SETPGID / **/
+
+/* HAS_SETPGRP2:
+ * This symbol, if defined, indicates that the setpgrp2() (as in DG/UX)
+ * routine is available to set the current process group.
+ */
+/*#define HAS_SETPGRP2 / **/
+
+/* HAS_SETPRIORITY:
+ * This symbol, if defined, indicates that the setpriority routine is
+ * available to set a process's priority.
+ */
+/*#define HAS_SETPRIORITY / **/
+
+/* HAS_SETREGID:
+ * This symbol, if defined, indicates that the setregid routine is
+ * available to change the real and effective gid of the current
+ * process.
+ */
+/* HAS_SETRESGID:
+ * This symbol, if defined, indicates that the setresgid routine is
+ * available to change the real, effective and saved gid of the current
+ * process.
+ */
+/*#define HAS_SETREGID / **/
+/*#define HAS_SETRESGID / **/
+
+/* HAS_SETREUID:
+ * This symbol, if defined, indicates that the setreuid routine is
+ * available to change the real and effective uid of the current
+ * process.
+ */
+/* HAS_SETRESUID:
+ * This symbol, if defined, indicates that the setresuid routine is
+ * available to change the real, effective and saved uid of the current
+ * process.
+ */
+/*#define HAS_SETREUID / **/
+/*#define HAS_SETRESUID / **/
+
+/* HAS_SETRGID:
+ * This symbol, if defined, indicates that the setrgid routine is available
+ * to change the real gid of the current program.
+ */
+/*#define HAS_SETRGID / **/
+
+/* HAS_SETRUID:
+ * This symbol, if defined, indicates that the setruid routine is available
+ * to change the real uid of the current program.
+ */
+/*#define HAS_SETRUID / **/
+
+/* HAS_SETSID:
+ * This symbol, if defined, indicates that the setsid routine is
+ * available to set the process group ID.
+ */
+/*#define HAS_SETSID / **/
+
+/* HAS_STRCHR:
+ * This symbol is defined to indicate that the strchr()/strrchr()
+ * functions are available for string searching. If not, try the
+ * index()/rindex() pair.
+ */
+/* HAS_INDEX:
+ * This symbol is defined to indicate that the index()/rindex()
+ * functions are available for string searching.
+ */
+/*#define HAS_STRCHR / **/
+/*#define HAS_INDEX / **/
+
+/* HAS_STRCOLL:
+ * This symbol, if defined, indicates that the strcoll routine is
+ * available to compare strings using collating information.
+ */
+/*#define HAS_STRCOLL / **/
+
+/* HAS_STRTOD:
+ * This symbol, if defined, indicates that the strtod routine is
+ * available to provide better numeric string conversion than atof().
+ */
+/*#define HAS_STRTOD / **/
+
+/* HAS_STRTOL:
+ * This symbol, if defined, indicates that the strtol routine is available
+ * to provide better numeric string conversion than atoi() and friends.
+ */
+/*#define HAS_STRTOL / **/
+
+/* HAS_STRXFRM:
+ * This symbol, if defined, indicates that the strxfrm() routine is
+ * available to transform strings.
+ */
+/*#define HAS_STRXFRM / **/
+
+/* HAS_SYMLINK:
+ * This symbol, if defined, indicates that the symlink routine is available
+ * to create symbolic links.
+ */
+/*#define HAS_SYMLINK / **/
+
+/* HAS_SYSCALL:
+ * This symbol, if defined, indicates that the syscall routine is
+ * available to call arbitrary system calls. If undefined, that's tough.
+ */
+/*#define HAS_SYSCALL / **/
+
+/* HAS_SYSCONF:
+ * This symbol, if defined, indicates that sysconf() is available
+ * to determine system related limits and options.
+ */
+/*#define HAS_SYSCONF / **/
+
+/* HAS_SYSTEM:
+ * This symbol, if defined, indicates that the system routine is
+ * available to issue a shell command.
+ */
+/*#define HAS_SYSTEM / **/
+
+/* HAS_TCGETPGRP:
+ * This symbol, if defined, indicates that the tcgetpgrp routine is
+ * available to get foreground process group ID.
+ */
+/*#define HAS_TCGETPGRP / **/
+
+/* HAS_TCSETPGRP:
+ * This symbol, if defined, indicates that the tcsetpgrp routine is
+ * available to set foreground process group ID.
+ */
+/*#define HAS_TCSETPGRP / **/
+
+/* HAS_TRUNCATE:
+ * This symbol, if defined, indicates that the truncate routine is
+ * available to truncate files.
+ */
+/*#define HAS_TRUNCATE / **/
+
+/* HAS_TZNAME:
+ * This symbol, if defined, indicates that the tzname[] array is
+ * available to access timezone names.
+ */
+/*#define HAS_TZNAME / **/
+
+/* HAS_UMASK:
+ * This symbol, if defined, indicates that the umask routine is
+ * available to set and get the value of the file creation mask.
+ */
+/*#define HAS_UMASK / **/
+
+/* HAS_USLEEP:
+ * This symbol, if defined, indicates that the usleep routine is
+ * available to let the process sleep on a sub-second accuracy.
+ */
+/*#define HAS_USLEEP / **/
+
+/* HAS_WAIT4:
+ * This symbol, if defined, indicates that wait4() exists.
+ */
+/*#define HAS_WAIT4 / **/
+
+/* HAS_WAITPID:
+ * This symbol, if defined, indicates that the waitpid routine is
+ * available to wait for child process.
+ */
+/*#define HAS_WAITPID / **/
+
+/* HAS_WCSTOMBS:
+ * This symbol, if defined, indicates that the wcstombs routine is
+ * available to convert wide character strings to multibyte strings.
+ */
+/*#define HAS_WCSTOMBS / **/
+
+/* HAS_WCTOMB:
+ * This symbol, if defined, indicates that the wctomb routine is available
+ * to covert a wide character to a multibyte.
+ */
+/*#define HAS_WCTOMB / **/
+
+/* Groups_t:
+ * This symbol holds the type used for the second argument to
+ * getgroups() and setgroups(). Usually, this is the same as
+ * gidtype (gid_t) , but sometimes it isn't.
+ * It can be int, ushort, gid_t, etc...
+ * It may be necessary to include <sys/types.h> to get any
+ * typedef'ed information. This is only required if you have
+ * getgroups() or setgroups()..
+ */
+#if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
+#define Groups_t int /* Type for 2nd arg to [sg]etgroups() */
+#endif
+
+/* I_ARPA_INET:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <arpa/inet.h> to get inet_addr and friends declarations.
+ */
+/*#define I_ARPA_INET / **/
+
+/* I_DBM:
+ * This symbol, if defined, indicates that <dbm.h> exists and should
+ * be included.
+ */
+/* I_RPCSVC_DBM:
+ * This symbol, if defined, indicates that <rpcsvc/dbm.h> exists and
+ * should be included.
+ */
+/*#define I_DBM / **/
+/*#define I_RPCSVC_DBM / **/
+
+/* I_DLFCN:
+ * This symbol, if defined, indicates that <dlfcn.h> exists and should
+ * be included.
+ */
+/*#define I_DLFCN / **/
+
+/* I_FCNTL:
+ * This manifest constant tells the C program to include <fcntl.h>.
+ */
+/*#define I_FCNTL / **/
+
+/* I_FLOAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <float.h> to get definition of symbols like DBL_MAX or
+ * DBL_MIN, i.e. machine dependent floating point values.
+ */
+/*#define I_FLOAT / **/
+
+/* I_GDBM:
+ * This symbol, if defined, indicates that <gdbm.h> exists and should
+ * be included.
+ */
+/*#define I_GDBM / **/
+
+/* I_LIMITS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <limits.h> to get definition of symbols like WORD_BIT or
+ * LONG_MAX, i.e. machine dependant limitations.
+ */
+/*#define I_LIMITS / **/
+
+/* I_LOCALE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <locale.h>.
+ */
+/*#define I_LOCALE / **/
+
+/* I_MATH:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <math.h>.
+ */
+#define I_MATH /**/
+
+/* I_MEMORY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <memory.h>.
+ */
+/*#define I_MEMORY / **/
+
+/* I_NETINET_IN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/in.h>. Otherwise, you may try <sys/in.h>.
+ */
+/*#define I_NETINET_IN / **/
+
+/* I_SFIO:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sfio.h>.
+ */
+/*#define I_SFIO / **/
+
+/* I_STDDEF:
+ * This symbol, if defined, indicates that <stddef.h> exists and should
+ * be included.
+ */
+/*#define I_STDDEF / **/
+
+/* I_STDLIB:
+ * This symbol, if defined, indicates that <stdlib.h> exists and should
+ * be included.
+ */
+#define I_STDLIB /**/
+
+/* I_STRING:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <string.h> (USG systems) instead of <strings.h> (BSD systems).
+ */
+#define I_STRING /**/
+
+/* I_SYS_DIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/dir.h>.
+ */
+/*#define I_SYS_DIR / **/
+
+/* I_SYS_FILE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/file.h> to get definition of R_OK and friends.
+ */
+/*#define I_SYS_FILE / **/
+
+/* I_SYS_IOCTL:
+ * This symbol, if defined, indicates that <sys/ioctl.h> exists and should
+ * be included. Otherwise, include <sgtty.h> or <termio.h>.
+ */
+/* I_SYS_SOCKIO:
+ * This symbol, if defined, indicates the <sys/sockio.h> should be included
+ * to get socket ioctl options, like SIOCATMARK.
+ */
+/*#define I_SYS_IOCTL / **/
+/*#define I_SYS_SOCKIO / **/
+
+/* I_SYS_NDIR:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/ndir.h>.
+ */
+/*#define I_SYS_NDIR / **/
+
+/* I_SYS_PARAM:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/param.h>.
+ */
+/*#define I_SYS_PARAM / **/
+
+/* I_SYS_POLL:
+ * This symbol, if defined, indicates that the program may include
+ * <sys/poll.h>. When I_POLL is also defined, it's probably safest
+ * to only include <poll.h>.
+ */
+/*#define I_SYS_POLL / **/
+
+/* I_SYS_RESOURCE:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/resource.h>.
+ */
+/*#define I_SYS_RESOURCE / **/
+
+/* I_SYS_SELECT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/select.h> in order to get definition of struct timeval.
+ */
+/*#define I_SYS_SELECT / **/
+
+/* I_SYS_STAT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/stat.h>.
+ */
+#define I_SYS_STAT /**/
+
+/* I_SYS_TIMES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/times.h>.
+ */
+/*#define I_SYS_TIMES / **/
+
+/* I_SYS_TYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/types.h>.
+ */
+/*#define I_SYS_TYPES / **/
+
+/* I_SYS_UN:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/un.h> to get UNIX domain socket definitions.
+ */
+/*#define I_SYS_UN / **/
+
+/* I_SYS_WAIT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/wait.h>.
+ */
+/*#define I_SYS_WAIT / **/
+
+/* I_TERMIO:
+ * This symbol, if defined, indicates that the program should include
+ * <termio.h> rather than <sgtty.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/* I_TERMIOS:
+ * This symbol, if defined, indicates that the program should include
+ * the POSIX termios.h rather than sgtty.h or termio.h.
+ * There are also differences in the ioctl() calls that depend on the
+ * value of this symbol.
+ */
+/* I_SGTTY:
+ * This symbol, if defined, indicates that the program should include
+ * <sgtty.h> rather than <termio.h>. There are also differences in
+ * the ioctl() calls that depend on the value of this symbol.
+ */
+/*#define I_TERMIO / **/
+/*#define I_TERMIOS / **/
+/*#define I_SGTTY / **/
+
+/* I_UNISTD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <unistd.h>.
+ */
+/*#define I_UNISTD / **/
+
+/* I_UTIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <utime.h>.
+ */
+/*#define I_UTIME / **/
+
+/* I_VALUES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <values.h> to get definition of symbols like MINFLOAT or
+ * MAXLONG, i.e. machine dependant limitations. Probably, you
+ * should use <limits.h> instead, if it is available.
+ */
+/*#define I_VALUES / **/
+
+/* I_VFORK:
+ * This symbol, if defined, indicates to the C program that it should
+ * include vfork.h.
+ */
+/*#define I_VFORK / **/
+
+/* INTSIZE:
+ * This symbol contains the value of sizeof(int) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* LONGSIZE:
+ * This symbol contains the value of sizeof(long) so that the C
+ * preprocessor can make decisions based on it.
+ */
+/* SHORTSIZE:
+ * This symbol contains the value of sizeof(short) so that the C
+ * preprocessor can make decisions based on it.
+ */
+#define INTSIZE 4 /**/
+#define LONGSIZE 4 /**/
+#define SHORTSIZE 2 /**/
+
+/* MULTIARCH:
+ * This symbol, if defined, signifies that the build
+ * process will produce some binary files that are going to be
+ * used in a cross-platform environment. This is the case for
+ * example with the NeXT "fat" binaries that contain executables
+ * for several CPUs.
+ */
+/*#define MULTIARCH / **/
+
+/* HAS_QUAD:
+ * This symbol, if defined, tells that there's a 64-bit integer type,
+ * Quad_t, and its unsigned counterpar, Uquad_t. QUADKIND will be one
+ * of QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, or QUAD_IS_INT64_T.
+ */
+/*#define HAS_QUAD / **/
+#ifdef HAS_QUAD
+# define Quad_t int64_t /**/
+# define Uquad_t uint64_t /**/
+# define QUADKIND 4 /**/
+# define QUAD_IS_INT 1
+# define QUAD_IS_LONG 2
+# define QUAD_IS_LONG_LONG 3
+# define QUAD_IS_INT64_T 4
+#endif
+
+/* OSNAME:
+ * This symbol contains the name of the operating system, as determined
+ * by Configure. You shouldn't rely on it too much; the specific
+ * feature tests from Configure are generally more reliable.
+ */
+/* OSVERS:
+ * This symbol contains the version of the operating system, as determined
+ * by Configure. You shouldn't rely on it too much; the specific
+ * feature tests from Configure are generally more reliable.
+ */
+#define OSNAME "unknown" /**/
+#define OSVERS "unknown" /**/
+
+/* ARCHLIB:
+ * This variable, if defined, holds the name of the directory in
+ * which the user wants to put architecture-dependent public
+ * library files for perl5. It is most often a local directory
+ * such as /usr/local/lib. Programs using this variable must be
+ * prepared to deal with filename expansion. If ARCHLIB is the
+ * same as PRIVLIB, it is not defined, since presumably the
+ * program already searches PRIVLIB.
+ */
+/* ARCHLIB_EXP:
+ * This symbol contains the ~name expanded version of ARCHLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define ARCHLIB "/usr/local/lib/perl5/5.11/unknown" / **/
+/*#define ARCHLIB_EXP "/usr/local/lib/perl5/5.11/unknown" / **/
+
+/* ARCHNAME:
+ * This symbol holds a string representing the architecture name.
+ * It may be used to construct an architecture-dependant pathname
+ * where library files may be held under a private library, for
+ * instance.
+ */
+#define ARCHNAME "unknown" /**/
+
+/* BIN:
+ * This symbol holds the path of the bin directory where the package will
+ * be installed. Program must be prepared to deal with ~name substitution.
+ */
+/* BIN_EXP:
+ * This symbol is the filename expanded version of the BIN symbol, for
+ * programs that do not want to deal with that at run-time.
+ */
+/* PERL_RELOCATABLE_INC:
+ * This symbol, if defined, indicates that we'd like to relocate entries
+ * in @INC at run time based on the location of the perl binary.
+ */
+#define BIN "/usr/local/bin" /**/
+#define BIN_EXP "/usr/local/bin" /**/
+#define PERL_RELOCATABLE_INC "undef" /**/
+
+/* CAT2:
+ * This macro concatenates 2 tokens together.
+ */
+/* STRINGIFY:
+ * This macro surrounds its token with double quotes.
+ */
+#if 42 == 1
+#define CAT2(a,b) a/**/b
+#define STRINGIFY(a) "a"
+#endif
+#if 42 == 42
+#define PeRl_CaTiFy(a, b) a ## b
+#define PeRl_StGiFy(a) #a
+#define CAT2(a,b) PeRl_CaTiFy(a,b)
+#define StGiFy(a) PeRl_StGiFy(a)
+#define STRINGIFY(a) PeRl_StGiFy(a)
+#endif
+#if 42 != 1 && 42 != 42
+#include "Bletch: How does this C preprocessor concatenate tokens?"
+#endif
+
+/* CPPSTDIN:
+ * This symbol contains the first part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. Typical value of "cc -E" or "/lib/cpp", but it can also
+ * call a wrapper. See CPPRUN.
+ */
+/* CPPMINUS:
+ * This symbol contains the second part of the string which will invoke
+ * the C preprocessor on the standard input and produce to standard
+ * output. This symbol will have the value "-" if CPPSTDIN needs a minus
+ * to specify standard input, otherwise the value is "".
+ */
+/* CPPRUN:
+ * This symbol contains the string which will invoke a C preprocessor on
+ * the standard input and produce to standard output. It needs to end
+ * with CPPLAST, after all other preprocessor flags have been specified.
+ * The main difference with CPPSTDIN is that this program will never be a
+ * pointer to a shell wrapper, i.e. it will be empty if no preprocessor is
+ * available directly to the user. Note that it may well be different from
+ * the preprocessor used to compile the C program.
+ */
+/* CPPLAST:
+ * This symbol is intended to be used along with CPPRUN in the same manner
+ * symbol CPPMINUS is used with CPPSTDIN. It contains either "-" or "".
+ */
+#define CPPSTDIN "cc -E"
+#define CPPMINUS "-"
+#define CPPRUN "cc -E"
+#define CPPLAST "-"
+
+/* HAS_ACCESS:
+ * This manifest constant lets the C program know that the access()
+ * system call is available to check for accessibility using real UID/GID.
+ * (always present on UNIX.)
+ */
+/*#define HAS_ACCESS / **/
+
+/* HAS_ACCESSX:
+ * This symbol, if defined, indicates that the accessx routine is
+ * available to do extended access checks.
+ */
+/*#define HAS_ACCESSX / **/
+
+/* HAS_ASCTIME_R:
+ * This symbol, if defined, indicates that the asctime_r routine
+ * is available to asctime re-entrantly.
+ */
+/* ASCTIME_R_PROTO:
+ * This symbol encodes the prototype of asctime_r.
+ * It is zero if d_asctime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_asctime_r
+ * is defined.
+ */
+/*#define HAS_ASCTIME_R / **/
+#define ASCTIME_R_PROTO 0 /**/
+
+/* HASATTRIBUTE_FORMAT:
+ * Can we handle GCC attribute for checking printf-style formats
+ */
+/* PRINTF_FORMAT_NULL_OK:
+ * Allows __printf__ format to be null when checking printf-style
+ */
+/* HASATTRIBUTE_MALLOC:
+ * Can we handle GCC attribute for malloc-style functions.
+ */
+/* HASATTRIBUTE_NONNULL:
+ * Can we handle GCC attribute for nonnull function parms.
+ */
+/* HASATTRIBUTE_NORETURN:
+ * Can we handle GCC attribute for functions that do not return
+ */
+/* HASATTRIBUTE_PURE:
+ * Can we handle GCC attribute for pure functions
+ */
+/* HASATTRIBUTE_UNUSED:
+ * Can we handle GCC attribute for unused variables and arguments
+ */
+/* HASATTRIBUTE_DEPRECATED:
+ * Can we handle GCC attribute for marking deprecated APIs
+ */
+/* HASATTRIBUTE_WARN_UNUSED_RESULT:
+ * Can we handle GCC attribute for warning on unused results
+ */
+/*#define HASATTRIBUTE_DEPRECATED / **/
+/*#define HASATTRIBUTE_FORMAT / **/
+/*#define PRINTF_FORMAT_NULL_OK / **/
+/*#define HASATTRIBUTE_NORETURN / **/
+/*#define HASATTRIBUTE_MALLOC / **/
+/*#define HASATTRIBUTE_NONNULL / **/
+/*#define HASATTRIBUTE_PURE / **/
+/*#define HASATTRIBUTE_UNUSED / **/
+/*#define HASATTRIBUTE_WARN_UNUSED_RESULT / **/
+
+/* HASCONST:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the const type. There is no need to actually test for that symbol
+ * within your programs. The mere use of the "const" keyword will
+ * trigger the necessary tests.
+ */
+/*#define HASCONST / **/
+#ifndef HASCONST
+#define const
+#endif
+
+/* HAS_CRYPT_R:
+ * This symbol, if defined, indicates that the crypt_r routine
+ * is available to crypt re-entrantly.
+ */
+/* CRYPT_R_PROTO:
+ * This symbol encodes the prototype of crypt_r.
+ * It is zero if d_crypt_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_crypt_r
+ * is defined.
+ */
+/*#define HAS_CRYPT_R / **/
+#define CRYPT_R_PROTO 0 /**/
+
+/* HAS_CSH:
+ * This symbol, if defined, indicates that the C-shell exists.
+ */
+/* CSH:
+ * This symbol, if defined, contains the full pathname of csh.
+ */
+/*#define HAS_CSH / **/
+#ifdef HAS_CSH
+#define CSH "" /**/
+#endif
+
+/* HAS_CTERMID_R:
+ * This symbol, if defined, indicates that the ctermid_r routine
+ * is available to ctermid re-entrantly.
+ */
+/* CTERMID_R_PROTO:
+ * This symbol encodes the prototype of ctermid_r.
+ * It is zero if d_ctermid_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctermid_r
+ * is defined.
+ */
+/*#define HAS_CTERMID_R / **/
+#define CTERMID_R_PROTO 0 /**/
+
+/* HAS_CTIME_R:
+ * This symbol, if defined, indicates that the ctime_r routine
+ * is available to ctime re-entrantly.
+ */
+/* CTIME_R_PROTO:
+ * This symbol encodes the prototype of ctime_r.
+ * It is zero if d_ctime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_ctime_r
+ * is defined.
+ */
+/*#define HAS_CTIME_R / **/
+#define CTIME_R_PROTO 0 /**/
+
+/* HAS_DRAND48_R:
+ * This symbol, if defined, indicates that the drand48_r routine
+ * is available to drand48 re-entrantly.
+ */
+/* DRAND48_R_PROTO:
+ * This symbol encodes the prototype of drand48_r.
+ * It is zero if d_drand48_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_drand48_r
+ * is defined.
+ */
+/*#define HAS_DRAND48_R / **/
+#define DRAND48_R_PROTO 0 /**/
+
+/* HAS_DRAND48_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the drand48() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern double drand48(void);
+ */
+/*#define HAS_DRAND48_PROTO / **/
+
+/* HAS_EACCESS:
+ * This symbol, if defined, indicates that the eaccess routine is
+ * available to do extended access checks.
+ */
+/*#define HAS_EACCESS / **/
+
+/* HAS_ENDGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the group database.
+ */
+/*#define HAS_ENDGRENT / **/
+
+/* HAS_ENDGRENT_R:
+ * This symbol, if defined, indicates that the endgrent_r routine
+ * is available to endgrent re-entrantly.
+ */
+/* ENDGRENT_R_PROTO:
+ * This symbol encodes the prototype of endgrent_r.
+ * It is zero if d_endgrent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endgrent_r
+ * is defined.
+ */
+/*#define HAS_ENDGRENT_R / **/
+#define ENDGRENT_R_PROTO 0 /**/
+
+/* HAS_ENDHOSTENT:
+ * This symbol, if defined, indicates that the endhostent() routine is
+ * available to close whatever was being used for host queries.
+ */
+/*#define HAS_ENDHOSTENT / **/
+
+/* HAS_ENDHOSTENT_R:
+ * This symbol, if defined, indicates that the endhostent_r routine
+ * is available to endhostent re-entrantly.
+ */
+/* ENDHOSTENT_R_PROTO:
+ * This symbol encodes the prototype of endhostent_r.
+ * It is zero if d_endhostent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endhostent_r
+ * is defined.
+ */
+/*#define HAS_ENDHOSTENT_R / **/
+#define ENDHOSTENT_R_PROTO 0 /**/
+
+/* HAS_ENDNETENT:
+ * This symbol, if defined, indicates that the endnetent() routine is
+ * available to close whatever was being used for network queries.
+ */
+/*#define HAS_ENDNETENT / **/
+
+/* HAS_ENDNETENT_R:
+ * This symbol, if defined, indicates that the endnetent_r routine
+ * is available to endnetent re-entrantly.
+ */
+/* ENDNETENT_R_PROTO:
+ * This symbol encodes the prototype of endnetent_r.
+ * It is zero if d_endnetent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endnetent_r
+ * is defined.
+ */
+/*#define HAS_ENDNETENT_R / **/
+#define ENDNETENT_R_PROTO 0 /**/
+
+/* HAS_ENDPROTOENT:
+ * This symbol, if defined, indicates that the endprotoent() routine is
+ * available to close whatever was being used for protocol queries.
+ */
+/*#define HAS_ENDPROTOENT / **/
+
+/* HAS_ENDPROTOENT_R:
+ * This symbol, if defined, indicates that the endprotoent_r routine
+ * is available to endprotoent re-entrantly.
+ */
+/* ENDPROTOENT_R_PROTO:
+ * This symbol encodes the prototype of endprotoent_r.
+ * It is zero if d_endprotoent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endprotoent_r
+ * is defined.
+ */
+/*#define HAS_ENDPROTOENT_R / **/
+#define ENDPROTOENT_R_PROTO 0 /**/
+
+/* HAS_ENDPWENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for finalizing sequential access of the passwd database.
+ */
+/*#define HAS_ENDPWENT / **/
+
+/* HAS_ENDPWENT_R:
+ * This symbol, if defined, indicates that the endpwent_r routine
+ * is available to endpwent re-entrantly.
+ */
+/* ENDPWENT_R_PROTO:
+ * This symbol encodes the prototype of endpwent_r.
+ * It is zero if d_endpwent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endpwent_r
+ * is defined.
+ */
+/*#define HAS_ENDPWENT_R / **/
+#define ENDPWENT_R_PROTO 0 /**/
+
+/* HAS_ENDSERVENT:
+ * This symbol, if defined, indicates that the endservent() routine is
+ * available to close whatever was being used for service queries.
+ */
+/*#define HAS_ENDSERVENT / **/
+
+/* HAS_ENDSERVENT_R:
+ * This symbol, if defined, indicates that the endservent_r routine
+ * is available to endservent re-entrantly.
+ */
+/* ENDSERVENT_R_PROTO:
+ * This symbol encodes the prototype of endservent_r.
+ * It is zero if d_endservent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_endservent_r
+ * is defined.
+ */
+/*#define HAS_ENDSERVENT_R / **/
+#define ENDSERVENT_R_PROTO 0 /**/
+
+/* FLEXFILENAMES:
+ * This symbol, if defined, indicates that the system supports filenames
+ * longer than 14 characters.
+ */
+/*#define FLEXFILENAMES / **/
+
+/* HAS_GETGRENT:
+ * This symbol, if defined, indicates that the getgrent routine is
+ * available for sequential access of the group database.
+ */
+/*#define HAS_GETGRENT / **/
+
+/* HAS_GETGRENT_R:
+ * This symbol, if defined, indicates that the getgrent_r routine
+ * is available to getgrent re-entrantly.
+ */
+/* GETGRENT_R_PROTO:
+ * This symbol encodes the prototype of getgrent_r.
+ * It is zero if d_getgrent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrent_r
+ * is defined.
+ */
+/*#define HAS_GETGRENT_R / **/
+#define GETGRENT_R_PROTO 0 /**/
+
+/* HAS_GETGRGID_R:
+ * This symbol, if defined, indicates that the getgrgid_r routine
+ * is available to getgrgid re-entrantly.
+ */
+/* GETGRGID_R_PROTO:
+ * This symbol encodes the prototype of getgrgid_r.
+ * It is zero if d_getgrgid_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrgid_r
+ * is defined.
+ */
+/*#define HAS_GETGRGID_R / **/
+#define GETGRGID_R_PROTO 0 /**/
+
+/* HAS_GETGRNAM_R:
+ * This symbol, if defined, indicates that the getgrnam_r routine
+ * is available to getgrnam re-entrantly.
+ */
+/* GETGRNAM_R_PROTO:
+ * This symbol encodes the prototype of getgrnam_r.
+ * It is zero if d_getgrnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getgrnam_r
+ * is defined.
+ */
+/*#define HAS_GETGRNAM_R / **/
+#define GETGRNAM_R_PROTO 0 /**/
+
+/* HAS_GETHOSTBYADDR:
+ * This symbol, if defined, indicates that the gethostbyaddr() routine is
+ * available to look up hosts by their IP addresses.
+ */
+/*#define HAS_GETHOSTBYADDR / **/
+
+/* HAS_GETHOSTBYNAME:
+ * This symbol, if defined, indicates that the gethostbyname() routine is
+ * available to look up host names in some data base or other.
+ */
+/*#define HAS_GETHOSTBYNAME / **/
+
+/* HAS_GETHOSTENT:
+ * This symbol, if defined, indicates that the gethostent() routine is
+ * available to look up host names in some data base or another.
+ */
+/*#define HAS_GETHOSTENT / **/
+
+/* HAS_GETHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * gethostname() routine to derive the host name. See also HAS_UNAME
+ * and PHOSTNAME.
+ */
+/* HAS_UNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * uname() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and PHOSTNAME.
+ */
+/* PHOSTNAME:
+ * This symbol, if defined, indicates the command to feed to the
+ * popen() routine to derive the host name. See also HAS_GETHOSTNAME
+ * and HAS_UNAME. Note that the command uses a fully qualified path,
+ * so that it is safe even if used by a process with super-user
+ * privileges.
+ */
+/* HAS_PHOSTNAME:
+ * This symbol, if defined, indicates that the C program may use the
+ * contents of PHOSTNAME as a command to feed to the popen() routine
+ * to derive the host name.
+ */
+/*#define HAS_GETHOSTNAME / **/
+/*#define HAS_UNAME / **/
+/*#define HAS_PHOSTNAME / **/
+#ifdef HAS_PHOSTNAME
+#define PHOSTNAME "/bin/hostname" /* How to get the host name */
+#endif
+
+/* HAS_GETHOSTBYADDR_R:
+ * This symbol, if defined, indicates that the gethostbyaddr_r routine
+ * is available to gethostbyaddr re-entrantly.
+ */
+/* GETHOSTBYADDR_R_PROTO:
+ * This symbol encodes the prototype of gethostbyaddr_r.
+ * It is zero if d_gethostbyaddr_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyaddr_r
+ * is defined.
+ */
+/*#define HAS_GETHOSTBYADDR_R / **/
+#define GETHOSTBYADDR_R_PROTO 0 /**/
+
+/* HAS_GETHOSTBYNAME_R:
+ * This symbol, if defined, indicates that the gethostbyname_r routine
+ * is available to gethostbyname re-entrantly.
+ */
+/* GETHOSTBYNAME_R_PROTO:
+ * This symbol encodes the prototype of gethostbyname_r.
+ * It is zero if d_gethostbyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostbyname_r
+ * is defined.
+ */
+/*#define HAS_GETHOSTBYNAME_R / **/
+#define GETHOSTBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETHOSTENT_R:
+ * This symbol, if defined, indicates that the gethostent_r routine
+ * is available to gethostent re-entrantly.
+ */
+/* GETHOSTENT_R_PROTO:
+ * This symbol encodes the prototype of gethostent_r.
+ * It is zero if d_gethostent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gethostent_r
+ * is defined.
+ */
+/*#define HAS_GETHOSTENT_R / **/
+#define GETHOSTENT_R_PROTO 0 /**/
+
+/* HAS_GETHOST_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for gethostent(), gethostbyname(), and
+ * gethostbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define HAS_GETHOST_PROTOS / **/
+
+/* HAS_GETLOGIN_R:
+ * This symbol, if defined, indicates that the getlogin_r routine
+ * is available to getlogin re-entrantly.
+ */
+/* GETLOGIN_R_PROTO:
+ * This symbol encodes the prototype of getlogin_r.
+ * It is zero if d_getlogin_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getlogin_r
+ * is defined.
+ */
+/*#define HAS_GETLOGIN_R / **/
+#define GETLOGIN_R_PROTO 0 /**/
+
+/* HAS_GETNETBYADDR:
+ * This symbol, if defined, indicates that the getnetbyaddr() routine is
+ * available to look up networks by their IP addresses.
+ */
+/*#define HAS_GETNETBYADDR / **/
+
+/* HAS_GETNETBYNAME:
+ * This symbol, if defined, indicates that the getnetbyname() routine is
+ * available to look up networks by their names.
+ */
+/*#define HAS_GETNETBYNAME / **/
+
+/* HAS_GETNETENT:
+ * This symbol, if defined, indicates that the getnetent() routine is
+ * available to look up network names in some data base or another.
+ */
+/*#define HAS_GETNETENT / **/
+
+/* HAS_GETNETBYADDR_R:
+ * This symbol, if defined, indicates that the getnetbyaddr_r routine
+ * is available to getnetbyaddr re-entrantly.
+ */
+/* GETNETBYADDR_R_PROTO:
+ * This symbol encodes the prototype of getnetbyaddr_r.
+ * It is zero if d_getnetbyaddr_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyaddr_r
+ * is defined.
+ */
+/*#define HAS_GETNETBYADDR_R / **/
+#define GETNETBYADDR_R_PROTO 0 /**/
+
+/* HAS_GETNETBYNAME_R:
+ * This symbol, if defined, indicates that the getnetbyname_r routine
+ * is available to getnetbyname re-entrantly.
+ */
+/* GETNETBYNAME_R_PROTO:
+ * This symbol encodes the prototype of getnetbyname_r.
+ * It is zero if d_getnetbyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetbyname_r
+ * is defined.
+ */
+/*#define HAS_GETNETBYNAME_R / **/
+#define GETNETBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETNETENT_R:
+ * This symbol, if defined, indicates that the getnetent_r routine
+ * is available to getnetent re-entrantly.
+ */
+/* GETNETENT_R_PROTO:
+ * This symbol encodes the prototype of getnetent_r.
+ * It is zero if d_getnetent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getnetent_r
+ * is defined.
+ */
+/*#define HAS_GETNETENT_R / **/
+#define GETNETENT_R_PROTO 0 /**/
+
+/* HAS_GETNET_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getnetent(), getnetbyname(), and
+ * getnetbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define HAS_GETNET_PROTOS / **/
+
+/* HAS_GETPROTOENT:
+ * This symbol, if defined, indicates that the getprotoent() routine is
+ * available to look up protocols in some data base or another.
+ */
+/*#define HAS_GETPROTOENT / **/
+
+/* HAS_GETPGRP:
+ * This symbol, if defined, indicates that the getpgrp routine is
+ * available to get the current process group.
+ */
+/* USE_BSD_GETPGRP:
+ * This symbol, if defined, indicates that getpgrp needs one
+ * arguments whereas USG one needs none.
+ */
+/*#define HAS_GETPGRP / **/
+/*#define USE_BSD_GETPGRP / **/
+
+/* HAS_GETPROTOBYNAME:
+ * This symbol, if defined, indicates that the getprotobyname()
+ * routine is available to look up protocols by their name.
+ */
+/* HAS_GETPROTOBYNUMBER:
+ * This symbol, if defined, indicates that the getprotobynumber()
+ * routine is available to look up protocols by their number.
+ */
+/*#define HAS_GETPROTOBYNAME / **/
+/*#define HAS_GETPROTOBYNUMBER / **/
+
+/* HAS_GETPROTOBYNAME_R:
+ * This symbol, if defined, indicates that the getprotobyname_r routine
+ * is available to getprotobyname re-entrantly.
+ */
+/* GETPROTOBYNAME_R_PROTO:
+ * This symbol encodes the prototype of getprotobyname_r.
+ * It is zero if d_getprotobyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobyname_r
+ * is defined.
+ */
+/*#define HAS_GETPROTOBYNAME_R / **/
+#define GETPROTOBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETPROTOBYNUMBER_R:
+ * This symbol, if defined, indicates that the getprotobynumber_r routine
+ * is available to getprotobynumber re-entrantly.
+ */
+/* GETPROTOBYNUMBER_R_PROTO:
+ * This symbol encodes the prototype of getprotobynumber_r.
+ * It is zero if d_getprotobynumber_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotobynumber_r
+ * is defined.
+ */
+/*#define HAS_GETPROTOBYNUMBER_R / **/
+#define GETPROTOBYNUMBER_R_PROTO 0 /**/
+
+/* HAS_GETPROTOENT_R:
+ * This symbol, if defined, indicates that the getprotoent_r routine
+ * is available to getprotoent re-entrantly.
+ */
+/* GETPROTOENT_R_PROTO:
+ * This symbol encodes the prototype of getprotoent_r.
+ * It is zero if d_getprotoent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getprotoent_r
+ * is defined.
+ */
+/*#define HAS_GETPROTOENT_R / **/
+#define GETPROTOENT_R_PROTO 0 /**/
+
+/* HAS_GETPROTO_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getprotoent(), getprotobyname(), and
+ * getprotobyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define HAS_GETPROTO_PROTOS / **/
+
+/* HAS_GETPWENT:
+ * This symbol, if defined, indicates that the getpwent routine is
+ * available for sequential access of the passwd database.
+ * If this is not available, the older getpw() function may be available.
+ */
+/*#define HAS_GETPWENT / **/
+
+/* HAS_GETPWENT_R:
+ * This symbol, if defined, indicates that the getpwent_r routine
+ * is available to getpwent re-entrantly.
+ */
+/* GETPWENT_R_PROTO:
+ * This symbol encodes the prototype of getpwent_r.
+ * It is zero if d_getpwent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwent_r
+ * is defined.
+ */
+/*#define HAS_GETPWENT_R / **/
+#define GETPWENT_R_PROTO 0 /**/
+
+/* HAS_GETPWNAM_R:
+ * This symbol, if defined, indicates that the getpwnam_r routine
+ * is available to getpwnam re-entrantly.
+ */
+/* GETPWNAM_R_PROTO:
+ * This symbol encodes the prototype of getpwnam_r.
+ * It is zero if d_getpwnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwnam_r
+ * is defined.
+ */
+/*#define HAS_GETPWNAM_R / **/
+#define GETPWNAM_R_PROTO 0 /**/
+
+/* HAS_GETPWUID_R:
+ * This symbol, if defined, indicates that the getpwuid_r routine
+ * is available to getpwuid re-entrantly.
+ */
+/* GETPWUID_R_PROTO:
+ * This symbol encodes the prototype of getpwuid_r.
+ * It is zero if d_getpwuid_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getpwuid_r
+ * is defined.
+ */
+/*#define HAS_GETPWUID_R / **/
+#define GETPWUID_R_PROTO 0 /**/
+
+/* HAS_GETSERVENT:
+ * This symbol, if defined, indicates that the getservent() routine is
+ * available to look up network services in some data base or another.
+ */
+/*#define HAS_GETSERVENT / **/
+
+/* HAS_GETSERVBYNAME_R:
+ * This symbol, if defined, indicates that the getservbyname_r routine
+ * is available to getservbyname re-entrantly.
+ */
+/* GETSERVBYNAME_R_PROTO:
+ * This symbol encodes the prototype of getservbyname_r.
+ * It is zero if d_getservbyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyname_r
+ * is defined.
+ */
+/*#define HAS_GETSERVBYNAME_R / **/
+#define GETSERVBYNAME_R_PROTO 0 /**/
+
+/* HAS_GETSERVBYPORT_R:
+ * This symbol, if defined, indicates that the getservbyport_r routine
+ * is available to getservbyport re-entrantly.
+ */
+/* GETSERVBYPORT_R_PROTO:
+ * This symbol encodes the prototype of getservbyport_r.
+ * It is zero if d_getservbyport_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservbyport_r
+ * is defined.
+ */
+/*#define HAS_GETSERVBYPORT_R / **/
+#define GETSERVBYPORT_R_PROTO 0 /**/
+
+/* HAS_GETSERVENT_R:
+ * This symbol, if defined, indicates that the getservent_r routine
+ * is available to getservent re-entrantly.
+ */
+/* GETSERVENT_R_PROTO:
+ * This symbol encodes the prototype of getservent_r.
+ * It is zero if d_getservent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getservent_r
+ * is defined.
+ */
+/*#define HAS_GETSERVENT_R / **/
+#define GETSERVENT_R_PROTO 0 /**/
+
+/* HAS_GETSERV_PROTOS:
+ * This symbol, if defined, indicates that <netdb.h> includes
+ * prototypes for getservent(), getservbyname(), and
+ * getservbyaddr(). Otherwise, it is up to the program to guess
+ * them. See netdbtype.U for probing for various Netdb_xxx_t types.
+ */
+/*#define HAS_GETSERV_PROTOS / **/
+
+/* HAS_GETSPNAM_R:
+ * This symbol, if defined, indicates that the getspnam_r routine
+ * is available to getspnam re-entrantly.
+ */
+/* GETSPNAM_R_PROTO:
+ * This symbol encodes the prototype of getspnam_r.
+ * It is zero if d_getspnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_getspnam_r
+ * is defined.
+ */
+/*#define HAS_GETSPNAM_R / **/
+#define GETSPNAM_R_PROTO 0 /**/
+
+/* HAS_GETSERVBYNAME:
+ * This symbol, if defined, indicates that the getservbyname()
+ * routine is available to look up services by their name.
+ */
+/* HAS_GETSERVBYPORT:
+ * This symbol, if defined, indicates that the getservbyport()
+ * routine is available to look up services by their port.
+ */
+/*#define HAS_GETSERVBYNAME / **/
+/*#define HAS_GETSERVBYPORT / **/
+
+/* HAS_GMTIME_R:
+ * This symbol, if defined, indicates that the gmtime_r routine
+ * is available to gmtime re-entrantly.
+ */
+/* GMTIME_R_PROTO:
+ * This symbol encodes the prototype of gmtime_r.
+ * It is zero if d_gmtime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_gmtime_r
+ * is defined.
+ */
+/*#define HAS_GMTIME_R / **/
+#define GMTIME_R_PROTO 0 /**/
+
+/* HAS_HTONL:
+ * This symbol, if defined, indicates that the htonl() routine (and
+ * friends htons() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_HTONS:
+ * This symbol, if defined, indicates that the htons() routine (and
+ * friends htonl() ntohl() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHL:
+ * This symbol, if defined, indicates that the ntohl() routine (and
+ * friends htonl() htons() ntohs()) are available to do network
+ * order byte swapping.
+ */
+/* HAS_NTOHS:
+ * This symbol, if defined, indicates that the ntohs() routine (and
+ * friends htonl() htons() ntohl()) are available to do network
+ * order byte swapping.
+ */
+/*#define HAS_HTONL / **/
+/*#define HAS_HTONS / **/
+/*#define HAS_NTOHL / **/
+/*#define HAS_NTOHS / **/
+
+/* HAS_LOCALTIME_R:
+ * This symbol, if defined, indicates that the localtime_r routine
+ * is available to localtime re-entrantly.
+ */
+/* LOCALTIME_R_NEEDS_TZSET:
+ * Many libc's localtime_r implementations do not call tzset,
+ * making them differ from localtime(), and making timezone
+ * changes using $ENV{TZ} without explicitly calling tzset
+ * impossible. This symbol makes us call tzset before localtime_r
+ */
+/*#define LOCALTIME_R_NEEDS_TZSET / **/
+#ifdef LOCALTIME_R_NEEDS_TZSET
+#define L_R_TZSET tzset(),
+#else
+#define L_R_TZSET
+#endif
+
+/* LOCALTIME_R_PROTO:
+ * This symbol encodes the prototype of localtime_r.
+ * It is zero if d_localtime_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_localtime_r
+ * is defined.
+ */
+/*#define HAS_LOCALTIME_R / **/
+#define LOCALTIME_R_PROTO 0 /**/
+
+/* HAS_LONG_DOUBLE:
+ * This symbol will be defined if the C compiler supports long
+ * doubles.
+ */
+/* LONG_DOUBLESIZE:
+ * This symbol contains the size of a long double, so that the
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long doubles.
+ */
+/*#define HAS_LONG_DOUBLE / **/
+#ifdef HAS_LONG_DOUBLE
+#define LONG_DOUBLESIZE 8 /**/
+#endif
+
+/* HAS_LONG_LONG:
+ * This symbol will be defined if the C compiler supports long long.
+ */
+/* LONGLONGSIZE:
+ * This symbol contains the size of a long long, so that the
+ * C preprocessor can make decisions based on it. It is only
+ * defined if the system supports long long.
+ */
+/*#define HAS_LONG_LONG / **/
+#ifdef HAS_LONG_LONG
+#define LONGLONGSIZE 8 /**/
+#endif
+
+/* HAS_LSEEK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the lseek() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern off_t lseek(int, off_t, int);
+ */
+/*#define HAS_LSEEK_PROTO / **/
+
+/* HAS_MEMCHR:
+ * This symbol, if defined, indicates that the memchr routine is available
+ * to locate characters within a C string.
+ */
+#define HAS_MEMCHR /**/
+
+/* HAS_MKSTEMP:
+ * This symbol, if defined, indicates that the mkstemp routine is
+ * available to exclusively create and open a uniquely named
+ * temporary file.
+ */
+/*#define HAS_MKSTEMP / **/
+
+/* HAS_MMAP:
+ * This symbol, if defined, indicates that the mmap system call is
+ * available to map a file into memory.
+ */
+/* Mmap_t:
+ * This symbol holds the return type of the mmap() system call
+ * (and simultaneously the type of the first argument).
+ * Usually set to 'void *' or 'caddr_t'.
+ */
+/*#define HAS_MMAP / **/
+#define Mmap_t void * /**/
+
+/* HAS_MSG:
+ * This symbol, if defined, indicates that the entire msg*(2) library is
+ * supported (IPC mechanism based on message queues).
+ */
+/*#define HAS_MSG / **/
+
+/* OLD_PTHREAD_CREATE_JOINABLE:
+ * This symbol, if defined, indicates how to create pthread
+ * in joinable (aka undetached) state. NOTE: not defined
+ * if pthread.h already has defined PTHREAD_CREATE_JOINABLE
+ * (the new version of the constant).
+ * If defined, known values are PTHREAD_CREATE_UNDETACHED
+ * and __UNDETACHED.
+ */
+/*#define OLD_PTHREAD_CREATE_JOINABLE / **/
+
+/* HAS_PTHREAD_ATFORK:
+ * This symbol, if defined, indicates that the pthread_atfork routine
+ * is available to setup fork handlers.
+ */
+/*#define HAS_PTHREAD_ATFORK / **/
+
+/* HAS_PTHREAD_YIELD:
+ * This symbol, if defined, indicates that the pthread_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/* SCHED_YIELD:
+ * This symbol defines the way to yield the execution of
+ * the current thread. Known ways are sched_yield,
+ * pthread_yield, and pthread_yield with NULL.
+ */
+/* HAS_SCHED_YIELD:
+ * This symbol, if defined, indicates that the sched_yield
+ * routine is available to yield the execution of the current
+ * thread. sched_yield is preferable to pthread_yield.
+ */
+/*#define HAS_PTHREAD_YIELD / **/
+#define SCHED_YIELD sched_yield() /**/
+/*#define HAS_SCHED_YIELD / **/
+
+/* HAS_RANDOM_R:
+ * This symbol, if defined, indicates that the random_r routine
+ * is available to random re-entrantly.
+ */
+/* RANDOM_R_PROTO:
+ * This symbol encodes the prototype of random_r.
+ * It is zero if d_random_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_random_r
+ * is defined.
+ */
+/*#define HAS_RANDOM_R / **/
+#define RANDOM_R_PROTO 0 /**/
+
+/* HAS_READDIR64_R:
+ * This symbol, if defined, indicates that the readdir64_r routine
+ * is available to readdir64 re-entrantly.
+ */
+/* READDIR64_R_PROTO:
+ * This symbol encodes the prototype of readdir64_r.
+ * It is zero if d_readdir64_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir64_r
+ * is defined.
+ */
+/*#define HAS_READDIR64_R / **/
+#define READDIR64_R_PROTO 0 /**/
+
+/* HAS_READDIR_R:
+ * This symbol, if defined, indicates that the readdir_r routine
+ * is available to readdir re-entrantly.
+ */
+/* READDIR_R_PROTO:
+ * This symbol encodes the prototype of readdir_r.
+ * It is zero if d_readdir_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_readdir_r
+ * is defined.
+ */
+/*#define HAS_READDIR_R / **/
+#define READDIR_R_PROTO 0 /**/
+
+/* HAS_SEM:
+ * This symbol, if defined, indicates that the entire sem*(2) library is
+ * supported.
+ */
+/*#define HAS_SEM / **/
+
+/* HAS_SETGRENT:
+ * This symbol, if defined, indicates that the setgrent routine is
+ * available for initializing sequential access of the group database.
+ */
+/*#define HAS_SETGRENT / **/
+
+/* HAS_SETGRENT_R:
+ * This symbol, if defined, indicates that the setgrent_r routine
+ * is available to setgrent re-entrantly.
+ */
+/* SETGRENT_R_PROTO:
+ * This symbol encodes the prototype of setgrent_r.
+ * It is zero if d_setgrent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setgrent_r
+ * is defined.
+ */
+/*#define HAS_SETGRENT_R / **/
+#define SETGRENT_R_PROTO 0 /**/
+
+/* HAS_SETHOSTENT:
+ * This symbol, if defined, indicates that the sethostent() routine is
+ * available.
+ */
+/*#define HAS_SETHOSTENT / **/
+
+/* HAS_SETHOSTENT_R:
+ * This symbol, if defined, indicates that the sethostent_r routine
+ * is available to sethostent re-entrantly.
+ */
+/* SETHOSTENT_R_PROTO:
+ * This symbol encodes the prototype of sethostent_r.
+ * It is zero if d_sethostent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_sethostent_r
+ * is defined.
+ */
+/*#define HAS_SETHOSTENT_R / **/
+#define SETHOSTENT_R_PROTO 0 /**/
+
+/* HAS_SETLOCALE_R:
+ * This symbol, if defined, indicates that the setlocale_r routine
+ * is available to setlocale re-entrantly.
+ */
+/* SETLOCALE_R_PROTO:
+ * This symbol encodes the prototype of setlocale_r.
+ * It is zero if d_setlocale_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setlocale_r
+ * is defined.
+ */
+/*#define HAS_SETLOCALE_R / **/
+#define SETLOCALE_R_PROTO 0 /**/
+
+/* HAS_SETNETENT:
+ * This symbol, if defined, indicates that the setnetent() routine is
+ * available.
+ */
+/*#define HAS_SETNETENT / **/
+
+/* HAS_SETNETENT_R:
+ * This symbol, if defined, indicates that the setnetent_r routine
+ * is available to setnetent re-entrantly.
+ */
+/* SETNETENT_R_PROTO:
+ * This symbol encodes the prototype of setnetent_r.
+ * It is zero if d_setnetent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setnetent_r
+ * is defined.
+ */
+/*#define HAS_SETNETENT_R / **/
+#define SETNETENT_R_PROTO 0 /**/
+
+/* HAS_SETPROTOENT:
+ * This symbol, if defined, indicates that the setprotoent() routine is
+ * available.
+ */
+/*#define HAS_SETPROTOENT / **/
+
+/* HAS_SETPGRP:
+ * This symbol, if defined, indicates that the setpgrp routine is
+ * available to set the current process group.
+ */
+/* USE_BSD_SETPGRP:
+ * This symbol, if defined, indicates that setpgrp needs two
+ * arguments whereas USG one needs none. See also HAS_SETPGID
+ * for a POSIX interface.
+ */
+/*#define HAS_SETPGRP / **/
+/*#define USE_BSD_SETPGRP / **/
+
+/* HAS_SETPROTOENT_R:
+ * This symbol, if defined, indicates that the setprotoent_r routine
+ * is available to setprotoent re-entrantly.
+ */
+/* SETPROTOENT_R_PROTO:
+ * This symbol encodes the prototype of setprotoent_r.
+ * It is zero if d_setprotoent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setprotoent_r
+ * is defined.
+ */
+/*#define HAS_SETPROTOENT_R / **/
+#define SETPROTOENT_R_PROTO 0 /**/
+
+/* HAS_SETPWENT:
+ * This symbol, if defined, indicates that the setpwent routine is
+ * available for initializing sequential access of the passwd database.
+ */
+/*#define HAS_SETPWENT / **/
+
+/* HAS_SETPWENT_R:
+ * This symbol, if defined, indicates that the setpwent_r routine
+ * is available to setpwent re-entrantly.
+ */
+/* SETPWENT_R_PROTO:
+ * This symbol encodes the prototype of setpwent_r.
+ * It is zero if d_setpwent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setpwent_r
+ * is defined.
+ */
+/*#define HAS_SETPWENT_R / **/
+#define SETPWENT_R_PROTO 0 /**/
+
+/* HAS_SETSERVENT:
+ * This symbol, if defined, indicates that the setservent() routine is
+ * available.
+ */
+/*#define HAS_SETSERVENT / **/
+
+/* HAS_SETSERVENT_R:
+ * This symbol, if defined, indicates that the setservent_r routine
+ * is available to setservent re-entrantly.
+ */
+/* SETSERVENT_R_PROTO:
+ * This symbol encodes the prototype of setservent_r.
+ * It is zero if d_setservent_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_setservent_r
+ * is defined.
+ */
+/*#define HAS_SETSERVENT_R / **/
+#define SETSERVENT_R_PROTO 0 /**/
+
+/* HAS_SETVBUF:
+ * This symbol, if defined, indicates that the setvbuf routine is
+ * available to change buffering on an open stdio stream.
+ * to a line-buffered mode.
+ */
+/*#define HAS_SETVBUF / **/
+
+/* HAS_SHM:
+ * This symbol, if defined, indicates that the entire shm*(2) library is
+ * supported.
+ */
+/*#define HAS_SHM / **/
+
+/* Shmat_t:
+ * This symbol holds the return type of the shmat() system call.
+ * Usually set to 'void *' or 'char *'.
+ */
+/* HAS_SHMAT_PROTOTYPE:
+ * This symbol, if defined, indicates that the sys/shm.h includes
+ * a prototype for shmat(). Otherwise, it is up to the program to
+ * guess one. Shmat_t shmat(int, Shmat_t, int) is a good guess,
+ * but not always right so it should be emitted by the program only
+ * when HAS_SHMAT_PROTOTYPE is not defined to avoid conflicting defs.
+ */
+#define Shmat_t void * /**/
+/*#define HAS_SHMAT_PROTOTYPE / **/
+
+/* HAS_SOCKET:
+ * This symbol, if defined, indicates that the BSD socket interface is
+ * supported.
+ */
+/* HAS_SOCKETPAIR:
+ * This symbol, if defined, indicates that the BSD socketpair() call is
+ * supported.
+ */
+/* HAS_MSG_CTRUNC:
+ * This symbol, if defined, indicates that the MSG_CTRUNC is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_DONTROUTE:
+ * This symbol, if defined, indicates that the MSG_DONTROUTE is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_OOB:
+ * This symbol, if defined, indicates that the MSG_OOB is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PEEK:
+ * This symbol, if defined, indicates that the MSG_PEEK is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_MSG_PROXY:
+ * This symbol, if defined, indicates that the MSG_PROXY is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/* HAS_SCM_RIGHTS:
+ * This symbol, if defined, indicates that the SCM_RIGHTS is supported.
+ * Checking just with #ifdef might not be enough because this symbol
+ * has been known to be an enum.
+ */
+/*#define HAS_SOCKET / **/
+/*#define HAS_SOCKETPAIR / **/
+/*#define HAS_MSG_CTRUNC / **/
+/*#define HAS_MSG_DONTROUTE / **/
+/*#define HAS_MSG_OOB / **/
+/*#define HAS_MSG_PEEK / **/
+/*#define HAS_MSG_PROXY / **/
+/*#define HAS_SCM_RIGHTS / **/
+
+/* HAS_SRAND48_R:
+ * This symbol, if defined, indicates that the srand48_r routine
+ * is available to srand48 re-entrantly.
+ */
+/* SRAND48_R_PROTO:
+ * This symbol encodes the prototype of srand48_r.
+ * It is zero if d_srand48_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_srand48_r
+ * is defined.
+ */
+/*#define HAS_SRAND48_R / **/
+#define SRAND48_R_PROTO 0 /**/
+
+/* HAS_SRANDOM_R:
+ * This symbol, if defined, indicates that the srandom_r routine
+ * is available to srandom re-entrantly.
+ */
+/* SRANDOM_R_PROTO:
+ * This symbol encodes the prototype of srandom_r.
+ * It is zero if d_srandom_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_srandom_r
+ * is defined.
+ */
+/*#define HAS_SRANDOM_R / **/
+#define SRANDOM_R_PROTO 0 /**/
+
+/* USE_STAT_BLOCKS:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_blksize and st_blocks.
+ */
+#ifndef USE_STAT_BLOCKS
+/*#define USE_STAT_BLOCKS / **/
+#endif
+
+/* USE_STRUCT_COPY:
+ * This symbol, if defined, indicates that this C compiler knows how
+ * to copy structures. If undefined, you'll need to use a block copy
+ * routine of some sort instead.
+ */
+/*#define USE_STRUCT_COPY / **/
+
+/* HAS_STRERROR:
+ * This symbol, if defined, indicates that the strerror routine is
+ * available to translate error numbers to strings. See the writeup
+ * of Strerror() in this file before you try to define your own.
+ */
+/* HAS_SYS_ERRLIST:
+ * This symbol, if defined, indicates that the sys_errlist array is
+ * available to translate error numbers to strings. The extern int
+ * sys_nerr gives the size of that table.
+ */
+/* Strerror:
+ * This preprocessor symbol is defined as a macro if strerror() is
+ * not available to translate error numbers to strings but sys_errlist[]
+ * array is there.
+ */
+/*#define HAS_STRERROR / **/
+/*#define HAS_SYS_ERRLIST / **/
+#define Strerror(e) strerror(e)
+
+/* HAS_STRERROR_R:
+ * This symbol, if defined, indicates that the strerror_r routine
+ * is available to strerror re-entrantly.
+ */
+/* STRERROR_R_PROTO:
+ * This symbol encodes the prototype of strerror_r.
+ * It is zero if d_strerror_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_strerror_r
+ * is defined.
+ */
+/*#define HAS_STRERROR_R / **/
+#define STRERROR_R_PROTO 0 /**/
+
+/* HAS_STRTOUL:
+ * This symbol, if defined, indicates that the strtoul routine is
+ * available to provide conversion of strings to unsigned long.
+ */
+#define HAS_STRTOUL /**/
+
+/* HAS_TIME:
+ * This symbol, if defined, indicates that the time() routine exists.
+ */
+/* Time_t:
+ * This symbol holds the type returned by time(). It can be long,
+ * or time_t on BSD sites (in which case <sys/types.h> should be
+ * included).
+ */
+#define HAS_TIME /**/
+#define Time_t time_t /* Time type */
+
+/* HAS_TIMES:
+ * This symbol, if defined, indicates that the times() routine exists.
+ * Note that this became obsolete on some systems (SUNOS), which now
+ * use getrusage(). It may be necessary to include <sys/times.h>.
+ */
+/*#define HAS_TIMES / **/
+
+/* HAS_TMPNAM_R:
+ * This symbol, if defined, indicates that the tmpnam_r routine
+ * is available to tmpnam re-entrantly.
+ */
+/* TMPNAM_R_PROTO:
+ * This symbol encodes the prototype of tmpnam_r.
+ * It is zero if d_tmpnam_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_tmpnam_r
+ * is defined.
+ */
+/*#define HAS_TMPNAM_R / **/
+#define TMPNAM_R_PROTO 0 /**/
+
+/* HAS_TTYNAME_R:
+ * This symbol, if defined, indicates that the ttyname_r routine
+ * is available to ttyname re-entrantly.
+ */
+/* TTYNAME_R_PROTO:
+ * This symbol encodes the prototype of ttyname_r.
+ * It is zero if d_ttyname_r is undef, and one of the
+ * REENTRANT_PROTO_T_ABC macros of reentr.h if d_ttyname_r
+ * is defined.
+ */
+/*#define HAS_TTYNAME_R / **/
+#define TTYNAME_R_PROTO 0 /**/
+
+/* HAS_UNION_SEMUN:
+ * This symbol, if defined, indicates that the union semun is
+ * defined by including <sys/sem.h>. If not, the user code
+ * probably needs to define it as:
+ * union semun {
+ * int val;
+ * struct semid_ds *buf;
+ * unsigned short *array;
+ * }
+ */
+/* USE_SEMCTL_SEMUN:
+ * This symbol, if defined, indicates that union semun is
+ * used for semctl IPC_STAT.
+ */
+/* USE_SEMCTL_SEMID_DS:
+ * This symbol, if defined, indicates that struct semid_ds * is
+ * used for semctl IPC_STAT.
+ */
+/*#define HAS_UNION_SEMUN / **/
+/*#define USE_SEMCTL_SEMUN / **/
+/*#define USE_SEMCTL_SEMID_DS / **/
+
+/* HAS_VFORK:
+ * This symbol, if defined, indicates that vfork() exists.
+ */
+/*#define HAS_VFORK / **/
+
+/* HAS_PSEUDOFORK:
+ * This symbol, if defined, indicates that an emulation of the
+ * fork routine is available.
+ */
+/*#define HAS_PSEUDOFORK / **/
+
+/* Signal_t:
+ * This symbol's value is either "void" or "int", corresponding to the
+ * appropriate return type of a signal handler. Thus, you can declare
+ * a signal handler using "Signal_t (*handler)()", and define the
+ * handler using "Signal_t handler(sig)".
+ */
+#define Signal_t int /* Signal handler's return type */
+
+/* HASVOLATILE:
+ * This symbol, if defined, indicates that this C compiler knows about
+ * the volatile declaration.
+ */
+/*#define HASVOLATILE / **/
+#ifndef HASVOLATILE
+#define volatile
+#endif
+
+/* Fpos_t:
+ * This symbol holds the type used to declare file positions in libc.
+ * It can be fpos_t, long, uint, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Fpos_t int /* File position type */
+
+/* Gid_t_f:
+ * This symbol defines the format string used for printing a Gid_t.
+ */
+#define Gid_t_f "lu" /**/
+
+/* Gid_t_sign:
+ * This symbol holds the signedess of a Gid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Gid_t_sign 1 /* GID sign */
+
+/* Gid_t_size:
+ * This symbol holds the size of a Gid_t in bytes.
+ */
+#define Gid_t_size 4 /* GID size */
+
+/* Gid_t:
+ * This symbol holds the return type of getgid() and the type of
+ * argument to setrgid() and related functions. Typically,
+ * it is the type of group ids in the kernel. It can be int, ushort,
+ * gid_t, etc... It may be necessary to include <sys/types.h> to get
+ * any typedef'ed information.
+ */
+#define Gid_t int /* Type for getgid(), etc... */
+
+/* I_DIRENT:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <dirent.h>. Using this symbol also triggers the definition
+ * of the Direntry_t define which ends up being 'struct dirent' or
+ * 'struct direct' depending on the availability of <dirent.h>.
+ */
+/* DIRNAMLEN:
+ * This symbol, if defined, indicates to the C program that the length
+ * of directory entry names is provided by a d_namlen field. Otherwise
+ * you need to do strlen() on the d_name field.
+ */
+/* Direntry_t:
+ * This symbol is set to 'struct direct' or 'struct dirent' depending on
+ * whether dirent is available or not. You should use this pseudo type to
+ * portably declare your directory entries.
+ */
+#define I_DIRENT /**/
+/*#define DIRNAMLEN / **/
+#define Direntry_t struct dirent
+
+/* I_GRP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <grp.h>.
+ */
+/* GRPASSWD:
+ * This symbol, if defined, indicates to the C program that struct group
+ * in <grp.h> contains gr_passwd.
+ */
+/*#define I_GRP / **/
+/*#define GRPASSWD / **/
+
+/* I_MACH_CTHREADS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <mach/cthreads.h>.
+ */
+/*#define I_MACH_CTHREADS / **/
+
+/* I_NDBM:
+ * This symbol, if defined, indicates that <ndbm.h> exists and should
+ * be included.
+ */
+/* I_GDBMNDBM:
+ * This symbol, if defined, indicates that <gdbm/ndbm.h> exists and should
+ * be included. This was the location of the ndbm.h compatibility file
+ * in RedHat 7.1.
+ */
+/* I_GDBM_NDBM:
+ * This symbol, if defined, indicates that <gdbm-ndbm.h> exists and should
+ * be included. This is the location of the ndbm.h compatibility file
+ * in Debian 4.0.
+ */
+/* NDBM_H_USES_PROTOTYPES:
+ * This symbol, if defined, indicates that <ndbm.h> uses real ANSI C
+ * prototypes instead of K&R style function declarations without any
+ * parameter information. While ANSI C prototypes are supported in C++,
+ * K&R style function declarations will yield errors.
+ */
+/* GDBMNDBM_H_USES_PROTOTYPES:
+ * This symbol, if defined, indicates that <gdbm/ndbm.h> uses real ANSI C
+ * prototypes instead of K&R style function declarations without any
+ * parameter information. While ANSI C prototypes are supported in C++,
+ * K&R style function declarations will yield errors.
+ */
+/* GDBM_NDBM_H_USES_PROTOTYPES:
+ * This symbol, if defined, indicates that <gdbm-ndbm.h> uses real ANSI C
+ * prototypes instead of K&R style function declarations without any
+ * parameter information. While ANSI C prototypes are supported in C++,
+ * K&R style function declarations will yield errors.
+ */
+/*#define I_NDBM / **/
+/*#define I_GDBMNDBM / **/
+/*#define I_GDBM_NDBM / **/
+/*#define NDBM_H_USES_PROTOTYPES / **/
+/*#define GDBMNDBM_H_USES_PROTOTYPES / **/
+/*#define GDBM_NDBM_H_USES_PROTOTYPES / **/
+
+/* I_NETDB:
+ * This symbol, if defined, indicates that <netdb.h> exists and
+ * should be included.
+ */
+/*#define I_NETDB / **/
+
+/* I_NET_ERRNO:
+ * This symbol, if defined, indicates that <net/errno.h> exists and
+ * should be included.
+ */
+/*#define I_NET_ERRNO / **/
+
+/* I_PTHREAD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pthread.h>.
+ */
+/*#define I_PTHREAD / **/
+
+/* I_PWD:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <pwd.h>.
+ */
+/* PWQUOTA:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_quota.
+ */
+/* PWAGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_age.
+ */
+/* PWCHANGE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_change.
+ */
+/* PWCLASS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_class.
+ */
+/* PWEXPIRE:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_expire.
+ */
+/* PWCOMMENT:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_comment.
+ */
+/* PWGECOS:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_gecos.
+ */
+/* PWPASSWD:
+ * This symbol, if defined, indicates to the C program that struct passwd
+ * contains pw_passwd.
+ */
+/*#define I_PWD / **/
+/*#define PWQUOTA / **/
+/*#define PWAGE / **/
+/*#define PWCHANGE / **/
+/*#define PWCLASS / **/
+/*#define PWEXPIRE / **/
+/*#define PWCOMMENT / **/
+/*#define PWGECOS / **/
+/*#define PWPASSWD / **/
+
+/* I_SYS_ACCESS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/access.h>.
+ */
+/*#define I_SYS_ACCESS / **/
+
+/* I_SYS_SECURITY:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/security.h>.
+ */
+/*#define I_SYS_SECURITY / **/
+
+/* I_SYSUIO:
+ * This symbol, if defined, indicates that <sys/uio.h> exists and
+ * should be included.
+ */
+/*#define I_SYSUIO / **/
+
+/* I_STDARG:
+ * This symbol, if defined, indicates that <stdarg.h> exists and should
+ * be included.
+ */
+/* I_VARARGS:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <varargs.h>.
+ */
+#define I_STDARG /**/
+/*#define I_VARARGS / **/
+
+/* PERL_INC_VERSION_LIST:
+ * This variable specifies the list of subdirectories in over
+ * which perl.c:incpush() and lib/lib.pm will automatically
+ * search when adding directories to @INC, in a format suitable
+ * for a C initialization string. See the inc_version_list entry
+ * in Porting/Glossary for more details.
+ */
+/*#define PERL_INC_VERSION_LIST NULL / **/
+
+/* INSTALL_USR_BIN_PERL:
+ * This symbol, if defined, indicates that Perl is to be installed
+ * also as /usr/bin/perl.
+ */
+/*#define INSTALL_USR_BIN_PERL / **/
+
+/* Off_t:
+ * This symbol holds the type used to declare offsets in the kernel.
+ * It can be int, long, off_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+/* LSEEKSIZE:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+/* Off_t_size:
+ * This symbol holds the number of bytes used by the Off_t.
+ */
+#define Off_t int /* <offset> type */
+#define LSEEKSIZE 4 /* <offset> size */
+#define Off_t_size 4 /* <offset> size */
+
+/* Free_t:
+ * This variable contains the return type of free(). It is usually
+ * void, but occasionally int.
+ */
+/* Malloc_t:
+ * This symbol is the type of pointer returned by malloc and realloc.
+ */
+#define Malloc_t void * /**/
+#define Free_t void /**/
+
+/* PERL_MALLOC_WRAP:
+ * This symbol, if defined, indicates that we'd like malloc wrap checks.
+ */
+/*#define PERL_MALLOC_WRAP / **/
+
+/* MYMALLOC:
+ * This symbol, if defined, indicates that we're using our own malloc.
+ */
+/*#define MYMALLOC / **/
+
+/* Mode_t:
+ * This symbol holds the type used to declare file modes
+ * for systems calls. It is usually mode_t, but may be
+ * int or unsigned short. It may be necessary to include <sys/types.h>
+ * to get any typedef'ed information.
+ */
+#define Mode_t int /* file mode parameter for system calls */
+
+/* Netdb_host_t:
+ * This symbol holds the type used for the 1st argument
+ * to gethostbyaddr().
+ */
+/* Netdb_hlen_t:
+ * This symbol holds the type used for the 2nd argument
+ * to gethostbyaddr().
+ */
+/* Netdb_name_t:
+ * This symbol holds the type used for the argument to
+ * gethostbyname().
+ */
+/* Netdb_net_t:
+ * This symbol holds the type used for the 1st argument to
+ * getnetbyaddr().
+ */
+#define Netdb_host_t const char * /**/
+#define Netdb_hlen_t int /**/
+#define Netdb_name_t const char * /**/
+#define Netdb_net_t unsigned long /**/
+
+/* PERL_OTHERLIBDIRS:
+ * This variable contains a colon-separated set of paths for the perl
+ * binary to search for additional library files or modules.
+ * These directories will be tacked to the end of @INC.
+ * Perl will automatically search below each path for version-
+ * and architecture-specific directories. See PERL_INC_VERSION_LIST
+ * for more details.
+ */
+/*#define PERL_OTHERLIBDIRS " " / **/
+
+/* Pid_t:
+ * This symbol holds the type used to declare process ids in the kernel.
+ * It can be int, uint, pid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Pid_t int /* PID type */
+
+/* PRIVLIB:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ */
+/* PRIVLIB_EXP:
+ * This symbol contains the ~name expanded version of PRIVLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+#define PRIVLIB "/usr/local/lib/perl5/5.11" /**/
+#define PRIVLIB_EXP "/usr/local/lib/perl5/5.11" /**/
+
+/* CAN_PROTOTYPE:
+ * If defined, this macro indicates that the C compiler can handle
+ * function prototypes.
+ */
+/* _:
+ * This macro is used to declare function parameters for folks who want
+ * to make declarations with prototypes using a different style than
+ * the above macros. Use double parentheses. For example:
+ *
+ * int main _((int argc, char *argv[]));
+ */
+/*#define CAN_PROTOTYPE / **/
+#ifdef CAN_PROTOTYPE
+#define _(args) args
+#else
+#define _(args) ()
+#endif
+
+/* Select_fd_set_t:
+ * This symbol holds the type used for the 2nd, 3rd, and 4th
+ * arguments to select. Usually, this is 'fd_set *', if HAS_FD_SET
+ * is defined, and 'int *' otherwise. This is only useful if you
+ * have select(), of course.
+ */
+#define Select_fd_set_t int /**/
+
+/* SH_PATH:
+ * This symbol contains the full pathname to the shell used on this
+ * on this system to execute Bourne shell scripts. Usually, this will be
+ * /bin/sh, though it's possible that some systems will have /bin/ksh,
+ * /bin/pdksh, /bin/ash, /bin/bash, or even something such as
+ * D:/bin/sh.exe.
+ */
+#define SH_PATH "/bin/sh" /**/
+
+/* SIG_NAME:
+ * This symbol contains a list of signal names in order of
+ * signal number. This is intended
+ * to be used as a static array initialization, like this:
+ * char *sig_name[] = { SIG_NAME };
+ * The signals in the list are separated with commas, and each signal
+ * is surrounded by double quotes. There is no leading SIG in the signal
+ * name, i.e. SIGQUIT is known as "QUIT".
+ * Gaps in the signal numbers (up to NSIG) are filled in with NUMnn,
+ * etc., where nn is the actual signal number (e.g. NUM37).
+ * The signal number for sig_name[i] is stored in sig_num[i].
+ * The last element is 0 to terminate the list with a NULL. This
+ * corresponds to the 0 at the end of the sig_name_init list.
+ * Note that this variable is initialized from the sig_name_init,
+ * not from sig_name (which is unused).
+ */
+/* SIG_NUM:
+ * This symbol contains a list of signal numbers, in the same order as the
+ * SIG_NAME list. It is suitable for static array initialization, as in:
+ * int sig_num[] = { SIG_NUM };
+ * The signals in the list are separated with commas, and the indices
+ * within that list and the SIG_NAME list match, so it's easy to compute
+ * the signal name from a number or vice versa at the price of a small
+ * dynamic linear lookup.
+ * Duplicates are allowed, but are moved to the end of the list.
+ * The signal number corresponding to sig_name[i] is sig_number[i].
+ * if (i < NSIG) then sig_number[i] == i.
+ * The last element is 0, corresponding to the 0 at the end of
+ * the sig_name_init list.
+ * Note that this variable is initialized from the sig_num_init,
+ * not from sig_num (which is unused).
+ */
+/* SIG_SIZE:
+ * This variable contains the number of elements of the SIG_NAME
+ * and SIG_NUM arrays, excluding the final NULL entry.
+ */
+#define SIG_NAME 0 /**/
+#define SIG_NUM 0 /**/
+#define SIG_SIZE 1 /**/
+
+/* SITEARCH:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ * The standard distribution will put nothing in this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-dependent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
+ */
+/* SITEARCH_EXP:
+ * This symbol contains the ~name expanded version of SITEARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define SITEARCH "/usr/local/lib/perl5/5.11/unknown" / **/
+/*#define SITEARCH_EXP "/usr/local/lib/perl5/5.11/unknown" / **/
+
+/* SITELIB:
+ * This symbol contains the name of the private library for this package.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world. The program
+ * should be prepared to do ~ expansion.
+ * The standard distribution will put nothing in this directory.
+ * After perl has been installed, users may install their own local
+ * architecture-independent modules in this directory with
+ * MakeMaker Makefile.PL
+ * or equivalent. See INSTALL for details.
+ */
+/* SITELIB_EXP:
+ * This symbol contains the ~name expanded version of SITELIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* SITELIB_STEM:
+ * This define is SITELIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
+ */
+#define SITELIB "/usr/local/lib/perl5/5.11" /**/
+#define SITELIB_EXP "/usr/local/lib/perl5/5.11" /**/
+#define SITELIB_STEM "/usr/local/lib/perl5" /**/
+
+/* Size_t_size:
+ * This symbol holds the size of a Size_t in bytes.
+ */
+#define Size_t_size 4 /* */
+
+/* Size_t:
+ * This symbol holds the type used to declare length parameters
+ * for string functions. It is usually size_t, but may be
+ * unsigned long, int, etc. It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Size_t size_t /* length paramater for string functions */
+
+/* Sock_size_t:
+ * This symbol holds the type used for the size argument of
+ * various socket calls (just the base type, not the pointer-to).
+ */
+#define Sock_size_t int /**/
+
+/* STDCHAR:
+ * This symbol is defined to be the type of char used in stdio.h.
+ * It has the values "unsigned char" or "char".
+ */
+#define STDCHAR char /**/
+
+/* Uid_t_f:
+ * This symbol defines the format string used for printing a Uid_t.
+ */
+#define Uid_t_f "lu" /**/
+
+/* Uid_t_sign:
+ * This symbol holds the signedess of a Uid_t.
+ * 1 for unsigned, -1 for signed.
+ */
+#define Uid_t_sign 1 /* UID sign */
+
+/* Uid_t_size:
+ * This symbol holds the size of a Uid_t in bytes.
+ */
+#define Uid_t_size 4 /* UID size */
+
+/* Uid_t:
+ * This symbol holds the type used to declare user ids in the kernel.
+ * It can be int, ushort, uid_t, etc... It may be necessary to include
+ * <sys/types.h> to get any typedef'ed information.
+ */
+#define Uid_t int /* UID type */
+
+/* USE_ITHREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the interpreter-based threading implementation.
+ */
+/* USE_5005THREADS:
+ * This symbol, if defined, indicates that Perl should be built to
+ * use the 5.005-based threading implementation.
+ * Only valid up to 5.8.x.
+ */
+/* OLD_PTHREADS_API:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use the old draft POSIX threads API.
+ */
+/* USE_REENTRANT_API:
+ * This symbol, if defined, indicates that Perl should
+ * try to use the various _r versions of library functions.
+ * This is extremely experimental.
+ */
+/*#define USE_5005THREADS / **/
+/*#define USE_ITHREADS / **/
+#if defined(USE_5005THREADS) && !defined(USE_ITHREADS)
+#define USE_THREADS /* until src is revised*/
+#endif
+/*#define OLD_PTHREADS_API / **/
+/*#define USE_REENTRANT_API / **/
+
+/* PERL_VENDORARCH:
+ * If defined, this symbol contains the name of a private library.
+ * The library is private in the sense that it needn't be in anyone's
+ * execution path, but it should be accessible by the world.
+ * It may have a ~ on the front.
+ * The standard distribution will put nothing in this directory.
+ * Vendors who distribute perl may wish to place their own
+ * architecture-dependent modules and extensions in this directory with
+ * MakeMaker Makefile.PL INSTALLDIRS=vendor
+ * or equivalent. See INSTALL for details.
+ */
+/* PERL_VENDORARCH_EXP:
+ * This symbol contains the ~name expanded version of PERL_VENDORARCH, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/*#define PERL_VENDORARCH "" / **/
+/*#define PERL_VENDORARCH_EXP "" / **/
+
+/* PERL_VENDORLIB_EXP:
+ * This symbol contains the ~name expanded version of VENDORLIB, to be used
+ * in programs that are not prepared to deal with ~ expansion at run-time.
+ */
+/* PERL_VENDORLIB_STEM:
+ * This define is PERL_VENDORLIB_EXP with any trailing version-specific component
+ * removed. The elements in inc_version_list (inc_version_list.U) can
+ * be tacked onto this variable to generate a list of directories to search.
+ */
+/*#define PERL_VENDORLIB_EXP "" / **/
+/*#define PERL_VENDORLIB_STEM "" / **/
+
+/* VOIDFLAGS:
+ * This symbol indicates how much support of the void type is given by this
+ * compiler. What various bits mean:
+ *
+ * 1 = supports declaration of void
+ * 2 = supports arrays of pointers to functions returning void
+ * 4 = supports comparisons between pointers to void functions and
+ * addresses of void functions
+ * 8 = suports declaration of generic void pointers
+ *
+ * The package designer should define VOIDUSED to indicate the requirements
+ * of the package. This can be done either by #defining VOIDUSED before
+ * including config.h, or by defining defvoidused in Myinit.U. If the
+ * latter approach is taken, only those flags will be tested. If the
+ * level of void support necessary is not present, defines void to int.
+ */
+#ifndef VOIDUSED
+#define VOIDUSED 1
+#endif
+#define VOIDFLAGS 1
+#if (VOIDFLAGS & VOIDUSED) != VOIDUSED
+#define void int /* is void to be avoided? */
+#define M_VOID /* Xenix strikes again */
+#endif
+
+/* USE_CROSS_COMPILE:
+ * This symbol, if defined, indicates that Perl is being cross-compiled.
+ */
+/* PERL_TARGETARCH:
+ * This symbol, if defined, indicates the target architecture
+ * Perl has been cross-compiled to. Undefined if not a cross-compile.
+ */
+#ifndef USE_CROSS_COMPILE
+/*#define USE_CROSS_COMPILE / **/
+#define PERL_TARGETARCH "" /**/
+#endif
+
+/* MEM_ALIGNBYTES:
+ * This symbol contains the number of bytes required to align a
+ * double, or a long double when applicable. Usual values are 2,
+ * 4 and 8. The default is eight, for safety.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+# define MEM_ALIGNBYTES 8
+#else
+#define MEM_ALIGNBYTES 4
+#endif
+
+/* BYTEORDER:
+ * This symbol holds the hexadecimal constant defined in byteorder,
+ * in a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...
+ * If the compiler supports cross-compiling or multiple-architecture
+ * binaries (eg. on NeXT systems), use compiler-defined macros to
+ * determine the byte order.
+ * On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
+ * Binaries (MAB) on either big endian or little endian machines.
+ * The endian-ness is available at compile-time. This only matters
+ * for perl, where the config.h can be generated and installed on
+ * one system, and used by a different architecture to build an
+ * extension. Older versions of NeXT that might not have
+ * defined either *_ENDIAN__ were all on Motorola 680x0 series,
+ * so the default case (for NeXT) is big endian to catch them.
+ * This might matter for NeXT 3.0.
+ */
+#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
+# ifdef __LITTLE_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x1234
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x12345678
+# endif
+# endif
+# else
+# ifdef __BIG_ENDIAN__
+# if LONGSIZE == 4
+# define BYTEORDER 0x4321
+# else
+# if LONGSIZE == 8
+# define BYTEORDER 0x87654321
+# endif
+# endif
+# endif
+# endif
+# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
+# define BYTEORDER 0x4321
+# endif
+#else
+#define BYTEORDER 0x1234 /* large digits for MSB */
+#endif /* NeXT */
+
+/* CASTI32:
+ * This symbol is defined if the C compiler can cast negative
+ * or large floating point numbers to 32-bit ints.
+ */
+/*#define CASTI32 / **/
+
+/* CASTNEGFLOAT:
+ * This symbol is defined if the C compiler can cast negative
+ * numbers to unsigned longs, ints and shorts.
+ */
+/* CASTFLAGS:
+ * This symbol contains flags that say what difficulties the compiler
+ * has casting odd floating values to unsigned long:
+ * 0 = ok
+ * 1 = couldn't cast < 0
+ * 2 = couldn't cast >= 0x80000000
+ * 4 = couldn't cast in argument expression list
+ */
+/*#define CASTNEGFLOAT / **/
+#define CASTFLAGS 0 /**/
+
+/* VOID_CLOSEDIR:
+ * This symbol, if defined, indicates that the closedir() routine
+ * does not return a value.
+ */
+/*#define VOID_CLOSEDIR / **/
+
+/* HAS_FD_SET:
+ * This symbol, when defined, indicates presence of the fd_set typedef
+ * in <sys/types.h>
+ */
+/*#define HAS_FD_SET / **/
+
+/* Gconvert:
+ * This preprocessor macro is defined to convert a floating point
+ * number to a string without a trailing decimal point. This
+ * emulates the behavior of sprintf("%g"), but is sometimes much more
+ * efficient. If gconvert() is not available, but gcvt() drops the
+ * trailing decimal point, then gcvt() is used. If all else fails,
+ * a macro using sprintf("%g") is used. Arguments for the Gconvert
+ * macro are: value, number of digits, whether trailing zeros should
+ * be retained, and the output buffer.
+ * The usual values are:
+ * d_Gconvert='gconvert((x),(n),(t),(b))'
+ * d_Gconvert='gcvt((x),(n),(b))'
+ * d_Gconvert='sprintf((b),"%.*g",(n),(x))'
+ * The last two assume trailing zeros should not be kept.
+ */
+#define Gconvert(x,n,t,b) sprintf((b),"%.*g",(n),(x))
+
+/* HAS_GETPAGESIZE:
+ * This symbol, if defined, indicates that the getpagesize system call
+ * is available to get system page size, which is the granularity of
+ * many memory management calls.
+ */
+/*#define HAS_GETPAGESIZE / **/
+
+/* HAS_GNULIBC:
+ * This symbol, if defined, indicates to the C program that
+ * the GNU C library is being used. A better check is to use
+ * the __GLIBC__ and __GLIBC_MINOR__ symbols supplied with glibc.
+ */
+/*#define HAS_GNULIBC / **/
+#if defined(HAS_GNULIBC) && !defined(_GNU_SOURCE)
+# define _GNU_SOURCE
+#endif
+
+/* HAS_ISASCII:
+ * This manifest constant lets the C program know that isascii
+ * is available.
+ */
+/*#define HAS_ISASCII / **/
+
+/* HAS_LCHOWN:
+ * This symbol, if defined, indicates that the lchown routine is
+ * available to operate on a symbolic link (instead of following the
+ * link).
+ */
+/*#define HAS_LCHOWN / **/
+
+/* HAS_OPEN3:
+ * This manifest constant lets the C program know that the three
+ * argument form of open(2) is available.
+ */
+/*#define HAS_OPEN3 / **/
+
+/* HAS_SAFE_BCOPY:
+ * This symbol, if defined, indicates that the bcopy routine is available
+ * to copy potentially overlapping memory blocks. Normally, you should
+ * probably use memmove() or memcpy(). If neither is defined, roll your
+ * own version.
+ */
+/*#define HAS_SAFE_BCOPY / **/
+
+/* HAS_SAFE_MEMCPY:
+ * This symbol, if defined, indicates that the memcpy routine is available
+ * to copy potentially overlapping memory blocks. If you need to
+ * copy overlapping memory blocks, you should check HAS_MEMMOVE and
+ * use memmove() instead, if available.
+ */
+/*#define HAS_SAFE_MEMCPY / **/
+
+/* HAS_SANE_MEMCMP:
+ * This symbol, if defined, indicates that the memcmp routine is available
+ * and can be used to compare relative magnitudes of chars with their high
+ * bits set. If it is not defined, roll your own version.
+ */
+/*#define HAS_SANE_MEMCMP / **/
+
+/* HAS_SIGACTION:
+ * This symbol, if defined, indicates that Vr4's sigaction() routine
+ * is available.
+ */
+/*#define HAS_SIGACTION / **/
+
+/* HAS_SIGSETJMP:
+ * This variable indicates to the C program that the sigsetjmp()
+ * routine is available to save the calling process's registers
+ * and stack environment for later use by siglongjmp(), and
+ * to optionally save the process's signal mask. See
+ * Sigjmp_buf, Sigsetjmp, and Siglongjmp.
+ */
+/* Sigjmp_buf:
+ * This is the buffer type to be used with Sigsetjmp and Siglongjmp.
+ */
+/* Sigsetjmp:
+ * This macro is used in the same way as sigsetjmp(), but will invoke
+ * traditional setjmp() if sigsetjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+/* Siglongjmp:
+ * This macro is used in the same way as siglongjmp(), but will invoke
+ * traditional longjmp() if siglongjmp isn't available.
+ * See HAS_SIGSETJMP.
+ */
+/*#define HAS_SIGSETJMP / **/
+#ifdef HAS_SIGSETJMP
+#define Sigjmp_buf sigjmp_buf
+#define Sigsetjmp(buf,save_mask) sigsetjmp((buf),(save_mask))
+#define Siglongjmp(buf,retval) siglongjmp((buf),(retval))
+#else
+#define Sigjmp_buf jmp_buf
+#define Sigsetjmp(buf,save_mask) setjmp((buf))
+#define Siglongjmp(buf,retval) longjmp((buf),(retval))
+#endif
+
+/* USE_STDIO_PTR:
+ * This symbol is defined if the _ptr and _cnt fields (or similar)
+ * of the stdio FILE structure can be used to access the stdio buffer
+ * for a file handle. If this is defined, then the FILE_ptr(fp)
+ * and FILE_cnt(fp) macros will also be defined and should be used
+ * to access these fields.
+ */
+/* FILE_ptr:
+ * This macro is used to access the _ptr field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_PTR_LVALUE:
+ * This symbol is defined if the FILE_ptr macro can be used as an
+ * lvalue.
+ */
+/* FILE_cnt:
+ * This macro is used to access the _cnt field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_PTR is defined.
+ */
+/* STDIO_CNT_LVALUE:
+ * This symbol is defined if the FILE_cnt macro can be used as an
+ * lvalue.
+ */
+/* STDIO_PTR_LVAL_SETS_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n has the side effect of decreasing the
+ * value of File_cnt(fp) by n.
+ */
+/* STDIO_PTR_LVAL_NOCHANGE_CNT:
+ * This symbol is defined if using the FILE_ptr macro as an lvalue
+ * to increase the pointer by n leaves File_cnt(fp) unchanged.
+ */
+/*#define USE_STDIO_PTR / **/
+#ifdef USE_STDIO_PTR
+#define FILE_ptr(fp) ((fp)->_IO_read_ptr)
+/*#define STDIO_PTR_LVALUE / **/
+#define FILE_cnt(fp) ((fp)->_IO_read_end - (fp)->_IO_read_ptr)
+/*#define STDIO_CNT_LVALUE / **/
+/*#define STDIO_PTR_LVAL_SETS_CNT / **/
+/*#define STDIO_PTR_LVAL_NOCHANGE_CNT / **/
+#endif
+
+/* USE_STDIO_BASE:
+ * This symbol is defined if the _base field (or similar) of the
+ * stdio FILE structure can be used to access the stdio buffer for
+ * a file handle. If this is defined, then the FILE_base(fp) macro
+ * will also be defined and should be used to access this field.
+ * Also, the FILE_bufsiz(fp) macro will be defined and should be used
+ * to determine the number of bytes in the buffer. USE_STDIO_BASE
+ * will never be defined unless USE_STDIO_PTR is.
+ */
+/* FILE_base:
+ * This macro is used to access the _base field (or equivalent) of the
+ * FILE structure pointed to by its argument. This macro will always be
+ * defined if USE_STDIO_BASE is defined.
+ */
+/* FILE_bufsiz:
+ * This macro is used to determine the number of bytes in the I/O
+ * buffer pointed to by _base field (or equivalent) of the FILE
+ * structure pointed to its argument. This macro will always be defined
+ * if USE_STDIO_BASE is defined.
+ */
+/*#define USE_STDIO_BASE / **/
+#ifdef USE_STDIO_BASE
+#define FILE_base(fp) ((fp)->_IO_read_base)
+#define FILE_bufsiz(fp) ((fp)->_IO_read_end - (fp)->_IO_read_base)
+#endif
+
+/* HAS_VPRINTF:
+ * This symbol, if defined, indicates that the vprintf routine is available
+ * to printf with a pointer to an argument list. If unavailable, you
+ * may need to write your own, probably in terms of _doprnt().
+ */
+/* USE_CHAR_VSPRINTF:
+ * This symbol is defined if this system has vsprintf() returning type
+ * (char*). The trend seems to be to declare it as "int vsprintf()". It
+ * is up to the package author to declare vsprintf correctly based on the
+ * symbol.
+ */
+#define HAS_VPRINTF /**/
+/*#define USE_CHAR_VSPRINTF / **/
+
+/* DOUBLESIZE:
+ * This symbol contains the size of a double, so that the C preprocessor
+ * can make decisions based on it.
+ */
+#define DOUBLESIZE 8 /**/
+
+/* I_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <time.h>.
+ */
+/* I_SYS_TIME:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h>.
+ */
+/* I_SYS_TIME_KERNEL:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <sys/time.h> with KERNEL defined.
+ */
+/* HAS_TM_TM_ZONE:
+ * This symbol, if defined, indicates to the C program that
+ * the struct tm has a tm_zone field.
+ */
+/* HAS_TM_TM_GMTOFF:
+ * This symbol, if defined, indicates to the C program that
+ * the struct tm has a tm_gmtoff field.
+ */
+#define I_TIME /**/
+/*#define I_SYS_TIME / **/
+/*#define I_SYS_TIME_KERNEL / **/
+/*#define HAS_TM_TM_ZONE / **/
+/*#define HAS_TM_TM_GMTOFF / **/
+
+/* VAL_O_NONBLOCK:
+ * This symbol is to be used during open() or fcntl(F_SETFL) to turn on
+ * non-blocking I/O for the file descriptor. Note that there is no way
+ * back, i.e. you cannot turn it blocking again this way. If you wish to
+ * alternatively switch between blocking and non-blocking, use the
+ * ioctl(FIOSNBIO) call instead, but that is not supported by all devices.
+ */
+/* VAL_EAGAIN:
+ * This symbol holds the errno error code set by read() when no data was
+ * present on the non-blocking file descriptor.
+ */
+/* RD_NODATA:
+ * This symbol holds the return code from read() when no data is present
+ * on the non-blocking file descriptor. Be careful! If EOF_NONBLOCK is
+ * not defined, then you can't distinguish between no data and EOF by
+ * issuing a read(). You'll have to find another way to tell for sure!
+ */
+/* EOF_NONBLOCK:
+ * This symbol, if defined, indicates to the C program that a read() on
+ * a non-blocking file descriptor will return 0 on EOF, and not the value
+ * held in RD_NODATA (-1 usually, in that case!).
+ */
+#define VAL_O_NONBLOCK O_NONBLOCK
+#define VAL_EAGAIN EAGAIN
+#define RD_NODATA -1
+#undef EOF_NONBLOCK
+
+/* PTRSIZE:
+ * This symbol contains the size of a pointer, so that the C preprocessor
+ * can make decisions based on it. It will be sizeof(void *) if
+ * the compiler supports (void *); otherwise it will be
+ * sizeof(char *).
+ */
+#define PTRSIZE 4 /**/
+
+/* Drand01:
+ * This macro is to be used to generate uniformly distributed
+ * random numbers over the range [0., 1.[. You may have to supply
+ * an 'extern double drand48();' in your program since SunOS 4.1.3
+ * doesn't provide you with anything relevant in its headers.
+ * See HAS_DRAND48_PROTO.
+ */
+/* Rand_seed_t:
+ * This symbol defines the type of the argument of the
+ * random seed function.
+ */
+/* seedDrand01:
+ * This symbol defines the macro to be used in seeding the
+ * random number generator (see Drand01).
+ */
+/* RANDBITS:
+ * This symbol indicates how many bits are produced by the
+ * function used to generate normalized random numbers.
+ * Values include 15, 16, 31, and 48.
+ */
+#define Drand01() ((rand() & 0x7FFF) / (double) ((unsigned long)1 << 15)) /**/
+#define Rand_seed_t int /**/
+#define seedDrand01(x) srand((Rand_seed_t)x) /**/
+#define RANDBITS 48 /**/
+
+/* SSize_t:
+ * This symbol holds the type used by functions that return
+ * a count of bytes or an error condition. It must be a signed type.
+ * It is usually ssize_t, but may be long or int, etc.
+ * It may be necessary to include <sys/types.h> or <unistd.h>
+ * to get any typedef'ed information.
+ * We will pick a type such that sizeof(SSize_t) == sizeof(Size_t).
+ */
+#define SSize_t int /* signed count of bytes */
+
+/* EBCDIC:
+ * This symbol, if defined, indicates that this system uses
+ * EBCDIC encoding.
+ */
+/*#define EBCDIC / **/
+
+/* PERL_USE_DEVEL:
+ * This symbol, if defined, indicates that Perl was configured with
+ * -Dusedevel, to enable development features. This should not be
+ * done for production builds.
+ */
+/*#define PERL_USE_DEVEL / **/
+
+/* HAS_ATOLF:
+ * This symbol, if defined, indicates that the atolf routine is
+ * available to convert strings into long doubles.
+ */
+/*#define HAS_ATOLF / **/
+
+/* HAS_ATOLL:
+ * This symbol, if defined, indicates that the atoll routine is
+ * available to convert strings into long longs.
+ */
+/*#define HAS_ATOLL / **/
+
+/* HAS__FWALK:
+ * This symbol, if defined, indicates that the _fwalk system call is
+ * available to apply a function to all the file handles.
+ */
+/*#define HAS__FWALK / **/
+
+/* HAS_AINTL:
+ * This symbol, if defined, indicates that the aintl routine is
+ * available. If copysignl is also present we can emulate modfl.
+ */
+/*#define HAS_AINTL / **/
+
+/* HAS_BUILTIN_CHOOSE_EXPR:
+ * Can we handle GCC builtin for compile-time ternary-like expressions
+ */
+/* HAS_BUILTIN_EXPECT:
+ * Can we handle GCC builtin for telling that certain values are more
+ * likely
+ */
+/*#define HAS_BUILTIN_EXPECT / **/
+/*#define HAS_BUILTIN_CHOOSE_EXPR / **/
+
+/* HAS_C99_VARIADIC_MACROS:
+ * If defined, the compiler supports C99 variadic macros.
+ */
+/*#define HAS_C99_VARIADIC_MACROS / **/
+
+/* HAS_CLASS:
+ * This symbol, if defined, indicates that the class routine is
+ * available to classify doubles. Available for example in AIX.
+ * The returned values are defined in <float.h> and are:
+ *
+ * FP_PLUS_NORM Positive normalized, nonzero
+ * FP_MINUS_NORM Negative normalized, nonzero
+ * FP_PLUS_DENORM Positive denormalized, nonzero
+ * FP_MINUS_DENORM Negative denormalized, nonzero
+ * FP_PLUS_ZERO +0.0
+ * FP_MINUS_ZERO -0.0
+ * FP_PLUS_INF +INF
+ * FP_MINUS_INF -INF
+ * FP_NANS Signaling Not a Number (NaNS)
+ * FP_NANQ Quiet Not a Number (NaNQ)
+ */
+/*#define HAS_CLASS / **/
+
+/* HAS_CLEARENV:
+ * This symbol, if defined, indicates that the clearenv () routine is
+ * available for use.
+ */
+/*#define HAS_CLEARENV / **/
+
+/* HAS_STRUCT_CMSGHDR:
+ * This symbol, if defined, indicates that the struct cmsghdr
+ * is supported.
+ */
+/*#define HAS_STRUCT_CMSGHDR / **/
+
+/* HAS_COPYSIGNL:
+ * This symbol, if defined, indicates that the copysignl routine is
+ * available. If aintl is also present we can emulate modfl.
+ */
+/*#define HAS_COPYSIGNL / **/
+
+/* USE_CPLUSPLUS:
+ * This symbol, if defined, indicates that a C++ compiler was
+ * used to compiled Perl and will be used to compile extensions.
+ */
+/*#define USE_CPLUSPLUS / **/
+
+/* HAS_DBMINIT_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the dbminit() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int dbminit(char *);
+ */
+/*#define HAS_DBMINIT_PROTO / **/
+
+/* HAS_DIR_DD_FD:
+ * This symbol, if defined, indicates that the the DIR* dirstream
+ * structure contains a member variable named dd_fd.
+ */
+/*#define HAS_DIR_DD_FD / **/
+
+/* HAS_DIRFD:
+ * This manifest constant lets the C program know that dirfd
+ * is available.
+ */
+/*#define HAS_DIRFD / **/
+
+/* DLSYM_NEEDS_UNDERSCORE:
+ * This symbol, if defined, indicates that we need to prepend an
+ * underscore to the symbol name before calling dlsym(). This only
+ * makes sense if you *have* dlsym, which we will presume is the
+ * case if you're using dl_dlopen.xs.
+ */
+/*#define DLSYM_NEEDS_UNDERSCORE / **/
+
+/* HAS_FAST_STDIO:
+ * This symbol, if defined, indicates that the "fast stdio"
+ * is available to manipulate the stdio buffers directly.
+ */
+/*#define HAS_FAST_STDIO / **/
+
+/* HAS_FCHDIR:
+ * This symbol, if defined, indicates that the fchdir routine is
+ * available to change directory using a file descriptor.
+ */
+/*#define HAS_FCHDIR / **/
+
+/* FCNTL_CAN_LOCK:
+ * This symbol, if defined, indicates that fcntl() can be used
+ * for file locking. Normally on Unix systems this is defined.
+ * It may be undefined on VMS.
+ */
+/*#define FCNTL_CAN_LOCK / **/
+
+/* HAS_FINITE:
+ * This symbol, if defined, indicates that the finite routine is
+ * available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_FINITE / **/
+
+/* HAS_FINITEL:
+ * This symbol, if defined, indicates that the finitel routine is
+ * available to check whether a long double is finite
+ * (non-infinity non-NaN).
+ */
+/*#define HAS_FINITEL / **/
+
+/* HAS_FLOCK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the flock() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int flock(int, int);
+ */
+/*#define HAS_FLOCK_PROTO / **/
+
+/* HAS_FP_CLASS:
+ * This symbol, if defined, indicates that the fp_class routine is
+ * available to classify doubles. Available for example in Digital UNIX.
+ * The returned values are defined in <math.h> and are:
+ *
+ * FP_SNAN Signaling NaN (Not-a-Number)
+ * FP_QNAN Quiet NaN (Not-a-Number)
+ * FP_POS_INF +infinity
+ * FP_NEG_INF -infinity
+ * FP_POS_NORM Positive normalized
+ * FP_NEG_NORM Negative normalized
+ * FP_POS_DENORM Positive denormalized
+ * FP_NEG_DENORM Negative denormalized
+ * FP_POS_ZERO +0.0 (positive zero)
+ * FP_NEG_ZERO -0.0 (negative zero)
+ */
+/*#define HAS_FP_CLASS / **/
+
+/* HAS_FPCLASS:
+ * This symbol, if defined, indicates that the fpclass routine is
+ * available to classify doubles. Available for example in Solaris/SVR4.
+ * The returned values are defined in <ieeefp.h> and are:
+ *
+ * FP_SNAN signaling NaN
+ * FP_QNAN quiet NaN
+ * FP_NINF negative infinity
+ * FP_PINF positive infinity
+ * FP_NDENORM negative denormalized non-zero
+ * FP_PDENORM positive denormalized non-zero
+ * FP_NZERO negative zero
+ * FP_PZERO positive zero
+ * FP_NNORM negative normalized non-zero
+ * FP_PNORM positive normalized non-zero
+ */
+/*#define HAS_FPCLASS / **/
+
+/* HAS_FPCLASSIFY:
+ * This symbol, if defined, indicates that the fpclassify routine is
+ * available to classify doubles. Available for example in HP-UX.
+ * The returned values are defined in <math.h> and are
+ *
+ * FP_NORMAL Normalized
+ * FP_ZERO Zero
+ * FP_INFINITE Infinity
+ * FP_SUBNORMAL Denormalized
+ * FP_NAN NaN
+ *
+ */
+/*#define HAS_FPCLASSIFY / **/
+
+/* HAS_FPCLASSL:
+ * This symbol, if defined, indicates that the fpclassl routine is
+ * available to classify long doubles. Available for example in IRIX.
+ * The returned values are defined in <ieeefp.h> and are:
+ *
+ * FP_SNAN signaling NaN
+ * FP_QNAN quiet NaN
+ * FP_NINF negative infinity
+ * FP_PINF positive infinity
+ * FP_NDENORM negative denormalized non-zero
+ * FP_PDENORM positive denormalized non-zero
+ * FP_NZERO negative zero
+ * FP_PZERO positive zero
+ * FP_NNORM negative normalized non-zero
+ * FP_PNORM positive normalized non-zero
+ */
+/*#define HAS_FPCLASSL / **/
+
+/* HAS_FPOS64_T:
+ * This symbol will be defined if the C compiler supports fpos64_t.
+ */
+/*#define HAS_FPOS64_T / **/
+
+/* HAS_FREXPL:
+ * This symbol, if defined, indicates that the frexpl routine is
+ * available to break a long double floating-point number into
+ * a normalized fraction and an integral power of 2.
+ */
+/*#define HAS_FREXPL / **/
+
+/* HAS_STRUCT_FS_DATA:
+ * This symbol, if defined, indicates that the struct fs_data
+ * to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_FS_DATA / **/
+
+/* HAS_FSEEKO:
+ * This symbol, if defined, indicates that the fseeko routine is
+ * available to fseek beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FSEEKO / **/
+
+/* HAS_FSTATFS:
+ * This symbol, if defined, indicates that the fstatfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATFS / **/
+
+/* HAS_FSYNC:
+ * This symbol, if defined, indicates that the fsync routine is
+ * available to write a file's modified data and attributes to
+ * permanent storage.
+ */
+/*#define HAS_FSYNC / **/
+
+/* HAS_FTELLO:
+ * This symbol, if defined, indicates that the ftello routine is
+ * available to ftell beyond 32 bits (useful for ILP32 hosts).
+ */
+/*#define HAS_FTELLO / **/
+
+/* HAS_FUTIMES:
+ * This symbol, if defined, indicates that the futimes routine is
+ * available to change file descriptor time stamps with struct timevals.
+ */
+/*#define HAS_FUTIMES / **/
+
+/* HAS_GETCWD:
+ * This symbol, if defined, indicates that the getcwd routine is
+ * available to get the current working directory.
+ */
+/*#define HAS_GETCWD / **/
+
+/* HAS_GETESPWNAM:
+ * This symbol, if defined, indicates that the getespwnam system call is
+ * available to retrieve enchanced (shadow) password entries by name.
+ */
+/*#define HAS_GETESPWNAM / **/
+
+/* HAS_GETFSSTAT:
+ * This symbol, if defined, indicates that the getfsstat routine is
+ * available to stat filesystems in bulk.
+ */
+/*#define HAS_GETFSSTAT / **/
+
+/* HAS_GETITIMER:
+ * This symbol, if defined, indicates that the getitimer routine is
+ * available to return interval timers.
+ */
+/*#define HAS_GETITIMER / **/
+
+/* HAS_GETMNT:
+ * This symbol, if defined, indicates that the getmnt routine is
+ * available to get filesystem mount info by filename.
+ */
+/*#define HAS_GETMNT / **/
+
+/* HAS_GETMNTENT:
+ * This symbol, if defined, indicates that the getmntent routine is
+ * available to iterate through mounted file systems to get their info.
+ */
+/*#define HAS_GETMNTENT / **/
+
+/* HAS_GETPRPWNAM:
+ * This symbol, if defined, indicates that the getprpwnam system call is
+ * available to retrieve protected (shadow) password entries by name.
+ */
+/*#define HAS_GETPRPWNAM / **/
+
+/* HAS_GETSPNAM:
+ * This symbol, if defined, indicates that the getspnam system call is
+ * available to retrieve SysV shadow password entries by name.
+ */
+/*#define HAS_GETSPNAM / **/
+
+/* HAS_HASMNTOPT:
+ * This symbol, if defined, indicates that the hasmntopt routine is
+ * available to query the mount options of file systems.
+ */
+/*#define HAS_HASMNTOPT / **/
+
+/* HAS_ILOGBL:
+ * This symbol, if defined, indicates that the ilogbl routine is
+ * available. If scalbnl is also present we can emulate frexpl.
+ */
+/*#define HAS_ILOGBL / **/
+
+/* HAS_INT64_T:
+ * This symbol will defined if the C compiler supports int64_t.
+ * Usually the <inttypes.h> needs to be included, but sometimes
+ * <sys/types.h> is enough.
+ */
+/*#define HAS_INT64_T / **/
+
+/* HAS_ISFINITE:
+ * This symbol, if defined, indicates that the isfinite routine is
+ * available to check whether a double is finite (non-infinity non-NaN).
+ */
+/*#define HAS_ISFINITE / **/
+
+/* HAS_ISINF:
+ * This symbol, if defined, indicates that the isinf routine is
+ * available to check whether a double is an infinity.
+ */
+/*#define HAS_ISINF / **/
+
+/* HAS_ISNAN:
+ * This symbol, if defined, indicates that the isnan routine is
+ * available to check whether a double is a NaN.
+ */
+/*#define HAS_ISNAN / **/
+
+/* HAS_ISNANL:
+ * This symbol, if defined, indicates that the isnanl routine is
+ * available to check whether a long double is a NaN.
+ */
+/*#define HAS_ISNANL / **/
+
+/* HAS_LDBL_DIG:
+ * This symbol, if defined, indicates that this system's <float.h>
+ * or <limits.h> defines the symbol LDBL_DIG, which is the number
+ * of significant digits in a long double precision number. Unlike
+ * for DBL_DIG, there's no good guess for LDBL_DIG if it is undefined.
+ */
+/*#define HAS_LDBL_DIG / * */
+
+/* LIBM_LIB_VERSION:
+ * This symbol, if defined, indicates that libm exports _LIB_VERSION
+ * and that math.h defines the enum to manipulate it.
+ */
+/*#define LIBM_LIB_VERSION / **/
+
+/* HAS_MADVISE:
+ * This symbol, if defined, indicates that the madvise system call is
+ * available to map a file into memory.
+ */
+/*#define HAS_MADVISE / **/
+
+/* HAS_MALLOC_SIZE:
+ * This symbol, if defined, indicates that the malloc_size
+ * routine is available for use.
+ */
+/*#define HAS_MALLOC_SIZE / **/
+
+/* HAS_MALLOC_GOOD_SIZE:
+ * This symbol, if defined, indicates that the malloc_good_size
+ * routine is available for use.
+ */
+/*#define HAS_MALLOC_GOOD_SIZE / **/
+
+/* HAS_MKDTEMP:
+ * This symbol, if defined, indicates that the mkdtemp routine is
+ * available to exclusively create a uniquely named temporary directory.
+ */
+/*#define HAS_MKDTEMP / **/
+
+/* HAS_MKSTEMPS:
+ * This symbol, if defined, indicates that the mkstemps routine is
+ * available to excluslvely create and open a uniquely named
+ * (with a suffix) temporary file.
+ */
+/*#define HAS_MKSTEMPS / **/
+
+/* HAS_MODFL:
+ * This symbol, if defined, indicates that the modfl routine is
+ * available to split a long double x into a fractional part f and
+ * an integer part i such that |f| < 1.0 and (f + i) = x.
+ */
+/* HAS_MODFL_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the modfl() function. Otherwise, it is up
+ * to the program to supply one.
+ */
+/* HAS_MODFL_POW32_BUG:
+ * This symbol, if defined, indicates that the modfl routine is
+ * broken for long doubles >= pow(2, 32).
+ * For example from 4294967303.150000 one would get 4294967302.000000
+ * and 1.150000. The bug has been seen in certain versions of glibc,
+ * release 2.2.2 is known to be okay.
+ */
+/*#define HAS_MODFL / **/
+/*#define HAS_MODFL_PROTO / **/
+/*#define HAS_MODFL_POW32_BUG / **/
+
+/* HAS_MPROTECT:
+ * This symbol, if defined, indicates that the mprotect system call is
+ * available to modify the access protection of a memory mapped file.
+ */
+/*#define HAS_MPROTECT / **/
+
+/* HAS_STRUCT_MSGHDR:
+ * This symbol, if defined, indicates that the struct msghdr
+ * is supported.
+ */
+/*#define HAS_STRUCT_MSGHDR / **/
+
+/* HAS_NL_LANGINFO:
+ * This symbol, if defined, indicates that the nl_langinfo routine is
+ * available to return local data. You will also need <langinfo.h>
+ * and therefore I_LANGINFO.
+ */
+/*#define HAS_NL_LANGINFO / **/
+
+/* HAS_OFF64_T:
+ * This symbol will be defined if the C compiler supports off64_t.
+ */
+/*#define HAS_OFF64_T / **/
+
+/* HAS_PROCSELFEXE:
+ * This symbol is defined if PROCSELFEXE_PATH is a symlink
+ * to the absolute pathname of the executing program.
+ */
+/* PROCSELFEXE_PATH:
+ * If HAS_PROCSELFEXE is defined this symbol is the filename
+ * of the symbolic link pointing to the absolute pathname of
+ * the executing program.
+ */
+/*#define HAS_PROCSELFEXE / **/
+#if defined(HAS_PROCSELFEXE) && !defined(PROCSELFEXE_PATH)
+#define PROCSELFEXE_PATH /**/
+#endif
+
+/* HAS_PTHREAD_ATTR_SETSCOPE:
+ * This symbol, if defined, indicates that the pthread_attr_setscope
+ * system call is available to set the contention scope attribute of
+ * a thread attribute object.
+ */
+/*#define HAS_PTHREAD_ATTR_SETSCOPE / **/
+
+/* HAS_READV:
+ * This symbol, if defined, indicates that the readv routine is
+ * available to do gather reads. You will also need <sys/uio.h>
+ * and there I_SYSUIO.
+ */
+/*#define HAS_READV / **/
+
+/* HAS_RECVMSG:
+ * This symbol, if defined, indicates that the recvmsg routine is
+ * available to send structured socket messages.
+ */
+/*#define HAS_RECVMSG / **/
+
+/* HAS_SBRK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the sbrk() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern void* sbrk(int);
+ * extern void* sbrk(size_t);
+ */
+/*#define HAS_SBRK_PROTO / **/
+
+/* HAS_SCALBNL:
+ * This symbol, if defined, indicates that the scalbnl routine is
+ * available. If ilogbl is also present we can emulate frexpl.
+ */
+/*#define HAS_SCALBNL / **/
+
+/* HAS_SENDMSG:
+ * This symbol, if defined, indicates that the sendmsg routine is
+ * available to send structured socket messages.
+ */
+/*#define HAS_SENDMSG / **/
+
+/* HAS_SETITIMER:
+ * This symbol, if defined, indicates that the setitimer routine is
+ * available to set interval timers.
+ */
+/*#define HAS_SETITIMER / **/
+
+/* HAS_SETPROCTITLE:
+ * This symbol, if defined, indicates that the setproctitle routine is
+ * available to set process title.
+ */
+/*#define HAS_SETPROCTITLE / **/
+
+/* USE_SFIO:
+ * This symbol, if defined, indicates that sfio should
+ * be used.
+ */
+/*#define USE_SFIO / **/
+
+/* HAS_SIGNBIT:
+ * This symbol, if defined, indicates that the signbit routine is
+ * available to check if the given number has the sign bit set.
+ * This should include correct testing of -0.0. This will only be set
+ * if the signbit() routine is safe to use with the NV type used internally
+ * in perl. Users should call Perl_signbit(), which will be #defined to
+ * the system's signbit() function or macro if this symbol is defined.
+ */
+/*#define HAS_SIGNBIT / **/
+
+/* HAS_SIGPROCMASK:
+ * This symbol, if defined, indicates that the sigprocmask
+ * system call is available to examine or change the signal mask
+ * of the calling process.
+ */
+/*#define HAS_SIGPROCMASK / **/
+
+/* USE_SITECUSTOMIZE:
+ * This symbol, if defined, indicates that sitecustomize should
+ * be used.
+ */
+#ifndef USE_SITECUSTOMIZE
+/*#define USE_SITECUSTOMIZE / **/
+#endif
+
+/* HAS_SNPRINTF:
+ * This symbol, if defined, indicates that the snprintf () library
+ * function is available for use.
+ */
+/* HAS_VSNPRINTF:
+ * This symbol, if defined, indicates that the vsnprintf () library
+ * function is available for use.
+ */
+/*#define HAS_SNPRINTF / **/
+/*#define HAS_VSNPRINTF / **/
+
+/* HAS_SOCKATMARK:
+ * This symbol, if defined, indicates that the sockatmark routine is
+ * available to test whether a socket is at the out-of-band mark.
+ */
+/*#define HAS_SOCKATMARK / **/
+
+/* HAS_SOCKATMARK_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the sockatmark() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int sockatmark(int);
+ */
+/*#define HAS_SOCKATMARK_PROTO / **/
+
+/* HAS_SOCKS5_INIT:
+ * This symbol, if defined, indicates that the socks5_init routine is
+ * available to initialize SOCKS 5.
+ */
+/*#define HAS_SOCKS5_INIT / **/
+
+/* SPRINTF_RETURNS_STRLEN:
+ * This variable defines whether sprintf returns the length of the string
+ * (as per the ANSI spec). Some C libraries retain compatibility with
+ * pre-ANSI C and return a pointer to the passed in buffer; for these
+ * this variable will be undef.
+ */
+/*#define SPRINTF_RETURNS_STRLEN / **/
+
+/* HAS_SQRTL:
+ * This symbol, if defined, indicates that the sqrtl routine is
+ * available to do long double square roots.
+ */
+/*#define HAS_SQRTL / **/
+
+/* HAS_SETRESGID_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the setresgid() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define HAS_SETRESGID_PROTO / **/
+
+/* HAS_SETRESUID_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the setresuid() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+ */
+/*#define HAS_SETRESUID_PROTO / **/
+
+/* HAS_STRUCT_STATFS_F_FLAGS:
+ * This symbol, if defined, indicates that the struct statfs
+ * does have the f_flags member containing the mount flags of
+ * the filesystem containing the file.
+ * This kind of struct statfs is coming from <sys/mount.h> (BSD 4.3),
+ * not from <sys/statfs.h> (SYSV). Older BSDs (like Ultrix) do not
+ * have statfs() and struct statfs, they have ustat() and getmnt()
+ * with struct ustat and struct fs_data.
+ */
+/*#define HAS_STRUCT_STATFS_F_FLAGS / **/
+
+/* HAS_STRUCT_STATFS:
+ * This symbol, if defined, indicates that the struct statfs
+ * to do statfs() is supported.
+ */
+/*#define HAS_STRUCT_STATFS / **/
+
+/* HAS_FSTATVFS:
+ * This symbol, if defined, indicates that the fstatvfs routine is
+ * available to stat filesystems by file descriptors.
+ */
+/*#define HAS_FSTATVFS / **/
+
+/* HAS_STRFTIME:
+ * This symbol, if defined, indicates that the strftime routine is
+ * available to do time formatting.
+ */
+/*#define HAS_STRFTIME / **/
+
+/* HAS_STRLCAT:
+ * This symbol, if defined, indicates that the strlcat () routine is
+ * available to do string concatenation.
+ */
+/*#define HAS_STRLCAT / **/
+
+/* HAS_STRLCPY:
+ * This symbol, if defined, indicates that the strlcpy () routine is
+ * available to do string copying.
+ */
+/*#define HAS_STRLCPY / **/
+
+/* HAS_STRTOLD:
+ * This symbol, if defined, indicates that the strtold routine is
+ * available to convert strings to long doubles.
+ */
+/*#define HAS_STRTOLD / **/
+
+/* HAS_STRTOLL:
+ * This symbol, if defined, indicates that the strtoll routine is
+ * available to convert strings to long longs.
+ */
+/*#define HAS_STRTOLL / **/
+
+/* HAS_STRTOQ:
+ * This symbol, if defined, indicates that the strtoq routine is
+ * available to convert strings to long longs (quads).
+ */
+/*#define HAS_STRTOQ / **/
+
+/* HAS_STRTOULL:
+ * This symbol, if defined, indicates that the strtoull routine is
+ * available to convert strings to unsigned long longs.
+ */
+/*#define HAS_STRTOULL / **/
+
+/* HAS_STRTOUQ:
+ * This symbol, if defined, indicates that the strtouq routine is
+ * available to convert strings to unsigned long longs (quads).
+ */
+/*#define HAS_STRTOUQ / **/
+
+/* HAS_SYSCALL_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the syscall() function. Otherwise, it is up
+ * to the program to supply one. Good guesses are
+ * extern int syscall(int, ...);
+ * extern int syscall(long, ...);
+ */
+/*#define HAS_SYSCALL_PROTO / **/
+
+/* HAS_TELLDIR_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the telldir() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern long telldir(DIR*);
+ */
+/*#define HAS_TELLDIR_PROTO / **/
+
+/* HAS_CTIME64:
+ * This symbol, if defined, indicates that the ctime64 () routine is
+ * available to do the 64bit variant of ctime ()
+ */
+/* HAS_LOCALTIME64:
+ * This symbol, if defined, indicates that the localtime64 () routine is
+ * available to do the 64bit variant of localtime ()
+ */
+/* HAS_GMTIME64:
+ * This symbol, if defined, indicates that the gmtime64 () routine is
+ * available to do the 64bit variant of gmtime ()
+ */
+/* HAS_MKTIME64:
+ * This symbol, if defined, indicates that the mktime64 () routine is
+ * available to do the 64bit variant of mktime ()
+ */
+/* HAS_DIFFTIME64:
+ * This symbol, if defined, indicates that the difftime64 () routine is
+ * available to do the 64bit variant of difftime ()
+ */
+/* HAS_ASCTIME64:
+ * This symbol, if defined, indicates that the asctime64 () routine is
+ * available to do the 64bit variant of asctime ()
+ */
+/*#define HAS_CTIME64 / **/
+/*#define HAS_LOCALTIME64 / **/
+/*#define HAS_GMTIME64 / **/
+/*#define HAS_MKTIME64 / **/
+/*#define HAS_DIFFTIME64 / **/
+/*#define HAS_ASCTIME64 / **/
+
+/* HAS_TIMEGM:
+ * This symbol, if defined, indicates that the timegm routine is
+ * available to do the opposite of gmtime ()
+ */
+/*#define HAS_TIMEGM / **/
+
+/* U32_ALIGNMENT_REQUIRED:
+ * This symbol, if defined, indicates that you must access
+ * character data through U32-aligned pointers.
+ */
+#ifndef U32_ALIGNMENT_REQUIRED
+#define U32_ALIGNMENT_REQUIRED /**/
+#endif
+
+/* HAS_UALARM:
+ * This symbol, if defined, indicates that the ualarm routine is
+ * available to do alarms with microsecond granularity.
+ */
+/*#define HAS_UALARM / **/
+
+/* HAS_UNORDERED:
+ * This symbol, if defined, indicates that the unordered routine is
+ * available to check whether two doubles are unordered
+ * (effectively: whether either of them is NaN)
+ */
+/*#define HAS_UNORDERED / **/
+
+/* HAS_UNSETENV:
+ * This symbol, if defined, indicates that the unsetenv () routine is
+ * available for use.
+ */
+/*#define HAS_UNSETENV / **/
+
+/* HAS_USLEEP_PROTO:
+ * This symbol, if defined, indicates that the system provides
+ * a prototype for the usleep() function. Otherwise, it is up
+ * to the program to supply one. A good guess is
+ * extern int usleep(useconds_t);
+ */
+/*#define HAS_USLEEP_PROTO / **/
+
+/* HAS_USTAT:
+ * This symbol, if defined, indicates that the ustat system call is
+ * available to query file system statistics by dev_t.
+ */
+/*#define HAS_USTAT / **/
+
+/* HAS_WRITEV:
+ * This symbol, if defined, indicates that the writev routine is
+ * available to do scatter writes.
+ */
+/*#define HAS_WRITEV / **/
+
+/* USE_DYNAMIC_LOADING:
+ * This symbol, if defined, indicates that dynamic loading of
+ * some sort is available.
+ */
+/*#define USE_DYNAMIC_LOADING / **/
+
+/* FFLUSH_NULL:
+ * This symbol, if defined, tells that fflush(NULL) does flush
+ * all pending stdio output.
+ */
+/* FFLUSH_ALL:
+ * This symbol, if defined, tells that to flush
+ * all pending stdio output one must loop through all
+ * the stdio file handles stored in an array and fflush them.
+ * Note that if fflushNULL is defined, fflushall will not
+ * even be probed for and will be left undefined.
+ */
+/*#define FFLUSH_NULL / **/
+/*#define FFLUSH_ALL / **/
+
+/* I_ASSERT:
+ * This symbol, if defined, indicates that <assert.h> exists and
+ * could be included by the C program to get the assert() macro.
+ */
+#define I_ASSERT /**/
+
+/* I_CRYPT:
+ * This symbol, if defined, indicates that <crypt.h> exists and
+ * should be included.
+ */
+/*#define I_CRYPT / **/
+
+/* DB_Prefix_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is u_int32_t.
+ */
+/* DB_Hash_t:
+ * This symbol contains the type of the prefix structure element
+ * in the <db.h> header file. In older versions of DB, it was
+ * int, while in newer ones it is size_t.
+ */
+/* DB_VERSION_MAJOR_CFG:
+ * This symbol, if defined, defines the major version number of
+ * Berkeley DB found in the <db.h> header when Perl was configured.
+ */
+/* DB_VERSION_MINOR_CFG:
+ * This symbol, if defined, defines the minor version number of
+ * Berkeley DB found in the <db.h> header when Perl was configured.
+ * For DB version 1 this is always 0.
+ */
+/* DB_VERSION_PATCH_CFG:
+ * This symbol, if defined, defines the patch version number of
+ * Berkeley DB found in the <db.h> header when Perl was configured.
+ * For DB version 1 this is always 0.
+ */
+#define DB_Hash_t u_int32_t /**/
+#define DB_Prefix_t size_t /**/
+#define DB_VERSION_MAJOR_CFG 0 /**/
+#define DB_VERSION_MINOR_CFG 0 /**/
+#define DB_VERSION_PATCH_CFG 0 /**/
+
+/* I_FP:
+ * This symbol, if defined, indicates that <fp.h> exists and
+ * should be included.
+ */
+/*#define I_FP / **/
+
+/* I_FP_CLASS:
+ * This symbol, if defined, indicates that <fp_class.h> exists and
+ * should be included.
+ */
+/*#define I_FP_CLASS / **/
+
+/* I_IEEEFP:
+ * This symbol, if defined, indicates that <ieeefp.h> exists and
+ * should be included.
+ */
+/*#define I_IEEEFP / **/
+
+/* I_INTTYPES:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <inttypes.h>.
+ */
+/*#define I_INTTYPES / **/
+
+/* I_LANGINFO:
+ * This symbol, if defined, indicates that <langinfo.h> exists and
+ * should be included.
+ */
+/*#define I_LANGINFO / **/
+
+/* I_LIBUTIL:
+ * This symbol, if defined, indicates that <libutil.h> exists and
+ * should be included.
+ */
+/*#define I_LIBUTIL / **/
+
+/* I_MALLOCMALLOC:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <malloc/malloc.h>.
+ */
+/*#define I_MALLOCMALLOC / **/
+
+/* I_MNTENT:
+ * This symbol, if defined, indicates that <mntent.h> exists and
+ * should be included.
+ */
+/*#define I_MNTENT / **/
+
+/* I_NETINET_TCP:
+ * This symbol, if defined, indicates to the C program that it should
+ * include <netinet/tcp.h>.
+ */
+/*#define I_NETINET_TCP / **/
+
+/* I_POLL:
+ * This symbol, if defined, indicates that <poll.h> exists and
+ * should be included. (see also HAS_POLL)
+ */
+/*#define I_POLL / **/
+
+/* I_PROT:
+ * This symbol, if defined, indicates that <prot.h> exists and
+ * should be included.
+ */
+/*#define I_PROT / **/
+
+/* I_SHADOW:
+ * This symbol, if defined, indicates that <shadow.h> exists and
+ * should be included.
+ */
+/*#define I_SHADOW / **/
+
+/* I_SOCKS:
+ * This symbol, if defined, indicates that <socks.h> exists and
+ * should be included.
+ */
+/*#define I_SOCKS / **/
+
+/* I_SUNMATH:
+ * This symbol, if defined, indicates that <sunmath.h> exists and
+ * should be included.
+ */
+/*#define I_SUNMATH / **/
+
+/* I_SYSLOG:
+ * This symbol, if defined, indicates that <syslog.h> exists and
+ * should be included.
+ */
+/*#define I_SYSLOG / **/
+
+/* I_SYSMODE:
+ * This symbol, if defined, indicates that <sys/mode.h> exists and
+ * should be included.
+ */
+/*#define I_SYSMODE / **/
+
+/* I_SYS_MOUNT:
+ * This symbol, if defined, indicates that <sys/mount.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_MOUNT / **/
+
+/* I_SYS_STATFS:
+ * This symbol, if defined, indicates that <sys/statfs.h> exists.
+ */
+/*#define I_SYS_STATFS / **/
+
+/* I_SYS_STATVFS:
+ * This symbol, if defined, indicates that <sys/statvfs.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_STATVFS / **/
+
+/* I_SYSUTSNAME:
+ * This symbol, if defined, indicates that <sys/utsname.h> exists and
+ * should be included.
+ */
+/*#define I_SYSUTSNAME / **/
+
+/* I_SYS_VFS:
+ * This symbol, if defined, indicates that <sys/vfs.h> exists and
+ * should be included.
+ */
+/*#define I_SYS_VFS / **/
+
+/* I_USTAT:
+ * This symbol, if defined, indicates that <ustat.h> exists and
+ * should be included.
+ */
+/*#define I_USTAT / **/
+
+/* PERL_PRIfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for output.
+ */
+/* PERL_PRIgldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'g') for output.
+ */
+/* PERL_PRIeldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'e') for output.
+ */
+/* PERL_SCNfldbl:
+ * This symbol, if defined, contains the string used by stdio to
+ * format long doubles (format 'f') for input.
+ */
+/*#define PERL_PRIfldbl "llf" / **/
+/*#define PERL_PRIgldbl "llg" / **/
+/*#define PERL_PRIeldbl "lle" / **/
+/*#define PERL_SCNfldbl "llf" / **/
+
+/* PERL_MAD:
+ * This symbol, if defined, indicates that the Misc Attribution
+ * Declaration code should be conditionally compiled.
+ */
+/*#define PERL_MAD / **/
+
+/* NEED_VA_COPY:
+ * This symbol, if defined, indicates that the system stores
+ * the variable argument list datatype, va_list, in a format
+ * that cannot be copied by simple assignment, so that some
+ * other means must be used when copying is required.
+ * As such systems vary in their provision (or non-provision)
+ * of copying mechanisms, handy.h defines a platform-
+ * independent macro, Perl_va_copy(src, dst), to do the job.
+ */
+/*#define NEED_VA_COPY / **/
+
+/* IVTYPE:
+ * This symbol defines the C type used for Perl's IV.
+ */
+/* UVTYPE:
+ * This symbol defines the C type used for Perl's UV.
+ */
+/* I8TYPE:
+ * This symbol defines the C type used for Perl's I8.
+ */
+/* U8TYPE:
+ * This symbol defines the C type used for Perl's U8.
+ */
+/* I16TYPE:
+ * This symbol defines the C type used for Perl's I16.
+ */
+/* U16TYPE:
+ * This symbol defines the C type used for Perl's U16.
+ */
+/* I32TYPE:
+ * This symbol defines the C type used for Perl's I32.
+ */
+/* U32TYPE:
+ * This symbol defines the C type used for Perl's U32.
+ */
+/* I64TYPE:
+ * This symbol defines the C type used for Perl's I64.
+ */
+/* U64TYPE:
+ * This symbol defines the C type used for Perl's U64.
+ */
+/* NVTYPE:
+ * This symbol defines the C type used for Perl's NV.
+ */
+/* IVSIZE:
+ * This symbol contains the sizeof(IV).
+ */
+/* UVSIZE:
+ * This symbol contains the sizeof(UV).
+ */
+/* I8SIZE:
+ * This symbol contains the sizeof(I8).
+ */
+/* U8SIZE:
+ * This symbol contains the sizeof(U8).
+ */
+/* I16SIZE:
+ * This symbol contains the sizeof(I16).
+ */
+/* U16SIZE:
+ * This symbol contains the sizeof(U16).
+ */
+/* I32SIZE:
+ * This symbol contains the sizeof(I32).
+ */
+/* U32SIZE:
+ * This symbol contains the sizeof(U32).
+ */
+/* I64SIZE:
+ * This symbol contains the sizeof(I64).
+ */
+/* U64SIZE:
+ * This symbol contains the sizeof(U64).
+ */
+/* NVSIZE:
+ * This symbol contains the sizeof(NV).
+ */
+/* NV_PRESERVES_UV:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * can preserve all the bits of a variable of type UVTYPE.
+ */
+/* NV_PRESERVES_UV_BITS:
+ * This symbol contains the number of bits a variable of type NVTYPE
+ * can preserve of a variable of type UVTYPE.
+ */
+/* NV_OVERFLOWS_INTEGERS_AT:
+ * This symbol gives the largest integer value that NVs can hold. This
+ * value + 1.0 cannot be stored accurately. It is expressed as constant
+ * floating point expression to reduce the chance of decimale/binary
+ * conversion issues. If it can not be determined, the value 0 is given.
+ */
+/* NV_ZERO_IS_ALLBITS_ZERO:
+ * This symbol, if defined, indicates that a variable of type NVTYPE
+ * stores 0.0 in memory as all bits zero.
+ */
+#define IVTYPE long /**/
+#define UVTYPE unsigned long /**/
+#define I8TYPE char /**/
+#define U8TYPE unsigned char /**/
+#define I16TYPE short /**/
+#define U16TYPE unsigned short /**/
+#define I32TYPE long /**/
+#define U32TYPE unsigned long /**/
+#ifdef HAS_QUAD
+#define I64TYPE int64_t /**/
+#define U64TYPE uint64_t /**/
+#endif
+#define NVTYPE double /**/
+#define IVSIZE 4 /**/
+#define UVSIZE 4 /**/
+#define I8SIZE 1 /**/
+#define U8SIZE 1 /**/
+#define I16SIZE 2 /**/
+#define U16SIZE 2 /**/
+#define I32SIZE 4 /**/
+#define U32SIZE 4 /**/
+#ifdef HAS_QUAD
+#define I64SIZE 8 /**/
+#define U64SIZE 8 /**/
+#endif
+#define NVSIZE 8 /**/
+#undef NV_PRESERVES_UV
+#define NV_PRESERVES_UV_BITS 0
+#define NV_OVERFLOWS_INTEGERS_AT 256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0
+#undef NV_ZERO_IS_ALLBITS_ZERO
+#if UVSIZE == 8
+# ifdef BYTEORDER
+# if BYTEORDER == 0x1234
+# undef BYTEORDER
+# define BYTEORDER 0x12345678
+# else
+# if BYTEORDER == 0x4321
+# undef BYTEORDER
+# define BYTEORDER 0x87654321
+# endif
+# endif
+# endif
+#endif
+
+/* IVdf:
+ * This symbol defines the format string used for printing a Perl IV
+ * as a signed decimal integer.
+ */
+/* UVuf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned decimal integer.
+ */
+/* UVof:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned octal integer.
+ */
+/* UVxf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned hexadecimal integer in lowercase abcdef.
+ */
+/* UVXf:
+ * This symbol defines the format string used for printing a Perl UV
+ * as an unsigned hexadecimal integer in uppercase ABCDEF.
+ */
+/* NVef:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %e-ish floating point format.
+ */
+/* NVff:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %f-ish floating point format.
+ */
+/* NVgf:
+ * This symbol defines the format string used for printing a Perl NV
+ * using %g-ish floating point format.
+ */
+#define IVdf "ld" /**/
+#define UVuf "lu" /**/
+#define UVof "lo" /**/
+#define UVxf "lx" /**/
+#define UVXf "lX" /**/
+#define NVef "e" /**/
+#define NVff "f" /**/
+#define NVgf "g" /**/
+
+/* SELECT_MIN_BITS:
+ * This symbol holds the minimum number of bits operated by select.
+ * That is, if you do select(n, ...), how many bits at least will be
+ * cleared in the masks if some activity is detected. Usually this
+ * is either n or 32*ceil(n/32), especially many little-endians do
+ * the latter. This is only useful if you have select(), naturally.
+ */
+#define SELECT_MIN_BITS 32 /**/
+
+/* STARTPERL:
+ * This variable contains the string to put in front of a perl
+ * script to make sure (one hopes) that it runs with perl and not
+ * some shell.
+ */
+#define STARTPERL "#!perl" /**/
+
+/* HAS_STDIO_STREAM_ARRAY:
+ * This symbol, if defined, tells that there is an array
+ * holding the stdio streams.
+ */
+/* STDIO_STREAM_ARRAY:
+ * This symbol tells the name of the array holding the stdio streams.
+ * Usual values include _iob, __iob, and __sF.
+ */
+/*#define HAS_STDIO_STREAM_ARRAY / **/
+#ifdef HAS_STDIO_STREAM_ARRAY
+#define STDIO_STREAM_ARRAY
+#endif
+
+/* GMTIME_MAX:
+ * This symbol contains the maximum value for the time_t offset that
+ * the system function gmtime () accepts, and defaults to 0
+ */
+/* GMTIME_MIN:
+ * This symbol contains the minimum value for the time_t offset that
+ * the system function gmtime () accepts, and defaults to 0
+ */
+/* LOCALTIME_MAX:
+ * This symbol contains the maximum value for the time_t offset that
+ * the system function localtime () accepts, and defaults to 0
+ */
+/* LOCALTIME_MIN:
+ * This symbol contains the minimum value for the time_t offset that
+ * the system function localtime () accepts, and defaults to 0
+ */
+#define GMTIME_MAX 2147483647 /**/
+#define GMTIME_MIN 0 /**/
+#define LOCALTIME_MAX 2147483647 /**/
+#define LOCALTIME_MIN 0 /**/
+
+/* USE_64_BIT_INT:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be employed (be they 32 or 64 bits). The minimal possible
+ * 64-bitness is used, just enough to get 64-bit integers into Perl.
+ * This may mean using for example "long longs", while your memory
+ * may still be limited to 2 gigabytes.
+ */
+/* USE_64_BIT_ALL:
+ * This symbol, if defined, indicates that 64-bit integers should
+ * be used when available. If not defined, the native integers
+ * will be used (be they 32 or 64 bits). The maximal possible
+ * 64-bitness is employed: LP64 or ILP64, meaning that you will
+ * be able to use more than 2 gigabytes of memory. This mode is
+ * even more binary incompatible than USE_64_BIT_INT. You may not
+ * be able to run the resulting executable in a 32-bit CPU at all or
+ * you may need at least to reboot your OS to 64-bit mode.
+ */
+#ifndef USE_64_BIT_INT
+/*#define USE_64_BIT_INT / **/
+#endif
+#ifndef USE_64_BIT_ALL
+/*#define USE_64_BIT_ALL / **/
+#endif
+
+/* USE_DTRACE:
+ * This symbol, if defined, indicates that Perl should
+ * be built with support for DTrace.
+ */
+/*#define USE_DTRACE / **/
+
+/* USE_FAST_STDIO:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use 'fast stdio'.
+ * Defaults to define in Perls 5.8 and earlier, to undef later.
+ */
+#ifndef USE_FAST_STDIO
+/*#define USE_FAST_STDIO / **/
+#endif
+
+/* USE_LARGE_FILES:
+ * This symbol, if defined, indicates that large file support
+ * should be used when available.
+ */
+#ifndef USE_LARGE_FILES
+/*#define USE_LARGE_FILES / **/
+#endif
+
+/* USE_LONG_DOUBLE:
+ * This symbol, if defined, indicates that long doubles should
+ * be used when available.
+ */
+#ifndef USE_LONG_DOUBLE
+/*#define USE_LONG_DOUBLE / **/
+#endif
+
+/* USE_MORE_BITS:
+ * This symbol, if defined, indicates that 64-bit interfaces and
+ * long doubles should be used when available.
+ */
+#ifndef USE_MORE_BITS
+/*#define USE_MORE_BITS / **/
+#endif
+
+/* MULTIPLICITY:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use multiplicity.
+ */
+#ifndef MULTIPLICITY
+/*#define MULTIPLICITY / **/
+#endif
+
+/* USE_PERLIO:
+ * This symbol, if defined, indicates that the PerlIO abstraction should
+ * be used throughout. If not defined, stdio should be
+ * used in a fully backward compatible manner.
+ */
+#ifndef USE_PERLIO
+/*#define USE_PERLIO / **/
+#endif
+
+/* USE_SOCKS:
+ * This symbol, if defined, indicates that Perl should
+ * be built to use socks.
+ */
+#ifndef USE_SOCKS
+/*#define USE_SOCKS / **/
+#endif
+
+#endif
diff --git a/Master/tlpkg/tlperl/lib/CORE/unixish.h b/Master/tlpkg/tlperl/lib/CORE/unixish.h
new file mode 100644
index 00000000000..6ad95c2dc8c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/unixish.h
@@ -0,0 +1,156 @@
+/* unixish.h
+ *
+ * Copyright (C) 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002,
+ * 2003, 2006, 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * The following symbols are defined if your operating system supports
+ * functions by that name. All Unixes I know of support them, thus they
+ * are not checked by the configuration script, but are directly defined
+ * here.
+ */
+
+#ifndef PERL_MICRO
+
+/* HAS_IOCTL:
+ * This symbol, if defined, indicates that the ioctl() routine is
+ * available to set I/O characteristics
+ */
+#define HAS_IOCTL /**/
+
+/* HAS_UTIME:
+ * This symbol, if defined, indicates that the routine utime() is
+ * available to update the access and modification times of files.
+ */
+#define HAS_UTIME /**/
+
+/* HAS_GROUP
+ * This symbol, if defined, indicates that the getgrnam() and
+ * getgrgid() routines are available to get group entries.
+ * The getgrent() has a separate definition, HAS_GETGRENT.
+ */
+#define HAS_GROUP /**/
+
+/* HAS_PASSWD
+ * This symbol, if defined, indicates that the getpwnam() and
+ * getpwuid() routines are available to get password entries.
+ * The getpwent() has a separate definition, HAS_GETPWENT.
+ */
+#define HAS_PASSWD /**/
+
+#define HAS_KILL
+#define HAS_WAIT
+
+#endif /* !PERL_MICRO */
+
+/* USEMYBINMODE
+ * This symbol, if defined, indicates that the program should
+ * use the routine my_binmode(FILE *fp, char iotype) to insure
+ * that a file is in "binary" mode -- that is, that no translation
+ * of bytes occurs on read or write operations.
+ */
+#undef USEMYBINMODE
+
+/* Stat_t:
+ * This symbol holds the type used to declare buffers for information
+ * returned by stat(). It's usually just struct stat. It may be necessary
+ * to include <sys/stat.h> and <sys/types.h> to get any typedef'ed
+ * information.
+ */
+#define Stat_t struct stat
+
+/* USE_STAT_RDEV:
+ * This symbol is defined if this system has a stat structure declaring
+ * st_rdev
+ */
+#define USE_STAT_RDEV /**/
+
+/* ACME_MESS:
+ * This symbol, if defined, indicates that error messages should be
+ * should be generated in a format that allows the use of the Acme
+ * GUI/editor's autofind feature.
+ */
+#undef ACME_MESS /**/
+
+/* UNLINK_ALL_VERSIONS:
+ * This symbol, if defined, indicates that the program should arrange
+ * to remove all versions of a file if unlink() is called. This is
+ * probably only relevant for VMS.
+ */
+/* #define UNLINK_ALL_VERSIONS / **/
+
+/* VMS:
+ * This symbol, if defined, indicates that the program is running under
+ * VMS. It is currently automatically set by cpps running under VMS,
+ * and is included here for completeness only.
+ */
+/* #define VMS / **/
+
+/* ALTERNATE_SHEBANG:
+ * This symbol, if defined, contains a "magic" string which may be used
+ * as the first line of a Perl program designed to be executed directly
+ * by name, instead of the standard Unix #!. If ALTERNATE_SHEBANG
+ * begins with a character other then #, then Perl will only treat
+ * it as a command line if it finds the string "perl" in the first
+ * word; otherwise it's treated as the first line of code in the script.
+ * (IOW, Perl won't hand off to another interpreter via an alternate
+ * shebang sequence that might be legal Perl code.)
+ */
+/* #define ALTERNATE_SHEBANG "#!" / **/
+
+# include <signal.h>
+
+#ifndef SIGABRT
+# define SIGABRT SIGILL
+#endif
+#ifndef SIGILL
+# define SIGILL 6 /* blech */
+#endif
+#define ABORT() kill(PerlProc_getpid(),SIGABRT);
+
+/*
+ * fwrite1() should be a routine with the same calling sequence as fwrite(),
+ * but which outputs all of the bytes requested as a single stream (unlike
+ * fwrite() itself, which on some systems outputs several distinct records
+ * if the number_of_items parameter is >1).
+ */
+#define fwrite1 fwrite
+
+#define Stat(fname,bufptr) stat((fname),(bufptr))
+#define Fstat(fd,bufptr) fstat((fd),(bufptr))
+#define Fflush(fp) fflush(fp)
+#define Mkdir(path,mode) mkdir((path),(mode))
+
+#ifndef PERL_SYS_INIT_BODY
+# define PERL_SYS_INIT_BODY(c,v) \
+ MALLOC_CHECK_TAINT2(*c,*v) PERL_FPU_INIT; PERLIO_INIT; MALLOC_INIT
+#endif
+
+#ifndef PERL_SYS_TERM_BODY
+# define PERL_SYS_TERM_BODY() \
+ HINTS_REFCNT_TERM; OP_REFCNT_TERM; PERLIO_TERM; MALLOC_TERM;
+
+#endif
+
+#define BIT_BUCKET "/dev/null"
+
+#define dXSUB_SYS
+
+#ifndef NO_ENVIRON_ARRAY
+#define USE_ENVIRON_ARRAY
+#endif
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/utf8.h b/Master/tlpkg/tlperl/lib/CORE/utf8.h
new file mode 100644
index 00000000000..87653360eae
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/utf8.h
@@ -0,0 +1,364 @@
+/* utf8.h
+ *
+ * Copyright (C) 2000, 2001, 2002, 2005, 2006, 2007, 2009 by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/* Use UTF-8 as the default script encoding?
+ * Turning this on will break scripts having non-UTF-8 binary
+ * data (such as Latin-1) in string literals. */
+#ifdef USE_UTF8_SCRIPTS
+# define USE_UTF8_IN_NAMES (!IN_BYTES)
+#else
+# define USE_UTF8_IN_NAMES (PL_hints & HINT_UTF8)
+#endif
+
+/* Source backward compatibility. */
+#define uvuni_to_utf8(d, uv) uvuni_to_utf8_flags(d, uv, 0)
+#define is_utf8_string_loc(s, len, ep) is_utf8_string_loclen(s, len, ep, 0)
+
+#ifdef EBCDIC
+/* The equivalent of these macros but implementing UTF-EBCDIC
+ are in the following header file:
+ */
+
+#include "utfebcdic.h"
+
+#else /* ! EBCDIC */
+START_EXTERN_C
+
+#ifdef DOINIT
+EXTCONST unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ascii */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bogus */
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, /* scripts */
+3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6, /* cjk etc. */
+7,13, /* Perl extended (not UTF-8). Up to 72bit allowed (64-bit + reserved). */
+};
+#else
+EXTCONST unsigned char PL_utf8skip[];
+#endif
+
+END_EXTERN_C
+
+/* Native character to iso-8859-1 */
+#define NATIVE_TO_ASCII(ch) (ch)
+#define ASCII_TO_NATIVE(ch) (ch)
+/* Transform after encoding */
+#define NATIVE_TO_UTF(ch) (ch)
+#define UTF_TO_NATIVE(ch) (ch)
+/* Transforms in wide UV chars */
+#define UNI_TO_NATIVE(ch) (ch)
+#define NATIVE_TO_UNI(ch) (ch)
+/* Transforms in invariant space */
+#define NATIVE_TO_NEED(enc,ch) (ch)
+#define ASCII_TO_NEED(enc,ch) (ch)
+
+/* As there are no translations, avoid the function wrapper */
+#define utf8n_to_uvchr utf8n_to_uvuni
+#define uvchr_to_utf8 uvuni_to_utf8
+
+/*
+
+ The following table is from Unicode 3.2.
+
+ Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+
+ U+0000..U+007F 00..7F
+ U+0080..U+07FF * C2..DF 80..BF
+ U+0800..U+0FFF E0 * A0..BF 80..BF
+ U+1000..U+CFFF E1..EC 80..BF 80..BF
+ U+D000..U+D7FF ED 80..9F 80..BF
+ U+D800..U+DFFF +++++++ utf16 surrogates, not legal utf8 +++++++
+ U+E000..U+FFFF EE..EF 80..BF 80..BF
+ U+10000..U+3FFFF F0 * 90..BF 80..BF 80..BF
+ U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
+ U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
+
+Note the gaps before several of the byte entries above marked by '*'. These are
+caused by legal UTF-8 avoiding non-shortest encodings: it is technically
+possible to UTF-8-encode a single code point in different ways, but that is
+explicitly forbidden, and the shortest possible encoding should always be used
+(and that is what Perl does).
+
+ */
+
+/*
+ Another way to look at it, as bits:
+
+ Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+
+ 0aaaaaaa 0aaaaaaa
+ 00000bbbbbaaaaaa 110bbbbb 10aaaaaa
+ ccccbbbbbbaaaaaa 1110cccc 10bbbbbb 10aaaaaa
+ 00000dddccccccbbbbbbaaaaaa 11110ddd 10cccccc 10bbbbbb 10aaaaaa
+
+As you can see, the continuation bytes all begin with C<10>, and the
+leading bits of the start byte tell how many bytes there are in the
+encoded character.
+
+*/
+
+
+#define UNI_IS_INVARIANT(c) (((UV)c) < 0x80)
+/* Note that C0 and C1 are invalid in legal UTF8, so the lower bound of the
+ * below might ought to be C2 */
+#define UTF8_IS_START(c) (((U8)c) >= 0xc0 && (((U8)c) <= 0xfd))
+#define UTF8_IS_CONTINUATION(c) (((U8)c) >= 0x80 && (((U8)c) <= 0xbf))
+#define UTF8_IS_CONTINUED(c) (((U8)c) & 0x80)
+#define UTF8_IS_DOWNGRADEABLE_START(c) (((U8)c & 0xfc) == 0xc0)
+
+#define UTF_START_MARK(len) (((len) > 7) ? 0xFF : (0xFE << (7-(len))))
+#define UTF_START_MASK(len) (((len) >= 7) ? 0x00 : (0x1F >> ((len)-2)))
+
+#define UTF_CONTINUATION_MARK 0x80
+#define UTF_ACCUMULATION_SHIFT 6
+#define UTF_CONTINUATION_MASK ((U8)0x3f)
+
+#ifdef HAS_QUAD
+#define UNISKIP(uv) ( (uv) < 0x80 ? 1 : \
+ (uv) < 0x800 ? 2 : \
+ (uv) < 0x10000 ? 3 : \
+ (uv) < 0x200000 ? 4 : \
+ (uv) < 0x4000000 ? 5 : \
+ (uv) < 0x80000000 ? 6 : \
+ (uv) < UTF8_QUAD_MAX ? 7 : 13 )
+#else
+/* No, I'm not even going to *TRY* putting #ifdef inside a #define */
+#define UNISKIP(uv) ( (uv) < 0x80 ? 1 : \
+ (uv) < 0x800 ? 2 : \
+ (uv) < 0x10000 ? 3 : \
+ (uv) < 0x200000 ? 4 : \
+ (uv) < 0x4000000 ? 5 : \
+ (uv) < 0x80000000 ? 6 : 7 )
+#endif
+
+#endif /* EBCDIC vs ASCII */
+
+/* Rest of these are attributes of Unicode and perl's internals rather than the
+ * encoding, or happen to be the same in both ASCII and EBCDIC (at least at
+ * this level; the macros that some of these call may have different
+ * definitions in the two encodings */
+
+#define NATIVE8_TO_UNI(ch) NATIVE_TO_ASCII(ch) /* a clearer synonym */
+
+#define UTF8_ACCUMULATE(old, new) (((old) << UTF_ACCUMULATION_SHIFT) | (((U8)new) & UTF_CONTINUATION_MASK))
+
+#define UTF8SKIP(s) PL_utf8skip[*(const U8*)(s)]
+
+#define UTF8_IS_INVARIANT(c) UNI_IS_INVARIANT(NATIVE_TO_UTF(c))
+#define NATIVE_IS_INVARIANT(c) UNI_IS_INVARIANT(NATIVE8_TO_UNI(c))
+
+#define MAX_PORTABLE_UTF8_TWO_BYTE 0x3FF /* constrained by EBCDIC */
+
+/* The macros in the next sets are used to generate the two utf8 or utfebcdic
+ * bytes from an ordinal that is known to fit into two bytes; it must be less
+ * than 0x3FF to work across both encodings. */
+/* Nocast allows these to be used in the case label of a switch statement */
+#define UTF8_TWO_BYTE_HI_nocast(c) UTF_TO_NATIVE(((c)>>UTF_ACCUMULATION_SHIFT)|UTF_START_MARK(2))
+#define UTF8_TWO_BYTE_LO_nocast(c) UTF_TO_NATIVE(((c)&UTF_CONTINUATION_MASK)|UTF_CONTINUATION_MARK)
+
+#define UTF8_TWO_BYTE_HI(c) ((U8) (UTF8_TWO_BYTE_HI_nocast(c)))
+#define UTF8_TWO_BYTE_LO(c) ((U8) (UTF8_TWO_BYTE_LO_nocast(c)))
+
+/* This name is used when the source is a single byte */
+#define UTF8_EIGHT_BIT_HI(c) UTF8_TWO_BYTE_HI((U8)(c))
+#define UTF8_EIGHT_BIT_LO(c) UTF8_TWO_BYTE_LO((U8)(c))
+
+/*
+ * Note: we try to be careful never to call the isXXX_utf8() functions
+ * unless we're pretty sure we've seen the beginning of a UTF-8 or UTFEBCDIC
+ * character. Otherwise we risk loading in the heavy-duty swash_init and
+ * swash_fetch routines unnecessarily.
+ */
+#define isIDFIRST_lazy_if(p,c) ((IN_BYTES || (!c || ! UTF8_IS_START(*((const U8*)p)))) \
+ ? isIDFIRST(*(p)) \
+ : isIDFIRST_utf8((const U8*)p))
+#define isALNUM_lazy_if(p,c) ((IN_BYTES || (!c || ! UTF8_IS_START(*((const U8*)p)))) \
+ ? isALNUM(*(p)) \
+ : isALNUM_utf8((const U8*)p))
+
+#define isIDFIRST_lazy(p) isIDFIRST_lazy_if(p,1)
+#define isALNUM_lazy(p) isALNUM_lazy_if(p,1)
+
+#define UTF8_MAXBYTES 13
+/* How wide can a single UTF-8 encoded character become in bytes.
+ * NOTE: Strictly speaking Perl's UTF-8 should not be called UTF-8
+ * since UTF-8 is an encoding of Unicode and given Unicode's current
+ * upper limit only four bytes is possible. Perl thinks of UTF-8
+ * as a way to encode non-negative integers in a binary format. */
+#define UTF8_MAXLEN UTF8_MAXBYTES
+
+/* The maximum number of UTF-8 bytes a single Unicode character can
+ * uppercase/lowercase/fold into; this number depends on the Unicode
+ * version. An example of maximal expansion is the U+03B0 which
+ * uppercases to U+03C5 U+0308 U+0301. The Unicode databases that
+ * tell these things are UnicodeData.txt, CaseFolding.txt, and
+ * SpecialCasing.txt. */
+#define UTF8_MAXBYTES_CASE 6
+
+#define IN_BYTES (CopHINTS_get(PL_curcop) & HINT_BYTES)
+#define DO_UTF8(sv) (SvUTF8(sv) && !IN_BYTES)
+#define IN_UNI_8_BIT ( (CopHINTS_get(PL_curcop) & HINT_UNI_8_BIT) \
+ && ! IN_LOCALE_RUNTIME && ! IN_BYTES)
+
+#define UTF8_ALLOW_EMPTY 0x0001
+#define UTF8_ALLOW_CONTINUATION 0x0002
+#define UTF8_ALLOW_NON_CONTINUATION 0x0004
+#define UTF8_ALLOW_FE_FF 0x0008 /* Allow FE or FF start bytes, \
+ yields above 0x7fffFFFF */
+#define UTF8_ALLOW_SHORT 0x0010 /* expecting more bytes */
+#define UTF8_ALLOW_SURROGATE 0x0020
+#define UTF8_ALLOW_FFFF 0x0040 /* Allow UNICODE_ILLEGAL */
+#define UTF8_ALLOW_LONG 0x0080 /* expecting fewer bytes */
+#define UTF8_ALLOW_ANYUV (UTF8_ALLOW_EMPTY|UTF8_ALLOW_FE_FF|\
+ UTF8_ALLOW_SURROGATE|UTF8_ALLOW_FFFF)
+#define UTF8_ALLOW_ANY 0x00FF
+#define UTF8_CHECK_ONLY 0x0200
+#define UTF8_ALLOW_DEFAULT (ckWARN(WARN_UTF8) ? 0 : \
+ UTF8_ALLOW_ANYUV)
+
+#define UNICODE_SURROGATE_FIRST 0xD800
+#define UNICODE_SURROGATE_LAST 0xDFFF
+#define UNICODE_REPLACEMENT 0xFFFD
+#define UNICODE_BYTE_ORDER_MARK 0xFEFF
+#define UNICODE_ILLEGAL 0xFFFF
+
+/* Though our UTF-8 encoding can go beyond this,
+ * let's be conservative and do as Unicode 5.1 says. */
+#define PERL_UNICODE_MAX 0x10FFFF
+
+#define UNICODE_ALLOW_SURROGATE 0x0001 /* Allow UTF-16 surrogates (EVIL) */
+#define UNICODE_ALLOW_FDD0 0x0002 /* Allow the U+FDD0...U+FDEF */
+#define UNICODE_ALLOW_FFFF 0x0004 /* Allow U+FFF[EF], U+1FFF[EF], ... */
+#define UNICODE_ALLOW_SUPER 0x0008 /* Allow past 0x10FFFF */
+#define UNICODE_ALLOW_ANY 0x000F
+
+#define UNICODE_IS_SURROGATE(c) ((c) >= UNICODE_SURROGATE_FIRST && \
+ (c) <= UNICODE_SURROGATE_LAST)
+#define UNICODE_IS_REPLACEMENT(c) ((c) == UNICODE_REPLACEMENT)
+#define UNICODE_IS_BYTE_ORDER_MARK(c) ((c) == UNICODE_BYTE_ORDER_MARK)
+#define UNICODE_IS_ILLEGAL(c) ((c) == UNICODE_ILLEGAL)
+
+#ifdef HAS_QUAD
+# define UTF8_QUAD_MAX UINT64_C(0x1000000000)
+#endif
+
+#define UTF8_IS_ASCII(c) UTF8_IS_INVARIANT(c)
+
+#define UNICODE_GREEK_CAPITAL_LETTER_SIGMA 0x03A3
+#define UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA 0x03C2
+#define UNICODE_GREEK_SMALL_LETTER_SIGMA 0x03C3
+
+#define UNI_DISPLAY_ISPRINT 0x0001
+#define UNI_DISPLAY_BACKSLASH 0x0002
+#define UNI_DISPLAY_QQ (UNI_DISPLAY_ISPRINT|UNI_DISPLAY_BACKSLASH)
+#define UNI_DISPLAY_REGEX (UNI_DISPLAY_ISPRINT|UNI_DISPLAY_BACKSLASH)
+
+#ifndef EBCDIC
+# define LATIN_SMALL_LETTER_SHARP_S 0x00DF
+# define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0x00FF
+# define MICRO_SIGN 0x00B5
+#endif
+
+#define ANYOF_FOLD_SHARP_S(node, input, end) \
+ (ANYOF_BITMAP_TEST(node, LATIN_SMALL_LETTER_SHARP_S) && \
+ (ANYOF_FLAGS(node) & ANYOF_UNICODE) && \
+ (ANYOF_FLAGS(node) & ANYOF_FOLD) && \
+ ((end) > (input) + 1) && \
+ toLOWER((input)[0]) == 's' && \
+ toLOWER((input)[1]) == 's')
+#define SHARP_S_SKIP 2
+
+#ifdef EBCDIC
+/* IS_UTF8_CHAR() is not ported to EBCDIC */
+#else
+#define IS_UTF8_CHAR_1(p) \
+ ((p)[0] <= 0x7F)
+#define IS_UTF8_CHAR_2(p) \
+ ((p)[0] >= 0xC2 && (p)[0] <= 0xDF && \
+ (p)[1] >= 0x80 && (p)[1] <= 0xBF)
+#define IS_UTF8_CHAR_3a(p) \
+ ((p)[0] == 0xE0 && \
+ (p)[1] >= 0xA0 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+#define IS_UTF8_CHAR_3b(p) \
+ ((p)[0] >= 0xE1 && (p)[0] <= 0xEC && \
+ (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+#define IS_UTF8_CHAR_3c(p) \
+ ((p)[0] == 0xED && \
+ (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+/* In IS_UTF8_CHAR_3c(p) one could use
+ * (p)[1] >= 0x80 && (p)[1] <= 0x9F
+ * if one wanted to exclude surrogates. */
+#define IS_UTF8_CHAR_3d(p) \
+ ((p)[0] >= 0xEE && (p)[0] <= 0xEF && \
+ (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF)
+#define IS_UTF8_CHAR_4a(p) \
+ ((p)[0] == 0xF0 && \
+ (p)[1] >= 0x90 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF && \
+ (p)[3] >= 0x80 && (p)[3] <= 0xBF)
+#define IS_UTF8_CHAR_4b(p) \
+ ((p)[0] >= 0xF1 && (p)[0] <= 0xF3 && \
+ (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF && \
+ (p)[3] >= 0x80 && (p)[3] <= 0xBF)
+/* In IS_UTF8_CHAR_4c(p) one could use
+ * (p)[0] == 0xF4
+ * if one wanted to stop at the Unicode limit U+10FFFF.
+ * The 0xF7 allows us to go to 0x1fffff (0x200000 would
+ * require five bytes). Not doing any further code points
+ * since that is not needed (and that would not be strict
+ * UTF-8, anyway). The "slow path" in Perl_is_utf8_char()
+ * will take care of the "extended UTF-8". */
+#define IS_UTF8_CHAR_4c(p) \
+ ((p)[0] == 0xF4 && (p)[0] <= 0xF7 && \
+ (p)[1] >= 0x80 && (p)[1] <= 0xBF && \
+ (p)[2] >= 0x80 && (p)[2] <= 0xBF && \
+ (p)[3] >= 0x80 && (p)[3] <= 0xBF)
+
+#define IS_UTF8_CHAR_3(p) \
+ (IS_UTF8_CHAR_3a(p) || \
+ IS_UTF8_CHAR_3b(p) || \
+ IS_UTF8_CHAR_3c(p) || \
+ IS_UTF8_CHAR_3d(p))
+#define IS_UTF8_CHAR_4(p) \
+ (IS_UTF8_CHAR_4a(p) || \
+ IS_UTF8_CHAR_4b(p) || \
+ IS_UTF8_CHAR_4c(p))
+
+/* IS_UTF8_CHAR(p) is strictly speaking wrong (not UTF-8) because it
+ * (1) allows UTF-8 encoded UTF-16 surrogates
+ * (2) it allows code points past U+10FFFF.
+ * The Perl_is_utf8_char() full "slow" code will handle the Perl
+ * "extended UTF-8". */
+#define IS_UTF8_CHAR(p, n) \
+ ((n) == 1 ? IS_UTF8_CHAR_1(p) : \
+ (n) == 2 ? IS_UTF8_CHAR_2(p) : \
+ (n) == 3 ? IS_UTF8_CHAR_3(p) : \
+ (n) == 4 ? IS_UTF8_CHAR_4(p) : 0)
+
+#define IS_UTF8_CHAR_FAST(n) ((n) <= 4)
+
+#endif /* IS_UTF8_CHAR() for UTF-8 */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h b/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h
new file mode 100644
index 00000000000..c3fe6036eea
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/utfebcdic.h
@@ -0,0 +1,485 @@
+/* utfebcdic.h
+ *
+ * Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2009 by Larry Wall,
+ * Nick Ing-Simmons, and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * Macros to implement UTF-EBCDIC as perl's internal encoding
+ * Taken from version 7.1 of Unicode Techical Report #16:
+ * http://www.unicode.org/unicode/reports/tr16
+ *
+ * To summarize, the way it works is:
+ * To convert an EBCDIC character to UTF-EBCDIC:
+ * 1) convert to Unicode. The table in this file that does this for
+ * EBCDIC bytes is PL_e2a (with inverse PLa2e). The 'a' stands for
+ * ASCIIish, meaning latin1.
+ * 2) convert that to a utf8-like string called I8 (I stands for
+ * intermediate) with variant characters occupying multiple bytes. This
+ * step is similar to the utf8-creating step from Unicode, but the details
+ * are different. This transformation is called UTF8-Mod. There is a
+ * chart about the bit patterns in a comment later in this file. But
+ * essentially here are the differences:
+ * UTF8 I8
+ * invariant byte starts with 0 starts with 0 or 100
+ * continuation byte starts with 10 starts with 101
+ * start byte same in both: if the code point requires N bytes,
+ * then the leading N bits are 1, followed by a 0. (No
+ * trailing 0 for the very largest possible allocation
+ * in I8, far beyond the current Unicode standard's
+ * max, as shown in the comment later in this file.)
+ * 3) Use the table published in tr16 to convert each byte from step 2 into
+ * final UTF-EBCDIC. That table is reproduced in this file as PL_utf2e,
+ * and its inverse is PL_e2utf. They are constructed so that all EBCDIC
+ * invariants remain invariant, but no others do. For example, the
+ * ordinal value of 'A' is 193 in EBCDIC, and also is 193 in UTF-EBCDIC.
+ * Step 1) converts it to 65, Step 2 leaves it at 65, and Step 3 converts
+ * it back to 193. As an example of how a variant character works, take
+ * LATIN SMALL LETTER Y WITH DIAERESIS, which is typicially 0xDF in
+ * EBCDIC. Step 1 converts it to the Unicode value, 0xFF. Step 2
+ * converts that to two bytes = 11000111 10111111 = C7 BF, and Step 3
+ * converts those to 0x8B 0x73. The table is constructed so that the
+ * first byte of the final form of a variant will always have its upper
+ * bit set (at least in the encodings that Perl recognizes, and probably
+ * all). But note that the upper bit of some invariants is also 1.
+ *
+ * If you're starting from Unicode, skip step 1. For UTF-EBCDIC to straight
+ * EBCDIC, reverse the steps.
+ *
+ * The EBCDIC invariants have been chosen to be those characters whose Unicode
+ * equivalents have ordinal numbers less than 160, that is the same characters
+ * that are expressible in ASCII, plus the C1 controls. So there are 160
+ * invariants instead of the 128 in UTF-8. (My guess is that this is because
+ * the C1 control NEL (and maybe others) is important in IBM.)
+ *
+ * The purpose of Step 3 is to make the encoding be invariant for the chosen
+ * characters. This messes up the convenient patterns found in step 2, so
+ * generally, one has to undo step 3 into a temporary to use them. However,
+ * a "shadow", or parallel table, PL_utf8skip, has been constructed so that for
+ * each byte, it says how long the sequence is if that byte were to begin it
+ *
+ * There are actually 3 slightly different UTF-EBCDIC encodings in this file,
+ * one for each of the code pages recognized by Perl. That means that there
+ * are actually three different sets of tables, one for each code page. (If
+ * Perl is compiled on platforms using another EBCDIC code page, it may not
+ * compile, or Perl may silently mistake it for one of the three.)
+ *
+ * EBCDIC characters above 0xFF are the same as Unicode in Perl's
+ * implementation of all 3 encodings, so for those Step 1 is trivial.
+ *
+ * (Note that the entries for invariant characters are necessarily the same in
+ * PL_e2a and PLe2f, and the same for their inverses.)
+ *
+ * UTF-EBCDIC strings are the same length or longer than UTF-8 representations
+ * of the same string. The maximum code point representable as 2 bytes in
+ * UTF-EBCDIC is 0x3FFF, instead of 0x7FFF in UTF-8.
+ */
+
+START_EXTERN_C
+
+#ifdef DOINIT
+/* Indexed by encoded byte this table gives the length of the sequence.
+ Adapted from the shadow flags table in tr16.
+ The entries marked 9 in tr6 are continuation bytes and are marked
+ as length 1 here so that we can recover.
+*/
+#if '^' == 95 /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
+EXTCONST unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,
+2,2,2,2,2,2,2,3,3,3,3,3,3,1,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,
+1,4,1,1,1,1,1,1,1,1,4,4,4,5,5,5,
+1,1,1,1,1,1,1,1,1,1,5,6,6,7,7,1
+};
+#endif
+
+#if '^' == 106 /* if defined(_OSD_POSIX) POSIX-BC */
+unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,3,1,1,1,1,1,1,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,3,1,1,1,1,1,1,1,1,2,2,2,3,2,2,
+1,2,2,2,2,2,2,3,3,3,2,1,1,1,3,3,
+4,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,4,6,4,4,
+7,4,1,1,1,1,1,1,1,1,4,4,4,5,5,5,
+1,1,1,1,1,1,1,1,1,1,5,1,6,1,7,1
+};
+#endif
+
+#if '^' == 176 /* if defined(??) (OS/400?) 037 */
+unsigned char PL_utf8skip[] = {
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,
+2,1,1,1,1,1,1,1,1,1,2,2,2,3,2,2,
+1,2,2,2,2,2,2,3,3,3,1,1,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,
+1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,
+1,4,1,1,1,1,1,1,1,1,4,4,4,5,5,5,
+1,1,1,1,1,1,1,1,1,1,5,6,6,7,7,1
+};
+#endif
+
+/* Transform tables from tr16 applied after encoding to render encoding EBCDIC
+ * like, meaning that all the invariants are actually invariant, eg, that 'A'
+ * remains 'A' */
+
+#if '^' == 95 /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
+EXTCONST unsigned char PL_utf2e[] = { /* I8 to EBCDIC (IBM-1047) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x9A, 0x9B, 0x9C,
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
+ 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBE, 0xBF, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE
+};
+
+EXTCONST unsigned char PL_e2utf[] = { /* EBCDIC (IBM-1047) to I8 */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
+ 0x2D, 0x2F, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
+ 0xCC, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
+ 0xD3, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD4, 0xD5, 0xD6, 0x5B, 0xD7, 0xD8,
+ 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0x5D, 0xE6, 0xE7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0x5C, 0xF4, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x9F
+};
+#endif /* 1047 */
+
+#if '^' == 106 /* if defined(_OSD_POSIX) POSIX-BC */
+unsigned char PL_utf2e[] = { /* I8 to EBCDIC (POSIX-BC) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBB, 0xBC, 0xBD, 0x6A, 0x6D,
+ 0x4A, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xFB, 0x4F, 0xFD, 0xFF, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0x5F,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xB0, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xD0, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x9A, 0x9B, 0x9C,
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0xBA, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
+ 0xB7, 0xB8, 0xB9, 0xAD, 0x79, 0xA1, 0xBE, 0xBF, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xDA, 0xDB,
+ 0xDC, 0xC0, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xDD, 0xFC, 0xE0, 0xFE
+};
+
+unsigned char PL_e2utf[] = { /* EBCDIC (POSIX-BC) to I8 */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0x60, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x9F,
+ 0x2D, 0x2F, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0x5E, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xE4, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
+ 0xCC, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
+ 0xD3, 0xE5, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD4, 0xD5, 0xD6, 0xE3, 0xD7, 0xD8,
+ 0xA9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xD9, 0x5B, 0x5C, 0x5D, 0xE6, 0xE7,
+ 0xF1, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED,
+ 0xBB, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xFC, 0xF2, 0xF3,
+ 0xFE, 0xF4, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFB, 0x7B, 0xFD, 0x7D, 0xFF, 0x7E
+};
+#endif /* POSIX-BC */
+
+#if '^' == 176 /* if defined(??) (OS/400?) 037 */
+unsigned char PL_utf2e[] = { /* I8 to EBCDIC (IBM-037) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x70, 0x71, 0x72, 0x73,
+ 0x74, 0x75, 0x76, 0x77, 0x78, 0x80, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x9A, 0x9B, 0x9C,
+ 0x9D, 0x9E, 0x9F, 0xA0, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0x5F, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
+ 0xB7, 0xB8, 0xB9, 0xAD, 0xBD, 0xBC, 0xBE, 0xBF, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE
+};
+
+unsigned char PL_e2utf[] = { /* EBCDIC (IBM-037) to I8 */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xD9,
+ 0x2D, 0x2F, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB,
+ 0xCC, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2,
+ 0xD3, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xD4, 0xD5, 0xD6, 0xE3, 0xD7, 0xD8,
+ 0x5E, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0x5B, 0x5D, 0xE5, 0xE4, 0xE6, 0xE7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0x5C, 0xF4, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x9F
+};
+#endif /* 037 */
+
+/* These tables moved from perl.h and converted to hex.
+ They map platfrom code page from/to bottom 256 codes of Unicode (i.e. iso-8859-1).
+*/
+
+#if '^' == 95 /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
+EXTCONST unsigned char PL_a2e[] = { /* ASCII (iso-8859-1) to EBCDIC (IBM-1047) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, 0xBB, 0xB4, 0x9A, 0x8A, 0xB0, 0xCA, 0xAF, 0xBC,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xBA, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+#define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0xDF
+#define LATIN_SMALL_LETTER_SHARP_S 0x59
+#define MICRO_SIGN 0xA0
+
+EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-1047) to ASCII (iso-8859-1) */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0x5B, 0xDE, 0xAE,
+ 0xAC, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, 0xBD, 0xBE, 0xDD, 0xA8, 0xAF, 0x5D, 0xB4, 0xD7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF,
+ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F
+};
+#endif /* 1047 */
+
+#if '^' == 106 /* if defined(_OSD_POSIX) POSIX-BC */
+EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBB, 0xBC, 0xBD, 0x6A, 0x6D,
+ 0x4A, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xFB, 0x4F, 0xFD, 0xFF, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0x5F,
+ 0x41, 0xAA, 0xB0, 0xB1, 0x9F, 0xB2, 0xD0, 0xB5, 0x79, 0xB4, 0x9A, 0x8A, 0xBA, 0xCA, 0xAF, 0xA1,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xE0, 0xFE, 0xDD, 0xFC, 0xAD, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xC0, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+#define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0xDF
+#define LATIN_SMALL_LETTER_SHARP_S 0x59
+#define MICRO_SIGN 0xA0
+
+EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x0A, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, 0xE7, 0xF1, 0x60, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x9F,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, 0xC7, 0xD1, 0x5E, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0xA8, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0xAF, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0xDD, 0xDE, 0xAE,
+ 0xA2, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, 0xBD, 0xBE, 0xAC, 0x5B, 0x5C, 0x5D, 0xB4, 0xD7,
+ 0xF9, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0xA6, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xDB, 0xFA, 0xFF,
+ 0xD9, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0x7B, 0xDC, 0x7D, 0xDA, 0x7E
+};
+#endif /* POSIX-BC */
+
+#if '^' == 176 /* if defined(??) (OS/400?) 037 */
+EXTCONST unsigned char PL_a2e[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, 0x16, 0x05, 0x25, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, 0x18, 0x19, 0x3F, 0x27, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
+ 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
+ 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D,
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x09, 0x0A, 0x1B,
+ 0x30, 0x31, 0x1A, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3A, 0x3B, 0x04, 0x14, 0x3E, 0xFF,
+ 0x41, 0xAA, 0x4A, 0xB1, 0x9F, 0xB2, 0x6A, 0xB5, 0xBD, 0xB4, 0x9A, 0x8A, 0x5F, 0xCA, 0xAF, 0xBC,
+ 0x90, 0x8F, 0xEA, 0xFA, 0xBE, 0xA0, 0xB6, 0xB3, 0x9D, 0xDA, 0x9B, 0x8B, 0xB7, 0xB8, 0xB9, 0xAB,
+ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9E, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77,
+ 0xAC, 0x69, 0xED, 0xEE, 0xEB, 0xEF, 0xEC, 0xBF, 0x80, 0xFD, 0xFE, 0xFB, 0xFC, 0xAD, 0xAE, 0x59,
+ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9C, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57,
+ 0x8C, 0x49, 0xCD, 0xCE, 0xCB, 0xCF, 0xCC, 0xE1, 0x70, 0xDD, 0xDE, 0xDB, 0xDC, 0x8D, 0x8E, 0xDF
+};
+
+
+#define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0xDF
+#define LATIN_SMALL_LETTER_SHARP_S 0x59
+#define MICRO_SIGN 0xA0
+
+EXTCONST unsigned char PL_e2a[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */
+ 0x00, 0x01, 0x02, 0x03, 0x9C, 0x09, 0x86, 0x7F, 0x97, 0x8D, 0x8E, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x9D, 0x85, 0x08, 0x87, 0x18, 0x19, 0x92, 0x8F, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x0A, 0x17, 0x1B, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x05, 0x06, 0x07,
+ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9A, 0x9B, 0x14, 0x15, 0x9E, 0x1A,
+ 0x20, 0xA0, 0xE2, 0xE4, 0xE0, 0xE1, 0xE3, 0xE5, 0xE7, 0xF1, 0xA2, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+ 0x26, 0xE9, 0xEA, 0xEB, 0xE8, 0xED, 0xEE, 0xEF, 0xEC, 0xDF, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAC,
+ 0x2D, 0x2F, 0xC2, 0xC4, 0xC0, 0xC1, 0xC3, 0xC5, 0xC7, 0xD1, 0xA6, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
+ 0xF8, 0xC9, 0xCA, 0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
+ 0xD8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xAB, 0xBB, 0xF0, 0xFD, 0xFE, 0xB1,
+ 0xB0, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0xAA, 0xBA, 0xE6, 0xB8, 0xC6, 0xA4,
+ 0xB5, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0xBF, 0xD0, 0xDD, 0xDE, 0xAE,
+ 0x5E, 0xA3, 0xA5, 0xB7, 0xA9, 0xA7, 0xB6, 0xBC, 0xBD, 0xBE, 0x5B, 0x5D, 0xAF, 0xA8, 0xB4, 0xD7,
+ 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xAD, 0xF4, 0xF6, 0xF2, 0xF3, 0xF5,
+ 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0xB9, 0xFB, 0xFC, 0xF9, 0xFA, 0xFF,
+ 0x5C, 0xF7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0xB2, 0xD4, 0xD6, 0xD2, 0xD3, 0xD5,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xB3, 0xDB, 0xDC, 0xD9, 0xDA, 0x9F
+};
+#endif /* 037 */
+
+#else
+EXTCONST unsigned char PL_utf8skip[];
+EXTCONST unsigned char PL_e2utf[];
+EXTCONST unsigned char PL_utf2e[];
+EXTCONST unsigned char PL_e2a[];
+EXTCONST unsigned char PL_a2e[];
+#endif
+
+END_EXTERN_C
+
+/* EBCDIC-happy ways of converting native code to UTF-8 */
+
+/* Native to iso-8859-1 */
+#define NATIVE_TO_ASCII(ch) PL_e2a[(U8)(ch)]
+#define ASCII_TO_NATIVE(ch) PL_a2e[(U8)(ch)]
+/* Transform after encoding */
+#define NATIVE_TO_UTF(ch) PL_e2utf[(U8)(ch)]
+#define UTF_TO_NATIVE(ch) PL_utf2e[(U8)(ch)]
+/* Transform in wide UV char space */
+#define NATIVE_TO_UNI(ch) (((ch) > 255) ? (ch) : NATIVE_TO_ASCII(ch))
+#define UNI_TO_NATIVE(ch) (((ch) > 255) ? (ch) : ASCII_TO_NATIVE(ch))
+/* Transform in invariant..byte space */
+#define NATIVE_TO_NEED(enc,ch) ((enc) ? UTF_TO_NATIVE(NATIVE_TO_ASCII(ch)) : (ch))
+#define ASCII_TO_NEED(enc,ch) ((enc) ? UTF_TO_NATIVE(ch) : ASCII_TO_NATIVE(ch))
+
+/*
+ The following table is adapted from tr16, it shows I8 encoding of Unicode code points.
+
+ Unicode Bit pattern 1st Byte 2nd Byte 3rd Byte 4th Byte 5th Byte 6th Byte 7th byte
+ U+0000..U+007F 000000000xxxxxxx 0xxxxxxx
+ U+0080..U+009F 00000000100xxxxx 100xxxxx
+ U+00A0..U+00FF 00000000yyyxxxxx 11000yyy 101xxxxx
+
+ U+00A0..U+03FF 000000yyyyyxxxxx 110yyyyy 101xxxxx
+ U+0400..U+3FFF 00zzzzyyyyyxxxxx 1110zzzz 101yyyyy 101xxxxx
+ U+4000..U+3FFFF 0wwwzzzzzyyyyyxxxxx 11110www 101zzzzz 101yyyyy 101xxxxx
+ U+40000..U+3FFFFF 0vvwwwwwzzzzzyyyyyxxxxx 111110vv 101wwwww 101zzzzz 101yyyyy 101xxxxx
+ U+400000..U+3FFFFFF 0uvvvvvwwwwwzzzzzyyyyyxxxxx 1111110u 101vvvvv 101wwwww 101zzzzz 101yyyyy 101xxxxx
+ U+4000000..U+7FFFFFFF 0tuuuuuvvvvvwwwwwzzzzzyyyyyxxxxx 1111111t 101uuuuu 101vvvvv 101wwwww 101zzzzz 101yyyyy 101xxxxx
+
+ Note: The I8 transformation is valid for UCS-4 values X'0' to
+ X'7FFFFFFF' (the full extent of ISO/IEC 10646 coding space).
+
+ */
+
+#define UNISKIP(uv) ( (uv) < 0xA0 ? 1 : \
+ (uv) < 0x400 ? 2 : \
+ (uv) < 0x4000 ? 3 : \
+ (uv) < 0x40000 ? 4 : \
+ (uv) < 0x400000 ? 5 : \
+ (uv) < 0x4000000 ? 6 : 7 )
+
+
+#define UNI_IS_INVARIANT(c) ((c) < 0xA0)
+/* UTF-EBCDIC semantic macros - transform back into I8 and then compare */
+#define UTF8_IS_START(c) (NATIVE_TO_UTF(c) >= 0xA0 && (NATIVE_TO_UTF(c) & 0xE0) != 0xA0)
+#define UTF8_IS_CONTINUATION(c) ((NATIVE_TO_UTF(c) & 0xE0) == 0xA0)
+#define UTF8_IS_CONTINUED(c) (NATIVE_TO_UTF(c) >= 0xA0)
+#define UTF8_IS_DOWNGRADEABLE_START(c) (NATIVE_TO_UTF(c) >= 0xA0 && (NATIVE_TO_UTF(c) & 0xF8) == 0xC0)
+
+#define UTF_START_MARK(len) (((len) > 7) ? 0xFF : ((U8)(0xFE << (7-(len)))))
+#define UTF_START_MASK(len) (((len) >= 6) ? 0x01 : (0x1F >> ((len)-2)))
+#define UTF_CONTINUATION_MARK 0xA0
+#define UTF_CONTINUATION_MASK ((U8)0x1f)
+#define UTF_ACCUMULATION_SHIFT 5
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/util.h b/Master/tlpkg/tlperl/lib/CORE/util.h
new file mode 100644
index 00000000000..6eab0556860
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/util.h
@@ -0,0 +1,49 @@
+/* util.h
+ *
+ * Copyright (C) 1991, 1992, 1993, 1999, 2001, 2002, 2003, 2004, 2005,
+ * 2007, by Larry Wall and others
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+#ifdef VMS
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (*(f) == '/' \
+ || (strchr(f,':') \
+ || ((*(f) == '[' || *(f) == '<') \
+ && (isALNUM((f)[1]) || strchr("$-_]>",(f)[1])))))
+
+#else /* !VMS */
+# if defined(WIN32) || defined(__CYGWIN__)
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (*(f) == '/' || *(f) == '\\' /* UNC/rooted path */ \
+ || ((f)[0] && (f)[1] == ':')) /* drive name */
+# else /* !WIN32 */
+# ifdef NETWARE
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (((f)[0] && (f)[1] == ':') /* drive name */ \
+ || ((f)[0] == '\\' && (f)[1] == '\\') /* UNC path */ \
+ || ((f)[3] == ':')) /* volume name, currently only sys */
+# else /* !NETWARE */
+# if defined(DOSISH) || defined(EPOC) || defined(__SYMBIAN32__)
+# define PERL_FILE_IS_ABSOLUTE(f) \
+ (*(f) == '/' \
+ || ((f)[0] && (f)[1] == ':')) /* drive name */
+# else /* NEITHER DOSISH NOR EPOCISH NOR SYMBIANISH */
+# define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
+# endif /* DOSISH */
+# endif /* NETWARE */
+# endif /* WIN32 */
+#endif /* VMS */
+
+/*
+ * Local variables:
+ * c-indentation-style: bsd
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * ex: set ts=8 sts=4 sw=4 noet:
+ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/uudmap.h b/Master/tlpkg/tlperl/lib/CORE/uudmap.h
new file mode 100644
index 00000000000..41341665dd2
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/uudmap.h
@@ -0,0 +1,18 @@
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+}
diff --git a/Master/tlpkg/tlperl/lib/CORE/vdir.h b/Master/tlpkg/tlperl/lib/CORE/vdir.h
new file mode 100644
index 00000000000..db7ec8417fe
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/vdir.h
@@ -0,0 +1,726 @@
+/* vdir.h
+ *
+ * (c) 1999 Microsoft Corporation. All rights reserved.
+ * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ */
+
+#ifndef ___VDir_H___
+#define ___VDir_H___
+
+/*
+ * Allow one slot for each possible drive letter
+ * and one additional slot for a UNC name
+ */
+const int driveCount = ('Z'-'A')+1+1;
+
+class VDir
+{
+public:
+ VDir(int bManageDir = 1);
+ ~VDir() {};
+
+ void Init(VDir* pDir, VMem *pMem);
+ void SetDefaultA(char const *pDefault);
+ void SetDefaultW(WCHAR const *pDefault);
+ char* MapPathA(const char *pInName);
+ WCHAR* MapPathW(const WCHAR *pInName);
+ int SetCurrentDirectoryA(char *lpBuffer);
+ int SetCurrentDirectoryW(WCHAR *lpBuffer);
+ inline int GetDefault(void) { return nDefault; };
+
+ inline char* GetCurrentDirectoryA(int dwBufSize, char *lpBuffer)
+ {
+ char* ptr = dirTableA[nDefault];
+ while (--dwBufSize)
+ {
+ if ((*lpBuffer++ = *ptr++) == '\0')
+ break;
+ }
+ *lpBuffer = '\0';
+ return /* unused */ NULL;
+ };
+ inline WCHAR* GetCurrentDirectoryW(int dwBufSize, WCHAR *lpBuffer)
+ {
+ WCHAR* ptr = dirTableW[nDefault];
+ while (--dwBufSize)
+ {
+ if ((*lpBuffer++ = *ptr++) == '\0')
+ break;
+ }
+ *lpBuffer = '\0';
+ return /* unused */ NULL;
+ };
+
+ DWORD CalculateEnvironmentSpace(void);
+ LPSTR BuildEnvironmentSpace(LPSTR lpStr);
+
+protected:
+ int SetDirA(char const *pPath, int index);
+ int SetDirW(WCHAR const *pPath, int index);
+ void FromEnvA(char *pEnv, int index);
+ void FromEnvW(WCHAR *pEnv, int index);
+
+ inline const char *GetDefaultDirA(void)
+ {
+ return dirTableA[nDefault];
+ };
+ inline void SetDefaultDirA(char const *pPath, int index)
+ {
+ SetDirA(pPath, index);
+ nDefault = index;
+ };
+ inline const WCHAR *GetDefaultDirW(void)
+ {
+ return dirTableW[nDefault];
+ };
+ inline void SetDefaultDirW(WCHAR const *pPath, int index)
+ {
+ SetDirW(pPath, index);
+ nDefault = index;
+ };
+ inline const char *GetDirA(int index)
+ {
+ char *ptr = dirTableA[index];
+ if (!ptr) {
+ /* simulate the existance of this drive */
+ ptr = szLocalBufferA;
+ ptr[0] = 'A' + index;
+ ptr[1] = ':';
+ ptr[2] = '\\';
+ ptr[3] = 0;
+ }
+ return ptr;
+ };
+ inline const WCHAR *GetDirW(int index)
+ {
+ WCHAR *ptr = dirTableW[index];
+ if (!ptr) {
+ /* simulate the existance of this drive */
+ ptr = szLocalBufferW;
+ ptr[0] = 'A' + index;
+ ptr[1] = ':';
+ ptr[2] = '\\';
+ ptr[3] = 0;
+ }
+ return ptr;
+ };
+
+ inline int DriveIndex(char chr)
+ {
+ if (chr == '\\' || chr == '/')
+ return ('Z'-'A')+1;
+ return (chr | 0x20)-'a';
+ };
+
+ VMem *pMem;
+ int nDefault, bManageDirectory;
+ char *dirTableA[driveCount];
+ char szLocalBufferA[MAX_PATH+1];
+ WCHAR *dirTableW[driveCount];
+ WCHAR szLocalBufferW[MAX_PATH+1];
+};
+
+
+VDir::VDir(int bManageDir /* = 1 */)
+{
+ nDefault = 0;
+ bManageDirectory = bManageDir;
+ memset(dirTableA, 0, sizeof(dirTableA));
+ memset(dirTableW, 0, sizeof(dirTableW));
+}
+
+void VDir::Init(VDir* pDir, VMem *p)
+{
+ int index;
+
+ pMem = p;
+ if (pDir) {
+ for (index = 0; index < driveCount; ++index) {
+ SetDirW(pDir->GetDirW(index), index);
+ }
+ nDefault = pDir->GetDefault();
+ }
+ else {
+ int bSave = bManageDirectory;
+ DWORD driveBits = GetLogicalDrives();
+ OSVERSIONINFO osver;
+
+ memset(&osver, 0, sizeof(osver));
+ osver.dwOSVersionInfoSize = sizeof(osver);
+ GetVersionEx(&osver);
+
+ bManageDirectory = 0;
+ if (osver.dwMajorVersion < 5) {
+ char szBuffer[MAX_PATH*driveCount];
+ if (GetLogicalDriveStringsA(sizeof(szBuffer), szBuffer)) {
+ char* pEnv = (char*)GetEnvironmentStringsA();
+ char* ptr = szBuffer;
+ for (index = 0; index < driveCount; ++index) {
+ if (driveBits & (1<<index)) {
+ ptr += SetDirA(ptr, index) + 1;
+ FromEnvA(pEnv, index);
+ }
+ }
+ FreeEnvironmentStringsA(pEnv);
+ }
+ SetDefaultA(".");
+ }
+ else { /* Windows 2000 or later */
+ WCHAR szBuffer[MAX_PATH*driveCount];
+ if (GetLogicalDriveStringsW(sizeof(szBuffer), szBuffer)) {
+ WCHAR* pEnv = GetEnvironmentStringsW();
+ WCHAR* ptr = szBuffer;
+ for (index = 0; index < driveCount; ++index) {
+ if (driveBits & (1<<index)) {
+ ptr += SetDirW(ptr, index) + 1;
+ FromEnvW(pEnv, index);
+ }
+ }
+ FreeEnvironmentStringsW(pEnv);
+ }
+ SetDefaultW(L".");
+ }
+ bManageDirectory = bSave;
+ }
+}
+
+int VDir::SetDirA(char const *pPath, int index)
+{
+ char chr, *ptr;
+ int length = 0;
+ WCHAR wBuffer[MAX_PATH+1];
+ if (index < driveCount && pPath != NULL) {
+ length = strlen(pPath);
+ pMem->Free(dirTableA[index]);
+ ptr = dirTableA[index] = (char*)pMem->Malloc(length+2);
+ if (ptr != NULL) {
+ strcpy(ptr, pPath);
+ ptr += length-1;
+ chr = *ptr++;
+ if (chr != '\\' && chr != '/') {
+ *ptr++ = '\\';
+ *ptr = '\0';
+ }
+ MultiByteToWideChar(CP_ACP, 0, dirTableA[index], -1,
+ wBuffer, (sizeof(wBuffer)/sizeof(WCHAR)));
+ length = wcslen(wBuffer);
+ pMem->Free(dirTableW[index]);
+ dirTableW[index] = (WCHAR*)pMem->Malloc((length+1)*2);
+ if (dirTableW[index] != NULL) {
+ wcscpy(dirTableW[index], wBuffer);
+ }
+ }
+ }
+
+ if(bManageDirectory)
+ ::SetCurrentDirectoryA(pPath);
+
+ return length;
+}
+
+void VDir::FromEnvA(char *pEnv, int index)
+{ /* gets the directory for index from the environment variable. */
+ while (*pEnv != '\0') {
+ if ((pEnv[0] == '=') && (DriveIndex(pEnv[1]) == index)) {
+ SetDirA(&pEnv[4], index);
+ break;
+ }
+ else
+ pEnv += strlen(pEnv)+1;
+ }
+}
+
+void VDir::FromEnvW(WCHAR *pEnv, int index)
+{ /* gets the directory for index from the environment variable. */
+ while (*pEnv != '\0') {
+ if ((pEnv[0] == '=') && (DriveIndex((char)pEnv[1]) == index)) {
+ SetDirW(&pEnv[4], index);
+ break;
+ }
+ else
+ pEnv += wcslen(pEnv)+1;
+ }
+}
+
+void VDir::SetDefaultA(char const *pDefault)
+{
+ char szBuffer[MAX_PATH+1];
+ char *pPtr;
+
+ if (GetFullPathNameA(pDefault, sizeof(szBuffer), szBuffer, &pPtr)) {
+ if (*pDefault != '.' && pPtr != NULL)
+ *pPtr = '\0';
+
+ SetDefaultDirA(szBuffer, DriveIndex(szBuffer[0]));
+ }
+}
+
+int VDir::SetDirW(WCHAR const *pPath, int index)
+{
+ WCHAR chr, *ptr;
+ int length = 0;
+ if (index < driveCount && pPath != NULL) {
+ length = wcslen(pPath);
+ pMem->Free(dirTableW[index]);
+ ptr = dirTableW[index] = (WCHAR*)pMem->Malloc((length+2)*2);
+ if (ptr != NULL) {
+ char *ansi;
+ wcscpy(ptr, pPath);
+ ptr += length-1;
+ chr = *ptr++;
+ if (chr != '\\' && chr != '/') {
+ *ptr++ = '\\';
+ *ptr = '\0';
+ }
+ ansi = win32_ansipath(dirTableW[index]);
+ length = strlen(ansi);
+ pMem->Free(dirTableA[index]);
+ dirTableA[index] = (char*)pMem->Malloc(length+1);
+ if (dirTableA[index] != NULL) {
+ strcpy(dirTableA[index], ansi);
+ }
+ win32_free(ansi);
+ }
+ }
+
+ if(bManageDirectory)
+ ::SetCurrentDirectoryW(pPath);
+
+ return length;
+}
+
+void VDir::SetDefaultW(WCHAR const *pDefault)
+{
+ WCHAR szBuffer[MAX_PATH+1];
+ WCHAR *pPtr;
+
+ if (GetFullPathNameW(pDefault, (sizeof(szBuffer)/sizeof(WCHAR)), szBuffer, &pPtr)) {
+ if (*pDefault != '.' && pPtr != NULL)
+ *pPtr = '\0';
+
+ SetDefaultDirW(szBuffer, DriveIndex((char)szBuffer[0]));
+ }
+}
+
+inline BOOL IsPathSep(char ch)
+{
+ return (ch == '\\' || ch == '/');
+}
+
+inline void DoGetFullPathNameA(char* lpBuffer, DWORD dwSize, char* Dest)
+{
+ char *pPtr;
+
+ /*
+ * On WinNT GetFullPathName does not fail, (or at least always
+ * succeeds when the drive is valid) WinNT does set *Dest to NULL
+ * On Win98 GetFullPathName will set last error if it fails, but
+ * does not touch *Dest
+ */
+ *Dest = '\0';
+ GetFullPathNameA(lpBuffer, dwSize, Dest, &pPtr);
+}
+
+inline bool IsSpecialFileName(const char* pName)
+{
+ /* specical file names are devices that the system can open
+ * these include AUX, CON, NUL, PRN, COMx, LPTx, CLOCK$, CONIN$, CONOUT$
+ * (x is a single digit, and names are case-insensitive)
+ */
+ char ch = (pName[0] & ~0x20);
+ switch (ch)
+ {
+ case 'A': /* AUX */
+ if (((pName[1] & ~0x20) == 'U')
+ && ((pName[2] & ~0x20) == 'X')
+ && !pName[3])
+ return true;
+ break;
+ case 'C': /* CLOCK$, COMx, CON, CONIN$ CONOUT$ */
+ ch = (pName[1] & ~0x20);
+ switch (ch)
+ {
+ case 'L': /* CLOCK$ */
+ if (((pName[2] & ~0x20) == 'O')
+ && ((pName[3] & ~0x20) == 'C')
+ && ((pName[4] & ~0x20) == 'K')
+ && (pName[5] == '$')
+ && !pName[6])
+ return true;
+ break;
+ case 'O': /* COMx, CON, CONIN$ CONOUT$ */
+ if ((pName[2] & ~0x20) == 'M') {
+ if ((pName[3] >= '1') && (pName[3] <= '9')
+ && !pName[4])
+ return true;
+ }
+ else if ((pName[2] & ~0x20) == 'N') {
+ if (!pName[3])
+ return true;
+ else if ((pName[3] & ~0x20) == 'I') {
+ if (((pName[4] & ~0x20) == 'N')
+ && (pName[5] == '$')
+ && !pName[6])
+ return true;
+ }
+ else if ((pName[3] & ~0x20) == 'O') {
+ if (((pName[4] & ~0x20) == 'U')
+ && ((pName[5] & ~0x20) == 'T')
+ && (pName[6] == '$')
+ && !pName[7])
+ return true;
+ }
+ }
+ break;
+ }
+ break;
+ case 'L': /* LPTx */
+ if (((pName[1] & ~0x20) == 'U')
+ && ((pName[2] & ~0x20) == 'X')
+ && (pName[3] >= '1') && (pName[3] <= '9')
+ && !pName[4])
+ return true;
+ break;
+ case 'N': /* NUL */
+ if (((pName[1] & ~0x20) == 'U')
+ && ((pName[2] & ~0x20) == 'L')
+ && !pName[3])
+ return true;
+ break;
+ case 'P': /* PRN */
+ if (((pName[1] & ~0x20) == 'R')
+ && ((pName[2] & ~0x20) == 'N')
+ && !pName[3])
+ return true;
+ break;
+ }
+ return false;
+}
+
+char *VDir::MapPathA(const char *pInName)
+{ /*
+ * possiblities -- relative path or absolute path with or without drive letter
+ * OR UNC name
+ */
+ char szBuffer[(MAX_PATH+1)*2];
+ char szlBuf[MAX_PATH+1];
+ int length = strlen(pInName);
+
+ if (!length)
+ return (char*)pInName;
+
+ if (length > MAX_PATH) {
+ strncpy(szlBuf, pInName, MAX_PATH);
+ if (IsPathSep(pInName[0]) && !IsPathSep(pInName[1])) {
+ /* absolute path - reduce length by 2 for drive specifier */
+ szlBuf[MAX_PATH-2] = '\0';
+ }
+ else
+ szlBuf[MAX_PATH] = '\0';
+ pInName = szlBuf;
+ }
+ /* strlen(pInName) is now <= MAX_PATH */
+
+ if (pInName[1] == ':') {
+ /* has drive letter */
+ if (IsPathSep(pInName[2])) {
+ /* absolute with drive letter */
+ DoGetFullPathNameA((char*)pInName, sizeof(szLocalBufferA), szLocalBufferA);
+ }
+ else {
+ /* relative path with drive letter */
+ strcpy(szBuffer, GetDirA(DriveIndex(*pInName)));
+ strcat(szBuffer, &pInName[2]);
+ if(strlen(szBuffer) > MAX_PATH)
+ szBuffer[MAX_PATH] = '\0';
+
+ DoGetFullPathNameA(szBuffer, sizeof(szLocalBufferA), szLocalBufferA);
+ }
+ }
+ else {
+ /* no drive letter */
+ if (IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
+ /* UNC name */
+ DoGetFullPathNameA((char*)pInName, sizeof(szLocalBufferA), szLocalBufferA);
+ }
+ else {
+ strcpy(szBuffer, GetDefaultDirA());
+ if (IsPathSep(pInName[0])) {
+ /* absolute path */
+ strcpy(&szBuffer[2], pInName);
+ DoGetFullPathNameA(szBuffer, sizeof(szLocalBufferA), szLocalBufferA);
+ }
+ else {
+ /* relative path */
+ if (IsSpecialFileName(pInName)) {
+ return (char*)pInName;
+ }
+ else {
+ strcat(szBuffer, pInName);
+ if (strlen(szBuffer) > MAX_PATH)
+ szBuffer[MAX_PATH] = '\0';
+
+ DoGetFullPathNameA(szBuffer, sizeof(szLocalBufferA), szLocalBufferA);
+ }
+ }
+ }
+ }
+
+ return szLocalBufferA;
+}
+
+int VDir::SetCurrentDirectoryA(char *lpBuffer)
+{
+ char *pPtr;
+ int length, nRet = -1;
+
+ pPtr = MapPathA(lpBuffer);
+ length = strlen(pPtr);
+ if(length > 3 && IsPathSep(pPtr[length-1])) {
+ /* don't remove the trailing slash from 'x:\' */
+ pPtr[length-1] = '\0';
+ }
+
+ DWORD r = GetFileAttributesA(pPtr);
+ if ((r != 0xffffffff) && (r & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ char szBuffer[(MAX_PATH+1)*2];
+ DoGetFullPathNameA(pPtr, sizeof(szBuffer), szBuffer);
+ SetDefaultDirA(szBuffer, DriveIndex(szBuffer[0]));
+ nRet = 0;
+ }
+
+ return nRet;
+}
+
+DWORD VDir::CalculateEnvironmentSpace(void)
+{ /* the current directory environment strings are stored as '=D:=d:\path' */
+ int index;
+ DWORD dwSize = 0;
+ for (index = 0; index < driveCount; ++index) {
+ if (dirTableA[index] != NULL) {
+ dwSize += strlen(dirTableA[index]) + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
+ }
+ }
+ return dwSize;
+}
+
+LPSTR VDir::BuildEnvironmentSpace(LPSTR lpStr)
+{ /* store the current directory environment strings as '=D:=d:\path' */
+ int index, length;
+ LPSTR lpDirStr;
+ for (index = 0; index < driveCount; ++index) {
+ lpDirStr = dirTableA[index];
+ if (lpDirStr != NULL) {
+ lpStr[0] = '=';
+ lpStr[1] = lpDirStr[0];
+ lpStr[2] = '\0';
+ CharUpper(&lpStr[1]);
+ lpStr[2] = ':';
+ lpStr[3] = '=';
+ strcpy(&lpStr[4], lpDirStr);
+ length = strlen(lpDirStr);
+ lpStr += length + 5; /* add 1 for trailing NULL and 4 for '=D:=' */
+ if (length > 3 && IsPathSep(lpStr[-2])) {
+ lpStr[-2] = '\0'; /* remove the trailing path separator */
+ --lpStr;
+ }
+ }
+ }
+ return lpStr;
+}
+
+inline BOOL IsPathSep(WCHAR ch)
+{
+ return (ch == '\\' || ch == '/');
+}
+
+inline void DoGetFullPathNameW(WCHAR* lpBuffer, DWORD dwSize, WCHAR* Dest)
+{
+ WCHAR *pPtr;
+
+ /*
+ * On WinNT GetFullPathName does not fail, (or at least always
+ * succeeds when the drive is valid) WinNT does set *Dest to NULL
+ * On Win98 GetFullPathName will set last error if it fails, but
+ * does not touch *Dest
+ */
+ *Dest = '\0';
+ GetFullPathNameW(lpBuffer, dwSize, Dest, &pPtr);
+}
+
+inline bool IsSpecialFileName(const WCHAR* pName)
+{
+ /* specical file names are devices that the system can open
+ * these include AUX, CON, NUL, PRN, COMx, LPTx, CLOCK$, CONIN$, CONOUT$
+ * (x is a single digit, and names are case-insensitive)
+ */
+ WCHAR ch = (pName[0] & ~0x20);
+ switch (ch)
+ {
+ case 'A': /* AUX */
+ if (((pName[1] & ~0x20) == 'U')
+ && ((pName[2] & ~0x20) == 'X')
+ && !pName[3])
+ return true;
+ break;
+ case 'C': /* CLOCK$, COMx, CON, CONIN$ CONOUT$ */
+ ch = (pName[1] & ~0x20);
+ switch (ch)
+ {
+ case 'L': /* CLOCK$ */
+ if (((pName[2] & ~0x20) == 'O')
+ && ((pName[3] & ~0x20) == 'C')
+ && ((pName[4] & ~0x20) == 'K')
+ && (pName[5] == '$')
+ && !pName[6])
+ return true;
+ break;
+ case 'O': /* COMx, CON, CONIN$ CONOUT$ */
+ if ((pName[2] & ~0x20) == 'M') {
+ if ((pName[3] >= '1') && (pName[3] <= '9')
+ && !pName[4])
+ return true;
+ }
+ else if ((pName[2] & ~0x20) == 'N') {
+ if (!pName[3])
+ return true;
+ else if ((pName[3] & ~0x20) == 'I') {
+ if (((pName[4] & ~0x20) == 'N')
+ && (pName[5] == '$')
+ && !pName[6])
+ return true;
+ }
+ else if ((pName[3] & ~0x20) == 'O') {
+ if (((pName[4] & ~0x20) == 'U')
+ && ((pName[5] & ~0x20) == 'T')
+ && (pName[6] == '$')
+ && !pName[7])
+ return true;
+ }
+ }
+ break;
+ }
+ break;
+ case 'L': /* LPTx */
+ if (((pName[1] & ~0x20) == 'U')
+ && ((pName[2] & ~0x20) == 'X')
+ && (pName[3] >= '1') && (pName[3] <= '9')
+ && !pName[4])
+ return true;
+ break;
+ case 'N': /* NUL */
+ if (((pName[1] & ~0x20) == 'U')
+ && ((pName[2] & ~0x20) == 'L')
+ && !pName[3])
+ return true;
+ break;
+ case 'P': /* PRN */
+ if (((pName[1] & ~0x20) == 'R')
+ && ((pName[2] & ~0x20) == 'N')
+ && !pName[3])
+ return true;
+ break;
+ }
+ return false;
+}
+
+WCHAR* VDir::MapPathW(const WCHAR *pInName)
+{ /*
+ * possiblities -- relative path or absolute path with or without drive letter
+ * OR UNC name
+ */
+ WCHAR szBuffer[(MAX_PATH+1)*2];
+ WCHAR szlBuf[MAX_PATH+1];
+ int length = wcslen(pInName);
+
+ if (!length)
+ return (WCHAR*)pInName;
+
+ if (length > MAX_PATH) {
+ wcsncpy(szlBuf, pInName, MAX_PATH);
+ if (IsPathSep(pInName[0]) && !IsPathSep(pInName[1])) {
+ /* absolute path - reduce length by 2 for drive specifier */
+ szlBuf[MAX_PATH-2] = '\0';
+ }
+ else
+ szlBuf[MAX_PATH] = '\0';
+ pInName = szlBuf;
+ }
+ /* strlen(pInName) is now <= MAX_PATH */
+
+ if (pInName[1] == ':') {
+ /* has drive letter */
+ if (IsPathSep(pInName[2])) {
+ /* absolute with drive letter */
+ DoGetFullPathNameW((WCHAR*)pInName, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+ }
+ else {
+ /* relative path with drive letter */
+ wcscpy(szBuffer, GetDirW(DriveIndex((char)*pInName)));
+ wcscat(szBuffer, &pInName[2]);
+ if(wcslen(szBuffer) > MAX_PATH)
+ szBuffer[MAX_PATH] = '\0';
+
+ DoGetFullPathNameW(szBuffer, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+ }
+ }
+ else {
+ /* no drive letter */
+ if (IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
+ /* UNC name */
+ DoGetFullPathNameW((WCHAR*)pInName, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+ }
+ else {
+ wcscpy(szBuffer, GetDefaultDirW());
+ if (IsPathSep(pInName[0])) {
+ /* absolute path */
+ wcscpy(&szBuffer[2], pInName);
+ DoGetFullPathNameW(szBuffer, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+ }
+ else {
+ /* relative path */
+ if (IsSpecialFileName(pInName)) {
+ return (WCHAR*)pInName;
+ }
+ else {
+ wcscat(szBuffer, pInName);
+ if (wcslen(szBuffer) > MAX_PATH)
+ szBuffer[MAX_PATH] = '\0';
+
+ DoGetFullPathNameW(szBuffer, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
+ }
+ }
+ }
+ }
+ return szLocalBufferW;
+}
+
+int VDir::SetCurrentDirectoryW(WCHAR *lpBuffer)
+{
+ WCHAR *pPtr;
+ int length, nRet = -1;
+
+ pPtr = MapPathW(lpBuffer);
+ length = wcslen(pPtr);
+ if(length > 3 && IsPathSep(pPtr[length-1])) {
+ /* don't remove the trailing slash from 'x:\' */
+ pPtr[length-1] = '\0';
+ }
+
+ DWORD r = GetFileAttributesW(pPtr);
+ if ((r != 0xffffffff) && (r & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ WCHAR wBuffer[(MAX_PATH+1)*2];
+ DoGetFullPathNameW(pPtr, (sizeof(wBuffer)/sizeof(WCHAR)), wBuffer);
+ SetDefaultDirW(wBuffer, DriveIndex((char)wBuffer[0]));
+ nRet = 0;
+ }
+
+ return nRet;
+}
+
+#endif /* ___VDir_H___ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/vmem.h b/Master/tlpkg/tlperl/lib/CORE/vmem.h
new file mode 100644
index 00000000000..460f55793a8
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/vmem.h
@@ -0,0 +1,1259 @@
+/* vmem.h
+ *
+ * (c) 1999 Microsoft Corporation. All rights reserved.
+ * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ * Options:
+ *
+ * Defining _USE_MSVCRT_MEM_ALLOC will cause all memory allocations
+ * to be forwarded to MSVCRT.DLL. Defining _USE_LINKED_LIST as well will
+ * track all allocations in a doubly linked list, so that the host can
+ * free all memory allocated when it goes away.
+ * If _USE_MSVCRT_MEM_ALLOC is not defined then Knuth's boundary tag algorithm
+ * is used; defining _USE_BUDDY_BLOCKS will use Knuth's algorithm R
+ * (Buddy system reservation)
+ *
+ */
+
+#ifndef ___VMEM_H_INC___
+#define ___VMEM_H_INC___
+
+#ifndef UNDER_CE
+#define _USE_MSVCRT_MEM_ALLOC
+#endif
+#define _USE_LINKED_LIST
+
+// #define _USE_BUDDY_BLOCKS
+
+// #define _DEBUG_MEM
+#ifdef _DEBUG_MEM
+#define ASSERT(f) if(!(f)) DebugBreak();
+
+inline void MEMODS(char *str)
+{
+ OutputDebugString(str);
+ OutputDebugString("\n");
+}
+
+inline void MEMODSlx(char *str, long x)
+{
+ char szBuffer[512];
+ sprintf(szBuffer, "%s %lx\n", str, x);
+ OutputDebugString(szBuffer);
+}
+
+#define WALKHEAP() WalkHeap(0)
+#define WALKHEAPTRACE() WalkHeap(1)
+
+#else
+
+#define ASSERT(f)
+#define MEMODS(x)
+#define MEMODSlx(x, y)
+#define WALKHEAP()
+#define WALKHEAPTRACE()
+
+#endif
+
+#ifdef _USE_MSVCRT_MEM_ALLOC
+
+#ifndef _USE_LINKED_LIST
+// #define _USE_LINKED_LIST
+#endif
+
+/*
+ * Pass all memory requests throught to msvcrt.dll
+ * optionaly track by using a doubly linked header
+ */
+
+typedef void (*LPFREE)(void *block);
+typedef void* (*LPMALLOC)(size_t size);
+typedef void* (*LPREALLOC)(void *block, size_t size);
+#ifdef _USE_LINKED_LIST
+class VMem;
+typedef struct _MemoryBlockHeader* PMEMORY_BLOCK_HEADER;
+typedef struct _MemoryBlockHeader {
+ PMEMORY_BLOCK_HEADER pNext;
+ PMEMORY_BLOCK_HEADER pPrev;
+ VMem *owner;
+} MEMORY_BLOCK_HEADER, *PMEMORY_BLOCK_HEADER;
+#endif
+
+class VMem
+{
+public:
+ VMem();
+ ~VMem();
+ virtual void* Malloc(size_t size);
+ virtual void* Realloc(void* pMem, size_t size);
+ virtual void Free(void* pMem);
+ virtual void GetLock(void);
+ virtual void FreeLock(void);
+ virtual int IsLocked(void);
+ virtual long Release(void);
+ virtual long AddRef(void);
+
+ inline BOOL CreateOk(void)
+ {
+ return TRUE;
+ };
+
+protected:
+#ifdef _USE_LINKED_LIST
+ void LinkBlock(PMEMORY_BLOCK_HEADER ptr)
+ {
+ PMEMORY_BLOCK_HEADER next = m_Dummy.pNext;
+ m_Dummy.pNext = ptr;
+ ptr->pPrev = &m_Dummy;
+ ptr->pNext = next;
+ ptr->owner = this;
+ next->pPrev = ptr;
+ }
+ void UnlinkBlock(PMEMORY_BLOCK_HEADER ptr)
+ {
+ PMEMORY_BLOCK_HEADER next = ptr->pNext;
+ PMEMORY_BLOCK_HEADER prev = ptr->pPrev;
+ prev->pNext = next;
+ next->pPrev = prev;
+ }
+
+ MEMORY_BLOCK_HEADER m_Dummy;
+#endif
+
+ long m_lRefCount; // number of current users
+ CRITICAL_SECTION m_cs; // access lock
+ HINSTANCE m_hLib;
+ LPFREE m_pfree;
+ LPMALLOC m_pmalloc;
+ LPREALLOC m_prealloc;
+};
+
+VMem::VMem()
+{
+ m_lRefCount = 1;
+ InitializeCriticalSection(&m_cs);
+#ifdef _USE_LINKED_LIST
+ m_Dummy.pNext = m_Dummy.pPrev = &m_Dummy;
+ m_Dummy.owner = this;
+#endif
+ m_hLib = LoadLibrary("msvcrt.dll");
+ if (m_hLib) {
+ m_pfree = (LPFREE)GetProcAddress(m_hLib, "free");
+ m_pmalloc = (LPMALLOC)GetProcAddress(m_hLib, "malloc");
+ m_prealloc = (LPREALLOC)GetProcAddress(m_hLib, "realloc");
+ }
+}
+
+VMem::~VMem(void)
+{
+#ifdef _USE_LINKED_LIST
+ while (m_Dummy.pNext != &m_Dummy) {
+ Free(m_Dummy.pNext+1);
+ }
+#endif
+ if (m_hLib)
+ FreeLibrary(m_hLib);
+ DeleteCriticalSection(&m_cs);
+}
+
+void* VMem::Malloc(size_t size)
+{
+#ifdef _USE_LINKED_LIST
+ GetLock();
+ PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)m_pmalloc(size+sizeof(MEMORY_BLOCK_HEADER));
+ if (!ptr) {
+ FreeLock();
+ return NULL;
+ }
+ LinkBlock(ptr);
+ FreeLock();
+ return (ptr+1);
+#else
+ return m_pmalloc(size);
+#endif
+}
+
+void* VMem::Realloc(void* pMem, size_t size)
+{
+#ifdef _USE_LINKED_LIST
+ if (!pMem)
+ return Malloc(size);
+
+ if (!size) {
+ Free(pMem);
+ return NULL;
+ }
+
+ GetLock();
+ PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)(((char*)pMem)-sizeof(MEMORY_BLOCK_HEADER));
+ UnlinkBlock(ptr);
+ ptr = (PMEMORY_BLOCK_HEADER)m_prealloc(ptr, size+sizeof(MEMORY_BLOCK_HEADER));
+ if (!ptr) {
+ FreeLock();
+ return NULL;
+ }
+ LinkBlock(ptr);
+ FreeLock();
+
+ return (ptr+1);
+#else
+ return m_prealloc(pMem, size);
+#endif
+}
+
+void VMem::Free(void* pMem)
+{
+#ifdef _USE_LINKED_LIST
+ if (pMem) {
+ PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)(((char*)pMem)-sizeof(MEMORY_BLOCK_HEADER));
+ if (ptr->owner != this) {
+ if (ptr->owner) {
+#if 1
+ dTHX;
+ int *nowhere = NULL;
+ Perl_warn(aTHX_ "Free to wrong pool %p not %p",this,ptr->owner);
+ *nowhere = 0; /* this segfault is deliberate,
+ so you can see the stack trace */
+#else
+ ptr->owner->Free(pMem);
+#endif
+ }
+ return;
+ }
+ GetLock();
+ UnlinkBlock(ptr);
+ ptr->owner = NULL;
+ m_pfree(ptr);
+ FreeLock();
+ }
+#else
+ m_pfree(pMem);
+#endif
+}
+
+void VMem::GetLock(void)
+{
+ EnterCriticalSection(&m_cs);
+}
+
+void VMem::FreeLock(void)
+{
+ LeaveCriticalSection(&m_cs);
+}
+
+int VMem::IsLocked(void)
+{
+#if 0
+ /* XXX TryEnterCriticalSection() is not available in some versions
+ * of Windows 95. Since this code is not used anywhere yet, we
+ * skirt the issue for now. */
+ BOOL bAccessed = TryEnterCriticalSection(&m_cs);
+ if(bAccessed) {
+ LeaveCriticalSection(&m_cs);
+ }
+ return !bAccessed;
+#else
+ ASSERT(0); /* alarm bells for when somebody calls this */
+ return 0;
+#endif
+}
+
+long VMem::Release(void)
+{
+ long lCount = InterlockedDecrement(&m_lRefCount);
+ if(!lCount)
+ delete this;
+ return lCount;
+}
+
+long VMem::AddRef(void)
+{
+ long lCount = InterlockedIncrement(&m_lRefCount);
+ return lCount;
+}
+
+#else /* _USE_MSVCRT_MEM_ALLOC */
+
+/*
+ * Knuth's boundary tag algorithm Vol #1, Page 440.
+ *
+ * Each block in the heap has tag words before and after it,
+ * TAG
+ * block
+ * TAG
+ * The size is stored in these tags as a long word, and includes the 8 bytes
+ * of overhead that the boundary tags consume. Blocks are allocated on long
+ * word boundaries, so the size is always multiples of long words. When the
+ * block is allocated, bit 0, (the tag bit), of the size is set to 1. When
+ * a block is freed, it is merged with adjacent free blocks, and the tag bit
+ * is set to 0.
+ *
+ * A linked list is used to manage the free list. The first two long words of
+ * the block contain double links. These links are only valid when the block
+ * is freed, therefore space needs to be reserved for them. Thus, the minimum
+ * block size (not counting the tags) is 8 bytes.
+ *
+ * Since memory allocation may occur on a single threaded, explict locks are not
+ * provided.
+ *
+ */
+
+const long lAllocStart = 0x00020000; /* start at 128K */
+const long minBlockSize = sizeof(void*)*2;
+const long sizeofTag = sizeof(long);
+const long blockOverhead = sizeofTag*2;
+const long minAllocSize = minBlockSize+blockOverhead;
+#ifdef _USE_BUDDY_BLOCKS
+const long lSmallBlockSize = 1024;
+const size_t nListEntries = ((lSmallBlockSize-minAllocSize)/sizeof(long));
+
+inline size_t CalcEntry(size_t size)
+{
+ ASSERT((size&(sizeof(long)-1)) == 0);
+ return ((size - minAllocSize) / sizeof(long));
+}
+#endif
+
+typedef BYTE* PBLOCK; /* pointer to a memory block */
+
+/*
+ * Macros for accessing hidden fields in a memory block:
+ *
+ * SIZE size of this block (tag bit 0 is 1 if block is allocated)
+ * PSIZE size of previous physical block
+ */
+
+#define SIZE(block) (*(ULONG*)(((PBLOCK)(block))-sizeofTag))
+#define PSIZE(block) (*(ULONG*)(((PBLOCK)(block))-(blockOverhead)))
+inline void SetTags(PBLOCK block, long size)
+{
+ SIZE(block) = size;
+ PSIZE(block+(size&~1)) = size;
+}
+
+/*
+ * Free list pointers
+ * PREV pointer to previous block
+ * NEXT pointer to next block
+ */
+
+#define PREV(block) (*(PBLOCK*)(block))
+#define NEXT(block) (*(PBLOCK*)((block)+sizeof(PBLOCK)))
+inline void SetLink(PBLOCK block, PBLOCK prev, PBLOCK next)
+{
+ PREV(block) = prev;
+ NEXT(block) = next;
+}
+inline void Unlink(PBLOCK p)
+{
+ PBLOCK next = NEXT(p);
+ PBLOCK prev = PREV(p);
+ NEXT(prev) = next;
+ PREV(next) = prev;
+}
+#ifndef _USE_BUDDY_BLOCKS
+inline void AddToFreeList(PBLOCK block, PBLOCK pInList)
+{
+ PBLOCK next = NEXT(pInList);
+ NEXT(pInList) = block;
+ SetLink(block, pInList, next);
+ PREV(next) = block;
+}
+#endif
+
+/* Macro for rounding up to the next sizeof(long) */
+#define ROUND_UP(n) (((ULONG)(n)+sizeof(long)-1)&~(sizeof(long)-1))
+#define ROUND_UP64K(n) (((ULONG)(n)+0x10000-1)&~(0x10000-1))
+#define ROUND_DOWN(n) ((ULONG)(n)&~(sizeof(long)-1))
+
+/*
+ * HeapRec - a list of all non-contiguous heap areas
+ *
+ * Each record in this array contains information about a non-contiguous heap area.
+ */
+
+const int maxHeaps = 32; /* 64 was overkill */
+const long lAllocMax = 0x80000000; /* max size of allocation */
+
+#ifdef _USE_BUDDY_BLOCKS
+typedef struct _FreeListEntry
+{
+ BYTE Dummy[minAllocSize]; // dummy free block
+} FREE_LIST_ENTRY, *PFREE_LIST_ENTRY;
+#endif
+
+#ifndef _USE_BUDDY_BLOCKS
+#define USE_BIGBLOCK_ALLOC
+#endif
+/*
+ * performance tuning
+ * Use VirtualAlloc() for blocks bigger than nMaxHeapAllocSize since
+ * Windows 95/98/Me have heap managers that are designed for memory
+ * blocks smaller than four megabytes.
+ */
+
+#ifdef USE_BIGBLOCK_ALLOC
+const int nMaxHeapAllocSize = (1024*512); /* don't allocate anything larger than this from the heap */
+#endif
+
+typedef struct _HeapRec
+{
+ PBLOCK base; /* base of heap area */
+ ULONG len; /* size of heap area */
+#ifdef USE_BIGBLOCK_ALLOC
+ BOOL bBigBlock; /* was allocate using VirtualAlloc */
+#endif
+} HeapRec;
+
+class VMem
+{
+public:
+ VMem();
+ ~VMem();
+ virtual void* Malloc(size_t size);
+ virtual void* Realloc(void* pMem, size_t size);
+ virtual void Free(void* pMem);
+ virtual void GetLock(void);
+ virtual void FreeLock(void);
+ virtual int IsLocked(void);
+ virtual long Release(void);
+ virtual long AddRef(void);
+
+ inline BOOL CreateOk(void)
+ {
+#ifdef _USE_BUDDY_BLOCKS
+ return TRUE;
+#else
+ return m_hHeap != NULL;
+#endif
+ };
+
+ void ReInit(void);
+
+protected:
+ void Init(void);
+ int Getmem(size_t size);
+
+ int HeapAdd(void* ptr, size_t size
+#ifdef USE_BIGBLOCK_ALLOC
+ , BOOL bBigBlock
+#endif
+ );
+
+ void* Expand(void* block, size_t size);
+
+#ifdef _USE_BUDDY_BLOCKS
+ inline PBLOCK GetFreeListLink(int index)
+ {
+ if (index >= nListEntries)
+ index = nListEntries-1;
+ return &m_FreeList[index].Dummy[sizeofTag];
+ }
+ inline PBLOCK GetOverSizeFreeList(void)
+ {
+ return &m_FreeList[nListEntries-1].Dummy[sizeofTag];
+ }
+ inline PBLOCK GetEOLFreeList(void)
+ {
+ return &m_FreeList[nListEntries].Dummy[sizeofTag];
+ }
+
+ void AddToFreeList(PBLOCK block, size_t size)
+ {
+ PBLOCK pFreeList = GetFreeListLink(CalcEntry(size));
+ PBLOCK next = NEXT(pFreeList);
+ NEXT(pFreeList) = block;
+ SetLink(block, pFreeList, next);
+ PREV(next) = block;
+ }
+#endif
+ inline size_t CalcAllocSize(size_t size)
+ {
+ /*
+ * Adjust the real size of the block to be a multiple of sizeof(long), and add
+ * the overhead for the boundary tags. Disallow negative or zero sizes.
+ */
+ return (size < minBlockSize) ? minAllocSize : (size_t)ROUND_UP(size) + blockOverhead;
+ }
+
+#ifdef _USE_BUDDY_BLOCKS
+ FREE_LIST_ENTRY m_FreeList[nListEntries+1]; // free list with dummy end of list entry as well
+#else
+ HANDLE m_hHeap; // memory heap for this script
+ char m_FreeDummy[minAllocSize]; // dummy free block
+ PBLOCK m_pFreeList; // pointer to first block on free list
+#endif
+ PBLOCK m_pRover; // roving pointer into the free list
+ HeapRec m_heaps[maxHeaps]; // list of all non-contiguous heap areas
+ int m_nHeaps; // no. of heaps in m_heaps
+ long m_lAllocSize; // current alloc size
+ long m_lRefCount; // number of current users
+ CRITICAL_SECTION m_cs; // access lock
+
+#ifdef _DEBUG_MEM
+ void WalkHeap(int complete);
+ void MemoryUsageMessage(char *str, long x, long y, int c);
+ FILE* m_pLog;
+#endif
+};
+
+VMem::VMem()
+{
+ m_lRefCount = 1;
+#ifndef _USE_BUDDY_BLOCKS
+ BOOL bRet = (NULL != (m_hHeap = HeapCreate(HEAP_NO_SERIALIZE,
+ lAllocStart, /* initial size of heap */
+ 0))); /* no upper limit on size of heap */
+ ASSERT(bRet);
+#endif
+
+ InitializeCriticalSection(&m_cs);
+#ifdef _DEBUG_MEM
+ m_pLog = 0;
+#endif
+
+ Init();
+}
+
+VMem::~VMem(void)
+{
+#ifndef _USE_BUDDY_BLOCKS
+ ASSERT(HeapValidate(m_hHeap, HEAP_NO_SERIALIZE, NULL));
+#endif
+ WALKHEAPTRACE();
+
+ DeleteCriticalSection(&m_cs);
+#ifdef _USE_BUDDY_BLOCKS
+ for(int index = 0; index < m_nHeaps; ++index) {
+ VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+ }
+#else /* !_USE_BUDDY_BLOCKS */
+#ifdef USE_BIGBLOCK_ALLOC
+ for(int index = 0; index < m_nHeaps; ++index) {
+ if (m_heaps[index].bBigBlock) {
+ VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+ }
+ }
+#endif
+ BOOL bRet = HeapDestroy(m_hHeap);
+ ASSERT(bRet);
+#endif /* _USE_BUDDY_BLOCKS */
+}
+
+void VMem::ReInit(void)
+{
+ for(int index = 0; index < m_nHeaps; ++index) {
+#ifdef _USE_BUDDY_BLOCKS
+ VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+#else
+#ifdef USE_BIGBLOCK_ALLOC
+ if (m_heaps[index].bBigBlock) {
+ VirtualFree(m_heaps[index].base, 0, MEM_RELEASE);
+ }
+ else
+#endif
+ HeapFree(m_hHeap, HEAP_NO_SERIALIZE, m_heaps[index].base);
+#endif /* _USE_BUDDY_BLOCKS */
+ }
+
+ Init();
+}
+
+void VMem::Init(void)
+{
+#ifdef _USE_BUDDY_BLOCKS
+ PBLOCK pFreeList;
+ /*
+ * Initialize the free list by placing a dummy zero-length block on it.
+ * Set the end of list marker.
+ * Set the number of non-contiguous heaps to zero.
+ * Set the next allocation size.
+ */
+ for (int index = 0; index < nListEntries; ++index) {
+ pFreeList = GetFreeListLink(index);
+ SIZE(pFreeList) = PSIZE(pFreeList+minAllocSize) = 0;
+ PREV(pFreeList) = NEXT(pFreeList) = pFreeList;
+ }
+ pFreeList = GetEOLFreeList();
+ SIZE(pFreeList) = PSIZE(pFreeList+minAllocSize) = 0;
+ PREV(pFreeList) = NEXT(pFreeList) = NULL;
+ m_pRover = GetOverSizeFreeList();
+#else
+ /*
+ * Initialize the free list by placing a dummy zero-length block on it.
+ * Set the number of non-contiguous heaps to zero.
+ */
+ m_pFreeList = m_pRover = (PBLOCK)(&m_FreeDummy[sizeofTag]);
+ PSIZE(m_pFreeList+minAllocSize) = SIZE(m_pFreeList) = 0;
+ PREV(m_pFreeList) = NEXT(m_pFreeList) = m_pFreeList;
+#endif
+
+ m_nHeaps = 0;
+ m_lAllocSize = lAllocStart;
+}
+
+void* VMem::Malloc(size_t size)
+{
+ WALKHEAP();
+
+ PBLOCK ptr;
+ size_t lsize, rem;
+ /*
+ * Disallow negative or zero sizes.
+ */
+ size_t realsize = CalcAllocSize(size);
+ if((int)realsize < minAllocSize || size == 0)
+ return NULL;
+
+#ifdef _USE_BUDDY_BLOCKS
+ /*
+ * Check the free list of small blocks if this is free use it
+ * Otherwise check the rover if it has no blocks then
+ * Scan the free list entries use the first free block
+ * split the block if needed, stop at end of list marker
+ */
+ {
+ int index = CalcEntry(realsize);
+ if (index < nListEntries-1) {
+ ptr = GetFreeListLink(index);
+ lsize = SIZE(ptr);
+ if (lsize >= realsize) {
+ rem = lsize - realsize;
+ if(rem < minAllocSize) {
+ /* Unlink the block from the free list. */
+ Unlink(ptr);
+ }
+ else {
+ /*
+ * split the block
+ * The remainder is big enough to split off into a new block.
+ * Use the end of the block, resize the beginning of the block
+ * no need to change the free list.
+ */
+ SetTags(ptr, rem);
+ ptr += SIZE(ptr);
+ lsize = realsize;
+ }
+ SetTags(ptr, lsize | 1);
+ return ptr;
+ }
+ ptr = m_pRover;
+ lsize = SIZE(ptr);
+ if (lsize >= realsize) {
+ rem = lsize - realsize;
+ if(rem < minAllocSize) {
+ /* Unlink the block from the free list. */
+ Unlink(ptr);
+ }
+ else {
+ /*
+ * split the block
+ * The remainder is big enough to split off into a new block.
+ * Use the end of the block, resize the beginning of the block
+ * no need to change the free list.
+ */
+ SetTags(ptr, rem);
+ ptr += SIZE(ptr);
+ lsize = realsize;
+ }
+ SetTags(ptr, lsize | 1);
+ return ptr;
+ }
+ ptr = GetFreeListLink(index+1);
+ while (NEXT(ptr)) {
+ lsize = SIZE(ptr);
+ if (lsize >= realsize) {
+ size_t rem = lsize - realsize;
+ if(rem < minAllocSize) {
+ /* Unlink the block from the free list. */
+ Unlink(ptr);
+ }
+ else {
+ /*
+ * split the block
+ * The remainder is big enough to split off into a new block.
+ * Use the end of the block, resize the beginning of the block
+ * no need to change the free list.
+ */
+ SetTags(ptr, rem);
+ ptr += SIZE(ptr);
+ lsize = realsize;
+ }
+ SetTags(ptr, lsize | 1);
+ return ptr;
+ }
+ ptr += sizeof(FREE_LIST_ENTRY);
+ }
+ }
+ }
+#endif
+
+ /*
+ * Start searching the free list at the rover. If we arrive back at rover without
+ * finding anything, allocate some memory from the heap and try again.
+ */
+ ptr = m_pRover; /* start searching at rover */
+ int loops = 2; /* allow two times through the loop */
+ for(;;) {
+ lsize = SIZE(ptr);
+ ASSERT((lsize&1)==0);
+ /* is block big enough? */
+ if(lsize >= realsize) {
+ /* if the remainder is too small, don't bother splitting the block. */
+ rem = lsize - realsize;
+ if(rem < minAllocSize) {
+ if(m_pRover == ptr)
+ m_pRover = NEXT(ptr);
+
+ /* Unlink the block from the free list. */
+ Unlink(ptr);
+ }
+ else {
+ /*
+ * split the block
+ * The remainder is big enough to split off into a new block.
+ * Use the end of the block, resize the beginning of the block
+ * no need to change the free list.
+ */
+ SetTags(ptr, rem);
+ ptr += SIZE(ptr);
+ lsize = realsize;
+ }
+ /* Set the boundary tags to mark it as allocated. */
+ SetTags(ptr, lsize | 1);
+ return ((void *)ptr);
+ }
+
+ /*
+ * This block was unsuitable. If we've gone through this list once already without
+ * finding anything, allocate some new memory from the heap and try again.
+ */
+ ptr = NEXT(ptr);
+ if(ptr == m_pRover) {
+ if(!(loops-- && Getmem(realsize))) {
+ return NULL;
+ }
+ ptr = m_pRover;
+ }
+ }
+}
+
+void* VMem::Realloc(void* block, size_t size)
+{
+ WALKHEAP();
+
+ /* if size is zero, free the block. */
+ if(size == 0) {
+ Free(block);
+ return (NULL);
+ }
+
+ /* if block pointer is NULL, do a Malloc(). */
+ if(block == NULL)
+ return Malloc(size);
+
+ /*
+ * Grow or shrink the block in place.
+ * if the block grows then the next block will be used if free
+ */
+ if(Expand(block, size) != NULL)
+ return block;
+
+ size_t realsize = CalcAllocSize(size);
+ if((int)realsize < minAllocSize)
+ return NULL;
+
+ /*
+ * see if the previous block is free, and is it big enough to cover the new size
+ * if merged with the current block.
+ */
+ PBLOCK ptr = (PBLOCK)block;
+ size_t cursize = SIZE(ptr) & ~1;
+ size_t psize = PSIZE(ptr);
+ if((psize&1) == 0 && (psize + cursize) >= realsize) {
+ PBLOCK prev = ptr - psize;
+ if(m_pRover == prev)
+ m_pRover = NEXT(prev);
+
+ /* Unlink the next block from the free list. */
+ Unlink(prev);
+
+ /* Copy contents of old block to new location, make it the current block. */
+ memmove(prev, ptr, cursize);
+ cursize += psize; /* combine sizes */
+ ptr = prev;
+
+ size_t rem = cursize - realsize;
+ if(rem >= minAllocSize) {
+ /*
+ * The remainder is big enough to be a new block. Set boundary
+ * tags for the resized block and the new block.
+ */
+ prev = ptr + realsize;
+ /*
+ * add the new block to the free list.
+ * next block cannot be free
+ */
+ SetTags(prev, rem);
+#ifdef _USE_BUDDY_BLOCKS
+ AddToFreeList(prev, rem);
+#else
+ AddToFreeList(prev, m_pFreeList);
+#endif
+ cursize = realsize;
+ }
+ /* Set the boundary tags to mark it as allocated. */
+ SetTags(ptr, cursize | 1);
+ return ((void *)ptr);
+ }
+
+ /* Allocate a new block, copy the old to the new, and free the old. */
+ if((ptr = (PBLOCK)Malloc(size)) != NULL) {
+ memmove(ptr, block, cursize-blockOverhead);
+ Free(block);
+ }
+ return ((void *)ptr);
+}
+
+void VMem::Free(void* p)
+{
+ WALKHEAP();
+
+ /* Ignore null pointer. */
+ if(p == NULL)
+ return;
+
+ PBLOCK ptr = (PBLOCK)p;
+
+ /* Check for attempt to free a block that's already free. */
+ size_t size = SIZE(ptr);
+ if((size&1) == 0) {
+ MEMODSlx("Attempt to free previously freed block", (long)p);
+ return;
+ }
+ size &= ~1; /* remove allocated tag */
+
+ /* if previous block is free, add this block to it. */
+#ifndef _USE_BUDDY_BLOCKS
+ int linked = FALSE;
+#endif
+ size_t psize = PSIZE(ptr);
+ if((psize&1) == 0) {
+ ptr -= psize; /* point to previous block */
+ size += psize; /* merge the sizes of the two blocks */
+#ifdef _USE_BUDDY_BLOCKS
+ Unlink(ptr);
+#else
+ linked = TRUE; /* it's already on the free list */
+#endif
+ }
+
+ /* if the next physical block is free, merge it with this block. */
+ PBLOCK next = ptr + size; /* point to next physical block */
+ size_t nsize = SIZE(next);
+ if((nsize&1) == 0) {
+ /* block is free move rover if needed */
+ if(m_pRover == next)
+ m_pRover = NEXT(next);
+
+ /* unlink the next block from the free list. */
+ Unlink(next);
+
+ /* merge the sizes of this block and the next block. */
+ size += nsize;
+ }
+
+ /* Set the boundary tags for the block; */
+ SetTags(ptr, size);
+
+ /* Link the block to the head of the free list. */
+#ifdef _USE_BUDDY_BLOCKS
+ AddToFreeList(ptr, size);
+#else
+ if(!linked) {
+ AddToFreeList(ptr, m_pFreeList);
+ }
+#endif
+}
+
+void VMem::GetLock(void)
+{
+ EnterCriticalSection(&m_cs);
+}
+
+void VMem::FreeLock(void)
+{
+ LeaveCriticalSection(&m_cs);
+}
+
+int VMem::IsLocked(void)
+{
+#if 0
+ /* XXX TryEnterCriticalSection() is not available in some versions
+ * of Windows 95. Since this code is not used anywhere yet, we
+ * skirt the issue for now. */
+ BOOL bAccessed = TryEnterCriticalSection(&m_cs);
+ if(bAccessed) {
+ LeaveCriticalSection(&m_cs);
+ }
+ return !bAccessed;
+#else
+ ASSERT(0); /* alarm bells for when somebody calls this */
+ return 0;
+#endif
+}
+
+
+long VMem::Release(void)
+{
+ long lCount = InterlockedDecrement(&m_lRefCount);
+ if(!lCount)
+ delete this;
+ return lCount;
+}
+
+long VMem::AddRef(void)
+{
+ long lCount = InterlockedIncrement(&m_lRefCount);
+ return lCount;
+}
+
+
+int VMem::Getmem(size_t requestSize)
+{ /* returns -1 is successful 0 if not */
+#ifdef USE_BIGBLOCK_ALLOC
+ BOOL bBigBlock;
+#endif
+ void *ptr;
+
+ /* Round up size to next multiple of 64K. */
+ size_t size = (size_t)ROUND_UP64K(requestSize);
+
+ /*
+ * if the size requested is smaller than our current allocation size
+ * adjust up
+ */
+ if(size < (unsigned long)m_lAllocSize)
+ size = m_lAllocSize;
+
+ /* Update the size to allocate on the next request */
+ if(m_lAllocSize != lAllocMax)
+ m_lAllocSize <<= 2;
+
+#ifndef _USE_BUDDY_BLOCKS
+ if(m_nHeaps != 0
+#ifdef USE_BIGBLOCK_ALLOC
+ && !m_heaps[m_nHeaps-1].bBigBlock
+#endif
+ ) {
+ /* Expand the last allocated heap */
+ ptr = HeapReAlloc(m_hHeap, HEAP_REALLOC_IN_PLACE_ONLY|HEAP_NO_SERIALIZE,
+ m_heaps[m_nHeaps-1].base,
+ m_heaps[m_nHeaps-1].len + size);
+ if(ptr != 0) {
+ HeapAdd(((char*)ptr) + m_heaps[m_nHeaps-1].len, size
+#ifdef USE_BIGBLOCK_ALLOC
+ , FALSE
+#endif
+ );
+ return -1;
+ }
+ }
+#endif /* _USE_BUDDY_BLOCKS */
+
+ /*
+ * if we didn't expand a block to cover the requested size
+ * allocate a new Heap
+ * the size of this block must include the additional dummy tags at either end
+ * the above ROUND_UP64K may not have added any memory to include this.
+ */
+ if(size == requestSize)
+ size = (size_t)ROUND_UP64K(requestSize+(blockOverhead));
+
+Restart:
+#ifdef _USE_BUDDY_BLOCKS
+ ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
+#else
+#ifdef USE_BIGBLOCK_ALLOC
+ bBigBlock = FALSE;
+ if (size >= nMaxHeapAllocSize) {
+ bBigBlock = TRUE;
+ ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
+ }
+ else
+#endif
+ ptr = HeapAlloc(m_hHeap, HEAP_NO_SERIALIZE, size);
+#endif /* _USE_BUDDY_BLOCKS */
+
+ if (!ptr) {
+ /* try to allocate a smaller chunk */
+ size >>= 1;
+ if(size > requestSize)
+ goto Restart;
+ }
+
+ if(ptr == 0) {
+ MEMODSlx("HeapAlloc failed on size!!!", size);
+ return 0;
+ }
+
+#ifdef _USE_BUDDY_BLOCKS
+ if (HeapAdd(ptr, size)) {
+ VirtualFree(ptr, 0, MEM_RELEASE);
+ return 0;
+ }
+#else
+#ifdef USE_BIGBLOCK_ALLOC
+ if (HeapAdd(ptr, size, bBigBlock)) {
+ if (bBigBlock) {
+ VirtualFree(ptr, 0, MEM_RELEASE);
+ }
+ }
+#else
+ HeapAdd(ptr, size);
+#endif
+#endif /* _USE_BUDDY_BLOCKS */
+ return -1;
+}
+
+int VMem::HeapAdd(void* p, size_t size
+#ifdef USE_BIGBLOCK_ALLOC
+ , BOOL bBigBlock
+#endif
+ )
+{ /* if the block can be succesfully added to the heap, returns 0; otherwise -1. */
+ int index;
+
+ /* Check size, then round size down to next long word boundary. */
+ if(size < minAllocSize)
+ return -1;
+
+ size = (size_t)ROUND_DOWN(size);
+ PBLOCK ptr = (PBLOCK)p;
+
+#ifdef USE_BIGBLOCK_ALLOC
+ if (!bBigBlock) {
+#endif
+ /*
+ * Search for another heap area that's contiguous with the bottom of this new area.
+ * (It should be extremely unusual to find one that's contiguous with the top).
+ */
+ for(index = 0; index < m_nHeaps; ++index) {
+ if(ptr == m_heaps[index].base + (int)m_heaps[index].len) {
+ /*
+ * The new block is contiguous with a previously allocated heap area. Add its
+ * length to that of the previous heap. Merge it with the dummy end-of-heap
+ * area marker of the previous heap.
+ */
+ m_heaps[index].len += size;
+ break;
+ }
+ }
+#ifdef USE_BIGBLOCK_ALLOC
+ }
+ else {
+ index = m_nHeaps;
+ }
+#endif
+
+ if(index == m_nHeaps) {
+ /* The new block is not contiguous, or is BigBlock. Add it to the heap list. */
+ if(m_nHeaps == maxHeaps) {
+ return -1; /* too many non-contiguous heaps */
+ }
+ m_heaps[m_nHeaps].base = ptr;
+ m_heaps[m_nHeaps].len = size;
+#ifdef USE_BIGBLOCK_ALLOC
+ m_heaps[m_nHeaps].bBigBlock = bBigBlock;
+#endif
+ m_nHeaps++;
+
+ /*
+ * Reserve the first LONG in the block for the ending boundary tag of a dummy
+ * block at the start of the heap area.
+ */
+ size -= blockOverhead;
+ ptr += blockOverhead;
+ PSIZE(ptr) = 1; /* mark the dummy previous block as allocated */
+ }
+
+ /*
+ * Convert the heap to one large block. Set up its boundary tags, and those of
+ * marker block after it. The marker block before the heap will already have
+ * been set up if this heap is not contiguous with the end of another heap.
+ */
+ SetTags(ptr, size | 1);
+ PBLOCK next = ptr + size; /* point to dummy end block */
+ SIZE(next) = 1; /* mark the dummy end block as allocated */
+
+ /*
+ * Link the block to the start of the free list by calling free().
+ * This will merge the block with any adjacent free blocks.
+ */
+ Free(ptr);
+ return 0;
+}
+
+
+void* VMem::Expand(void* block, size_t size)
+{
+ /*
+ * Disallow negative or zero sizes.
+ */
+ size_t realsize = CalcAllocSize(size);
+ if((int)realsize < minAllocSize || size == 0)
+ return NULL;
+
+ PBLOCK ptr = (PBLOCK)block;
+
+ /* if the current size is the same as requested, do nothing. */
+ size_t cursize = SIZE(ptr) & ~1;
+ if(cursize == realsize) {
+ return block;
+ }
+
+ /* if the block is being shrunk, convert the remainder of the block into a new free block. */
+ if(realsize <= cursize) {
+ size_t nextsize = cursize - realsize; /* size of new remainder block */
+ if(nextsize >= minAllocSize) {
+ /*
+ * Split the block
+ * Set boundary tags for the resized block and the new block.
+ */
+ SetTags(ptr, realsize | 1);
+ ptr += realsize;
+
+ /*
+ * add the new block to the free list.
+ * call Free to merge this block with next block if free
+ */
+ SetTags(ptr, nextsize | 1);
+ Free(ptr);
+ }
+
+ return block;
+ }
+
+ PBLOCK next = ptr + cursize;
+ size_t nextsize = SIZE(next);
+
+ /* Check the next block for consistency.*/
+ if((nextsize&1) == 0 && (nextsize + cursize) >= realsize) {
+ /*
+ * The next block is free and big enough. Add the part that's needed
+ * to our block, and split the remainder off into a new block.
+ */
+ if(m_pRover == next)
+ m_pRover = NEXT(next);
+
+ /* Unlink the next block from the free list. */
+ Unlink(next);
+ cursize += nextsize; /* combine sizes */
+
+ size_t rem = cursize - realsize; /* size of remainder */
+ if(rem >= minAllocSize) {
+ /*
+ * The remainder is big enough to be a new block.
+ * Set boundary tags for the resized block and the new block.
+ */
+ next = ptr + realsize;
+ /*
+ * add the new block to the free list.
+ * next block cannot be free
+ */
+ SetTags(next, rem);
+#ifdef _USE_BUDDY_BLOCKS
+ AddToFreeList(next, rem);
+#else
+ AddToFreeList(next, m_pFreeList);
+#endif
+ cursize = realsize;
+ }
+ /* Set the boundary tags to mark it as allocated. */
+ SetTags(ptr, cursize | 1);
+ return ((void *)ptr);
+ }
+ return NULL;
+}
+
+#ifdef _DEBUG_MEM
+#define LOG_FILENAME ".\\MemLog.txt"
+
+void VMem::MemoryUsageMessage(char *str, long x, long y, int c)
+{
+ char szBuffer[512];
+ if(str) {
+ if(!m_pLog)
+ m_pLog = fopen(LOG_FILENAME, "w");
+ sprintf(szBuffer, str, x, y, c);
+ fputs(szBuffer, m_pLog);
+ }
+ else {
+ if(m_pLog) {
+ fflush(m_pLog);
+ fclose(m_pLog);
+ m_pLog = 0;
+ }
+ }
+}
+
+void VMem::WalkHeap(int complete)
+{
+ if(complete) {
+ MemoryUsageMessage(NULL, 0, 0, 0);
+ size_t total = 0;
+ for(int i = 0; i < m_nHeaps; ++i) {
+ total += m_heaps[i].len;
+ }
+ MemoryUsageMessage("VMem heaps used %d. Total memory %08x\n", m_nHeaps, total, 0);
+
+ /* Walk all the heaps - verify structures */
+ for(int index = 0; index < m_nHeaps; ++index) {
+ PBLOCK ptr = m_heaps[index].base;
+ size_t size = m_heaps[index].len;
+#ifndef _USE_BUDDY_BLOCKS
+#ifdef USE_BIGBLOCK_ALLOC
+ if (!m_heaps[m_nHeaps].bBigBlock)
+#endif
+ ASSERT(HeapValidate(m_hHeap, HEAP_NO_SERIALIZE, ptr));
+#endif
+
+ /* set over reserved header block */
+ size -= blockOverhead;
+ ptr += blockOverhead;
+ PBLOCK pLast = ptr + size;
+ ASSERT(PSIZE(ptr) == 1); /* dummy previous block is allocated */
+ ASSERT(SIZE(pLast) == 1); /* dummy next block is allocated */
+ while(ptr < pLast) {
+ ASSERT(ptr > m_heaps[index].base);
+ size_t cursize = SIZE(ptr) & ~1;
+ ASSERT((PSIZE(ptr+cursize) & ~1) == cursize);
+ MemoryUsageMessage("Memory Block %08x: Size %08x %c\n", (long)ptr, cursize, (SIZE(ptr)&1) ? 'x' : ' ');
+ if(!(SIZE(ptr)&1)) {
+ /* this block is on the free list */
+ PBLOCK tmp = NEXT(ptr);
+ while(tmp != ptr) {
+ ASSERT((SIZE(tmp)&1)==0);
+ if(tmp == m_pFreeList)
+ break;
+ ASSERT(NEXT(tmp));
+ tmp = NEXT(tmp);
+ }
+ if(tmp == ptr) {
+ MemoryUsageMessage("Memory Block %08x: Size %08x free but not in free list\n", (long)ptr, cursize, 0);
+ }
+ }
+ ptr += cursize;
+ }
+ }
+ MemoryUsageMessage(NULL, 0, 0, 0);
+ }
+}
+#endif /* _DEBUG_MEM */
+
+#endif /* _USE_MSVCRT_MEM_ALLOC */
+
+#endif /* ___VMEM_H_INC___ */
diff --git a/Master/tlpkg/tlperl/lib/CORE/warnings.h b/Master/tlpkg/tlperl/lib/CORE/warnings.h
new file mode 100644
index 00000000000..3ed9ecf56d5
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/warnings.h
@@ -0,0 +1,130 @@
+/* -*- buffer-read-only: t -*-
+ !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
+ This file is built by warnings.pl
+ Any changes made here will be lost!
+*/
+
+
+#define Off(x) ((x) / 8)
+#define Bit(x) (1 << ((x) % 8))
+#define IsSet(a, x) ((a)[Off(x)] & Bit(x))
+
+
+#define G_WARN_OFF 0 /* $^W == 0 */
+#define G_WARN_ON 1 /* -w flag and $^W != 0 */
+#define G_WARN_ALL_ON 2 /* -W flag */
+#define G_WARN_ALL_OFF 4 /* -X flag */
+#define G_WARN_ONCE 8 /* set if 'once' ever enabled */
+#define G_WARN_ALL_MASK (G_WARN_ALL_ON|G_WARN_ALL_OFF)
+
+#define pWARN_STD NULL
+#define pWARN_ALL (((STRLEN*)0)+1) /* use warnings 'all' */
+#define pWARN_NONE (((STRLEN*)0)+2) /* no warnings 'all' */
+
+#define specialWARN(x) ((x) == pWARN_STD || (x) == pWARN_ALL || \
+ (x) == pWARN_NONE)
+
+/* if PL_warnhook is set to this value, then warnings die */
+#define PERL_WARNHOOK_FATAL (&PL_sv_placeholder)
+
+/* Warnings Categories added in Perl 5.008 */
+
+#define WARN_ALL 0
+#define WARN_CLOSURE 1
+#define WARN_DEPRECATED 2
+#define WARN_EXITING 3
+#define WARN_GLOB 4
+#define WARN_IO 5
+#define WARN_CLOSED 6
+#define WARN_EXEC 7
+#define WARN_LAYER 8
+#define WARN_NEWLINE 9
+#define WARN_PIPE 10
+#define WARN_UNOPENED 11
+#define WARN_MISC 12
+#define WARN_NUMERIC 13
+#define WARN_ONCE 14
+#define WARN_OVERFLOW 15
+#define WARN_PACK 16
+#define WARN_PORTABLE 17
+#define WARN_RECURSION 18
+#define WARN_REDEFINE 19
+#define WARN_REGEXP 20
+#define WARN_SEVERE 21
+#define WARN_DEBUGGING 22
+#define WARN_INPLACE 23
+#define WARN_INTERNAL 24
+#define WARN_MALLOC 25
+#define WARN_SIGNAL 26
+#define WARN_SUBSTR 27
+#define WARN_SYNTAX 28
+#define WARN_AMBIGUOUS 29
+#define WARN_BAREWORD 30
+#define WARN_DIGIT 31
+#define WARN_PARENTHESIS 32
+#define WARN_PRECEDENCE 33
+#define WARN_PRINTF 34
+#define WARN_PROTOTYPE 35
+#define WARN_QW 36
+#define WARN_RESERVED 37
+#define WARN_SEMICOLON 38
+#define WARN_TAINT 39
+#define WARN_THREADS 40
+#define WARN_UNINITIALIZED 41
+#define WARN_UNPACK 42
+#define WARN_UNTIE 43
+#define WARN_UTF8 44
+#define WARN_VOID 45
+
+/* Warnings Categories added in Perl 5.011 */
+
+#define WARN_IMPRECISION 46
+#define WARN_ILLEGALPROTO 47
+
+#define WARNsize 12
+#define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125"
+#define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0"
+
+#define isLEXWARN_on (PL_curcop->cop_warnings != pWARN_STD)
+#define isLEXWARN_off (PL_curcop->cop_warnings == pWARN_STD)
+#define isWARN_ONCE (PL_dowarn & (G_WARN_ON|G_WARN_ONCE))
+#define isWARN_on(c,x) (IsSet((U8 *)(c + 1), 2*(x)))
+#define isWARNf_on(c,x) (IsSet((U8 *)(c + 1), 2*(x)+1))
+
+#define DUP_WARNINGS(p) \
+ (specialWARN(p) ? (STRLEN*)(p) \
+ : (STRLEN*)CopyD(p, PerlMemShared_malloc(sizeof(*p)+*p), sizeof(*p)+*p, \
+ char))
+
+#define ckWARN(w) Perl_ckwarn(aTHX_ packWARN(w))
+#define ckWARN2(w1,w2) Perl_ckwarn(aTHX_ packWARN2(w1,w2))
+#define ckWARN3(w1,w2,w3) Perl_ckwarn(aTHX_ packWARN3(w1,w2,w3))
+#define ckWARN4(w1,w2,w3,w4) Perl_ckwarn(aTHX_ packWARN4(w1,w2,w3,w4))
+
+#define ckWARN_d(w) Perl_ckwarn_d(aTHX_ packWARN(w))
+#define ckWARN2_d(w1,w2) Perl_ckwarn_d(aTHX_ packWARN2(w1,w2))
+#define ckWARN3_d(w1,w2,w3) Perl_ckwarn_d(aTHX_ packWARN3(w1,w2,w3))
+#define ckWARN4_d(w1,w2,w3,w4) Perl_ckwarn_d(aTHX_ packWARN4(w1,w2,w3,w4))
+
+#define WARNshift 8
+
+#define packWARN(a) (a )
+#define packWARN2(a,b) ((a) | ((b)<<8) )
+#define packWARN3(a,b,c) ((a) | ((b)<<8) | ((c)<<16) )
+#define packWARN4(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d) <<24))
+
+#define unpackWARN1(x) ((x) & 0xFF)
+#define unpackWARN2(x) (((x) >>8) & 0xFF)
+#define unpackWARN3(x) (((x) >>16) & 0xFF)
+#define unpackWARN4(x) (((x) >>24) & 0xFF)
+
+#define ckDEAD(x) \
+ ( ! specialWARN(PL_curcop->cop_warnings) && \
+ ( isWARNf_on(PL_curcop->cop_warnings, WARN_ALL) || \
+ isWARNf_on(PL_curcop->cop_warnings, unpackWARN1(x)) || \
+ isWARNf_on(PL_curcop->cop_warnings, unpackWARN2(x)) || \
+ isWARNf_on(PL_curcop->cop_warnings, unpackWARN3(x)) || \
+ isWARNf_on(PL_curcop->cop_warnings, unpackWARN4(x))))
+
+/* end of file warnings.h */
+/* ex: set ro: */
diff --git a/Master/tlpkg/tlperl/lib/CORE/win32.h b/Master/tlpkg/tlperl/lib/CORE/win32.h
new file mode 100644
index 00000000000..762ab54068b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/win32.h
@@ -0,0 +1,615 @@
+/* WIN32.H
+ *
+ * (c) 1995 Microsoft Corporation. All rights reserved.
+ * Developed by hip communications inc.
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ */
+#ifndef _INC_WIN32_PERL5
+#define _INC_WIN32_PERL5
+
+#ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0400 /* needed for TryEnterCriticalSection() etc. */
+#endif
+
+#if defined(PERL_IMPLICIT_SYS)
+# define DYNAMIC_ENV_FETCH
+# define HAS_GETENV_LEN
+# define prime_env_iter()
+# define WIN32IO_IS_STDIO /* don't pull in custom stdio layer */
+# define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */
+# ifdef PERL_GLOBAL_STRUCT
+# error PERL_GLOBAL_STRUCT cannot be defined with PERL_IMPLICIT_SYS
+# endif
+# define win32_get_privlib PerlEnv_lib_path
+# define win32_get_sitelib PerlEnv_sitelib_path
+# define win32_get_vendorlib PerlEnv_vendorlib_path
+#endif
+
+#ifdef __GNUC__
+# ifndef __int64 /* some versions seem to #define it already */
+# define __int64 long long
+# endif
+# define Win32_Winsock
+#ifdef __cplusplus
+/* Mingw32 gcc -xc++ objects to __attribute((unused)) at least */
+#undef PERL_UNUSED_DECL
+#define PERL_UNUSED_DECL
+#endif
+#endif
+
+
+/* Define DllExport akin to perl's EXT,
+ * If we are in the DLL or mimicing the DLL for Win95 work round
+ * then Export the symbol,
+ * otherwise import it.
+ */
+
+/* now even GCC supports __declspec() */
+
+#if defined(PERLDLL) || defined(WIN95FIX)
+#define DllExport
+/*#define DllExport __declspec(dllexport)*/ /* noises with VC5+sp3 */
+#else
+#define DllExport __declspec(dllimport)
+#endif
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/*
+ * Bug in winbase.h in mingw-w64 4.4.0-1 at least... they
+ * do #define GetEnvironmentStringsA GetEnvironmentStrings and fail
+ * to declare GetEnvironmentStringsA.
+ */
+#if defined(__MINGW64__) && defined(GetEnvironmentStringsA) && !defined(UNICODE)
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef GetEnvironmentStringsA
+WINBASEAPI LPCH WINAPI GetEnvironmentStringsA(VOID);
+#define GetEnvironmentStrings GetEnvironmentStringsA
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+#ifdef WIN32_LEAN_AND_MEAN /* C file is NOT a Perl5 original. */
+#define CONTEXT PERL_CONTEXT /* Avoid conflict of CONTEXT defs. */
+#endif /*WIN32_LEAN_AND_MEAN */
+
+#ifndef TLS_OUT_OF_INDEXES
+#define TLS_OUT_OF_INDEXES (DWORD)0xFFFFFFFF
+#endif
+
+#include <dirent.h>
+#include <io.h>
+#include <process.h>
+#include <stdio.h>
+#include <direct.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <fcntl.h>
+#ifndef EXT
+#include "EXTERN.h"
+#endif
+
+struct tms {
+ long tms_utime;
+ long tms_stime;
+ long tms_cutime;
+ long tms_cstime;
+};
+
+#ifndef SYS_NMLN
+#define SYS_NMLN 257
+#endif
+
+struct utsname {
+ char sysname[SYS_NMLN];
+ char nodename[SYS_NMLN];
+ char release[SYS_NMLN];
+ char version[SYS_NMLN];
+ char machine[SYS_NMLN];
+};
+
+#ifndef START_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
+#endif
+#endif
+
+#define STANDARD_C 1
+#define DOSISH 1 /* no escaping our roots */
+#define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */
+
+/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as
+ * real filehandles. XXX Should always be defined (the other version is untested) */
+#define USE_SOCKETS_AS_HANDLES
+
+/* read() and write() aren't transparent for socket handles */
+#define PERL_SOCK_SYSREAD_IS_RECV
+#define PERL_SOCK_SYSWRITE_IS_SEND
+
+#define PERL_NO_FORCE_LINK /* no need for PL_force_link_funcs */
+
+/* Define USE_FIXED_OSFHANDLE to fix MSVCRT's _open_osfhandle() on W95.
+ It now uses some black magic to work seamlessly with the DLL CRT and
+ works with MSVC++ 4.0+ or GCC/Mingw32
+ -- BKS 1-24-2000
+ Only use this fix for VC++ 6.x or earlier (and for GCC, which we assume
+ uses MSVCRT.DLL). Later versions use MSVCR70.dll, MSVCR71.dll, etc, which
+ do not require the fix. */
+#if (defined(_M_IX86) && _MSC_VER >= 1000 && _MSC_VER <= 1200) || defined(__MINGW32__)
+#define USE_FIXED_OSFHANDLE
+#endif
+
+/* Define PERL_WIN32_SOCK_DLOAD to have Perl dynamically load the winsock
+ DLL when needed. Don't use if your compiler supports delayloading (ie, VC++ 6.0)
+ -- BKS 5-29-2000 */
+#if !(defined(_M_IX86) && _MSC_VER >= 1200)
+#define PERL_WIN32_SOCK_DLOAD
+#endif
+#define ENV_IS_CASELESS
+
+#define PIPESOCK_MODE "b" /* pipes, sockets default to binmode */
+
+#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers don't have this */
+#define VER_PLATFORM_WIN32_WINDOWS 1
+#endif
+
+#ifndef FILE_SHARE_DELETE /* VC-4.0 headers don't have this */
+#define FILE_SHARE_DELETE 0x00000004
+#endif
+
+/* access() mode bits */
+#ifndef R_OK
+# define R_OK 4
+# define W_OK 2
+# define X_OK 1
+# define F_OK 0
+#endif
+
+/* for waitpid() */
+#ifndef WNOHANG
+# define WNOHANG 1
+#endif
+
+#define PERL_GET_CONTEXT_DEFINED
+
+/* Compiler-specific stuff. */
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+/* VC uses non-standard way to determine the size and alignment if bit-fields */
+/* MinGW will compiler with -mms-bitfields, so should use the same types */
+# define PERL_BITFIELD8 unsigned char
+# define PERL_BITFIELD16 unsigned short
+# define PERL_BITFIELD32 unsigned int
+#endif
+
+#ifdef __BORLANDC__ /* Borland C++ */
+
+#if (__BORLANDC__ <= 0x520)
+#define _access access
+#define _chdir chdir
+#endif
+
+#define _getpid getpid
+#define wcsicmp _wcsicmp
+#include <sys/types.h>
+
+#ifndef DllMain
+#define DllMain DllEntryPoint
+#endif
+
+#pragma warn -8004 /* "'foo' is assigned a value that is never used" */
+#pragma warn -8008 /* "condition is always true/false" */
+#pragma warn -8012 /* "comparing signed and unsigned values" */
+#pragma warn -8027 /* "functions containing %s are not expanded inline" */
+#pragma warn -8057 /* "parameter 'foo' is never used" */
+#pragma warn -8060 /* "possibly incorrect assignment" */
+#pragma warn -8066 /* "unreachable code" */
+#pragma warn -8071 /* "conversion may lose significant digits" */
+#pragma warn -8080 /* "'foo' is declared but never used" */
+
+/* Borland C thinks that a pointer to a member variable is 12 bytes in size. */
+#define PERL_MEMBER_PTR_SIZE 12
+
+#define isnan _isnan
+
+#endif
+
+#ifdef _MSC_VER /* Microsoft Visual C++ */
+
+#ifndef UNDER_CE
+typedef long uid_t;
+typedef long gid_t;
+typedef unsigned short mode_t;
+#endif
+
+#pragma warning(disable: 4102) /* "unreferenced label" */
+
+/* Visual C thinks that a pointer to a member variable is 16 bytes in size. */
+#define PERL_MEMBER_PTR_SIZE 16
+
+#define isnan _isnan
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+
+#if _MSC_VER < 1300
+/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false */
+#define NAN_COMPARE_BROKEN 1
+#endif
+
+#endif /* _MSC_VER */
+
+#ifdef __MINGW32__ /* Minimal Gnu-Win32 */
+
+typedef long uid_t;
+typedef long gid_t;
+#ifndef _environ
+#define _environ environ
+#endif
+#define flushall _flushall
+#define fcloseall _fcloseall
+#ifndef isnan
+#define isnan _isnan /* ...same libraries as MSVC */
+#endif
+
+#ifndef _O_NOINHERIT
+# define _O_NOINHERIT 0x0080
+# ifndef _NO_OLDNAMES
+# define O_NOINHERIT _O_NOINHERIT
+# endif
+#endif
+
+/* <stdint.h>, pulled in by <io.h> as of mingw-runtime-3.3, typedef's
+ * (u)intptr_t but doesn't set the _(U)INTPTR_T_DEFINED defines */
+#ifdef _STDINT_H
+# ifndef _INTPTR_T_DEFINED
+# define _INTPTR_T_DEFINED
+# endif
+# ifndef _UINTPTR_T_DEFINED
+# define _UINTPTR_T_DEFINED
+# endif
+#endif
+
+#endif /* __MINGW32__ */
+
+/* both GCC/Mingw32 and MSVC++ 4.0 are missing this, so we put it here */
+#ifndef CP_UTF8
+# define CP_UTF8 65001
+#endif
+
+/* compatibility stuff for other compilers goes here */
+
+#ifndef _INTPTR_T_DEFINED
+typedef int intptr_t;
+# define _INTPTR_T_DEFINED
+#endif
+
+#ifndef _UINTPTR_T_DEFINED
+typedef unsigned int uintptr_t;
+# define _UINTPTR_T_DEFINED
+#endif
+
+START_EXTERN_C
+
+/* For UNIX compatibility. */
+
+extern uid_t getuid(void);
+extern gid_t getgid(void);
+extern uid_t geteuid(void);
+extern gid_t getegid(void);
+extern int setuid(uid_t uid);
+extern int setgid(gid_t gid);
+extern int kill(int pid, int sig);
+extern int killpg(int pid, int sig);
+#ifndef USE_PERL_SBRK
+extern void *sbrk(ptrdiff_t need);
+# define HAS_SBRK_PROTO
+#endif
+extern char * getlogin(void);
+extern int chown(const char *p, uid_t o, gid_t g);
+extern int mkstemp(const char *path);
+
+#undef Stat
+#define Stat win32_stat
+
+#undef init_os_extras
+#define init_os_extras Perl_init_os_extras
+
+DllExport void Perl_win32_init(int *argcp, char ***argvp);
+DllExport void Perl_win32_term(void);
+DllExport void Perl_init_os_extras(void);
+DllExport void win32_str_os_error(void *sv, DWORD err);
+DllExport int RunPerl(int argc, char **argv, char **env);
+
+typedef struct {
+ HANDLE childStdIn;
+ HANDLE childStdOut;
+ HANDLE childStdErr;
+ /*
+ * the following correspond to the fields of the same name
+ * in the STARTUPINFO structure. Embedders can use these to
+ * control the spawning process' look.
+ * Example - to hide the window of the spawned process:
+ * dwFlags = STARTF_USESHOWWINDOW;
+ * wShowWindow = SW_HIDE;
+ */
+ DWORD dwFlags;
+ DWORD dwX;
+ DWORD dwY;
+ DWORD dwXSize;
+ DWORD dwYSize;
+ DWORD dwXCountChars;
+ DWORD dwYCountChars;
+ DWORD dwFillAttribute;
+ WORD wShowWindow;
+} child_IO_table;
+
+DllExport void win32_get_child_IO(child_IO_table* ptr);
+DllExport HWND win32_create_message_window(void);
+
+#ifndef USE_SOCKETS_AS_HANDLES
+extern FILE * my_fdopen(int, char *);
+#endif
+extern int my_fclose(FILE *);
+extern int my_fstat(int fd, Stat_t *sbufptr);
+extern char * win32_get_privlib(const char *pl, STRLEN *const len);
+extern char * win32_get_sitelib(const char *pl, STRLEN *const len);
+extern char * win32_get_vendorlib(const char *pl, STRLEN *const len);
+extern int IsWin95(void);
+extern int IsWinNT(void);
+
+#ifdef PERL_IMPLICIT_SYS
+extern void win32_delete_internal_host(void *h);
+#endif
+
+extern char * staticlinkmodules[];
+
+END_EXTERN_C
+
+typedef char * caddr_t; /* In malloc.c (core address). */
+
+/*
+ * handle socket stuff, assuming socket is always available
+ */
+#include <sys/socket.h>
+#include <netdb.h>
+
+#ifdef MYMALLOC
+#define EMBEDMYMALLOC /**/
+/* #define USE_PERL_SBRK /**/
+/* #define PERL_SBRK_VIA_MALLOC /**/
+#endif
+
+#ifdef PERL_TEXTMODE_SCRIPTS
+# define PERL_SCRIPT_MODE "r"
+#else
+# define PERL_SCRIPT_MODE "rb"
+#endif
+
+/*
+ * Now Win32 specific per-thread data stuff
+ */
+
+/* Leave the first couple ids after WM_USER unused because they
+ * might be used by an embedding application, and on Windows
+ * version before 2000 we might end up eating those messages
+ * if they were not meant for us.
+ */
+#define WM_USER_MIN (WM_USER+30)
+#define WM_USER_MESSAGE (WM_USER_MIN)
+#define WM_USER_KILL (WM_USER_MIN+1)
+#define WM_USER_MAX (WM_USER_MIN+1)
+
+struct thread_intern {
+ /* XXX can probably use one buffer instead of several */
+ char Wstrerror_buffer[512];
+ struct servent Wservent;
+ char Wgetlogin_buffer[128];
+# ifdef USE_SOCKETS_AS_HANDLES
+ int Winit_socktype;
+# endif
+# ifdef HAVE_DES_FCRYPT
+ char Wcrypt_buffer[30];
+# endif
+# ifdef USE_RTL_THREAD_API
+ void * retv; /* slot for thread return value */
+# endif
+ BOOL Wuse_showwindow;
+ WORD Wshowwindow;
+};
+
+#define HAVE_INTERP_INTERN
+typedef struct {
+ long num;
+ DWORD pids[MAXIMUM_WAIT_OBJECTS];
+ HANDLE handles[MAXIMUM_WAIT_OBJECTS];
+} child_tab;
+
+#ifdef USE_ITHREADS
+typedef struct {
+ long num;
+ DWORD pids[MAXIMUM_WAIT_OBJECTS];
+ HANDLE handles[MAXIMUM_WAIT_OBJECTS];
+ HWND message_hwnds[MAXIMUM_WAIT_OBJECTS];
+} pseudo_child_tab;
+#endif
+
+#ifndef Sighandler_t
+typedef Signal_t (*Sighandler_t) (int);
+#define Sighandler_t Sighandler_t
+#endif
+
+struct interp_intern {
+ char * perlshell_tokens;
+ char ** perlshell_vec;
+ long perlshell_items;
+ struct av * fdpid;
+ child_tab * children;
+#ifdef USE_ITHREADS
+ DWORD pseudo_id;
+ pseudo_child_tab * pseudo_children;
+#endif
+ void * internal_host;
+ struct thread_intern thr_intern;
+ HWND message_hwnd;
+ UINT timerid;
+ unsigned poll_count;
+ Sighandler_t sigtable[SIG_SIZE];
+};
+
+DllExport int win32_async_check(pTHX);
+
+#define WIN32_POLL_INTERVAL 32768
+#define PERL_ASYNC_CHECK() if (w32_do_async || PL_sig_pending) win32_async_check(aTHX)
+
+#define w32_perlshell_tokens (PL_sys_intern.perlshell_tokens)
+#define w32_perlshell_vec (PL_sys_intern.perlshell_vec)
+#define w32_perlshell_items (PL_sys_intern.perlshell_items)
+#define w32_fdpid (PL_sys_intern.fdpid)
+#define w32_children (PL_sys_intern.children)
+#define w32_num_children (w32_children->num)
+#define w32_child_pids (w32_children->pids)
+#define w32_child_handles (w32_children->handles)
+#define w32_pseudo_id (PL_sys_intern.pseudo_id)
+#define w32_pseudo_children (PL_sys_intern.pseudo_children)
+#define w32_num_pseudo_children (w32_pseudo_children->num)
+#define w32_pseudo_child_pids (w32_pseudo_children->pids)
+#define w32_pseudo_child_handles (w32_pseudo_children->handles)
+#define w32_pseudo_child_message_hwnds (w32_pseudo_children->message_hwnds)
+#define w32_internal_host (PL_sys_intern.internal_host)
+#define w32_timerid (PL_sys_intern.timerid)
+#define w32_message_hwnd (PL_sys_intern.message_hwnd)
+#define w32_sighandler (PL_sys_intern.sigtable)
+#define w32_poll_count (PL_sys_intern.poll_count)
+#define w32_do_async (w32_poll_count++ > WIN32_POLL_INTERVAL)
+#define w32_strerror_buffer (PL_sys_intern.thr_intern.Wstrerror_buffer)
+#define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer)
+#define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer)
+#define w32_servent (PL_sys_intern.thr_intern.Wservent)
+#define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype)
+#define w32_use_showwindow (PL_sys_intern.thr_intern.Wuse_showwindow)
+#define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow)
+
+#ifdef USE_ITHREADS
+# define PERL_WAIT_FOR_CHILDREN \
+ STMT_START { \
+ if (w32_pseudo_children && w32_num_pseudo_children) { \
+ long children = w32_num_pseudo_children; \
+ WaitForMultipleObjects(children, \
+ w32_pseudo_child_handles, \
+ TRUE, INFINITE); \
+ while (children) \
+ CloseHandle(w32_pseudo_child_handles[--children]); \
+ } \
+ } STMT_END
+#endif
+
+#if defined(USE_FIXED_OSFHANDLE) || defined(PERL_MSVCRT_READFIX)
+#ifdef PERL_CORE
+
+/* C doesn't like repeat struct definitions */
+#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION>=3)
+#undef _CRTIMP
+#endif
+#ifndef _CRTIMP
+#define _CRTIMP __declspec(dllimport)
+#endif
+
+/*
+ * Control structure for lowio file handles
+ */
+typedef struct {
+ intptr_t osfhnd;/* underlying OS file HANDLE */
+ char osfile; /* attributes of file (e.g., open in text mode?) */
+ char pipech; /* one char buffer for handles opened on pipes */
+ int lockinitflag;
+ CRITICAL_SECTION lock;
+} ioinfo;
+
+
+/*
+ * Array of arrays of control structures for lowio files.
+ */
+EXTERN_C _CRTIMP ioinfo* __pioinfo[];
+
+/*
+ * Definition of IOINFO_L2E, the log base 2 of the number of elements in each
+ * array of ioinfo structs.
+ */
+#define IOINFO_L2E 5
+
+/*
+ * Definition of IOINFO_ARRAY_ELTS, the number of elements in ioinfo array
+ */
+#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
+
+/*
+ * Access macros for getting at an ioinfo struct and its fields from a
+ * file handle
+ */
+#define _pioinfo(i) (__pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)))
+#define _osfhnd(i) (_pioinfo(i)->osfhnd)
+#define _osfile(i) (_pioinfo(i)->osfile)
+#define _pipech(i) (_pioinfo(i)->pipech)
+
+/* since we are not doing a dup2(), this works fine */
+#define _set_osfhnd(fh, osfh) (void)(_osfhnd(fh) = (intptr_t)osfh)
+#endif
+#endif
+
+/* IO.xs and POSIX.xs define PERLIO_NOT_STDIO to 1 */
+#if defined(PERL_EXT_IO) || defined(PERL_EXT_POSIX)
+#undef PERLIO_NOT_STDIO
+#endif
+#define PERLIO_NOT_STDIO 0
+
+#include "perlio.h"
+
+/*
+ * This provides a layer of functions and macros to ensure extensions will
+ * get to use the same RTL functions as the core.
+ */
+#include "win32iop.h"
+
+#define EXEC_ARGV_CAST(x) ((const char *const *) x)
+
+#if !defined(ECONNABORTED) && defined(WSAECONNABORTED)
+#define ECONNABORTED WSAECONNABORTED
+#endif
+#if !defined(ECONNRESET) && defined(WSAECONNRESET)
+#define ECONNRESET WSAECONNRESET
+#endif
+#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT)
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#endif
+/* Why not needed for ECONNREFUSED? --abe */
+
+DllExport void *win32_signal_context(void);
+#define PERL_GET_SIG_CONTEXT win32_signal_context()
+
+#ifdef UNDER_CE
+#define Win_GetModuleHandle XCEGetModuleHandleA
+#define Win_GetProcAddress XCEGetProcAddressA
+#define Win_GetModuleFileName XCEGetModuleFileNameA
+#define Win_CreateSemaphore CreateSemaphoreW
+#else
+#define Win_GetModuleHandle GetModuleHandle
+#define Win_GetProcAddress GetProcAddress
+#define Win_GetModuleFileName GetModuleFileName
+#define Win_CreateSemaphore CreateSemaphore
+#endif
+
+#endif /* _INC_WIN32_PERL5 */
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/win32iop-o.h b/Master/tlpkg/tlperl/lib/CORE/win32iop-o.h
new file mode 100644
index 00000000000..57b073ba874
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/win32iop-o.h
@@ -0,0 +1,340 @@
+/* Time-stamp: <01/08/01 21:00:16 keuchel@w2k> */
+
+#ifndef WIN32IOP_H
+#define WIN32IOP_H
+
+#ifndef START_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
+#endif
+#endif
+
+#ifndef UNDER_CE
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# include <sys/utime.h>
+#else
+# include <utime.h>
+#endif
+#endif
+
+/*
+ * defines for flock emulation
+ */
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8
+
+/*
+ * Make this as close to original stdio as possible.
+ */
+
+/*
+ * function prototypes for our own win32io layer
+ */
+START_EXTERN_C
+
+DllExport int * win32_errno(void);
+DllExport char *** win32_environ(void);
+DllExport FILE* win32_stdin(void);
+DllExport FILE* win32_stdout(void);
+DllExport FILE* win32_stderr(void);
+DllExport int win32_ferror(FILE *fp);
+DllExport int win32_feof(FILE *fp);
+DllExport char* win32_strerror(int e);
+
+DllExport int win32_fprintf(FILE *pf, const char *format, ...);
+DllExport int win32_printf(const char *format, ...);
+DllExport int win32_vfprintf(FILE *pf, const char *format, va_list arg);
+DllExport int win32_vprintf(const char *format, va_list arg);
+DllExport size_t win32_fread(void *buf, size_t size, size_t count, FILE *pf);
+DllExport size_t win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf);
+DllExport FILE* win32_fopen(const char *path, const char *mode);
+DllExport FILE* win32_fdopen(int fh, const char *mode);
+DllExport FILE* win32_freopen(const char *path, const char *mode, FILE *pf);
+DllExport int win32_fclose(FILE *pf);
+DllExport int win32_fputs(const char *s,FILE *pf);
+DllExport int win32_fputc(int c,FILE *pf);
+DllExport int win32_ungetc(int c,FILE *pf);
+DllExport int win32_getc(FILE *pf);
+DllExport int win32_fileno(FILE *pf);
+DllExport void win32_clearerr(FILE *pf);
+DllExport int win32_fflush(FILE *pf);
+DllExport long win32_ftell(FILE *pf);
+DllExport int win32_fseek(FILE *pf,long offset,int origin);
+DllExport int win32_fgetpos(FILE *pf,fpos_t *p);
+DllExport int win32_fsetpos(FILE *pf,const fpos_t *p);
+DllExport void win32_rewind(FILE *pf);
+DllExport FILE* win32_tmpfile(void);
+DllExport int win32_tmpfd(void);
+DllExport void win32_abort(void);
+DllExport int win32_fstat(int fd,struct stat *sbufptr);
+DllExport int win32_stat(const char *name,struct stat *sbufptr);
+DllExport int win32_pipe( int *phandles, unsigned int psize, int textmode );
+DllExport PerlIO* win32_popen( const char *command, const char *mode );
+DllExport PerlIO* win32_popenlist(const char *mode, IV narg, SV **args);
+DllExport int win32_pclose( FILE *pf);
+DllExport int win32_rename( const char *oname, const char *newname);
+DllExport int win32_setmode( int fd, int mode);
+DllExport int win32_chsize(int fd, Off_t size);
+DllExport long win32_lseek( int fd, long offset, int origin);
+DllExport long win32_tell( int fd);
+DllExport int win32_dup( int fd);
+DllExport int win32_dup2(int h1, int h2);
+DllExport int win32_open(const char *path, int oflag,...);
+DllExport int win32_close(int fd);
+DllExport int win32_eof(int fd);
+DllExport int win32_read(int fd, void *buf, unsigned int cnt);
+DllExport int win32_write(int fd, const void *buf, unsigned int cnt);
+DllExport int win32_spawnvp(int mode, const char *cmdname,
+ const char *const *argv);
+DllExport int win32_mkdir(const char *dir, int mode);
+DllExport int win32_rmdir(const char *dir);
+DllExport int win32_chdir(const char *dir);
+DllExport int win32_flock(int fd, int oper);
+DllExport int win32_execv(const char *cmdname, const char *const *argv);
+DllExport int win32_execvp(const char *cmdname, const char *const *argv);
+DllExport void win32_perror(const char *str);
+DllExport void win32_setbuf(FILE *pf, char *buf);
+DllExport int win32_setvbuf(FILE *pf, char *buf, int type, size_t size);
+DllExport int win32_flushall(void);
+DllExport int win32_fcloseall(void);
+DllExport char* win32_fgets(char *s, int n, FILE *pf);
+DllExport char* win32_gets(char *s);
+DllExport int win32_fgetc(FILE *pf);
+DllExport int win32_putc(int c, FILE *pf);
+DllExport int win32_puts(const char *s);
+DllExport int win32_getchar(void);
+DllExport int win32_putchar(int c);
+DllExport void* win32_malloc(size_t size);
+DllExport void* win32_calloc(size_t numitems, size_t size);
+DllExport void* win32_realloc(void *block, size_t size);
+DllExport void win32_free(void *block);
+
+DllExport int win32_open_osfhandle(long handle, int flags);
+DllExport long win32_get_osfhandle(int fd);
+
+DllExport DIR* win32_opendir(char *filename);
+DllExport struct direct* win32_readdir(DIR *dirp);
+DllExport long win32_telldir(DIR *dirp);
+DllExport void win32_seekdir(DIR *dirp, long loc);
+DllExport void win32_rewinddir(DIR *dirp);
+DllExport int win32_closedir(DIR *dirp);
+
+DllExport char* win32_getenv(const char *name);
+DllExport int win32_putenv(const char *name);
+
+DllExport unsigned win32_sleep(unsigned int);
+DllExport int win32_times(struct tms *timebuf);
+DllExport unsigned win32_alarm(unsigned int sec);
+DllExport int win32_stat(const char *path, struct stat *buf);
+DllExport char* win32_longpath(char *path);
+DllExport int win32_ioctl(int i, unsigned int u, char *data);
+DllExport int win32_link(const char *oldname, const char *newname);
+DllExport int win32_gettimeofday(struct timeval *tp, void *not_used);
+DllExport int win32_unlink(const char *f);
+DllExport int win32_utime(const char *f, struct utimbuf *t);
+DllExport int win32_uname(struct utsname *n);
+DllExport int win32_wait(int *status);
+DllExport int win32_waitpid(int pid, int *status, int flags);
+DllExport int win32_kill(int pid, int sig);
+DllExport unsigned long win32_os_id(void);
+DllExport void* win32_dynaload(const char*filename);
+DllExport int win32_access(const char *path, int mode);
+DllExport int win32_chmod(const char *path, int mode);
+DllExport int win32_getpid(void);
+DllExport Sighandler_t win32_signal(int sig, Sighandler_t subcode);
+
+DllExport char * win32_crypt(const char *txt, const char *salt);
+
+END_EXTERN_C
+
+/*
+ * the following six(6) is #define in stdio.h
+ */
+#ifndef WIN32IO_IS_STDIO
+#undef errno
+#undef environ
+#undef stderr
+#undef stdin
+#undef stdout
+#undef ferror
+#undef feof
+#undef fclose
+#undef pipe
+#undef pause
+#undef sleep
+#undef times
+#undef alarm
+#undef ioctl
+#undef unlink
+#undef utime
+#undef uname
+#undef wait
+
+#ifdef __BORLANDC__
+#undef ungetc
+#undef getc
+#undef putc
+#undef getchar
+#undef putchar
+#undef fileno
+#endif
+
+#define stderr win32_stderr()
+#define stdout win32_stdout()
+#define stdin win32_stdin()
+#define feof(f) win32_feof(f)
+#define ferror(f) win32_ferror(f)
+#define errno (*win32_errno())
+#define environ (*win32_environ())
+#define strerror win32_strerror
+
+/*
+ * redirect to our own version
+ */
+#undef fprintf
+#define fprintf win32_fprintf
+#undef vfprintf
+#define vfprintf win32_vfprintf
+#undef printf
+#define printf win32_printf
+#undef vprintf
+#define vprintf win32_vprintf
+#undef fread
+#define fread(buf,size,count,f) win32_fread(buf,size,count,f)
+#undef fwrite
+#define fwrite(buf,size,count,f) win32_fwrite(buf,size,count,f)
+#undef fopen
+#define fopen win32_fopen
+#undef fdopen
+#define fdopen win32_fdopen
+#undef freopen
+#define freopen win32_freopen
+#define fclose(f) win32_fclose(f)
+#undef fputs
+#define fputs(s,f) win32_fputs(s,f)
+#undef fputc
+#define fputc(c,f) win32_fputc(c,f)
+#undef ungetc
+#define ungetc(c,f) win32_ungetc(c,f)
+#undef getc
+#define getc(f) win32_getc(f)
+#undef fileno
+#define fileno(f) win32_fileno(f)
+#undef clearerr
+#define clearerr(f) win32_clearerr(f)
+#undef fflush
+#define fflush(f) win32_fflush(f)
+#undef ftell
+#define ftell(f) win32_ftell(f)
+#undef fseek
+#define fseek(f,o,w) win32_fseek(f,o,w)
+#undef fgetpos
+#define fgetpos(f,p) win32_fgetpos(f,p)
+#undef fsetpos
+#define fsetpos(f,p) win32_fsetpos(f,p)
+#undef rewind
+#define rewind(f) win32_rewind(f)
+#define tmpfile() win32_tmpfile()
+#define abort() win32_abort()
+#define fstat(fd,bufptr) win32_fstat(fd,bufptr)
+#define stat(pth,bufptr) win32_stat(pth,bufptr)
+#define longpath(pth) win32_longpath(pth)
+#define rename(old,new) win32_rename(old,new)
+#define setmode(fd,mode) win32_setmode(fd,mode)
+#define lseek(fd,offset,orig) win32_lseek(fd,offset,orig)
+#define tell(fd) win32_tell(fd)
+#define dup(fd) win32_dup(fd)
+#define dup2(fd1,fd2) win32_dup2(fd1,fd2)
+#define open win32_open
+#define close(fd) win32_close(fd)
+#define eof(fd) win32_eof(fd)
+#define read(fd,b,s) win32_read(fd,b,s)
+#define write(fd,b,s) win32_write(fd,b,s)
+#define _open_osfhandle win32_open_osfhandle
+#define _get_osfhandle win32_get_osfhandle
+#define spawnvp win32_spawnvp
+#define mkdir win32_mkdir
+#define rmdir win32_rmdir
+#define chdir win32_chdir
+#define flock(fd,o) win32_flock(fd,o)
+#define execv win32_execv
+#define execvp win32_execvp
+#define perror win32_perror
+#define setbuf win32_setbuf
+#undef setvbuf
+#define setvbuf win32_setvbuf
+#undef flushall
+#define flushall win32_flushall
+#undef fcloseall
+#define fcloseall win32_fcloseall
+#undef fgets
+#define fgets win32_fgets
+#undef gets
+#define gets win32_gets
+#undef fgetc
+#define fgetc win32_fgetc
+#undef putc
+#define putc win32_putc
+#undef puts
+#define puts win32_puts
+#undef getchar
+#define getchar win32_getchar
+#undef putchar
+#define putchar win32_putchar
+#define access(p,m) win32_access(p,m)
+#define chmod(p,m) win32_chmod(p,m)
+
+
+#if !defined(MYMALLOC) || !defined(PERL_CORE)
+#undef malloc
+#undef calloc
+#undef realloc
+#undef free
+#define malloc win32_malloc
+#define calloc win32_calloc
+#define realloc win32_realloc
+#define free win32_free
+#endif
+
+#define pipe(fd) win32_pipe((fd), 512, O_BINARY)
+#define pause() win32_sleep((32767L << 16) + 32767)
+#define sleep win32_sleep
+#define times win32_times
+#define alarm win32_alarm
+#define ioctl win32_ioctl
+#define link win32_link
+#define unlink win32_unlink
+#define utime win32_utime
+#define uname win32_uname
+#define wait win32_wait
+#define waitpid win32_waitpid
+#define kill win32_kill
+
+#define opendir win32_opendir
+#define readdir win32_readdir
+#define telldir win32_telldir
+#define seekdir win32_seekdir
+#define rewinddir win32_rewinddir
+#define closedir win32_closedir
+#define os_id win32_os_id
+#define getpid win32_getpid
+
+#undef crypt
+#define crypt(t,s) win32_crypt(t,s)
+
+#undef getenv
+#define getenv win32_getenv
+#undef putenv
+#define putenv win32_putenv
+
+#endif /* WIN32IO_IS_STDIO */
+#endif /* WIN32IOP_H */
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/win32iop.h b/Master/tlpkg/tlperl/lib/CORE/win32iop.h
new file mode 100644
index 00000000000..9c59037c535
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/win32iop.h
@@ -0,0 +1,347 @@
+#ifndef WIN32IOP_H
+#define WIN32IOP_H
+
+#ifndef START_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
+#endif
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# include <sys/utime.h>
+#else
+# include <utime.h>
+#endif
+
+/*
+ * defines for flock emulation
+ */
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8
+
+/*
+ * Make this as close to original stdio as possible.
+ */
+
+/*
+ * function prototypes for our own win32io layer
+ */
+START_EXTERN_C
+
+DllExport int * win32_errno(void);
+DllExport char *** win32_environ(void);
+DllExport FILE* win32_stdin(void);
+DllExport FILE* win32_stdout(void);
+DllExport FILE* win32_stderr(void);
+DllExport int win32_ferror(FILE *fp);
+DllExport int win32_feof(FILE *fp);
+DllExport char* win32_strerror(int e);
+
+DllExport int win32_fprintf(FILE *pf, const char *format, ...);
+DllExport int win32_printf(const char *format, ...);
+DllExport int win32_vfprintf(FILE *pf, const char *format, va_list arg);
+DllExport int win32_vprintf(const char *format, va_list arg);
+DllExport size_t win32_fread(void *buf, size_t size, size_t count, FILE *pf);
+DllExport size_t win32_fwrite(const void *buf, size_t size, size_t count, FILE *pf);
+DllExport FILE* win32_fopen(const char *path, const char *mode);
+DllExport FILE* win32_fdopen(int fh, const char *mode);
+DllExport FILE* win32_freopen(const char *path, const char *mode, FILE *pf);
+DllExport int win32_fclose(FILE *pf);
+DllExport int win32_fputs(const char *s,FILE *pf);
+DllExport int win32_fputc(int c,FILE *pf);
+DllExport int win32_ungetc(int c,FILE *pf);
+DllExport int win32_getc(FILE *pf);
+DllExport int win32_fileno(FILE *pf);
+DllExport void win32_clearerr(FILE *pf);
+DllExport int win32_fflush(FILE *pf);
+DllExport Off_t win32_ftell(FILE *pf);
+DllExport int win32_fseek(FILE *pf,Off_t offset,int origin);
+DllExport int win32_fgetpos(FILE *pf,fpos_t *p);
+DllExport int win32_fsetpos(FILE *pf,const fpos_t *p);
+DllExport void win32_rewind(FILE *pf);
+DllExport int win32_tmpfd(void);
+DllExport FILE* win32_tmpfile(void);
+DllExport void win32_abort(void);
+DllExport int win32_fstat(int fd,Stat_t *sbufptr);
+DllExport int win32_stat(const char *name,Stat_t *sbufptr);
+DllExport int win32_pipe( int *phandles, unsigned int psize, int textmode );
+DllExport PerlIO* win32_popen( const char *command, const char *mode );
+DllExport PerlIO* win32_popenlist(const char *mode, IV narg, SV **args);
+DllExport int win32_pclose( PerlIO *pf);
+DllExport int win32_rename( const char *oname, const char *newname);
+DllExport int win32_setmode( int fd, int mode);
+DllExport int win32_chsize(int fd, Off_t size);
+DllExport Off_t win32_lseek( int fd, Off_t offset, int origin);
+DllExport Off_t win32_tell( int fd);
+DllExport int win32_dup( int fd);
+DllExport int win32_dup2(int h1, int h2);
+DllExport int win32_open(const char *path, int oflag,...);
+DllExport int win32_close(int fd);
+DllExport int win32_eof(int fd);
+DllExport int win32_isatty(int fd);
+DllExport int win32_read(int fd, void *buf, unsigned int cnt);
+DllExport int win32_write(int fd, const void *buf, unsigned int cnt);
+DllExport int win32_spawnvp(int mode, const char *cmdname,
+ const char *const *argv);
+DllExport int win32_mkdir(const char *dir, int mode);
+DllExport int win32_rmdir(const char *dir);
+DllExport int win32_chdir(const char *dir);
+DllExport int win32_flock(int fd, int oper);
+DllExport int win32_execv(const char *cmdname, const char *const *argv);
+DllExport int win32_execvp(const char *cmdname, const char *const *argv);
+DllExport void win32_perror(const char *str);
+DllExport void win32_setbuf(FILE *pf, char *buf);
+DllExport int win32_setvbuf(FILE *pf, char *buf, int type, size_t size);
+DllExport int win32_flushall(void);
+DllExport int win32_fcloseall(void);
+DllExport char* win32_fgets(char *s, int n, FILE *pf);
+DllExport char* win32_gets(char *s);
+DllExport int win32_fgetc(FILE *pf);
+DllExport int win32_putc(int c, FILE *pf);
+DllExport int win32_puts(const char *s);
+DllExport int win32_getchar(void);
+DllExport int win32_putchar(int c);
+DllExport void* win32_malloc(size_t size);
+DllExport void* win32_calloc(size_t numitems, size_t size);
+DllExport void* win32_realloc(void *block, size_t size);
+DllExport void win32_free(void *block);
+
+DllExport int win32_open_osfhandle(intptr_t handle, int flags);
+DllExport intptr_t win32_get_osfhandle(int fd);
+DllExport FILE* win32_fdupopen(FILE *pf);
+
+DllExport DIR* win32_opendir(const char *filename);
+DllExport struct direct* win32_readdir(DIR *dirp);
+DllExport long win32_telldir(DIR *dirp);
+DllExport void win32_seekdir(DIR *dirp, long loc);
+DllExport void win32_rewinddir(DIR *dirp);
+DllExport int win32_closedir(DIR *dirp);
+
+DllExport char* win32_getenv(const char *name);
+DllExport int win32_putenv(const char *name);
+
+DllExport unsigned win32_sleep(unsigned int);
+DllExport int win32_times(struct tms *timebuf);
+DllExport unsigned win32_alarm(unsigned int sec);
+DllExport int win32_stat(const char *path, Stat_t *buf);
+DllExport char* win32_longpath(char *path);
+DllExport char* win32_ansipath(const WCHAR *path);
+DllExport int win32_ioctl(int i, unsigned int u, char *data);
+DllExport int win32_link(const char *oldname, const char *newname);
+DllExport int win32_unlink(const char *f);
+DllExport int win32_utime(const char *f, struct utimbuf *t);
+DllExport int win32_gettimeofday(struct timeval *tp, void *not_used);
+DllExport int win32_uname(struct utsname *n);
+DllExport int win32_wait(int *status);
+DllExport int win32_waitpid(int pid, int *status, int flags);
+DllExport int win32_kill(int pid, int sig);
+DllExport unsigned long win32_os_id(void);
+DllExport void* win32_dynaload(const char*filename);
+DllExport int win32_access(const char *path, int mode);
+DllExport int win32_chmod(const char *path, int mode);
+DllExport int win32_getpid(void);
+
+DllExport char * win32_crypt(const char *txt, const char *salt);
+
+DllExport void * win32_get_childenv(void);
+DllExport void win32_free_childenv(void* d);
+DllExport void win32_clearenv(void);
+DllExport char * win32_get_childdir(void);
+DllExport void win32_free_childdir(char* d);
+DllExport Sighandler_t win32_signal(int sig, Sighandler_t subcode);
+
+
+END_EXTERN_C
+
+#undef alarm
+#define alarm win32_alarm
+#undef strerror
+#define strerror win32_strerror
+
+/*
+ * the following six(6) is #define in stdio.h
+ */
+#ifndef WIN32IO_IS_STDIO
+#undef errno
+#undef environ
+#undef stderr
+#undef stdin
+#undef stdout
+#undef ferror
+#undef feof
+#undef fclose
+#undef pipe
+#undef pause
+#undef sleep
+#undef times
+#undef ioctl
+#undef unlink
+#undef utime
+#undef gettimeofday
+#undef uname
+#undef wait
+
+#ifdef __BORLANDC__
+#undef ungetc
+#undef getc
+#undef putc
+#undef getchar
+#undef putchar
+#endif
+
+#if defined(__MINGW32__) || defined(__BORLANDC__)
+#undef fileno
+#endif
+
+#define stderr win32_stderr()
+#define stdout win32_stdout()
+#define stdin win32_stdin()
+#define feof(f) win32_feof(f)
+#define ferror(f) win32_ferror(f)
+#define errno (*win32_errno())
+#define environ (*win32_environ())
+
+/*
+ * redirect to our own version
+ */
+#undef fprintf
+#define fprintf win32_fprintf
+#define vfprintf win32_vfprintf
+#define printf win32_printf
+#define vprintf win32_vprintf
+#define fread(buf,size,count,f) win32_fread(buf,size,count,f)
+#define fwrite(buf,size,count,f) win32_fwrite(buf,size,count,f)
+#define fopen win32_fopen
+#undef fdopen
+#define fdopen win32_fdopen
+#define freopen win32_freopen
+#define fclose(f) win32_fclose(f)
+#define fputs(s,f) win32_fputs(s,f)
+#define fputc(c,f) win32_fputc(c,f)
+#define ungetc(c,f) win32_ungetc(c,f)
+#undef getc
+#define getc(f) win32_getc(f)
+#define fileno(f) win32_fileno(f)
+#define clearerr(f) win32_clearerr(f)
+#define fflush(f) win32_fflush(f)
+#define ftell(f) win32_ftell(f)
+#define fseek(f,o,w) win32_fseek(f,o,w)
+#define fgetpos(f,p) win32_fgetpos(f,p)
+#define fsetpos(f,p) win32_fsetpos(f,p)
+#define rewind(f) win32_rewind(f)
+#define tmpfile() win32_tmpfile()
+#define abort() win32_abort()
+#define fstat(fd,bufptr) win32_fstat(fd,bufptr)
+#define stat(pth,bufptr) win32_stat(pth,bufptr)
+#define longpath(pth) win32_longpath(pth)
+#define ansipath(pth) win32_ansipath(pth)
+#define rename(old,new) win32_rename(old,new)
+#define setmode(fd,mode) win32_setmode(fd,mode)
+#define chsize(fd,sz) win32_chsize(fd,sz)
+#define lseek(fd,offset,orig) win32_lseek(fd,offset,orig)
+#define tell(fd) win32_tell(fd)
+#define dup(fd) win32_dup(fd)
+#define dup2(fd1,fd2) win32_dup2(fd1,fd2)
+#define open win32_open
+#define close(fd) win32_close(fd)
+#define eof(fd) win32_eof(fd)
+#define isatty(fd) win32_isatty(fd)
+#define read(fd,b,s) win32_read(fd,b,s)
+#define write(fd,b,s) win32_write(fd,b,s)
+#define _open_osfhandle win32_open_osfhandle
+#define _get_osfhandle win32_get_osfhandle
+#define spawnvp win32_spawnvp
+#define mkdir win32_mkdir
+#define rmdir win32_rmdir
+#define chdir win32_chdir
+#define flock(fd,o) win32_flock(fd,o)
+#define execv win32_execv
+#define execvp win32_execvp
+#define perror win32_perror
+#define setbuf win32_setbuf
+#define setvbuf win32_setvbuf
+#undef flushall
+#define flushall win32_flushall
+#undef fcloseall
+#define fcloseall win32_fcloseall
+#define fgets win32_fgets
+#define gets win32_gets
+#define fgetc win32_fgetc
+#undef putc
+#define putc win32_putc
+#define puts win32_puts
+#undef getchar
+#define getchar win32_getchar
+#undef putchar
+#define putchar win32_putchar
+#define access(p,m) win32_access(p,m)
+#define chmod(p,m) win32_chmod(p,m)
+
+
+#if !defined(MYMALLOC) || !defined(PERL_CORE)
+#undef malloc
+#undef calloc
+#undef realloc
+#undef free
+#define malloc win32_malloc
+#define calloc win32_calloc
+#define realloc win32_realloc
+#define free win32_free
+#endif
+
+/* XXX Why are APIs like sleep(), times() etc. inside a block
+ * XXX guarded by "#ifndef WIN32IO_IS_STDIO"?
+ */
+
+#define pipe(fd) win32_pipe((fd), 512, O_BINARY)
+#define pause() win32_sleep((32767L << 16) + 32767)
+#define sleep win32_sleep
+#define times win32_times
+#define ioctl win32_ioctl
+#define link win32_link
+#define unlink win32_unlink
+#define utime win32_utime
+#define gettimeofday win32_gettimeofday
+#define uname win32_uname
+#define wait win32_wait
+#define waitpid win32_waitpid
+#define kill win32_kill
+
+#define opendir win32_opendir
+#define readdir win32_readdir
+#define telldir win32_telldir
+#define seekdir win32_seekdir
+#define rewinddir win32_rewinddir
+#define closedir win32_closedir
+#define os_id win32_os_id
+#define getpid win32_getpid
+
+#undef crypt
+#define crypt(t,s) win32_crypt(t,s)
+
+#undef get_childenv
+#undef free_childenv
+#undef clearenv
+#undef get_childdir
+#undef free_childdir
+#define get_childenv() win32_get_childenv()
+#define free_childenv(d) win32_free_childenv(d)
+#define clearenv() win32_clearenv()
+#define get_childdir() win32_get_childdir()
+#define free_childdir(d) win32_free_childdir(d)
+
+#undef getenv
+#define getenv win32_getenv
+#undef putenv
+#define putenv win32_putenv
+
+#endif /* WIN32IO_IS_STDIO */
+#endif /* WIN32IOP_H */
diff --git a/Master/tlpkg/tlperl/lib/CORE/win32thread.h b/Master/tlpkg/tlperl/lib/CORE/win32thread.h
new file mode 100644
index 00000000000..c6f93097ffa
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/win32thread.h
@@ -0,0 +1,197 @@
+#ifndef _WIN32THREAD_H
+#define _WIN32THREAD_H
+
+#include "win32.h"
+
+typedef struct win32_cond { LONG waiters; HANDLE sem; } perl_cond;
+typedef DWORD perl_key;
+typedef HANDLE perl_os_thread;
+
+#ifndef DONT_USE_CRITICAL_SECTION
+
+/* Critical Sections used instead of mutexes: lightweight,
+ * but can't be communicated to child processes, and can't get
+ * HANDLE to it for use elsewhere.
+ */
+typedef CRITICAL_SECTION perl_mutex;
+#define MUTEX_INIT(m) InitializeCriticalSection(m)
+#define MUTEX_LOCK(m) EnterCriticalSection(m)
+#define MUTEX_UNLOCK(m) LeaveCriticalSection(m)
+#define MUTEX_DESTROY(m) DeleteCriticalSection(m)
+
+#else
+
+typedef HANDLE perl_mutex;
+# define MUTEX_INIT(m) \
+ STMT_START { \
+ if ((*(m) = CreateMutex(NULL,FALSE,NULL)) == NULL) \
+ Perl_croak_nocontext("panic: MUTEX_INIT"); \
+ } STMT_END
+
+# define MUTEX_LOCK(m) \
+ STMT_START { \
+ if (WaitForSingleObject(*(m),INFINITE) == WAIT_FAILED) \
+ Perl_croak_nocontext("panic: MUTEX_LOCK"); \
+ } STMT_END
+
+# define MUTEX_UNLOCK(m) \
+ STMT_START { \
+ if (ReleaseMutex(*(m)) == 0) \
+ Perl_croak_nocontext("panic: MUTEX_UNLOCK"); \
+ } STMT_END
+
+# define MUTEX_DESTROY(m) \
+ STMT_START { \
+ if (CloseHandle(*(m)) == 0) \
+ Perl_croak_nocontext("panic: MUTEX_DESTROY"); \
+ } STMT_END
+
+#endif
+
+/* These macros assume that the mutex associated with the condition
+ * will always be held before COND_{SIGNAL,BROADCAST,WAIT,DESTROY},
+ * so there's no separate mutex protecting access to (c)->waiters
+ */
+#define COND_INIT(c) \
+ STMT_START { \
+ (c)->waiters = 0; \
+ (c)->sem = Win_CreateSemaphore(NULL,0,LONG_MAX,NULL); \
+ if ((c)->sem == NULL) \
+ Perl_croak_nocontext("panic: COND_INIT (%ld)",GetLastError()); \
+ } STMT_END
+
+#define COND_SIGNAL(c) \
+ STMT_START { \
+ if ((c)->waiters > 0 && \
+ ReleaseSemaphore((c)->sem,1,NULL) == 0) \
+ Perl_croak_nocontext("panic: COND_SIGNAL (%ld)",GetLastError()); \
+ } STMT_END
+
+#define COND_BROADCAST(c) \
+ STMT_START { \
+ if ((c)->waiters > 0 && \
+ ReleaseSemaphore((c)->sem,(c)->waiters,NULL) == 0) \
+ Perl_croak_nocontext("panic: COND_BROADCAST (%ld)",GetLastError());\
+ } STMT_END
+
+#define COND_WAIT(c, m) \
+ STMT_START { \
+ (c)->waiters++; \
+ MUTEX_UNLOCK(m); \
+ /* Note that there's no race here, since a \
+ * COND_BROADCAST() on another thread will have seen the\
+ * right number of waiters (i.e. including this one) */ \
+ if (WaitForSingleObject((c)->sem,INFINITE)==WAIT_FAILED)\
+ Perl_croak_nocontext("panic: COND_WAIT (%ld)",GetLastError()); \
+ /* XXX there may be an inconsequential race here */ \
+ MUTEX_LOCK(m); \
+ (c)->waiters--; \
+ } STMT_END
+
+#define COND_DESTROY(c) \
+ STMT_START { \
+ (c)->waiters = 0; \
+ if (CloseHandle((c)->sem) == 0) \
+ Perl_croak_nocontext("panic: COND_DESTROY (%ld)",GetLastError()); \
+ } STMT_END
+
+#define DETACH(t) \
+ STMT_START { \
+ if (CloseHandle((t)->self) == 0) { \
+ MUTEX_UNLOCK(&(t)->mutex); \
+ Perl_croak_nocontext("panic: DETACH"); \
+ } \
+ } STMT_END
+
+
+#define THREAD_CREATE(t, f) Perl_thread_create(t, f)
+#define THREAD_POST_CREATE(t) NOOP
+
+/* XXX Docs mention that the RTL versions of thread creation routines
+ * should be used, but that advice only seems applicable when the RTL
+ * is not in a DLL. RTL DLLs in both Borland and VC seem to do all of
+ * the init/deinit required upon DLL_THREAD_ATTACH/DETACH. So we seem
+ * to be completely safe using straight Win32 API calls, rather than
+ * the much braindamaged RTL calls.
+ *
+ * _beginthread() in the RTLs call CloseHandle() just after the thread
+ * function returns, which means: 1) we have a race on our hands
+ * 2) it is impossible to implement join() semantics.
+ *
+ * IOW, do *NOT* turn on USE_RTL_THREAD_API! It is here
+ * for experimental purposes only. GSAR 98-01-02
+ */
+#ifdef USE_RTL_THREAD_API
+# include <process.h>
+# if defined(__BORLANDC__)
+ /* Borland RTL doesn't allow a return value from thread function! */
+# define THREAD_RET_TYPE void _USERENTRY
+# define THREAD_RET_CAST(p) ((void)(thr->i.retv = (void *)(p)))
+# elif defined (_MSC_VER)
+# define THREAD_RET_TYPE unsigned __stdcall
+# define THREAD_RET_CAST(p) ((unsigned)(p))
+# else
+ /* CRTDLL.DLL doesn't allow a return value from thread function! */
+# define THREAD_RET_TYPE void __cdecl
+# define THREAD_RET_CAST(p) ((void)(thr->i.retv = (void *)(p)))
+# endif
+#else /* !USE_RTL_THREAD_API */
+# define THREAD_RET_TYPE DWORD WINAPI
+# define THREAD_RET_CAST(p) ((DWORD)(p))
+#endif /* !USE_RTL_THREAD_API */
+
+typedef THREAD_RET_TYPE thread_func_t(void *);
+
+
+START_EXTERN_C
+
+#if defined(PERLDLL) && defined(USE_DECLSPEC_THREAD) && (!defined(__BORLANDC__) || defined(_DLL))
+extern __declspec(thread) void *PL_current_context;
+#define PERL_SET_CONTEXT(t) (PL_current_context = t)
+#define PERL_GET_CONTEXT PL_current_context
+#else
+#define PERL_GET_CONTEXT Perl_get_context()
+#define PERL_SET_CONTEXT(t) Perl_set_context(t)
+#endif
+
+END_EXTERN_C
+
+#define INIT_THREADS NOOP
+#define ALLOC_THREAD_KEY \
+ STMT_START { \
+ if ((PL_thr_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) { \
+ PerlIO_printf(PerlIO_stderr(),"panic: TlsAlloc"); \
+ exit(1); \
+ } \
+ } STMT_END
+
+#define FREE_THREAD_KEY \
+ STMT_START { \
+ TlsFree(PL_thr_key); \
+ } STMT_END
+
+#define PTHREAD_ATFORK(prepare,parent,child) NOOP
+
+#if defined(USE_RTL_THREAD_API) && !defined(_MSC_VER)
+#define JOIN(t, avp) \
+ STMT_START { \
+ if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED) \
+ || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0) \
+ || (CloseHandle((t)->self) == 0)) \
+ Perl_croak_nocontext("panic: JOIN"); \
+ *avp = (AV *)((t)->i.retv); \
+ } STMT_END
+#else /* !USE_RTL_THREAD_API || _MSC_VER */
+#define JOIN(t, avp) \
+ STMT_START { \
+ if ((WaitForSingleObject((t)->self,INFINITE) == WAIT_FAILED) \
+ || (GetExitCodeThread((t)->self,(LPDWORD)(avp)) == 0) \
+ || (CloseHandle((t)->self) == 0)) \
+ Perl_croak_nocontext("panic: JOIN"); \
+ } STMT_END
+#endif /* !USE_RTL_THREAD_API || _MSC_VER */
+
+#define YIELD Sleep(0)
+
+#endif /* _WIN32THREAD_H */
+
diff --git a/Master/tlpkg/tlperl/lib/CORE/wince.h b/Master/tlpkg/tlperl/lib/CORE/wince.h
new file mode 100644
index 00000000000..2a97668bb15
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/CORE/wince.h
@@ -0,0 +1,146 @@
+/* wince.h */
+
+/* Time-stamp: <01/08/01 20:48:08 keuchel@w2k> */
+
+/* This file includes extracts from the celib-headers, because */
+/* the celib-headers produces macro conflicts with defines in */
+/* win32iop.h etc */
+
+#ifndef WINCE_H
+#define WINCE_H 1
+
+#include "celib_defs.h"
+
+/* include local copies of celib headers... */
+#include "errno.h"
+#include "sys/stat.h"
+#include "time.h"
+#include "cectype.h"
+
+#ifndef START_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
+#endif
+#endif
+
+START_EXTERN_C
+
+#ifndef _IOFBF
+#define _IOFBF 0x0000
+#endif
+#ifndef _IOLBF
+#define _IOLBF 0x0040
+#endif
+#ifndef _IONBF
+#define _IONBF 0x0004
+#endif
+
+#if UNDER_CE <= 200
+XCE_EXPORT double xceatof(const char *);
+XCE_EXPORT int xcetoupper(int c);
+XCE_EXPORT int xcetolower(int c);
+#define atof xceatof
+#define toupper xcetoupper
+#define tolower xcetolower
+#else
+XCE_EXPORT double atof(const char *);
+#endif
+
+XCE_EXPORT void XCEShowMessageA(const char *fmt, ...);
+
+#define time xcetime
+#define gmtime xcegmtime
+#define localtime xcelocaltime
+#define asctime xceasctime
+/* #define utime xceutime */
+#define futime xcefutime
+#define ftime xceftime
+#define ctime xcectime
+#define gettimeofday xcegettimeofday
+#define GetSystemTimeAsFileTime XCEGetSystemTimeAsFileTime
+
+#define setuid xcesetuid
+#define getuid xcegetuid
+#define geteuid xcegeteuid
+#define seteuid xceseteuid
+
+#define setgid xcesetgid
+#define getgid xcegetgid
+#define getegid xcegetegid
+#define setegid xcesetegid
+
+XCE_EXPORT int xcechown(const char *filename, int owner, int group);
+#define chown xcechown
+
+XCE_EXPORT char *xcestrrchr(const char * string, int ch);
+#define strrchr xcestrrchr
+
+XCE_EXPORT void (*xcesignal(int, void (*)(int)))(int);
+XCE_EXPORT int xceraise(int);
+#define signal xcesignal
+#define raise xceraise
+
+XCE_EXPORT int xcecreat(const char *filename, int pmode);
+XCE_EXPORT int xceopen(const char *fname, int mode, ...);
+XCE_EXPORT int xceread(int fd, void *buf, int size);
+XCE_EXPORT int xcewrite(int fd, void *buf, int size);
+XCE_EXPORT int xceclose(int fd);
+XCE_EXPORT off_t xcelseek(int fd, int off, int whence);
+
+XCE_EXPORT char *xcestrupr(char *string);
+XCE_EXPORT char *xcestrlwr(char *string);
+#define strupr xcestrupr
+#define strlwr xcestrlwr
+
+XCE_EXPORT double xcestrtod(const char *s, char **errorptr);
+XCE_EXPORT long xcestrtol(const char *s, char **errorptr, int base);
+XCE_EXPORT unsigned long xcestrtoul(const char *s, char **errorptr, int base);
+#define strtod xcestrtod
+#define strtol xcestrtol
+#define strtoul xcestrtoul
+
+XCE_EXPORT int xcestrnicmp(const char *first, const char *last, size_t count);
+#define strnicmp xcestrnicmp
+
+XCE_EXPORT int xceumask(int mask);
+#define umask xceumask
+
+XCE_EXPORT int xceisatty(int fd);
+#define isatty xceisatty
+
+XCE_EXPORT int xcechsize(int fd, unsigned long size);
+#define chsize xcechsize
+
+XCE_EXPORT char *xcegetlogin();
+#define getlogin xcegetlogin
+
+XCE_EXPORT DWORD XCEAPI XCEGetModuleFileNameA(HMODULE hModule, LPTSTR lpName, DWORD nSize);
+XCE_EXPORT HMODULE XCEAPI XCEGetModuleHandleA(const char *lpName);
+XCE_EXPORT FARPROC XCEAPI XCEGetProcAddressA(HMODULE hMod, const char *name);
+
+/* //////////////////////////////////////////////////////////////////// */
+
+#define getgid xcegetgid
+#define getegid xcegetegid
+#define geteuid xcegeteuid
+#define setgid xcesetgid
+
+#define strupr xcestrupr
+#define time xcetime
+
+XCE_EXPORT BOOL XCEFreeEnvironmentStrings(LPCSTR buf);
+#define GetEnvironmentStrings XCEGetEnvironmentStrings
+#define FreeEnvironmentStrings XCEFreeEnvironmentStrings
+
+void wce_hitreturn();
+
+END_EXTERN_C
+
+#endif
diff --git a/Master/tlpkg/tlperl/lib/Module/Build.pm b/Master/tlpkg/tlperl/lib/Module/Build.pm
new file mode 100644
index 00000000000..356fd42a14a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build.pm
@@ -0,0 +1,1128 @@
+package Module::Build;
+
+# This module doesn't do much of anything itself, it inherits from the
+# modules that do the real work. The only real thing it has to do is
+# figure out which OS-specific module to pull in. Many of the
+# OS-specific modules don't do anything either - most of the work is
+# done in Module::Build::Base.
+
+use strict;
+use File::Spec ();
+use File::Path ();
+use File::Basename ();
+
+use Module::Build::Base;
+
+use vars qw($VERSION @ISA);
+@ISA = qw(Module::Build::Base);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+# Okay, this is the brute-force method of finding out what kind of
+# platform we're on. I don't know of a systematic way. These values
+# came from the latest (bleadperl) perlport.pod.
+
+my %OSTYPES = qw(
+ aix Unix
+ bsdos Unix
+ dgux Unix
+ dragonfly Unix
+ dynixptx Unix
+ freebsd Unix
+ linux Unix
+ haiku Unix
+ hpux Unix
+ irix Unix
+ darwin Unix
+ machten Unix
+ midnightbsd Unix
+ mirbsd Unix
+ next Unix
+ openbsd Unix
+ netbsd Unix
+ dec_osf Unix
+ nto Unix
+ svr4 Unix
+ svr5 Unix
+ sco_sv Unix
+ unicos Unix
+ unicosmk Unix
+ solaris Unix
+ sunos Unix
+ cygwin Unix
+ os2 Unix
+ interix Unix
+ gnu Unix
+ gnukfreebsd Unix
+ nto Unix
+
+ dos Windows
+ MSWin32 Windows
+
+ os390 EBCDIC
+ os400 EBCDIC
+ posix-bc EBCDIC
+ vmesa EBCDIC
+
+ MacOS MacOS
+ VMS VMS
+ VOS VOS
+ riscos RiscOS
+ amigaos Amiga
+ mpeix MPEiX
+ );
+
+# Inserts the given module into the @ISA hierarchy between
+# Module::Build and its immediate parent
+sub _interpose_module {
+ my ($self, $mod) = @_;
+ eval "use $mod";
+ die $@ if $@;
+
+ no strict 'refs';
+ my $top_class = $mod;
+ while (@{"${top_class}::ISA"}) {
+ last if ${"${top_class}::ISA"}[0] eq $ISA[0];
+ $top_class = ${"${top_class}::ISA"}[0];
+ }
+
+ @{"${top_class}::ISA"} = @ISA;
+ @ISA = ($mod);
+}
+
+if (grep {-e File::Spec->catfile($_, qw(Module Build Platform), $^O) . '.pm'} @INC) {
+ __PACKAGE__->_interpose_module("Module::Build::Platform::$^O");
+
+} elsif (exists $OSTYPES{$^O}) {
+ __PACKAGE__->_interpose_module("Module::Build::Platform::$OSTYPES{$^O}");
+
+} else {
+ warn "Unknown OS type '$^O' - using default settings\n";
+}
+
+sub os_type { $OSTYPES{$^O} }
+
+sub is_vmsish { return ((os_type() || '') eq 'VMS') }
+sub is_windowsish { return ((os_type() || '') eq 'Windows') }
+sub is_unixish { return ((os_type() || '') eq 'Unix') }
+
+1;
+
+__END__
+
+=for :stopwords
+bindoc binhtml destdir distcheck distclean distdir distmeta distsign disttest
+fakeinstall html installdirs installsitebin installsitescript installvendorbin
+installvendorscript libdoc libhtml pardist ppd ppmdist realclean skipcheck
+testall testcover testdb testpod testpodcoverage versioninstall
+
+=head1 NAME
+
+Module::Build - Build and install Perl modules
+
+
+=head1 SYNOPSIS
+
+Standard process for building & installing modules:
+
+ perl Build.PL
+ ./Build
+ ./Build test
+ ./Build install
+
+Or, if you're on a platform (like DOS or Windows) that doesn't require
+the "./" notation, you can do this:
+
+ perl Build.PL
+ Build
+ Build test
+ Build install
+
+
+=head1 DESCRIPTION
+
+C<Module::Build> is a system for building, testing, and installing
+Perl modules. It is meant to be an alternative to
+C<ExtUtils::MakeMaker>. Developers may alter the behavior of the
+module through subclassing in a much more straightforward way than
+with C<MakeMaker>. It also does not require a C<make> on your system
+- most of the C<Module::Build> code is pure-perl and written in a very
+cross-platform way. In fact, you don't even need a shell, so even
+platforms like MacOS (traditional) can use it fairly easily. Its only
+prerequisites are modules that are included with perl 5.6.0, and it
+works fine on perl 5.005 if you can install a few additional modules.
+
+See L<"MOTIVATIONS"> for more comparisons between C<ExtUtils::MakeMaker>
+and C<Module::Build>.
+
+To install C<Module::Build>, and any other module that uses
+C<Module::Build> for its installation process, do the following:
+
+ perl Build.PL # 'Build.PL' script creates the 'Build' script
+ ./Build # Need ./ to ensure we're using this "Build" script
+ ./Build test # and not another one that happens to be in the PATH
+ ./Build install
+
+This illustrates initial configuration and the running of three
+'actions'. In this case the actions run are 'build' (the default
+action), 'test', and 'install'. Other actions defined so far include:
+
+<action_list>
+
+You can run the 'help' action for a complete list of actions.
+
+
+=head1 GUIDE TO DOCUMENTATION
+
+The documentation for C<Module::Build> is broken up into three sections:
+
+=over
+
+=item General Usage (L<Module::Build>)
+
+This is the document you are currently reading. It describes basic
+usage and background information. Its main purpose is to assist the
+user who wants to learn how to invoke and control C<Module::Build>
+scripts at the command line.
+
+=item Authoring Reference (L<Module::Build::Authoring>)
+
+This document describes the structure and organization of
+C<Module::Build>, and the relevant concepts needed by authors who are
+writing F<Build.PL> scripts for a distribution or controlling
+C<Module::Build> processes programmatically.
+
+=item API Reference (L<Module::Build::API>)
+
+This is a reference to the C<Module::Build> API.
+
+=item Cookbook (L<Module::Build::Cookbook>)
+
+This document demonstrates how to accomplish many common tasks. It
+covers general command line usage and authoring of F<Build.PL>
+scripts. Includes working examples.
+
+=back
+
+
+=head1 ACTIONS
+
+There are some general principles at work here. First, each task when
+building a module is called an "action". These actions are listed
+above; they correspond to the building, testing, installing,
+packaging, etc., tasks.
+
+Second, arguments are processed in a very systematic way. Arguments
+are always key=value pairs. They may be specified at C<perl Build.PL>
+time (i.e. C<perl Build.PL destdir=/my/secret/place>), in which case
+their values last for the lifetime of the C<Build> script. They may
+also be specified when executing a particular action (i.e.
+C<Build test verbose=1>), in which case their values last only for the
+lifetime of that command. Per-action command line parameters take
+precedence over parameters specified at C<perl Build.PL> time.
+
+The build process also relies heavily on the C<Config.pm> module.
+If the user wishes to override any of the
+values in C<Config.pm>, she may specify them like so:
+
+ perl Build.PL --config cc=gcc --config ld=gcc
+
+The following build actions are provided by default.
+
+=over 4
+
+=item build
+
+[version 0.01]
+
+If you run the C<Build> script without any arguments, it runs the
+C<build> action, which in turn runs the C<code> and C<docs> actions.
+
+This is analogous to the C<MakeMaker> I<make all> target.
+
+=item clean
+
+[version 0.01]
+
+This action will clean up any files that the build process may have
+created, including the C<blib/> directory (but not including the
+C<_build/> directory and the C<Build> script itself).
+
+=item code
+
+[version 0.20]
+
+This action builds your code base.
+
+By default it just creates a C<blib/> directory and copies any C<.pm>
+and C<.pod> files from your C<lib/> directory into the C<blib/>
+directory. It also compiles any C<.xs> files from C<lib/> and places
+them in C<blib/>. Of course, you need a working C compiler (probably
+the same one that built perl itself) for the compilation to work
+properly.
+
+The C<code> action also runs any C<.PL> files in your F<lib/>
+directory. Typically these create other files, named the same but
+without the C<.PL> ending. For example, a file F<lib/Foo/Bar.pm.PL>
+could create the file F<lib/Foo/Bar.pm>. The C<.PL> files are
+processed first, so any C<.pm> files (or other kinds that we deal
+with) will get copied correctly.
+
+=item config_data
+
+[version 0.26]
+
+...
+
+=item diff
+
+[version 0.14]
+
+This action will compare the files about to be installed with their
+installed counterparts. For .pm and .pod files, a diff will be shown
+(this currently requires a 'diff' program to be in your PATH). For
+other files like compiled binary files, we simply report whether they
+differ.
+
+A C<flags> parameter may be passed to the action, which will be passed
+to the 'diff' program. Consult your 'diff' documentation for the
+parameters it will accept - a good one is C<-u>:
+
+ ./Build diff flags=-u
+
+=item dist
+
+[version 0.02]
+
+This action is helpful for module authors who want to package up their
+module for source distribution through a medium like CPAN. It will create a
+tarball of the files listed in F<MANIFEST> and compress the tarball using
+GZIP compression.
+
+By default, this action will use the C<Archive::Tar> module. However, you can
+force it to use binary "tar" and "gzip" executables by supplying an explicit
+C<tar> (and optional C<gzip>) parameter:
+
+ ./Build dist --tar C:\path\to\tar.exe --gzip C:\path\to\zip.exe
+
+=item distcheck
+
+[version 0.05]
+
+Reports which files are in the build directory but not in the
+F<MANIFEST> file, and vice versa. (See L<manifest> for details.)
+
+=item distclean
+
+[version 0.05]
+
+Performs the 'realclean' action and then the 'distcheck' action.
+
+=item distdir
+
+[version 0.05]
+
+Creates a "distribution directory" named C<$dist_name-$dist_version>
+(if that directory already exists, it will be removed first), then
+copies all the files listed in the F<MANIFEST> file to that directory.
+This directory is what the distribution tarball is created from.
+
+=item distmeta
+
+[version 0.21]
+
+Creates the F<META.yml> file that describes the distribution.
+
+F<META.yml> is a file containing various bits of I<metadata> about the
+distribution. The metadata includes the distribution name, version,
+abstract, prerequisites, license, and various other data about the
+distribution. This file is created as F<META.yml> in YAML format.
+It is recommended that the C<YAML::Tiny> module be installed to create it.
+If the C<YAML::Tiny> module is not installed, an internal module supplied
+with Module::Build will be used to write the META.yml file, and this
+will most likely be fine.
+
+F<META.yml> file must also be listed in F<MANIFEST> - if it's not, a
+warning will be issued.
+
+The current version of the F<META.yml> specification can be found at
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+=item distsign
+
+[version 0.16]
+
+Uses C<Module::Signature> to create a SIGNATURE file for your
+distribution, and adds the SIGNATURE file to the distribution's
+MANIFEST.
+
+=item disttest
+
+[version 0.05]
+
+Performs the 'distdir' action, then switches into that directory and
+runs a C<perl Build.PL>, followed by the 'build' and 'test' actions in
+that directory.
+
+=item docs
+
+[version 0.20]
+
+This will generate documentation (e.g. Unix man pages and HTML
+documents) for any installable items under B<blib/> that
+contain POD. If there are no C<bindoc> or C<libdoc> installation
+targets defined (as will be the case on systems that don't support
+Unix manpages) no action is taken for manpages. If there are no
+C<binhtml> or C<libhtml> installation targets defined no action is
+taken for HTML documents.
+
+=item fakeinstall
+
+[version 0.02]
+
+This is just like the C<install> action, but it won't actually do
+anything, it will just report what it I<would> have done if you had
+actually run the C<install> action.
+
+=item help
+
+[version 0.03]
+
+This action will simply print out a message that is meant to help you
+use the build process. It will show you a list of available build
+actions too.
+
+With an optional argument specifying an action name (e.g. C<Build help
+test>), the 'help' action will show you any POD documentation it can
+find for that action.
+
+=item html
+
+[version 0.26]
+
+This will generate HTML documentation for any binary or library files
+under B<blib/> that contain POD. The HTML documentation will only be
+installed if the install paths can be determined from values in
+C<Config.pm>. You can also supply or override install paths on the
+command line by specifying C<install_path> values for the C<binhtml>
+and/or C<libhtml> installation targets.
+
+=item install
+
+[version 0.01]
+
+This action will use C<ExtUtils::Install> to install the files from
+C<blib/> into the system. See L<"INSTALL PATHS">
+for details about how Module::Build determines where to install
+things, and how to influence this process.
+
+If you want the installation process to look around in C<@INC> for
+other versions of the stuff you're installing and try to delete it,
+you can use the C<uninst> parameter, which tells C<ExtUtils::Install> to
+do so:
+
+ ./Build install uninst=1
+
+This can be a good idea, as it helps prevent multiple versions of a
+module from being present on your system, which can be a confusing
+situation indeed.
+
+=item installdeps
+
+[version 0.36]
+
+This action will use the C<cpan_client> parameter as a command to install
+missing prerequisites. You will be prompted whether to install
+optional dependencies.
+
+The C<cpan_client> option defaults to 'cpan' but can be set as an option or in
+F<.modulebuildrc>. It must be a shell command that takes a list of modules to
+install as arguments (e.g. 'cpanp -i' for CPANPLUS). If the program part is a
+relative path (e.g. 'cpan' or 'cpanp'), it will be located relative to the perl
+program that executed Build.PL.
+
+ /opt/perl/5.8.9/bin/perl Build.PL
+ ./Build installdeps --cpan_client 'cpanp -i'
+ # installs to 5.8.9
+
+=item manifest
+
+[version 0.05]
+
+This is an action intended for use by module authors, not people
+installing modules. It will bring the F<MANIFEST> up to date with the
+files currently present in the distribution. You may use a
+F<MANIFEST.SKIP> file to exclude certain files or directories from
+inclusion in the F<MANIFEST>. F<MANIFEST.SKIP> should contain a bunch
+of regular expressions, one per line. If a file in the distribution
+directory matches any of the regular expressions, it won't be included
+in the F<MANIFEST>.
+
+The following is a reasonable F<MANIFEST.SKIP> starting point, you can
+add your own stuff to it:
+
+ ^_build
+ ^Build$
+ ^blib
+ ~$
+ \.bak$
+ ^MANIFEST\.SKIP$
+ CVS
+
+See the L<distcheck> and L<skipcheck> actions if you want to find out
+what the C<manifest> action would do, without actually doing anything.
+
+=item manpages
+
+[version 0.28]
+
+This will generate man pages for any binary or library files under
+B<blib/> that contain POD. The man pages will only be installed if the
+install paths can be determined from values in C<Config.pm>. You can
+also supply or override install paths by specifying there values on
+the command line with the C<bindoc> and C<libdoc> installation
+targets.
+
+=item pardist
+
+[version 0.2806]
+
+Generates a PAR binary distribution for use with L<PAR> or L<PAR::Dist>.
+
+It requires that the PAR::Dist module (version 0.17 and up) is
+installed on your system.
+
+=item ppd
+
+[version 0.20]
+
+Build a PPD file for your distribution.
+
+This action takes an optional argument C<codebase> which is used in
+the generated PPD file to specify the (usually relative) URL of the
+distribution. By default, this value is the distribution name without
+any path information.
+
+Example:
+
+ ./Build ppd --codebase "MSWin32-x86-multi-thread/Module-Build-0.21.tar.gz"
+
+=item ppmdist
+
+[version 0.23]
+
+Generates a PPM binary distribution and a PPD description file. This
+action also invokes the C<ppd> action, so it can accept the same
+C<codebase> argument described under that action.
+
+This uses the same mechanism as the C<dist> action to tar & zip its
+output, so you can supply C<tar> and/or C<gzip> parameters to affect
+the result.
+
+=item prereq_data
+
+[version 0.32]
+
+This action prints out a Perl data structure of all prerequisites and the versions
+required. The output can be loaded again using C<eval()>. This can be useful for
+external tools that wish to query a Build script for prerequisites.
+
+=item prereq_report
+
+[version 0.28]
+
+This action prints out a list of all prerequisites, the versions required, and
+the versions actually installed. This can be useful for reviewing the
+configuration of your system prior to a build, or when compiling data to send
+for a bug report.
+
+=item pure_install
+
+[version 0.28]
+
+This action is identical to the C<install> action. In the future,
+though, when C<install> starts writing to the file
+F<$(INSTALLARCHLIB)/perllocal.pod>, C<pure_install> won't, and that
+will be the only difference between them.
+
+=item realclean
+
+[version 0.01]
+
+This action is just like the C<clean> action, but also removes the
+C<_build> directory and the C<Build> script. If you run the
+C<realclean> action, you are essentially starting over, so you will
+have to re-create the C<Build> script again.
+
+=item retest
+
+[version 0.2806]
+
+This is just like the C<test> action, but doesn't actually build the
+distribution first, and doesn't add F<blib/> to the load path, and
+therefore will test against a I<previously> installed version of the
+distribution. This can be used to verify that a certain installed
+distribution still works, or to see whether newer versions of a
+distribution still pass the old regression tests, and so on.
+
+=item skipcheck
+
+[version 0.05]
+
+Reports which files are skipped due to the entries in the
+F<MANIFEST.SKIP> file (See L<manifest> for details)
+
+=item test
+
+[version 0.01]
+
+This will use C<Test::Harness> or C<TAP::Harness> to run any regression
+tests and report their results. Tests can be defined in the standard
+places: a file called C<test.pl> in the top-level directory, or several
+files ending with C<.t> in a C<t/> directory.
+
+If you want tests to be 'verbose', i.e. show details of test execution
+rather than just summary information, pass the argument C<verbose=1>.
+
+If you want to run tests under the perl debugger, pass the argument
+C<debugger=1>.
+
+If you want to have Module::Build find test files with different file
+name extensions, pass the C<test_file_exts> argument with an array
+of extensions, such as C<[qw( .t .s .z )]>.
+
+If you want test to be run by C<TAP::Harness>, rather than C<Test::Harness>,
+pass the argument C<tap_harness_args> as an array reference of arguments to
+pass to the TAP::Harness constructor.
+
+In addition, if a file called C<visual.pl> exists in the top-level
+directory, this file will be executed as a Perl script and its output
+will be shown to the user. This is a good place to put speed tests or
+other tests that don't use the C<Test::Harness> format for output.
+
+To override the choice of tests to run, you may pass a C<test_files>
+argument whose value is a whitespace-separated list of test scripts to
+run. This is especially useful in development, when you only want to
+run a single test to see whether you've squashed a certain bug yet:
+
+ ./Build test --test_files t/something_failing.t
+
+You may also pass several C<test_files> arguments separately:
+
+ ./Build test --test_files t/one.t --test_files t/two.t
+
+or use a C<glob()>-style pattern:
+
+ ./Build test --test_files 't/01-*.t'
+
+=item testall
+
+[version 0.2807]
+
+[Note: the 'testall' action and the code snippets below are currently
+in alpha stage, see
+L<"http://www.nntp.perl.org/group/perl.module.build/2007/03/msg584.html"> ]
+
+Runs the C<test> action plus each of the C<test$type> actions defined by
+the keys of the C<test_types> parameter.
+
+Currently, you need to define the ACTION_test$type method yourself and
+enumerate them in the test_types parameter.
+
+ my $mb = Module::Build->subclass(
+ code => q(
+ sub ACTION_testspecial { shift->generic_test(type => 'special'); }
+ sub ACTION_testauthor { shift->generic_test(type => 'author'); }
+ )
+ )->new(
+ ...
+ test_types => {
+ special => '.st',
+ author => ['.at', '.pt' ],
+ },
+ ...
+
+=item testcover
+
+[version 0.26]
+
+Runs the C<test> action using C<Devel::Cover>, generating a
+code-coverage report showing which parts of the code were actually
+exercised during the tests.
+
+To pass options to C<Devel::Cover>, set the C<$DEVEL_COVER_OPTIONS>
+environment variable:
+
+ DEVEL_COVER_OPTIONS=-ignore,Build ./Build testcover
+
+=item testdb
+
+[version 0.05]
+
+This is a synonym for the 'test' action with the C<debugger=1>
+argument.
+
+=item testpod
+
+[version 0.25]
+
+This checks all the files described in the C<docs> action and
+produces C<Test::Harness>-style output. If you are a module author,
+this is useful to run before creating a new release.
+
+=item testpodcoverage
+
+[version 0.28]
+
+This checks the pod coverage of the distribution and
+produces C<Test::Harness>-style output. If you are a module author,
+this is useful to run before creating a new release.
+
+=item versioninstall
+
+[version 0.16]
+
+** Note: since C<only.pm> is so new, and since we just recently added
+support for it here too, this feature is to be considered
+experimental. **
+
+If you have the C<only.pm> module installed on your system, you can
+use this action to install a module into the version-specific library
+trees. This means that you can have several versions of the same
+module installed and C<use> a specific one like this:
+
+ use only MyModule => 0.55;
+
+To override the default installation libraries in C<only::config>,
+specify the C<versionlib> parameter when you run the C<Build.PL> script:
+
+ perl Build.PL --versionlib /my/version/place/
+
+To override which version the module is installed as, specify the
+C<versionlib> parameter when you run the C<Build.PL> script:
+
+ perl Build.PL --version 0.50
+
+See the C<only.pm> documentation for more information on
+version-specific installs.
+
+=back
+
+
+=head1 OPTIONS
+
+=head2 Command Line Options
+
+The following options can be used during any invocation of C<Build.PL>
+or the Build script, during any action. For information on other
+options specific to an action, see the documentation for the
+respective action.
+
+NOTE: There is some preliminary support for options to use the more
+familiar long option style. Most options can be preceded with the
+C<--> long option prefix, and the underscores changed to dashes
+(e.g. C<--use-rcfile>). Additionally, the argument to boolean options is
+optional, and boolean options can be negated by prefixing them with
+C<no> or C<no-> (e.g. C<--noverbose> or C<--no-verbose>).
+
+=over 4
+
+=item quiet
+
+Suppress informative messages on output.
+
+=item verbose
+
+Display extra information about the Build on output.
+
+=item cpan_client
+
+Sets the C<cpan_client> command for use with the C<installdeps> action.
+See C<installdeps> for more details.
+
+=item use_rcfile
+
+Load the F<~/.modulebuildrc> option file. This option can be set to
+false to prevent the custom resource file from being loaded.
+
+=item allow_mb_mismatch
+
+Suppresses the check upon startup that the version of Module::Build
+we're now running under is the same version that was initially invoked
+when building the distribution (i.e. when the C<Build.PL> script was
+first run). As of 0.3601, a mismatch results in a warning instead of
+a fatal error, so this option effectively just suppresses the warning.
+
+=item debug
+
+Prints Module::Build debugging information to STDOUT, such as a trace of
+executed build actions.
+
+=back
+
+=head2 Default Options File (F<.modulebuildrc>)
+
+[version 0.28]
+
+When Module::Build starts up, it will look first for a file,
+F<$ENV{HOME}/.modulebuildrc>. If it's not found there, it will look
+in the the F<.modulebuildrc> file in the directories referred to by
+the environment variables C<HOMEDRIVE> + C<HOMEDIR>, C<USERPROFILE>,
+C<APPDATA>, C<WINDIR>, C<SYS$LOGIN>. If the file exists, the options
+specified there will be used as defaults, as if they were typed on the
+command line. The defaults can be overridden by specifying new values
+on the command line.
+
+The action name must come at the beginning of the line, followed by any
+amount of whitespace and then the options. Options are given the same
+as they would be on the command line. They can be separated by any
+amount of whitespace, including newlines, as long there is whitespace at
+the beginning of each continued line. Anything following a hash mark (C<#>)
+is considered a comment, and is stripped before parsing. If more than
+one line begins with the same action name, those lines are merged into
+one set of options.
+
+Besides the regular actions, there are two special pseudo-actions: the
+key C<*> (asterisk) denotes any global options that should be applied
+to all actions, and the key 'Build_PL' specifies options to be applied
+when you invoke C<perl Build.PL>.
+
+ * verbose=1 # global options
+ diff flags=-u
+ install --install_base /home/ken
+ --install_path html=/home/ken/docs/html
+ installdeps --cpan_client 'cpanp -i'
+
+If you wish to locate your resource file in a different location, you
+can set the environment variable C<MODULEBUILDRC> to the complete
+absolute path of the file containing your options.
+
+=head2 Environment variables
+
+=over
+
+=item MODULEBUILDRC
+
+[version 0.28]
+
+Specifies an alternate location for a default options file as described above.
+
+=item PERL_MB_OPT
+
+[version 0.36]
+
+Command line options that are applied to Build.PL or any Build action. The
+string is split as the shell would (e.g. whitespace) and the result is
+prepended to any actual command-line arguments.
+
+=back
+
+=head1 INSTALL PATHS
+
+[version 0.19]
+
+When you invoke Module::Build's C<build> action, it needs to figure
+out where to install things. The nutshell version of how this works
+is that default installation locations are determined from
+F<Config.pm>, and they may be overridden by using the C<install_path>
+parameter. An C<install_base> parameter lets you specify an
+alternative installation root like F</home/foo>, and a C<destdir> lets
+you specify a temporary installation directory like F</tmp/install> in
+case you want to create bundled-up installable packages.
+
+Natively, Module::Build provides default installation locations for
+the following types of installable items:
+
+=over 4
+
+=item lib
+
+Usually pure-Perl module files ending in F<.pm>.
+
+=item arch
+
+"Architecture-dependent" module files, usually produced by compiling
+XS, L<Inline>, or similar code.
+
+=item script
+
+Programs written in pure Perl. In order to improve reuse, try to make
+these as small as possible - put the code into modules whenever
+possible.
+
+=item bin
+
+"Architecture-dependent" executable programs, i.e. compiled C code or
+something. Pretty rare to see this in a perl distribution, but it
+happens.
+
+=item bindoc
+
+Documentation for the stuff in C<script> and C<bin>. Usually
+generated from the POD in those files. Under Unix, these are manual
+pages belonging to the 'man1' category.
+
+=item libdoc
+
+Documentation for the stuff in C<lib> and C<arch>. This is usually
+generated from the POD in F<.pm> files. Under Unix, these are manual
+pages belonging to the 'man3' category.
+
+=item binhtml
+
+This is the same as C<bindoc> above, but applies to HTML documents.
+
+=item libhtml
+
+This is the same as C<bindoc> above, but applies to HTML documents.
+
+=back
+
+Four other parameters let you control various aspects of how
+installation paths are determined:
+
+=over 4
+
+=item installdirs
+
+The default destinations for these installable things come from
+entries in your system's C<Config.pm>. You can select from three
+different sets of default locations by setting the C<installdirs>
+parameter as follows:
+
+ 'installdirs' set to:
+ core site vendor
+
+ uses the following defaults from Config.pm:
+
+ lib => installprivlib installsitelib installvendorlib
+ arch => installarchlib installsitearch installvendorarch
+ script => installscript installsitebin installvendorbin
+ bin => installbin installsitebin installvendorbin
+ bindoc => installman1dir installsiteman1dir installvendorman1dir
+ libdoc => installman3dir installsiteman3dir installvendorman3dir
+ binhtml => installhtml1dir installsitehtml1dir installvendorhtml1dir [*]
+ libhtml => installhtml3dir installsitehtml3dir installvendorhtml3dir [*]
+
+ * Under some OS (eg. MSWin32) the destination for HTML documents is
+ determined by the C<Config.pm> entry C<installhtmldir>.
+
+The default value of C<installdirs> is "site". If you're creating
+vendor distributions of module packages, you may want to do something
+like this:
+
+ perl Build.PL --installdirs vendor
+
+or
+
+ ./Build install --installdirs vendor
+
+If you're installing an updated version of a module that was included
+with perl itself (i.e. a "core module"), then you may set
+C<installdirs> to "core" to overwrite the module in its present
+location.
+
+(Note that the 'script' line is different from C<MakeMaker> -
+unfortunately there's no such thing as "installsitescript" or
+"installvendorscript" entry in C<Config.pm>, so we use the
+"installsitebin" and "installvendorbin" entries to at least get the
+general location right. In the future, if C<Config.pm> adds some more
+appropriate entries, we'll start using those.)
+
+=item install_path
+
+Once the defaults have been set, you can override them.
+
+On the command line, that would look like this:
+
+ perl Build.PL --install_path lib=/foo/lib --install_path arch=/foo/lib/arch
+
+or this:
+
+ ./Build install --install_path lib=/foo/lib --install_path arch=/foo/lib/arch
+
+=item install_base
+
+You can also set the whole bunch of installation paths by supplying the
+C<install_base> parameter to point to a directory on your system. For
+instance, if you set C<install_base> to "/home/ken" on a Linux
+system, you'll install as follows:
+
+ lib => /home/ken/lib/perl5
+ arch => /home/ken/lib/perl5/i386-linux
+ script => /home/ken/bin
+ bin => /home/ken/bin
+ bindoc => /home/ken/man/man1
+ libdoc => /home/ken/man/man3
+ binhtml => /home/ken/html
+ libhtml => /home/ken/html
+
+Note that this is I<different> from how C<MakeMaker>'s C<PREFIX>
+parameter works. C<install_base> just gives you a default layout under the
+directory you specify, which may have little to do with the
+C<installdirs=site> layout.
+
+The exact layout under the directory you specify may vary by system -
+we try to do the "sensible" thing on each platform.
+
+=item destdir
+
+If you want to install everything into a temporary directory first
+(for instance, if you want to create a directory tree that a package
+manager like C<rpm> or C<dpkg> could create a package from), you can
+use the C<destdir> parameter:
+
+ perl Build.PL --destdir /tmp/foo
+
+or
+
+ ./Build install --destdir /tmp/foo
+
+This will effectively install to "/tmp/foo/$sitelib",
+"/tmp/foo/$sitearch", and the like, except that it will use
+C<File::Spec> to make the pathnames work correctly on whatever
+platform you're installing on.
+
+=item prefix
+
+Provided for compatibility with C<ExtUtils::MakeMaker>'s PREFIX argument.
+C<prefix> should be used when you wish Module::Build to install your
+modules, documentation and scripts in the same place
+C<ExtUtils::MakeMaker> does.
+
+The following are equivalent.
+
+ perl Build.PL --prefix /tmp/foo
+ perl Makefile.PL PREFIX=/tmp/foo
+
+Because of the very complex nature of the prefixification logic, the
+behavior of PREFIX in C<MakeMaker> has changed subtly over time.
+Module::Build's --prefix logic is equivalent to the PREFIX logic found
+in C<ExtUtils::MakeMaker> 6.30.
+
+If you do not need to retain compatibility with C<ExtUtils::MakeMaker> or
+are starting a fresh Perl installation we recommend you use
+C<install_base> instead (and C<INSTALL_BASE> in C<ExtUtils::MakeMaker>).
+See L<Module::Build::Cookbook/Instaling in the same location as
+ExtUtils::MakeMaker> for further information.
+
+
+=back
+
+
+=head1 MOTIVATIONS
+
+There are several reasons I wanted to start over, and not just fix
+what I didn't like about C<MakeMaker>:
+
+=over 4
+
+=item *
+
+I don't like the core idea of C<MakeMaker>, namely that C<make> should be
+involved in the build process. Here are my reasons:
+
+=over 4
+
+=item +
+
+When a person is installing a Perl module, what can you assume about
+their environment? Can you assume they have C<make>? No, but you can
+assume they have some version of Perl.
+
+=item +
+
+When a person is writing a Perl module for intended distribution, can
+you assume that they know how to build a Makefile, so they can
+customize their build process? No, but you can assume they know Perl,
+and could customize that way.
+
+=back
+
+For years, these things have been a barrier to people getting the
+build/install process to do what they want.
+
+=item *
+
+There are several architectural decisions in C<MakeMaker> that make it
+very difficult to customize its behavior. For instance, when using
+C<MakeMaker> you do C<use ExtUtils::MakeMaker>, but the object created in
+C<WriteMakefile()> is actually blessed into a package name that's
+created on the fly, so you can't simply subclass
+C<ExtUtils::MakeMaker>. There is a workaround C<MY> package that lets
+you override certain C<MakeMaker> methods, but only certain explicitly
+preselected (by C<MakeMaker>) methods can be overridden. Also, the method
+of customization is very crude: you have to modify a string containing
+the Makefile text for the particular target. Since these strings
+aren't documented, and I<can't> be documented (they take on different
+values depending on the platform, version of perl, version of
+C<MakeMaker>, etc.), you have no guarantee that your modifications will
+work on someone else's machine or after an upgrade of C<MakeMaker> or
+perl.
+
+=item *
+
+It is risky to make major changes to C<MakeMaker>, since it does so many
+things, is so important, and generally works. C<Module::Build> is an
+entirely separate package so that I can work on it all I want, without
+worrying about backward compatibility.
+
+=item *
+
+Finally, Perl is said to be a language for system administration.
+Could it really be the case that Perl isn't up to the task of building
+and installing software? Even if that software is a bunch of stupid
+little C<.pm> files that just need to be copied from one place to
+another? My sense was that we could design a system to accomplish
+this in a flexible, extensible, and friendly manner. Or die trying.
+
+=back
+
+
+=head1 TO DO
+
+The current method of relying on time stamps to determine whether a
+derived file is out of date isn't likely to scale well, since it
+requires tracing all dependencies backward, it runs into problems on
+NFS, and it's just generally flimsy. It would be better to use an MD5
+signature or the like, if available. See C<cons> for an example.
+
+ - append to perllocal.pod
+ - add a 'plugin' functionality
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+Development questions, bug reports, and patches should be sent to the
+Module-Build mailing list at <module-build@perl.org>.
+
+Bug reports are also welcome at
+<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build>.
+
+The latest development version is available from the Subversion
+repository at <https://svn.perl.org/modules/Module-Build/trunk/>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build::Cookbook>, L<Module::Build::Authoring>,
+L<Module::Build::API>, L<ExtUtils::MakeMaker>, L<YAML::Tiny>
+
+F<META.yml> Specification:
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+L<http://www.dsmit.com/cons/>
+
+L<http://search.cpan.org/dist/PerlBuildSystem/>
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/API.pod b/Master/tlpkg/tlperl/lib/Module/Build/API.pod
new file mode 100644
index 00000000000..146d28ec2b9
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/API.pod
@@ -0,0 +1,1885 @@
+=head1 NAME
+
+Module::Build::API - API Reference for Module Authors
+
+=for :stopwords apache bsd distdir distsign gpl installdirs lgpl mit mozilla packlists
+
+=head1 DESCRIPTION
+
+I list here some of the most important methods in C<Module::Build>.
+Normally you won't need to deal with these methods unless you want to
+subclass C<Module::Build>. But since one of the reasons I created
+this module in the first place was so that subclassing is possible
+(and easy), I will certainly write more docs as the interface
+stabilizes.
+
+
+=head2 CONSTRUCTORS
+
+=over 4
+
+=item current()
+
+[version 0.20]
+
+This method returns a reasonable facsimile of the currently-executing
+C<Module::Build> object representing the current build. You can use
+this object to query its L</notes()> method, inquire about installed
+modules, and so on. This is a great way to share information between
+different parts of your build process. For instance, you can ask
+the user a question during C<perl Build.PL>, then use their answer
+during a regression test:
+
+ # In Build.PL:
+ my $color = $build->prompt("What is your favorite color?");
+ $build->notes(color => $color);
+
+ # In t/colortest.t:
+ use Module::Build;
+ my $build = Module::Build->current;
+ my $color = $build->notes('color');
+ ...
+
+The way the C<current()> method is currently implemented, there may be
+slight differences between the C<$build> object in Build.PL and the
+one in C<t/colortest.t>. It is our goal to minimize these differences
+in future releases of Module::Build, so please report any anomalies
+you find.
+
+One important caveat: in its current implementation, C<current()> will
+B<NOT> work correctly if you have changed out of the directory that
+C<Module::Build> was invoked from.
+
+=item new()
+
+[version 0.03]
+
+Creates a new Module::Build object. Arguments to the new() method are
+listed below. Most arguments are optional, but you must provide
+either the L</module_name> argument, or L</dist_name> and one of
+L</dist_version> or L</dist_version_from>. In other words, you must
+provide enough information to determine both a distribution name and
+version.
+
+
+=over 4
+
+=item add_to_cleanup
+
+[version 0.19]
+
+An array reference of files to be cleaned up when the C<clean> action
+is performed. See also the L<add_to_cleanup()|/"add_to_cleanup(@files)">
+method.
+
+=item auto_configure_requires
+
+[version 0.34]
+
+This parameter determines whether Module::Build will add itself
+automatically to configure_requires (and build_requires) if Module::Build
+is not already there. The required version will be the last 'major' release,
+as defined by the decimal version truncated to two decimal places (e.g. 0.34,
+instead of 0.3402). The default value is true.
+
+=item auto_features
+
+[version 0.26]
+
+This parameter supports the setting of features (see
+L</feature($name)>) automatically based on a set of prerequisites. For
+instance, for a module that could optionally use either MySQL or
+PostgreSQL databases, you might use C<auto_features> like this:
+
+ my $build = Module::Build->new
+ (
+ ...other stuff here...
+ auto_features => {
+ pg_support => {
+ description => "Interface with Postgres databases",
+ requires => { 'DBD::Pg' => 23.3,
+ 'DateTime::Format::Pg' => 0 },
+ },
+ mysql_support => {
+ description => "Interface with MySQL databases",
+ requires => { 'DBD::mysql' => 17.9,
+ 'DateTime::Format::MySQL' => 0 },
+ },
+ }
+ );
+
+For each feature named, the required prerequisites will be checked, and
+if there are no failures, the feature will be enabled (set to C<1>).
+Otherwise the failures will be displayed to the user and the feature
+will be disabled (set to C<0>).
+
+See the documentation for L</requires> for the details of how
+requirements can be specified.
+
+=item autosplit
+
+[version 0.04]
+
+An optional C<autosplit> argument specifies a file which should be run
+through the L<AutoSplit::autosplit()|AutoSplit/autosplit> function.
+If multiple files should be split, the argument may be given as an
+array of the files to split.
+
+In general I don't consider autosplitting a great idea, because it's
+not always clear that autosplitting achieves its intended performance
+benefits. It may even harm performance in environments like mod_perl,
+where as much as possible of a module's code should be loaded during
+startup.
+
+=item build_class
+
+[version 0.28]
+
+The Module::Build class or subclass to use in the build script.
+Defaults to "Module::Build" or the class name passed to or created by
+a call to L</subclass()>. This property is useful if you're
+writing a custom Module::Build subclass and have a bootstrapping
+problem--that is, your subclass requires modules that may not be
+installed when C<perl Build.PL> is executed, but you've listed in
+L</build_requires> so that they should be available when C<./Build> is
+executed.
+
+=item build_requires
+
+[version 0.07]
+
+Modules listed in this section are necessary to build and install the
+given module, but are not necessary for regular usage of it. This is
+actually an important distinction - it allows for tighter control over
+the body of installed modules, and facilitates correct dependency
+checking on binary/packaged distributions of the module.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item create_packlist
+
+[version 0.28]
+
+If true, this parameter tells Module::Build to create a F<.packlist>
+file during the C<install> action, just like C<ExtUtils::MakeMaker> does.
+The file is created in a subdirectory of the C<arch> installation
+location. It is used by some other tools (CPAN, CPANPLUS, etc.) for
+determining what files are part of an install.
+
+The default value is true. This parameter was introduced in
+Module::Build version 0.2609; previously no packlists were ever
+created by Module::Build.
+
+=item c_source
+
+[version 0.04]
+
+An optional C<c_source> argument specifies a directory which contains
+C source files that the rest of the build may depend on. Any C<.c>
+files in the directory will be compiled to object files. The
+directory will be added to the search path during the compilation and
+linking phases of any C or XS files.
+
+=item conflicts
+
+[version 0.07]
+
+Modules listed in this section conflict in some serious way with the
+given module. C<Module::Build> (or some higher-level tool) will
+refuse to install the given module if the given module/version is also
+installed.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item create_license
+
+[version 0.31]
+
+This parameter tells Module::Build to automatically create a
+F<LICENSE> file at the top level of your distribution, containing the
+full text of the author's chosen license. This requires
+C<Software::License> on the author's machine, and further requires
+that the C<license> parameter specifies a license that it knows about.
+
+=item create_makefile_pl
+
+[version 0.19]
+
+This parameter lets you use C<Module::Build::Compat> during the
+C<distdir> (or C<dist>) action to automatically create a Makefile.PL
+for compatibility with C<ExtUtils::MakeMaker>. The parameter's value
+should be one of the styles named in the L<Module::Build::Compat>
+documentation.
+
+=item create_readme
+
+[version 0.22]
+
+This parameter tells Module::Build to automatically create a F<README>
+file at the top level of your distribution. Currently it will simply
+use C<Pod::Text> (or C<Pod::Readme> if it's installed) on the file
+indicated by C<dist_version_from> and put the result in the F<README>
+file. This is by no means the only recommended style for writing a
+F<README>, but it seems to be one common one used on the CPAN.
+
+If you generate a F<README> in this way, it's probably a good idea to
+create a separate F<INSTALL> file if that information isn't in the
+generated F<README>.
+
+=item dist_abstract
+
+[version 0.20]
+
+This should be a short description of the distribution. This is used when
+generating metadata for F<META.yml> and PPD files. If it is not given
+then C<Module::Build> looks in the POD of the module from which it gets
+the distribution's version. If it finds a POD section marked "=head1
+NAME", then it looks for the first line matching C<\s+-\s+(.+)>,
+and uses the captured text as the abstract.
+
+=item dist_author
+
+[version 0.20]
+
+This should be something like "John Doe <jdoe@example.com>", or if
+there are multiple authors, an anonymous array of strings may be
+specified. This is used when generating metadata for F<META.yml> and
+PPD files. If this is not specified, then C<Module::Build> looks at
+the module from which it gets the distribution's version. If it finds
+a POD section marked "=head1 AUTHOR", then it uses the contents of
+this section.
+
+=item dist_name
+
+[version 0.11]
+
+Specifies the name for this distribution. Most authors won't need to
+set this directly, they can use C<module_name> to set C<dist_name> to
+a reasonable default. However, some agglomerative distributions like
+C<libwww-perl> or C<bioperl> have names that don't correspond directly
+to a module name, so C<dist_name> can be set independently.
+
+=item dist_version
+
+[version 0.11]
+
+Specifies a version number for the distribution. See L</module_name>
+or L</dist_version_from> for ways to have this set automatically from a
+C<$VERSION> variable in a module. One way or another, a version
+number needs to be set.
+
+=item dist_version_from
+
+[version 0.11]
+
+Specifies a file to look for the distribution version in. Most
+authors won't need to set this directly, they can use L</module_name>
+to set it to a reasonable default.
+
+The version is extracted from the specified file according to the same
+rules as L<ExtUtils::MakeMaker> and C<CPAN.pm>. It involves finding
+the first line that matches the regular expression
+
+ /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/
+
+eval()-ing that line, then checking the value of the C<$VERSION>
+variable. Quite ugly, really, but all the modules on CPAN depend on
+this process, so there's no real opportunity to change to something
+better.
+
+If the target file of L</dist_version_from> contains more than one package
+declaration, the version returned will be the one matching the configured
+L</module_name>.
+
+=item dynamic_config
+
+[version 0.07]
+
+A boolean flag indicating whether the F<Build.PL> file must be
+executed, or whether this module can be built, tested and installed
+solely from consulting its metadata file. The main reason to set this
+to a true value is that your module performs some dynamic
+configuration as part of its build/install process. If the flag is
+omitted, the F<META.yml> spec says that installation tools should
+treat it as 1 (true), because this is a safer way to behave.
+
+Currently C<Module::Build> doesn't actually do anything with this flag
+- it's up to higher-level tools like C<CPAN.pm> to do something useful
+with it. It can potentially bring lots of security, packaging, and
+convenience improvements.
+
+=item extra_compiler_flags
+
+=item extra_linker_flags
+
+[version 0.19]
+
+These parameters can contain array references (or strings, in which
+case they will be split into arrays) to pass through to the compiler
+and linker phases when compiling/linking C code. For example, to tell
+the compiler that your code is C++, you might do:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ extra_compiler_flags => ['-x', 'c++'],
+ );
+
+To link your XS code against glib you might write something like:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ dynamic_config => 1,
+ extra_compiler_flags => scalar `glib-config --cflags`,
+ extra_linker_flags => scalar `glib-config --libs`,
+ );
+
+=item get_options
+
+[version 0.26]
+
+You can pass arbitrary command line options to F<Build.PL> or
+F<Build>, and they will be stored in the Module::Build object and can
+be accessed via the L</args()> method. However, sometimes you want
+more flexibility out of your argument processing than this allows. In
+such cases, use the C<get_options> parameter to pass in a hash
+reference of argument specifications, and the list of arguments to
+F<Build.PL> or F<Build> will be processed according to those
+specifications before they're passed on to C<Module::Build>'s own
+argument processing.
+
+The supported option specification hash keys are:
+
+
+=over 4
+
+=item type
+
+The type of option. The types are those supported by Getopt::Long; consult
+its documentation for a complete list. Typical types are C<=s> for strings,
+C<+> for additive options, and C<!> for negatable options. If the
+type is not specified, it will be considered a boolean, i.e. no
+argument is taken and a value of 1 will be assigned when the option is
+encountered.
+
+=item store
+
+A reference to a scalar in which to store the value passed to the option.
+If not specified, the value will be stored under the option name in the
+hash returned by the C<args()> method.
+
+=item default
+
+A default value for the option. If no default value is specified and no option
+is passed, then the option key will not exist in the hash returned by
+C<args()>.
+
+=back
+
+
+You can combine references to your own variables or subroutines with
+unreferenced specifications, for which the result will also be stored in the
+hash returned by C<args()>. For example:
+
+ my $loud = 0;
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ get_options => {
+ Loud => { store => \$loud },
+ Dbd => { type => '=s' },
+ Quantity => { type => '+' },
+ }
+ );
+
+ print STDERR "HEY, ARE YOU LISTENING??\n" if $loud;
+ print "We'll use the ", $build->args('Dbd'), " DBI driver\n";
+ print "Are you sure you want that many?\n"
+ if $build->args('Quantity') > 2;
+
+The arguments for such a specification can be called like so:
+
+ perl Build.PL --Loud --Dbd=DBD::pg --Quantity --Quantity --Quantity
+
+B<WARNING:> Any option specifications that conflict with Module::Build's own
+options (defined by its properties) will throw an exception. Use capitalized
+option names to avoid unintended conflicts with future Module::Build options.
+
+Consult the Getopt::Long documentation for details on its usage.
+
+=item include_dirs
+
+[version 0.24]
+
+Specifies any additional directories in which to search for C header
+files. May be given as a string indicating a single directory, or as
+a list reference indicating multiple directories.
+
+=item install_path
+
+[version 0.19]
+
+You can set paths for individual installable elements by using the
+C<install_path> parameter:
+
+ my $build = Module::Build->new
+ (
+ ...other stuff here...
+ install_path => {
+ lib => '/foo/lib',
+ arch => '/foo/lib/arch',
+ }
+ );
+
+=item installdirs
+
+[version 0.19]
+
+Determines where files are installed within the normal perl hierarchy
+as determined by F<Config.pm>. Valid values are: C<core>, C<site>,
+C<vendor>. The default is C<site>. See
+L<Module::Build/"INSTALL PATHS">
+
+=item license
+
+[version 0.07]
+
+Specifies the licensing terms of your distribution. Valid options include:
+
+
+=over 4
+
+=item apache
+
+The distribution is licensed under the Apache License, Version 2.0
+(L<http://apache.org/licenses/LICENSE-2.0>).
+
+=item apache_1_1
+
+The distribution is licensed under the Apache Software License, Version 1.1
+(L<http://apache.org/licenses/LICENSE-1.1>).
+
+=item artistic
+
+The distribution is licensed under the Artistic License, as specified
+by the F<Artistic> file in the standard Perl distribution.
+
+=item artistic_2
+
+The distribution is licensed under the Artistic 2.0 License
+(L<http://opensource.org/licenses/artistic-license-2.0.php>.)
+
+=item bsd
+
+The distribution is licensed under the BSD License
+(L<http://www.opensource.org/licenses/bsd-license.php>).
+
+=item gpl
+
+The distribution is licensed under the terms of the GNU General
+Public License (L<http://www.opensource.org/licenses/gpl-license.php>).
+
+=item lgpl
+
+The distribution is licensed under the terms of the GNU Lesser
+General Public License
+(L<http://www.opensource.org/licenses/lgpl-license.php>).
+
+=item mit
+
+The distribution is licensed under the MIT License
+(L<http://opensource.org/licenses/mit-license.php>).
+
+=item mozilla
+
+The distribution is licensed under the Mozilla Public
+License. (L<http://opensource.org/licenses/mozilla1.0.php> or
+L<http://opensource.org/licenses/mozilla1.1.php>)
+
+=item open_source
+
+The distribution is licensed under some other Open Source
+Initiative-approved license listed at
+L<http://www.opensource.org/licenses/>.
+
+=item perl
+
+The distribution may be copied and redistributed under the same terms
+as Perl itself (this is by far the most common licensing option for
+modules on CPAN). This is a dual license, in which the user may
+choose between either the GPL or the Artistic license.
+
+=item restrictive
+
+The distribution may not be redistributed without special permission
+from the author and/or copyright holder.
+
+=item unrestricted
+
+The distribution is licensed under a license that is B<not> approved
+by www.opensource.org but that allows distribution without
+restrictions.
+
+=back
+
+
+Note that you must still include the terms of your license in your
+documentation - this field only lets automated tools figure out your
+licensing restrictions. Humans still need something to read. If you
+choose to provide this field, you should make sure that you keep it in
+sync with your written documentation if you ever change your licensing
+terms.
+
+You may also use a license type of C<unknown> if you don't wish to
+specify your terms in the metadata.
+
+It is a fatal error to use a license other than the ones mentioned
+above. This is not because I wish to impose licensing terms on you -
+please let me know if you would like another license option to be
+added to the list. I just started out with a small set of licenses to
+keep things simple, figuring I'd let people with actual working
+knowledge in this area tell me what to do. So if that's you, drop me
+a line.
+
+=item meta_add
+
+[version 0.28]
+
+A hash of key/value pairs that should be added to the F<META.yml> file
+during the C<distmeta> action. Any existing entries with the same
+names will be overridden.
+
+See the L</"MODULE METADATA"> section for details.
+
+=item meta_merge
+
+[version 0.28]
+
+A hash of key/value pairs that should be merged into the F<META.yml>
+file during the C<distmeta> action. Any existing entries with the
+same names will be overridden.
+
+The only difference between C<meta_add> and C<meta_merge> is their
+behavior on hash-valued and array-valued entries: C<meta_add> will
+completely blow away the existing hash or array value, but
+C<meta_merge> will merge the supplied data into the existing hash or
+array value.
+
+See the L</"MODULE METADATA"> section for details.
+
+=item module_name
+
+[version 0.03]
+
+The C<module_name> is a shortcut for setting default values of
+C<dist_name> and C<dist_version_from>, reflecting the fact that the
+majority of CPAN distributions are centered around one "main" module.
+For instance, if you set C<module_name> to C<Foo::Bar>, then
+C<dist_name> will default to C<Foo-Bar> and C<dist_version_from> will
+default to C<lib/Foo/Bar.pm>. C<dist_version_from> will in turn be
+used to set C<dist_version>.
+
+Setting C<module_name> won't override a C<dist_*> parameter you
+specify explicitly.
+
+=item needs_compiler
+
+[version 0.36]
+
+The C<needs_compiler> parameter indicates whether a compiler is required to
+build the distsribution. The default is false, unless XS files are found or
+the C<c_source> parameter is set, in which case it is true. If true,
+L<ExtUtils::CBuilder> is automatically added to C<build_requires> if needed.
+
+For a distribution where a compiler is I<optional>, e.g. a dual XS/pure-Perl
+distribution, C<needs_compiler> should explicitly be set to a false value.
+
+=item PL_files
+
+[version 0.06]
+
+An optional parameter specifying a set of C<.PL> files in your
+distribution. These will be run as Perl scripts prior to processing
+the rest of the files in your distribution with the name of the file
+they're generating as an argument. They are usually used as templates
+for creating other files dynamically, so that a file like
+C<lib/Foo/Bar.pm.PL> might create the file C<lib/Foo/Bar.pm>.
+
+The files are specified with the C<.PL> files as hash keys, and the
+file(s) they generate as hash values, like so:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ ...
+ PL_files => { 'lib/Foo/Bar.pm.PL' => 'lib/Foo/Bar.pm' },
+ );
+
+Note that the path specifications are I<always> given in Unix-like
+format, not in the style of the local system.
+
+If your C<.PL> scripts don't create any files, or if they create files
+with unexpected names, or even if they create multiple files, you can
+indicate that so that Module::Build can properly handle these created
+files:
+
+ PL_files => {
+ 'lib/Foo/Bar.pm.PL' => 'lib/Foo/Bar.pm',
+ 'lib/something.PL' => ['/lib/something', '/lib/else'],
+ 'lib/funny.PL' => [],
+ }
+
+Here's an example of a simple PL file.
+
+ my $output_file = shift;
+ open my $fh, ">", $output_file or die "Can't open $output_file: $!";
+
+ print $fh <<'END';
+ #!/usr/bin/perl
+
+ print "Hello, world!\n";
+ END
+
+PL files are not installed by default, so its safe to put them in
+F<lib/> and F<bin/>.
+
+
+=item pm_files
+
+[version 0.19]
+
+An optional parameter specifying the set of C<.pm> files in this
+distribution, specified as a hash reference whose keys are the files'
+locations in the distributions, and whose values are their logical
+locations based on their package name, i.e. where they would be found
+in a "normal" Module::Build-style distribution. This parameter is
+mainly intended to support alternative layouts of files.
+
+For instance, if you have an old-style C<MakeMaker> distribution for a
+module called C<Foo::Bar> and a F<Bar.pm> file at the top level of the
+distribution, you could specify your layout in your C<Build.PL> like
+this:
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ ...
+ pm_files => { 'Bar.pm' => 'lib/Foo/Bar.pm' },
+ );
+
+Note that the values should include C<lib/>, because this is where
+they would be found in a "normal" Module::Build-style distribution.
+
+Note also that the path specifications are I<always> given in
+Unix-like format, not in the style of the local system.
+
+=item pod_files
+
+[version 0.19]
+
+Just like C<pm_files>, but used for specifying the set of C<.pod>
+files in your distribution.
+
+=item recommends
+
+[version 0.08]
+
+This is just like the L</requires> argument, except that modules listed
+in this section aren't essential, just a good idea. We'll just print
+a friendly warning if one of these modules aren't found, but we'll
+continue running.
+
+If a module is recommended but not required, all tests should still
+pass if the module isn't installed. This may mean that some tests
+may be skipped if recommended dependencies aren't present.
+
+Automated tools like CPAN.pm should inform the user when recommended
+modules aren't installed, and it should offer to install them if it
+wants to be helpful.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item recursive_test_files
+
+[version 0.28]
+
+Normally, C<Module::Build> does not search subdirectories when looking
+for tests to run. When this options is set it will search recursively
+in all subdirectories of the standard 't' test directory.
+
+=item requires
+
+[version 0.07]
+
+An optional C<requires> argument specifies any module prerequisites
+that the current module depends on.
+
+One note: currently C<Module::Build> doesn't actually I<require> the
+user to have dependencies installed, it just strongly urges. In the
+future we may require it. There's also a L</recommends> section for
+things that aren't absolutely required.
+
+Automated tools like CPAN.pm should refuse to install a module if one
+of its dependencies isn't satisfied, unless a "force" command is given
+by the user. If the tools are helpful, they should also offer to
+install the dependencies.
+
+A synonym for C<requires> is C<prereq>, to help succour people
+transitioning from C<ExtUtils::MakeMaker>. The C<requires> term is
+preferred, but the C<prereq> term will remain valid in future
+distributions.
+
+See the documentation for L<Module::Build::Authoring/"PREREQUISITES">
+for the details of how requirements can be specified.
+
+=item script_files
+
+[version 0.18]
+
+An optional parameter specifying a set of files that should be
+installed as executable Perl scripts when the module is installed.
+May be given as an array reference of the files, as a hash reference
+whose keys are the files (and whose values will currently be ignored),
+as a string giving the name of a directory in which to find scripts,
+or as a string giving the name of a single script file.
+
+The default is to install any scripts found in a F<bin> directory at
+the top level of the distribution, minus any keys of L<PL_files>.
+
+For backward compatibility, you may use the parameter C<scripts>
+instead of C<script_files>. Please consider this usage deprecated,
+though it will continue to exist for several version releases.
+
+=item share_dir
+
+[version 0.36]
+
+An optional parameter specifying directories of static data files to
+be installed as read-only files for use with L<File::ShareDir>. The
+C<share_dir> property supports both distribution-level and
+module-level share files.
+
+The simplest use of C<share_dir> is to set it to a directory name or an
+arrayref of directory names containing files to be installed in the
+distribution-level share directory.
+
+ share_dir => 'share'
+
+Alternatively, if C<share_dir> is a hashref, it may have C<dist> or
+C<module> keys providing full flexibility in defining how share
+directories should be installed.
+
+ share_dir => {
+ dist => [ 'examples', 'more_examples' ],
+ module => {
+ Foo::Templates => ['share/html', 'share/text'],
+ Foo::Config => 'share/config',
+ }
+ }
+
+If C<share_dir> is set, then File::ShareDir will automatically be added
+to the C<requires> hash.
+
+=item sign
+
+[version 0.16]
+
+If a true value is specified for this parameter, L<Module::Signature>
+will be used (via the 'distsign' action) to create a SIGNATURE file
+for your distribution during the 'distdir' action, and to add the
+SIGNATURE file to the MANIFEST (therefore, don't add it yourself).
+
+The default value is false. In the future, the default may change to
+true if you have C<Module::Signature> installed on your system.
+
+=item test_files
+
+[version 0.23]
+
+An optional parameter specifying a set of files that should be used as
+C<Test::Harness>-style regression tests to be run during the C<test>
+action. May be given as an array reference of the files, or as a hash
+reference whose keys are the files (and whose values will currently be
+ignored). If the argument is given as a single string (not in an
+array reference), that string will be treated as a C<glob()> pattern
+specifying the files to use.
+
+The default is to look for a F<test.pl> script in the top-level
+directory of the distribution, and any files matching the glob pattern
+C<*.t> in the F<t/> subdirectory. If the C<recursive_test_files>
+property is true, then the C<t/> directory will be scanned recursively
+for C<*.t> files.
+
+=item use_tap_harness
+
+[version 0.2808_03]
+
+An optional parameter indicating whether or not to use TAP::Harness for
+testing rather than Test::Harness. Defaults to false. If set to true, you must
+therefore be sure to add TAP::Harness as a requirement for your module in
+L</build_requires>. Implicitly set to a true value if C<tap_harness_args> is
+specified.
+
+=item tap_harness_args
+
+[version 0.2808_03]
+
+An optional parameter specifying parameters to be passed to TAP::Harness when
+running tests. Must be given as a hash reference of parameters; see the
+L<TAP::Harness|TAP::Harness> documentation for details. Note that specifying
+this parameter will implicitly set C<use_tap_harness> to a true value. You
+must therefore be sure to add TAP::Harness as a requirement for your module in
+L</build_requires>.
+
+=item xs_files
+
+[version 0.19]
+
+Just like C<pm_files>, but used for specifying the set of C<.xs>
+files in your distribution.
+
+=back
+
+
+=item new_from_context(%args)
+
+[version 0.28]
+
+When called from a directory containing a F<Build.PL> script (in other words,
+the base directory of a distribution), this method will run the F<Build.PL> and
+call C<resume()> to return the resulting C<Module::Build> object to the caller.
+Any key-value arguments given to C<new_from_context()> are essentially like
+command line arguments given to the F<Build.PL> script, so for example you
+could pass C<< verbose => 1 >> to this method to turn on verbosity.
+
+=item resume()
+
+[version 0.03]
+
+You'll probably never call this method directly, it's only called from the
+auto-generated C<Build> script (and the C<new_from_context> method). The
+C<new()> method is only called once, when the user runs C<perl Build.PL>.
+Thereafter, when the user runs C<Build test> or another action, the
+C<Module::Build> object is created using the C<resume()> method to
+re-instantiate with the settings given earlier to C<new()>.
+
+=item subclass()
+
+[version 0.06]
+
+This creates a new C<Module::Build> subclass on the fly, as described
+in the L<Module::Build::Authoring/"SUBCLASSING"> section. The caller
+must provide either a C<class> or C<code> parameter, or both. The
+C<class> parameter indicates the name to use for the new subclass, and
+defaults to C<MyModuleBuilder>. The C<code> parameter specifies Perl
+code to use as the body of the subclass.
+
+=item add_property
+
+[version 0.31]
+
+ package 'My::Build';
+ use base 'Module::Build';
+ __PACKAGE__->add_property( 'pedantic' );
+ __PACKAGE__->add_property( answer => 42 );
+ __PACKAGE__->add_property(
+ 'epoch',
+ default => sub { time },
+ check => sub {
+ return 1 if /^\d+$/;
+ shift->property_error( "'$_' is not an epoch time" );
+ return 0;
+ },
+ );
+
+Adds a property to a Module::Build class. Properties are those attributes of a
+Module::Build object which can be passed to the constructor and which have
+accessors to get and set them. All of the core properties, such as
+C<module_name> and C<license>, are defined using this class method.
+
+The first argument to C<add_property()> is always the name of the property.
+The second argument can be either a default value for the property, or a list
+of key/value pairs. The supported keys are:
+
+=over
+
+=item C<default>
+
+The default value. May optionally be specified as a code reference, in which
+case the return value from the execution of the code reference will be used.
+If you need the default to be a code reference, just use a code reference to
+return it, e.g.:
+
+ default => sub { sub { ... } },
+
+=item C<check>
+
+A code reference that checks that a value specified for the property is valid.
+During the execution of the code reference, the new value will be included in
+the C<$_> variable. If the value is correct, the C<check> code reference
+should return true. If the value is not correct, it sends an error message to
+C<property_error()> and returns false.
+
+=back
+
+When this method is called, a new property will be installed in the
+Module::Build class, and an accessor will be built to allow the property to be
+get or set on the build object.
+
+ print $build->pedantic, $/;
+ $build->pedantic(0);
+
+If the default value is a hash reference, this generates a special-case
+accessor method, wherein individual key/value pairs may be set or fetched:
+
+ print "stuff{foo} is: ", $build->stuff( 'foo' ), $/;
+ $build->stuff( foo => 'bar' );
+ print $build->stuff( 'foo' ), $/; # Outputs "bar"
+
+Of course, you can still set the entire hash reference at once, as well:
+
+ $build->stuff( { foo => 'bar', baz => 'yo' } );
+
+In either case, if a C<check> has been specified for the property, it will be
+applied to the entire hash. So the check code reference should look something
+like:
+
+ check => sub {
+ return 1 if defined $_ && exists $_->{foo};
+ shift->property_error(qq{Property "stuff" needs "foo"});
+ return 0;
+ },
+
+=item property_error
+
+[version 0.31]
+
+=back
+
+
+=head2 METHODS
+
+=over 4
+
+=item add_build_element($type)
+
+[version 0.26]
+
+Adds a new type of entry to the build process. Accepts a single
+string specifying its type-name. There must also be a method defined
+to process things of that type, e.g. if you add a build element called
+C<'foo'>, then you must also define a method called
+C<process_foo_files()>.
+
+See also
+L<Module::Build::Cookbook/"Adding new file types to the build process">.
+
+=item add_to_cleanup(@files)
+
+[version 0.03]
+
+You may call C<< $self->add_to_cleanup(@patterns) >> to tell
+C<Module::Build> that certain files should be removed when the user
+performs the C<Build clean> action. The arguments to the method are
+patterns suitable for passing to Perl's C<glob()> function, specified
+in either Unix format or the current machine's native format. It's
+usually convenient to use Unix format when you hard-code the filenames
+(e.g. in F<Build.PL>) and the native format when the names are
+programmatically generated (e.g. in a testing script).
+
+I decided to provide a dynamic method of the C<$build> object, rather
+than just use a static list of files named in the F<Build.PL>, because
+these static lists can get difficult to manage. I usually prefer to
+keep the responsibility for registering temporary files close to the
+code that creates them.
+
+=item args()
+
+[version 0.26]
+
+ my $args_href = $build->args;
+ my %args = $build->args;
+ my $arg_value = $build->args($key);
+ $build->args($key, $value);
+
+This method is the preferred interface for retrieving the arguments passed via
+command line options to F<Build.PL> or F<Build>, minus the Module-Build
+specific options.
+
+When called in in a scalar context with no arguments, this method returns a
+reference to the hash storing all of the arguments; in an array context, it
+returns the hash itself. When passed a single argument, it returns the value
+stored in the args hash for that option key. When called with two arguments,
+the second argument is assigned to the args hash under the key passed as the
+first argument.
+
+=item autosplit_file($from, $to)
+
+[version 0.28]
+
+Invokes the L<AutoSplit> module on the C<$from> file, sending the
+output to the C<lib/auto> directory inside C<$to>. C<$to> is
+typically the C<blib/> directory.
+
+=item base_dir()
+
+[version 0.14]
+
+Returns a string containing the root-level directory of this build,
+i.e. where the C<Build.PL> script and the C<lib> directory can be
+found. This is usually the same as the current working directory,
+because the C<Build> script will C<chdir()> into this directory as
+soon as it begins execution.
+
+=item build_requires()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<build_requires>
+prerequisites that were passed to the C<new()> method.
+
+=item can_action( $action )
+
+Returns a reference to the method that defines C<$action>, or false
+otherwise. This is handy for actions defined (or maybe not!) in subclasses.
+
+[version 0.32_xx]
+
+=item cbuilder()
+
+[version 0.2809]
+
+Returns the internal ExtUtils::CBuilder object that can be used for
+compiling & linking C code. If no such object is available (e.g. if
+the system has no compiler installed) an exception will be thrown.
+
+=item check_installed_status($module, $version)
+
+[version 0.11]
+
+This method returns a hash reference indicating whether a version
+dependency on a certain module is satisfied. The C<$module> argument
+is given as a string like C<"Data::Dumper"> or C<"perl">, and the
+C<$version> argument can take any of the forms described in L</requires>
+above. This allows very fine-grained version checking.
+
+The returned hash reference has the following structure:
+
+ {
+ ok => $whether_the_dependency_is_satisfied,
+ have => $version_already_installed,
+ need => $version_requested, # Same as incoming $version argument
+ message => $informative_error_message,
+ }
+
+If no version of C<$module> is currently installed, the C<have> value
+will be the string C<< "<none>" >>. Otherwise the C<have> value will
+simply be the version of the installed module. Note that this means
+that if C<$module> is installed but doesn't define a version number,
+the C<have> value will be C<undef> - this is why we don't use C<undef>
+for the case when C<$module> isn't installed at all.
+
+This method may be called either as an object method
+(C<< $build->check_installed_status($module, $version) >>)
+or as a class method
+(C<< Module::Build->check_installed_status($module, $version) >>).
+
+=item check_installed_version($module, $version)
+
+[version 0.05]
+
+Like L<check_installed_status()|/"check_installed_status($module, $version)">,
+but simply returns true or false depending on whether module
+C<$module> satisfies the dependency C<$version>.
+
+If the check succeeds, the return value is the actual version of
+C<$module> installed on the system. This allows you to do the
+following:
+
+ my $installed = $build->check_installed_version('DBI', '1.15');
+ if ($installed) {
+ print "Congratulations, version $installed of DBI is installed.\n";
+ } else {
+ die "Sorry, you must install DBI.\n";
+ }
+
+If the check fails, we return false and set C<$@> to an informative
+error message.
+
+If C<$version> is any non-true value (notably zero) and any version of
+C<$module> is installed, we return true. In this case, if C<$module>
+doesn't define a version, or if its version is zero, we return the
+special value "0 but true", which is numerically zero, but logically
+true.
+
+In general you might prefer to use C<check_installed_status> if you
+need detailed information, or this method if you just need a yes/no
+answer.
+
+=item compare_versions($v1, $op, $v2)
+
+[version 0.28]
+
+Compares two module versions C<$v1> and C<$v2> using the operator
+C<$op>, which should be one of Perl's numeric operators like C<!=> or
+C<< >= >> or the like. We do at least a halfway-decent job of
+handling versions that aren't strictly numeric, like C<0.27_02>, but
+exotic stuff will likely cause problems.
+
+In the future, the guts of this method might be replaced with a call
+out to C<version.pm>.
+
+=item config($key)
+
+=item config($key, $value)
+
+=item config() [deprecated]
+
+[version 0.22]
+
+With a single argument C<$key>, returns the value associated with that
+key in the C<Config.pm> hash, including any changes the author or user
+has specified.
+
+With C<$key> and C<$value> arguments, sets the value for future
+callers of C<config($key)>.
+
+With no arguments, returns a hash reference containing all such
+key-value pairs. This usage is deprecated, though, because it's a
+resource hog and violates encapsulation.
+
+=item config_data($name)
+
+=item config_data($name => $value)
+
+[version 0.26]
+
+With a single argument, returns the value of the configuration
+variable C<$name>. With two arguments, sets the given configuration
+variable to the given value. The value may be any Perl scalar that's
+serializable with C<Data::Dumper>. For instance, if you write a
+module that can use a MySQL or PostgreSQL back-end, you might create
+configuration variables called C<mysql_connect> and
+C<postgres_connect>, and set each to an array of connection parameters
+for C<< DBI->connect() >>.
+
+Configuration values set in this way using the Module::Build object
+will be available for querying during the build/test process and after
+installation via the generated C<...::ConfigData> module, as
+C<< ...::ConfigData->config($name) >>.
+
+The L<feature()|/"feature($name)"> and C<config_data()> methods represent
+Module::Build's main support for configuration of installed modules.
+See also L<Module::Build::Authoring/"SAVING CONFIGURATION INFORMATION">.
+
+=item conflicts()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<conflicts> prerequisites
+that were passed to the C<new()> method.
+
+=item contains_pod($file) [deprecated]
+
+[version 0.20]
+
+[Deprecated] Please see L<Module::Build::ModuleInfo> instead.
+
+Returns true if the given file appears to contain POD documentation.
+Currently this checks whether the file has a line beginning with
+'=pod', '=head', or '=item', but the exact semantics may change in the
+future.
+
+=item copy_if_modified(%parameters)
+
+[version 0.19]
+
+Takes the file in the C<from> parameter and copies it to the file in
+the C<to> parameter, or the directory in the C<to_dir> parameter, if
+the file has changed since it was last copied (or if it doesn't exist
+in the new location). By default the entire directory structure of
+C<from> will be copied into C<to_dir>; an optional C<flatten>
+parameter will copy into C<to_dir> without doing so.
+
+Returns the path to the destination file, or C<undef> if nothing
+needed to be copied.
+
+Any directories that need to be created in order to perform the
+copying will be automatically created.
+
+The destination file is set to read-only. If the source file has the
+executable bit set, then the destination file will be made executable.
+
+=item create_build_script()
+
+[version 0.05]
+
+Creates an executable script called C<Build> in the current directory
+that will be used to execute further user actions. This script is
+roughly analogous (in function, not in form) to the Makefile created
+by C<ExtUtils::MakeMaker>. This method also creates some temporary
+data in a directory called C<_build/>. Both of these will be removed
+when the C<realclean> action is performed.
+
+Among the files created in C<_build/> is a F<_build/prereqs> file
+containing the set of prerequisites for this distribution, as a hash
+of hashes. This file may be C<eval()>-ed to obtain the authoritative
+set of prerequisites, which might be different from the contents of
+F<META.yml> (because F<Build.PL> might have set them dynamically).
+But fancy developers take heed: do not put any fancy custom runtime
+code in the F<_build/prereqs> file, leave it as a static declaration
+containing only strings and numbers. Similarly, do not alter the
+structure of the internal C<< $self->{properties}{requires} >> (etc.)
+data members, because that's where this data comes from.
+
+=item current_action()
+
+[version 0.28]
+
+Returns the name of the currently-running action, such as "build" or
+"test". This action is not necessarily the action that was originally
+invoked by the user. For example, if the user invoked the "test"
+action, current_action() would initially return "test". However,
+action "test" depends on action "code", so current_action() will
+return "code" while that dependency is being executed. Once that
+action has completed, current_action() will again return "test".
+
+If you need to know the name of the original action invoked by the
+user, see L</invoked_action()> below.
+
+=item depends_on(@actions)
+
+[version 0.28]
+
+Invokes the named action or list of actions in sequence. Using this
+method is preferred to calling the action explicitly because it
+performs some internal record-keeping, and it ensures that the same
+action is not invoked multiple times (note: in future versions of
+Module::Build it's conceivable that this run-only-once mechanism will
+be changed to something more intelligent).
+
+Note that the name of this method is something of a misnomer; it
+should really be called something like
+C<invoke_actions_unless_already_invoked()> or something, but for
+better or worse (perhaps better!) we were still thinking in
+C<make>-like dependency terms when we created this method.
+
+See also L<dispatch()|/"dispatch($action, %args)">. The main
+distinction between the two is that C<depends_on()> is meant to call
+an action from inside another action, whereas C<dispatch()> is meant
+to set the very top action in motion.
+
+=item dir_contains($first_dir, $second_dir)
+
+[version 0.28]
+
+Returns true if the first directory logically contains the second
+directory. This is just a convenience function because C<File::Spec>
+doesn't really provide an easy way to figure this out (but
+C<Path::Class> does...).
+
+=item dispatch($action, %args)
+
+[version 0.03]
+
+Invokes the build action C<$action>. Optionally, a list of options
+and their values can be passed in. This is equivalent to invoking an
+action at the command line, passing in a list of options.
+
+Custom options that have not been registered must be passed in as a
+hash reference in a key named "args":
+
+ $build->dispatch('foo', verbose => 1, args => { my_option => 'value' });
+
+This method is intended to be used to programmatically invoke build
+actions, e.g. by applications controlling Module::Build-based builds
+rather than by subclasses.
+
+See also L<depends_on()|/"depends_on(@actions)">. The main
+distinction between the two is that C<depends_on()> is meant to call
+an action from inside another action, whereas C<dispatch()> is meant
+to set the very top action in motion.
+
+=item dist_dir()
+
+[version 0.28]
+
+Returns the name of the directory that will be created during the
+C<dist> action. The name is derived from the C<dist_name> and
+C<dist_version> properties.
+
+=item dist_name()
+
+[version 0.21]
+
+Returns the name of the current distribution, as passed to the
+C<new()> method in a C<dist_name> or modified C<module_name>
+parameter.
+
+=item dist_version()
+
+[version 0.21]
+
+Returns the version of the current distribution, as determined by the
+C<new()> method from a C<dist_version>, C<dist_version_from>, or
+C<module_name> parameter.
+
+=item do_system($cmd, @args)
+
+[version 0.21]
+
+This is a fairly simple wrapper around Perl's C<system()> built-in
+command. Given a command and an array of optional arguments, this
+method will print the command to C<STDOUT>, and then execute it using
+Perl's C<system()>. It returns true or false to indicate success or
+failure (the opposite of how C<system()> works, but more intuitive).
+
+Note that if you supply a single argument to C<do_system()>, it
+will/may be processed by the system's shell, and any special
+characters will do their special things. If you supply multiple
+arguments, no shell will get involved and the command will be executed
+directly.
+
+=item feature($name)
+
+=item feature($name => $value)
+
+[version 0.26]
+
+With a single argument, returns true if the given feature is set.
+With two arguments, sets the given feature to the given boolean value.
+In this context, a "feature" is any optional functionality of an
+installed module. For instance, if you write a module that could
+optionally support a MySQL or PostgreSQL backend, you might create
+features called C<mysql_support> and C<postgres_support>, and set them
+to true/false depending on whether the user has the proper databases
+installed and configured.
+
+Features set in this way using the Module::Build object will be
+available for querying during the build/test process and after
+installation via the generated C<...::ConfigData> module, as
+C<< ...::ConfigData->feature($name) >>.
+
+The C<feature()> and C<config_data()> methods represent
+Module::Build's main support for configuration of installed modules.
+See also L<Module::Build::Authoring/"SAVING CONFIGURATION INFORMATION">.
+
+=item fix_shebang_line(@files)
+
+[version 0.??]
+
+Modify any "shebang" line in the specified files to use the path to the
+perl executable being used for the current build. Files are modified
+in-place. The existing shebang line must have a command that contains
+"C<perl>"; arguments to the command do not count. In particular, this
+means that the use of C<#!/usr/bin/env perl> will not be changed.
+
+For an explanation of shebang lines, see
+L<http://en.wikipedia.org/wiki/Shebang_%28Unix%29>.
+
+=item have_c_compiler()
+
+[version 0.21]
+
+Returns true if the current system seems to have a working C compiler.
+We currently determine this by attempting to compile a simple C source
+file and reporting whether the attempt was successful.
+
+=item install_base_relpaths()
+
+=item install_base_relpaths($type)
+
+=item install_base_relpaths($type => $path)
+
+[version 0.28]
+
+Set or retrieve the relative paths that are appended to
+C<install_base> for any installable element. This is useful if you
+want to set the relative install path for custom build elements.
+
+With no argument, it returns a reference to a hash containing all
+elements and their respective values. This hash should not be modified
+directly; use the multiple argument below form to change values.
+
+The single argument form returns the value associated with the
+element C<$type>.
+
+The multiple argument form allows you to set the paths for element types.
+C<$value> must be a relative path using Unix-like paths. (A series of
+directories separated by slashes, e.g. C<foo/bar>.) The return value is a
+localized path based on C<$value>.
+
+Assigning the value C<undef> to an element causes it to be removed.
+
+=item install_destination($type)
+
+[version 0.28]
+
+Returns the directory in which items of type C<$type> (e.g. C<lib>,
+C<arch>, C<bin>, or anything else returned by the L</install_types()>
+method) will be installed during the C<install> action. Any settings
+for C<install_path>, C<install_base>, and C<prefix> are taken into
+account when determining the return value.
+
+=item install_path()
+
+=item install_path($type)
+
+=item install_path($type => $path)
+
+[version 0.28]
+
+Set or retrieve paths for specific installable elements. This is
+useful when you want to examine any explicit install paths specified
+by the user on the command line, or if you want to set the install
+path for a specific installable element based on another attribute
+like C<install_base()>.
+
+With no argument, it returns a reference to a hash containing all
+elements and their respective values. This hash should not be modified
+directly; use the multiple argument below form to change values.
+
+The single argument form returns the value associated with the
+element C<$type>.
+
+The multiple argument form allows you to set the paths for element types.
+The supplied C<$path> should be an absolute path to install elements
+of C<$type>. The return value is C<$path>.
+
+Assigning the value C<undef> to an element causes it to be removed.
+
+=item install_types()
+
+[version 0.28]
+
+Returns a list of installable types that this build knows about.
+These types each correspond to the name of a directory in F<blib/>,
+and the list usually includes items such as C<lib>, C<arch>, C<bin>,
+C<script>, C<libdoc>, C<bindoc>, and if HTML documentation is to be
+built, C<libhtml> and C<binhtml>. Other user-defined types may also
+exist.
+
+=item invoked_action()
+
+[version 0.28]
+
+This is the name of the original action invoked by the user. This
+value is set when the user invokes F<Build.PL>, the F<Build> script,
+or programmatically through the L<dispatch()|/"dispatch($action, %args)">
+method. It does not change as sub-actions are executed as
+dependencies are evaluated.
+
+To get the name of the currently executing dependency, see
+L</current_action()> above.
+
+=item notes()
+
+=item notes($key)
+
+=item notes($key => $value)
+
+[version 0.20]
+
+The C<notes()> value allows you to store your own persistent
+information about the build, and to share that information among
+different entities involved in the build. See the example in the
+C<current()> method.
+
+The C<notes()> method is essentially a glorified hash access. With no
+arguments, C<notes()> returns the entire hash of notes. With one argument,
+C<notes($key)> returns the value associated with the given key. With two
+arguments, C<notes($key, $value)> sets the value associated with the given key
+to C<$value> and returns the new value.
+
+The lifetime of the C<notes> data is for "a build" - that is, the
+C<notes> hash is created when C<perl Build.PL> is run (or when the
+C<new()> method is run, if the Module::Build Perl API is being used
+instead of called from a shell), and lasts until C<perl Build.PL> is
+run again or the C<clean> action is run.
+
+=item orig_dir()
+
+[version 0.28]
+
+Returns a string containing the working directory that was in effect
+before the F<Build> script chdir()-ed into the C<base_dir>. This
+might be useful for writing wrapper tools that might need to chdir()
+back out.
+
+=item os_type()
+
+[version 0.04]
+
+If you're subclassing Module::Build and some code needs to alter its
+behavior based on the current platform, you may only need to know
+whether you're running on Windows, Unix, MacOS, VMS, etc., and not the
+fine-grained value of Perl's C<$^O> variable. The C<os_type()> method
+will return a string like C<Windows>, C<Unix>, C<MacOS>, C<VMS>, or
+whatever is appropriate. If you're running on an unknown platform, it
+will return C<undef> - there shouldn't be many unknown platforms
+though.
+
+=item is_vmsish()
+
+=item is_windowsish()
+
+=item is_unixish()
+
+Convenience functions that return a boolean value indicating whether
+this platform behaves respectively like VMS, Windows, or Unix. For
+arbitrary reasons other platforms don't get their own such functions,
+at least not yet.
+
+
+=item prefix_relpaths()
+
+=item prefix_relpaths($installdirs)
+
+=item prefix_relpaths($installdirs, $type)
+
+=item prefix_relpaths($installdirs, $type => $path)
+
+[version 0.28]
+
+Set or retrieve the relative paths that are appended to C<prefix> for
+any installable element. This is useful if you want to set the
+relative install path for custom build elements.
+
+With no argument, it returns a reference to a hash containing all
+elements and their respective values as defined by the current
+C<installdirs> setting.
+
+With a single argument, it returns a reference to a hash containing
+all elements and their respective values as defined by
+C<$installdirs>.
+
+The hash returned by the above calls should not be modified directly;
+use the three-argument below form to change values.
+
+The two argument form returns the value associated with the
+element C<$type>.
+
+The multiple argument form allows you to set the paths for element types.
+C<$value> must be a relative path using Unix-like paths. (A series of
+directories separated by slashes, e.g. C<foo/bar>.) The return value is a
+localized path based on C<$value>.
+
+Assigning the value C<undef> to an element causes it to be removed.
+
+=item get_metadata()
+
+[version 0.36]
+
+This method returns a hash reference of metadata that can be used to create a
+YAML datastream. It is provided for authors to override or customize the fields
+of F<META.yml>. E.g.
+
+ package My::Builder;
+ use base 'Module::Build';
+
+ sub get_metadata {
+ my $self, @args = @_;
+ my $data = $self->SUPER::get_metadata(@args);
+ $data->{custom_field} = 'foo';
+ return $data;
+ }
+
+The only valid argument is C<fatal>, which indicates whether missing required
+metadata fields should be a fatal error or not. For META creation, it
+generally should, but for MYMETA creation for end-users, it should not be
+fatal.
+
+This method is a wrapper around the old prepare_metadata API now that we
+no longer use YAML::Node to hold metadata.
+
+=item prepare_metadata() [deprecated]
+
+[version 0.36]
+
+[Deprecated] As of 0.36, authors should use C<get_metadata> instead. This
+method is preserved for backwards compatibility only.
+
+It takes three positional arguments: a hashref (to which metadata will be
+added), an optional arrayref (to which metadata keys will be added in order if
+the arrayref exists), and a hashref of arguments (as provided to get_metadata).
+The latter argument is new as of 0.36. Earlier versions are always fatal on
+errors.
+
+Prior to version 0.36, this method took a YAML::Node as an argument to hold
+assembled metadata.
+
+=item prereq_failures()
+
+[version 0.11]
+
+Returns a data structure containing information about any failed
+prerequisites (of any of the types described above), or C<undef> if
+all prerequisites are met.
+
+The data structure returned is a hash reference. The top level keys
+are the type of prerequisite failed, one of "requires",
+"build_requires", "conflicts", or "recommends". The associated values
+are hash references whose keys are the names of required (or
+conflicting) modules. The associated values of those are hash
+references indicating some information about the failure. For example:
+
+ {
+ have => '0.42',
+ need => '0.59',
+ message => 'Version 0.42 is installed, but we need version 0.59',
+ }
+
+or
+
+ {
+ have => '<none>',
+ need => '0.59',
+ message => 'Prerequisite Foo isn't installed',
+ }
+
+This hash has the same structure as the hash returned by the
+C<check_installed_status()> method, except that in the case of
+"conflicts" dependencies we change the "need" key to "conflicts" and
+construct a proper message.
+
+Examples:
+
+ # Check a required dependency on Foo::Bar
+ if ( $build->prereq_failures->{requires}{Foo::Bar} ) { ...
+
+ # Check whether there were any failures
+ if ( $build->prereq_failures ) { ...
+
+ # Show messages for all failures
+ my $failures = $build->prereq_failures;
+ while (my ($type, $list) = each %$failures) {
+ while (my ($name, $hash) = each %$list) {
+ print "Failure for $name: $hash->{message}\n";
+ }
+ }
+
+=item prereq_data()
+
+[version 0.32]
+
+Returns a reference to a hash describing all prerequisites. The keys of the
+hash will the various prerequisite types ('requires', 'build_requires',
+'configure_requires', 'recommends', or 'conflicts') and the values will
+references to hashes of module names and version numbers. Only prerequisites
+types that are defined will be included. The C<prereq_data> action is just a
+thin wrapper around the C<prereq_data()> method and dumps the hash as a string
+that can be loaded using C<eval()>.
+
+=item prereq_report()
+
+[version 0.28]
+
+Returns a human-readable (table-form) string showing all
+prerequisites, the versions required, and the versions actually
+installed. This can be useful for reviewing the configuration of your
+system prior to a build, or when compiling data to send for a bug
+report. The C<prereq_report> action is just a thin wrapper around the
+C<prereq_report()> method.
+
+=item prompt($message, $default)
+
+[version 0.12]
+
+Asks the user a question and returns their response as a string. The
+first argument specifies the message to display to the user (for
+example, C<"Where do you keep your money?">). The second argument,
+which is optional, specifies a default answer (for example,
+C<"wallet">). The user will be asked the question once.
+
+If C<prompt()> detects that it is not running interactively and there
+is nothing on STDIN or if the PERL_MM_USE_DEFAULT environment variable
+is set to true, the $default will be used without prompting.
+
+To prevent automated processes from blocking, the user must either set
+PERL_MM_USE_DEFAULT or attach something to STDIN (this can be a
+pipe/file containing a scripted set of answers or /dev/null.)
+
+If no $default is provided an empty string will be used instead. In
+non-interactive mode, the absence of $default is an error (though
+explicitly passing C<undef()> as the default is valid as of 0.27.)
+
+This method may be called as a class or object method.
+
+=item recommends()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<recommends> prerequisites
+that were passed to the C<new()> method.
+
+=item requires()
+
+[version 0.21]
+
+Returns a hash reference indicating the C<requires> prerequisites that
+were passed to the C<new()> method.
+
+=item rscan_dir($dir, $pattern)
+
+[version 0.28]
+
+Uses C<File::Find> to traverse the directory C<$dir>, returning a
+reference to an array of entries matching C<$pattern>. C<$pattern>
+may either be a regular expression (using C<qr//> or just a plain
+string), or a reference to a subroutine that will return true for
+wanted entries. If C<$pattern> is not given, all entries will be
+returned.
+
+Examples:
+
+ # All the *.pm files in lib/
+ $m->rscan_dir('lib', qr/\.pm$/)
+
+ # All the files in blib/ that aren't *.html files
+ $m->rscan_dir('blib', sub {-f $_ and not /\.html$/});
+
+ # All the files in t/
+ $m->rscan_dir('t');
+
+=item runtime_params()
+
+=item runtime_params($key)
+
+[version 0.28]
+
+The C<runtime_params()> method stores the values passed on the command line
+for valid properties (that is, any command line options for which
+C<valid_property()> returns a true value). The value on the command line may
+override the default value for a property, as well as any value specified in a
+call to C<new()>. This allows you to programmatically tell if C<perl Build.PL>
+or any execution of C<./Build> had command line options specified that
+override valid properties.
+
+The C<runtime_params()> method is essentially a glorified read-only hash. With
+no arguments, C<runtime_params()> returns the entire hash of properties
+specified on the command line. With one argument, C<runtime_params($key)>
+returns the value associated with the given key.
+
+The lifetime of the C<runtime_params> data is for "a build" - that is, the
+C<runtime_params> hash is created when C<perl Build.PL> is run (or when the
+C<new()> method is called, if the Module::Build Perl API is being used instead
+of called from a shell), and lasts until C<perl Build.PL> is run again or the
+C<clean> action is run.
+
+=item script_files()
+
+[version 0.18]
+
+Returns a hash reference whose keys are the perl script files to be
+installed, if any. This corresponds to the C<script_files> parameter to the
+C<new()> method. With an optional argument, this parameter may be set
+dynamically.
+
+For backward compatibility, the C<scripts()> method does exactly the
+same thing as C<script_files()>. C<scripts()> is deprecated, but it
+will stay around for several versions to give people time to
+transition.
+
+=item up_to_date($source_file, $derived_file)
+
+=item up_to_date(\@source_files, \@derived_files)
+
+[version 0.20]
+
+This method can be used to compare a set of source files to a set of
+derived files. If any of the source files are newer than any of the
+derived files, it returns false. Additionally, if any of the derived
+files do not exist, it returns false. Otherwise it returns true.
+
+The arguments may be either a scalar or an array reference of file
+names.
+
+=item y_n($message, $default)
+
+[version 0.12]
+
+Asks the user a yes/no question using C<prompt()> and returns true or
+false accordingly. The user will be asked the question repeatedly
+until they give an answer that looks like "yes" or "no".
+
+The first argument specifies the message to display to the user (for
+example, C<"Shall I invest your money for you?">), and the second
+argument specifies the default answer (for example, C<"y">).
+
+Note that the default is specified as a string like C<"y"> or C<"n">,
+and the return value is a Perl boolean value like 1 or 0. I thought
+about this for a while and this seemed like the most useful way to do
+it.
+
+This method may be called as a class or object method.
+
+=back
+
+
+=head2 Autogenerated Accessors
+
+In addition to the aforementioned methods, there are also some get/set
+accessor methods for the following properties:
+
+=over 4
+
+<autogenerated_accessors>
+
+=back
+
+
+=head1 MODULE METADATA
+
+If you would like to add other useful metadata, C<Module::Build>
+supports this with the C<meta_add> and C<meta_merge> arguments to
+L</new>. The authoritative list of supported metadata can be found at
+L<http://module-build.sourceforge.net/META-spec-current.html>, but for
+convenience - here are a few of the more useful ones:
+
+=over 4
+
+=item keywords
+
+For describing the distribution using keyword (or "tags") in order to
+make CPAN.org indexing and search more efficient and useful.
+
+See L<http://module-build.sourceforge.net/META-spec-current.html#keywords>.
+
+=item resources
+
+A list of additional resources available for users of the
+distribution. This can include links to a homepage on the web, a
+bug tracker, the repository location, a even subscription page for the
+distribution mailing list.
+
+See L<http://module-build.sourceforge.net/META-spec-current.html#resources>.
+
+=back
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3), L<Module::Build::Authoring>(3),
+L<Module::Build::Cookbook>(3), L<ExtUtils::MakeMaker>(3), L<YAML::Tiny>(3)
+
+F<META.yml> Specification:
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Authoring.pod b/Master/tlpkg/tlperl/lib/Module/Build/Authoring.pod
new file mode 100644
index 00000000000..38fb3f089a6
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Authoring.pod
@@ -0,0 +1,323 @@
+=head1 NAME
+
+Module::Build::Authoring - Authoring Module::Build modules
+
+
+=head1 DESCRIPTION
+
+When creating a C<Build.PL> script for a module, something like the
+following code will typically be used:
+
+ use Module::Build;
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ requires => {
+ 'perl' => '5.6.1',
+ 'Some::Module' => '1.23',
+ 'Other::Module' => '>= 1.2, != 1.5, < 2.0',
+ },
+ );
+ $build->create_build_script;
+
+A simple module could get away with something as short as this for its
+C<Build.PL> script:
+
+ use Module::Build;
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+The model used by C<Module::Build> is a lot like the C<MakeMaker>
+metaphor, with the following correspondences:
+
+ In Module::Build In ExtUtils::MakeMaker
+ --------------------------- ------------------------
+ Build.PL (initial script) Makefile.PL (initial script)
+ Build (a short perl script) Makefile (a long Makefile)
+ _build/ (saved state info) various config text in the Makefile
+
+Any customization can be done simply by subclassing C<Module::Build>
+and adding a method called (for example) C<ACTION_test>, overriding
+the default 'test' action. You could also add a method called
+C<ACTION_whatever>, and then you could perform the action C<Build
+whatever>.
+
+For information on providing compatibility with
+C<ExtUtils::MakeMaker>, see L<Module::Build::Compat> and
+L<http://www.makemaker.org/wiki/index.cgi?ModuleBuildConversionGuide>.
+
+
+=head1 STRUCTURE
+
+Module::Build creates a class hierarchy conducive to customization.
+Here is the parent-child class hierarchy in classy ASCII art:
+
+ /--------------------\
+ | Your::Parent | (If you subclass Module::Build)
+ \--------------------/
+ |
+ |
+ /--------------------\ (Doesn't define any functionality
+ | Module::Build | of its own - just figures out what
+ \--------------------/ other modules to load.)
+ |
+ |
+ /-----------------------------------\ (Some values of $^O may
+ | Module::Build::Platform::$^O | define specialized functionality.
+ \-----------------------------------/ Otherwise it's ...::Default, a
+ | pass-through class.)
+ |
+ /--------------------------\
+ | Module::Build::Base | (Most of the functionality of
+ \--------------------------/ Module::Build is defined here.)
+
+
+=head1 SUBCLASSING
+
+Right now, there are two ways to subclass Module::Build. The first
+way is to create a regular module (in a C<.pm> file) that inherits
+from Module::Build, and use that module's class instead of using
+Module::Build directly:
+
+ ------ in Build.PL: ----------
+ #!/usr/bin/perl
+
+ use lib q(/nonstandard/library/path);
+ use My::Builder; # Or whatever you want to call it
+
+ my $build = My::Builder->new
+ (
+ module_name => 'Foo::Bar', # All the regular args...
+ license => 'perl',
+ dist_author => 'A N Other <me@here.net.au>',
+ requires => { Carp => 0 }
+ );
+ $build->create_build_script;
+
+This is relatively straightforward, and is the best way to do things
+if your My::Builder class contains lots of code. The
+C<create_build_script()> method will ensure that the current value of
+C<@INC> (including the C</nonstandard/library/path>) is propagated to
+the Build script, so that My::Builder can be found when running build
+actions. If you find that you need to C<chdir> into a different directories
+in your subclass methods or actions, be sure to always return to the original
+directory (available via the C<base_dir()> method before returning control
+to the parent class. This is important to avoid data serialization problems.
+
+For very small additions, Module::Build provides a C<subclass()>
+method that lets you subclass Module::Build more conveniently, without
+creating a separate file for your module:
+
+ ------ in Build.PL: ----------
+ #!/usr/bin/perl
+
+ use Module::Build;
+ my $class = Module::Build->subclass
+ (
+ class => 'My::Builder',
+ code => q{
+ sub ACTION_foo {
+ print "I'm fooing to death!\n";
+ }
+ },
+ );
+
+ my $build = $class->new
+ (
+ module_name => 'Foo::Bar', # All the regular args...
+ license => 'perl',
+ dist_author => 'A N Other <me@here.net.au>',
+ requires => { Carp => 0 }
+ );
+ $build->create_build_script;
+
+Behind the scenes, this actually does create a C<.pm> file, since the
+code you provide must persist after Build.PL is run if it is to be
+very useful.
+
+See also the documentation for the L<Module::Build::API/"subclass()">
+method.
+
+
+=head1 PREREQUISITES
+
+=head2 Types of prerequisites
+
+To specify what versions of other modules are used by this
+distribution, several types of prerequisites can be defined with the
+following parameters:
+
+=over 3
+
+=item configure_requires
+
+Items that must be installed I<before> configuring this distribution
+(i.e. before running the F<Build.PL> script). This might be a
+specific minimum version of C<Module::Build> or any other module the
+F<Build.PL> needs in order to do its stuff. Clients like C<CPAN.pm>
+or C<CPANPLUS> will be expected to pick C<configure_requires> out of the
+F<META.yml> file and install these items before running the
+C<Build.PL>.
+
+If no configure_requires is specified, the current version of Module::Build
+is automatically added to configure_requires.
+
+=item build_requires
+
+Items that are necessary for building and testing this distribution,
+but aren't necessary after installation. This can help users who only
+want to install these items temporarily. It also helps reduce the
+size of the CPAN dependency graph if everything isn't smooshed into
+C<requires>.
+
+=item requires
+
+Items that are necessary for basic functioning.
+
+=item recommends
+
+Items that are recommended for enhanced functionality, but there are
+ways to use this distribution without having them installed. You
+might also think of this as "can use" or "is aware of" or "changes
+behavior in the presence of".
+
+=item conflicts
+
+Items that can cause problems with this distribution when installed.
+This is pretty rare.
+
+=back
+
+=head2 Format of prerequisites
+
+The prerequisites are given in a hash reference, where the keys are
+the module names and the values are version specifiers:
+
+ requires => {
+ Foo::Module => '2.4',
+ Bar::Module => 0,
+ Ken::Module => '>= 1.2, != 1.5, < 2.0',
+ perl => '5.6.0'
+ },
+
+The above four version specifiers have different effects. The value
+C<'2.4'> means that B<at least> version 2.4 of C<Foo::Module> must be
+installed. The value C<0> means that B<any> version of C<Bar::Module>
+is acceptable, even if C<Bar::Module> doesn't define a version. The
+more verbose value C<'E<gt>= 1.2, != 1.5, E<lt> 2.0'> means that
+C<Ken::Module>'s version must be B<at least> 1.2, B<less than> 2.0,
+and B<not equal to> 1.5. The list of criteria is separated by commas,
+and all criteria must be satisfied.
+
+A special C<perl> entry lets you specify the versions of the Perl
+interpreter that are supported by your module. The same version
+dependency-checking semantics are available, except that we also
+understand perl's new double-dotted version numbers.
+
+=head2 XS Extensions
+
+Modules which need to compile XS code should list C<ExtUtils::CBuilder>
+as a C<build_requires> element.
+
+
+=head1 SAVING CONFIGURATION INFORMATION
+
+Module::Build provides a very convenient way to save configuration
+information that your installed modules (or your regression tests) can
+access. If your Build process calls the C<feature()> or
+C<config_data()> methods, then a C<Foo::Bar::ConfigData> module will
+automatically be created for you, where C<Foo::Bar> is the
+C<module_name> parameter as passed to C<new()>. This module provides
+access to the data saved by these methods, and a way to update the
+values. There is also a utility script called C<config_data>
+distributed with Module::Build that provides a command line interface
+to this same functionality. See also the generated
+C<Foo::Bar::ConfigData> documentation, and the C<config_data>
+script's documentation, for more information.
+
+
+=head1 STARTING MODULE DEVELOPMENT
+
+When starting development on a new module, it's rarely worth your time
+to create a tree of all the files by hand. Some automatic
+module-creators are available: the oldest is C<h2xs>, which has
+shipped with perl itself for a long time. Its name reflects the fact
+that modules were originally conceived of as a way to wrap up a C
+library (thus the C<h> part) into perl extensions (thus the C<xs>
+part).
+
+These days, C<h2xs> has largely been superseded by modules like
+C<ExtUtils::ModuleMaker>, and C<Module::Starter>. They have varying
+degrees of support for C<Module::Build>.
+
+
+=head1 AUTOMATION
+
+One advantage of Module::Build is that since it's implemented as Perl
+methods, you can invoke these methods directly if you want to install
+a module non-interactively. For instance, the following Perl script
+will invoke the entire build/install procedure:
+
+ my $build = Module::Build->new(module_name => 'MyModule');
+ $build->dispatch('build');
+ $build->dispatch('test');
+ $build->dispatch('install');
+
+If any of these steps encounters an error, it will throw a fatal
+exception.
+
+You can also pass arguments as part of the build process:
+
+ my $build = Module::Build->new(module_name => 'MyModule');
+ $build->dispatch('build');
+ $build->dispatch('test', verbose => 1);
+ $build->dispatch('install', sitelib => '/my/secret/place/');
+
+Building and installing modules in this way skips creating the
+C<Build> script.
+
+
+=head1 MIGRATION
+
+Note that if you want to provide both a F<Makefile.PL> and a
+F<Build.PL> for your distribution, you probably want to add the
+following to C<WriteMakefile> in your F<Makefile.PL> so that C<MakeMaker>
+doesn't try to run your F<Build.PL> as a normal F<.PL> file:
+
+ PL_FILES => {},
+
+You may also be interested in looking at the C<Module::Build::Compat>
+module, which can automatically create various kinds of F<Makefile.PL>
+compatibility layers.
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+Development questions, bug reports, and patches should be sent to the
+Module-Build mailing list at <module-build@perl.org>.
+
+Bug reports are also welcome at
+<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build>.
+
+The latest development version is available from the Subversion
+repository at <https://svn.perl.org/modules/Module-Build/trunk/>
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3), L<Module::Build::API>(3),
+L<Module::Build::Cookbook>(3), L<ExtUtils::MakeMaker>(3), L<YAML>(3)
+
+F<META.yml> Specification:
+L<http://module-build.sourceforge.net/META-spec-current.html>
+
+L<http://www.dsmit.com/cons/>
+
+L<http://search.cpan.org/dist/PerlBuildSystem/>
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Base.pm b/Master/tlpkg/tlperl/lib/Module/Build/Base.pm
new file mode 100644
index 00000000000..5bd8ec72a55
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Base.pm
@@ -0,0 +1,5287 @@
+# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
+# vim:ts=8:sw=2:et:sta:sts=2
+package Module::Build::Base;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+BEGIN { require 5.00503 }
+
+use Carp;
+use Cwd ();
+use File::Copy ();
+use File::Find ();
+use File::Path ();
+use File::Basename ();
+use File::Spec 0.82 ();
+use File::Compare ();
+use Module::Build::Dumper ();
+use IO::File ();
+use Text::ParseWords ();
+
+use Module::Build::ModuleInfo;
+use Module::Build::Notes;
+use Module::Build::Config;
+use Module::Build::Version;
+
+
+#################### Constructors ###########################
+sub new {
+ my $self = shift()->_construct(@_);
+
+ $self->{invoked_action} = $self->{action} ||= 'Build_PL';
+ $self->cull_args(@ARGV);
+
+ die "Too early to specify a build action '$self->{action}'. Do 'Build $self->{action}' instead.\n"
+ if $self->{action} && $self->{action} ne 'Build_PL';
+
+ $self->check_manifest;
+ $self->auto_require;
+ if ( $self->check_prereq + $self->check_autofeatures != 2) {
+ $self->log_warn(<<EOF);
+
+ERRORS/WARNINGS FOUND IN PREREQUISITES. You may wish to install the versions
+of the modules indicated above before proceeding with this installation
+
+EOF
+ unless (
+ $self->dist_name eq 'Module-Build' ||
+ $ENV{PERL5_CPANPLUS_IS_RUNNING} || $ENV{PERL5_CPAN_IS_RUNNING}
+ ) {
+ $self->log_warn(
+ "Run 'Build installdeps' to install missing prerequisites.\n\n"
+ );
+ }
+ }
+
+ # record for later use in resume;
+ $self->{properties}{_added_to_INC} = [ $self->_added_to_INC ];
+
+ $self->set_bundle_inc;
+
+ $self->dist_name;
+ $self->dist_version;
+ $self->_guess_module_name unless $self->module_name;
+
+ $self->_find_nested_builds;
+
+ return $self;
+}
+
+sub resume {
+ my $package = shift;
+ my $self = $package->_construct(@_);
+ $self->read_config;
+
+ my @added_earlier = @{ $self->{properties}{_added_to_INC} || [] };
+
+ @INC = ($self->_added_to_INC, @added_earlier, $self->_default_INC);
+
+ # If someone called Module::Build->current() or
+ # Module::Build->new_from_context() and the correct class to use is
+ # actually a *subclass* of Module::Build, we may need to load that
+ # subclass here and re-delegate the resume() method to it.
+ unless ( UNIVERSAL::isa($package, $self->build_class) ) {
+ my $build_class = $self->build_class;
+ my $config_dir = $self->config_dir || '_build';
+ my $build_lib = File::Spec->catdir( $config_dir, 'lib' );
+ unshift( @INC, $build_lib );
+ unless ( $build_class->can('new') ) {
+ eval "require $build_class; 1" or die "Failed to re-load '$build_class': $@";
+ }
+ return $build_class->resume(@_);
+ }
+
+ unless ($self->_perl_is_same($self->{properties}{perl})) {
+ my $perl = $self->find_perl_interpreter;
+ $self->log_warn(" * WARNING: Configuration was initially created with '$self->{properties}{perl}',\n".
+ " but we are now using '$perl'.\n");
+ }
+
+ $self->cull_args(@ARGV);
+
+ unless ($self->allow_mb_mismatch) {
+ my $mb_version = $Module::Build::VERSION;
+ if ( $mb_version ne $self->{properties}{mb_version} ) {
+ $self->log_warn(<<"MISMATCH");
+* WARNING: Configuration was initially created with Module::Build
+ version '$self->{properties}{mb_version}' but we are now using version '$mb_version'.
+ If errors occur, you must re-run the Build.PL or Makefile.PL script.
+MISMATCH
+ }
+ }
+
+ $self->{invoked_action} = $self->{action} ||= 'build';
+
+ return $self;
+}
+
+sub new_from_context {
+ my ($package, %args) = @_;
+
+ $package->run_perl_script('Build.PL',[],[$package->unparse_args(\%args)]);
+ return $package->resume;
+}
+
+sub current {
+ # hmm, wonder what the right thing to do here is
+ local @ARGV;
+ return shift()->resume;
+}
+
+sub _construct {
+ my ($package, %input) = @_;
+
+ my $args = delete $input{args} || {};
+ my $config = delete $input{config} || {};
+
+ my $self = bless {
+ args => {%$args},
+ config => Module::Build::Config->new(values => $config),
+ properties => {
+ base_dir => $package->cwd,
+ mb_version => $Module::Build::VERSION,
+ %input,
+ },
+ phash => {},
+ stash => {}, # temporary caching, not stored in _build
+ }, $package;
+
+ $self->_set_defaults;
+ my ($p, $ph) = ($self->{properties}, $self->{phash});
+
+ foreach (qw(notes config_data features runtime_params cleanup auto_features)) {
+ my $file = File::Spec->catfile($self->config_dir, $_);
+ $ph->{$_} = Module::Build::Notes->new(file => $file);
+ $ph->{$_}->restore if -e $file;
+ if (exists $p->{$_}) {
+ my $vals = delete $p->{$_};
+ while (my ($k, $v) = each %$vals) {
+ $self->$_($k, $v);
+ }
+ }
+ }
+
+ # The following warning could be unnecessary if the user is running
+ # an embedded perl, but there aren't too many of those around, and
+ # embedded perls aren't usually used to install modules, and the
+ # installation process sometimes needs to run external scripts
+ # (e.g. to run tests).
+ $p->{perl} = $self->find_perl_interpreter
+ or $self->log_warn("Warning: Can't locate your perl binary");
+
+ my $blibdir = sub { File::Spec->catdir($p->{blib}, @_) };
+ $p->{bindoc_dirs} ||= [ $blibdir->("script") ];
+ $p->{libdoc_dirs} ||= [ $blibdir->("lib"), $blibdir->("arch") ];
+
+ $p->{dist_author} = [ $p->{dist_author} ] if defined $p->{dist_author} and not ref $p->{dist_author};
+
+ # Synonyms
+ $p->{requires} = delete $p->{prereq} if defined $p->{prereq};
+ $p->{script_files} = delete $p->{scripts} if defined $p->{scripts};
+
+ # Convert to from shell strings to arrays
+ for ('extra_compiler_flags', 'extra_linker_flags') {
+ $p->{$_} = [ $self->split_like_shell($p->{$_}) ] if exists $p->{$_};
+ }
+
+ # Convert to arrays
+ for ('include_dirs') {
+ $p->{$_} = [ $p->{$_} ] if exists $p->{$_} && !ref $p->{$_}
+ }
+
+ $self->add_to_cleanup( @{delete $p->{add_to_cleanup}} )
+ if $p->{add_to_cleanup};
+
+ return $self;
+}
+
+################## End constructors #########################
+
+sub log_info {
+ my $self = shift;
+ print @_ unless(ref($self) and $self->quiet);
+}
+sub log_verbose {
+ my $self = shift;
+ $self->log_info(@_) if(ref($self) and $self->verbose);
+}
+sub log_debug {
+ my $self = shift;
+ print @_ if ref $self && $self->debug;
+}
+
+sub log_warn {
+ # Try to make our call stack invisible
+ shift;
+ if (@_ and $_[-1] !~ /\n$/) {
+ my (undef, $file, $line) = caller();
+ warn @_, " at $file line $line.\n";
+ } else {
+ warn @_;
+ }
+}
+
+
+# install paths must be generated when requested to be sure all changes
+# to config (from various sources) are included
+sub _default_install_paths {
+ my $self = shift;
+ my $c = $self->{config};
+ my $p = {};
+
+ my @libstyle = $c->get('installstyle') ?
+ File::Spec->splitdir($c->get('installstyle')) : qw(lib perl5);
+ my $arch = $c->get('archname');
+ my $version = $c->get('version');
+
+ my $bindoc = $c->get('installman1dir') || undef;
+ my $libdoc = $c->get('installman3dir') || undef;
+
+ my $binhtml = $c->get('installhtml1dir') || $c->get('installhtmldir') || undef;
+ my $libhtml = $c->get('installhtml3dir') || $c->get('installhtmldir') || undef;
+
+ $p->{install_sets} =
+ {
+ core => {
+ lib => $c->get('installprivlib'),
+ arch => $c->get('installarchlib'),
+ bin => $c->get('installbin'),
+ script => $c->get('installscript'),
+ bindoc => $bindoc,
+ libdoc => $libdoc,
+ binhtml => $binhtml,
+ libhtml => $libhtml,
+ },
+ site => {
+ lib => $c->get('installsitelib'),
+ arch => $c->get('installsitearch'),
+ bin => $c->get('installsitebin') || $c->get('installbin'),
+ script => $c->get('installsitescript') ||
+ $c->get('installsitebin') || $c->get('installscript'),
+ bindoc => $c->get('installsiteman1dir') || $bindoc,
+ libdoc => $c->get('installsiteman3dir') || $libdoc,
+ binhtml => $c->get('installsitehtml1dir') || $binhtml,
+ libhtml => $c->get('installsitehtml3dir') || $libhtml,
+ },
+ vendor => {
+ lib => $c->get('installvendorlib'),
+ arch => $c->get('installvendorarch'),
+ bin => $c->get('installvendorbin') || $c->get('installbin'),
+ script => $c->get('installvendorscript') ||
+ $c->get('installvendorbin') || $c->get('installscript'),
+ bindoc => $c->get('installvendorman1dir') || $bindoc,
+ libdoc => $c->get('installvendorman3dir') || $libdoc,
+ binhtml => $c->get('installvendorhtml1dir') || $binhtml,
+ libhtml => $c->get('installvendorhtml3dir') || $libhtml,
+ },
+ };
+
+ $p->{original_prefix} =
+ {
+ core => $c->get('installprefixexp') || $c->get('installprefix') ||
+ $c->get('prefixexp') || $c->get('prefix') || '',
+ site => $c->get('siteprefixexp'),
+ vendor => $c->get('usevendorprefix') ? $c->get('vendorprefixexp') : '',
+ };
+ $p->{original_prefix}{site} ||= $p->{original_prefix}{core};
+
+ # Note: you might be tempted to use $Config{installstyle} here
+ # instead of hard-coding lib/perl5, but that's been considered and
+ # (at least for now) rejected. `perldoc Config` has some wisdom
+ # about it.
+ $p->{install_base_relpaths} =
+ {
+ lib => ['lib', 'perl5'],
+ arch => ['lib', 'perl5', $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ };
+
+ $p->{prefix_relpaths} =
+ {
+ core => {
+ lib => [@libstyle],
+ arch => [@libstyle, $version, $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ },
+ vendor => {
+ lib => [@libstyle],
+ arch => [@libstyle, $version, $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ },
+ site => {
+ lib => [@libstyle, 'site_perl'],
+ arch => [@libstyle, 'site_perl', $version, $arch],
+ bin => ['bin'],
+ script => ['bin'],
+ bindoc => ['man', 'man1'],
+ libdoc => ['man', 'man3'],
+ binhtml => ['html'],
+ libhtml => ['html'],
+ },
+ };
+ return $p
+}
+
+sub _find_nested_builds {
+ my $self = shift;
+ my $r = $self->recurse_into or return;
+
+ my ($file, @r);
+ if (!ref($r) && $r eq 'auto') {
+ local *DH;
+ opendir DH, $self->base_dir
+ or die "Can't scan directory " . $self->base_dir . " for nested builds: $!";
+ while (defined($file = readdir DH)) {
+ my $subdir = File::Spec->catdir( $self->base_dir, $file );
+ next unless -d $subdir;
+ push @r, $subdir if -e File::Spec->catfile( $subdir, 'Build.PL' );
+ }
+ }
+
+ $self->recurse_into(\@r);
+}
+
+sub cwd {
+ return Cwd::cwd();
+}
+
+sub _quote_args {
+ # Returns a string that can become [part of] a command line with
+ # proper quoting so that the subprocess sees this same list of args.
+ my ($self, @args) = @_;
+
+ my @quoted;
+
+ for (@args) {
+ if ( /^[^\s*?!\$<>;\\|'"\[\]\{\}]+$/ ) {
+ # Looks pretty safe
+ push @quoted, $_;
+ } else {
+ # XXX this will obviously have to improve - is there already a
+ # core module lying around that does proper quoting?
+ s/('+)/'"$1"'/g;
+ push @quoted, qq('$_');
+ }
+ }
+
+ return join " ", @quoted;
+}
+
+sub _backticks {
+ my ($self, @cmd) = @_;
+ if ($self->have_forkpipe) {
+ local *FH;
+ my $pid = open *FH, "-|";
+ if ($pid) {
+ return wantarray ? <FH> : join '', <FH>;
+ } else {
+ die "Can't execute @cmd: $!\n" unless defined $pid;
+ exec { $cmd[0] } @cmd;
+ }
+ } else {
+ my $cmd = $self->_quote_args(@cmd);
+ return `$cmd`;
+ }
+}
+
+# Tells us whether the construct open($fh, '-|', @command) is
+# supported. It would probably be better to dynamically sense this.
+sub have_forkpipe { 1 }
+
+# Determine whether a given binary is the same as the perl
+# (configuration) that started this process.
+sub _perl_is_same {
+ my ($self, $perl) = @_;
+
+ my @cmd = ($perl);
+
+ # When run from the perl core, @INC will include the directories
+ # where perl is yet to be installed. We need to reference the
+ # absolute path within the source distribution where it can find
+ # it's Config.pm This also prevents us from picking up a Config.pm
+ # from a different configuration that happens to be already
+ # installed in @INC.
+ if ($ENV{PERL_CORE}) {
+ push @cmd, '-I' . File::Spec->catdir(File::Basename::dirname($perl), 'lib');
+ }
+
+ push @cmd, qw(-MConfig=myconfig -e print -e myconfig);
+ return $self->_backticks(@cmd) eq Config->myconfig;
+}
+
+# cache _discover_perl_interpreter() results
+{
+ my $known_perl;
+ sub find_perl_interpreter {
+ my $self = shift;
+
+ return $known_perl if defined($known_perl);
+ return $known_perl = $self->_discover_perl_interpreter;
+ }
+}
+
+# Returns the absolute path of the perl interpreter used to invoke
+# this process. The path is derived from $^X or $Config{perlpath}. On
+# some platforms $^X contains the complete absolute path of the
+# interpreter, on other it may contain a relative path, or simply
+# 'perl'. This can also vary depending on whether a path was supplied
+# when perl was invoked. Additionally, the value in $^X may omit the
+# executable extension on platforms that use one. It's a fatal error
+# if the interpreter can't be found because it can result in undefined
+# behavior by routines that depend on it (generating errors or
+# invoking the wrong perl.)
+sub _discover_perl_interpreter {
+ my $proto = shift;
+ my $c = ref($proto) ? $proto->{config} : 'Module::Build::Config';
+
+ my $perl = $^X;
+ my $perl_basename = File::Basename::basename($perl);
+
+ my @potential_perls;
+
+ # Try 1, Check $^X for absolute path
+ push( @potential_perls, $perl )
+ if File::Spec->file_name_is_absolute($perl);
+
+ # Try 2, Check $^X for a valid relative path
+ my $abs_perl = File::Spec->rel2abs($perl);
+ push( @potential_perls, $abs_perl );
+
+ # Try 3, Last ditch effort: These two option use hackery to try to locate
+ # a suitable perl. The hack varies depending on whether we are running
+ # from an installed perl or an uninstalled perl in the perl source dist.
+ if ($ENV{PERL_CORE}) {
+
+ # Try 3.A, If we are in a perl source tree, running an uninstalled
+ # perl, we can keep moving up the directory tree until we find our
+ # binary. We wouldn't do this under any other circumstances.
+
+ # CBuilder is also in the core, so it should be available here
+ require ExtUtils::CBuilder;
+ my $perl_src = Cwd::realpath( ExtUtils::CBuilder->perl_src );
+ if ( defined($perl_src) && length($perl_src) ) {
+ my $uninstperl =
+ File::Spec->rel2abs(File::Spec->catfile( $perl_src, $perl_basename ));
+ push( @potential_perls, $uninstperl );
+ }
+
+ } else {
+
+ # Try 3.B, First look in $Config{perlpath}, then search the user's
+ # PATH. We do not want to do either if we are running from an
+ # uninstalled perl in a perl source tree.
+
+ push( @potential_perls, $c->get('perlpath') );
+
+ push( @potential_perls,
+ map File::Spec->catfile($_, $perl_basename), File::Spec->path() );
+ }
+
+ # Now that we've enumerated the potential perls, it's time to test
+ # them to see if any of them match our configuration, returning the
+ # absolute path of the first successful match.
+ my $exe = $c->get('exe_ext');
+ foreach my $thisperl ( @potential_perls ) {
+
+ if (defined $exe) {
+ $thisperl .= $exe unless $thisperl =~ m/$exe$/i;
+ }
+
+ if ( -f $thisperl && $proto->_perl_is_same($thisperl) ) {
+ return $thisperl;
+ }
+ }
+
+ # We've tried all alternatives, and didn't find a perl that matches
+ # our configuration. Throw an exception, and list alternatives we tried.
+ my @paths = map File::Basename::dirname($_), @potential_perls;
+ die "Can't locate the perl binary used to run this script " .
+ "in (@paths)\n";
+}
+
+# Adapted from IPC::Cmd::can_run()
+sub find_command {
+ my ($self, $command) = @_;
+
+ if( File::Spec->file_name_is_absolute($command) ) {
+ return $self->_maybe_command($command);
+
+ } else {
+ for my $dir ( File::Spec->path ) {
+ my $abs = File::Spec->catfile($dir, $command);
+ return $abs if $abs = $self->_maybe_command($abs);
+ }
+ }
+}
+
+# Copied from ExtUtils::MM_Unix::maybe_command
+sub _maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d $file;
+ return;
+}
+
+sub _is_interactive {
+ return -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; # Pipe?
+}
+
+# NOTE this is a blocking operation if(-t STDIN)
+sub _is_unattended {
+ my $self = shift;
+ return $ENV{PERL_MM_USE_DEFAULT} ||
+ ( !$self->_is_interactive && eof STDIN );
+}
+
+sub _readline {
+ my $self = shift;
+ return undef if $self->_is_unattended;
+
+ my $answer = <STDIN>;
+ chomp $answer if defined $answer;
+ return $answer;
+}
+
+sub prompt {
+ my $self = shift;
+ my $mess = shift
+ or die "prompt() called without a prompt message";
+
+ # use a list to distinguish a default of undef() from no default
+ my @def;
+ @def = (shift) if @_;
+ # use dispdef for output
+ my @dispdef = scalar(@def) ?
+ ('[', (defined($def[0]) ? $def[0] . ' ' : ''), ']') :
+ (' ', '');
+
+ local $|=1;
+ print "$mess ", @dispdef;
+
+ if ( $self->_is_unattended && !@def ) {
+ die <<EOF;
+ERROR: This build seems to be unattended, but there is no default value
+for this question. Aborting.
+EOF
+ }
+
+ my $ans = $self->_readline();
+
+ if ( !defined($ans) # Ctrl-D or unattended
+ or !length($ans) ) { # User hit return
+ print "$dispdef[1]\n";
+ $ans = scalar(@def) ? $def[0] : '';
+ }
+
+ return $ans;
+}
+
+sub y_n {
+ my $self = shift;
+ my ($mess, $def) = @_;
+
+ die "y_n() called without a prompt message" unless $mess;
+ die "Invalid default value: y_n() default must be 'y' or 'n'"
+ if $def && $def !~ /^[yn]/i;
+
+ my $answer;
+ while (1) { # XXX Infinite or a large number followed by an exception ?
+ $answer = $self->prompt(@_);
+ return 1 if $answer =~ /^y/i;
+ return 0 if $answer =~ /^n/i;
+ local $|=1;
+ print "Please answer 'y' or 'n'.\n";
+ }
+}
+
+sub current_action { shift->{action} }
+sub invoked_action { shift->{invoked_action} }
+
+sub notes { shift()->{phash}{notes}->access(@_) }
+sub config_data { shift()->{phash}{config_data}->access(@_) }
+sub runtime_params { shift->{phash}{runtime_params}->read( @_ ? shift : () ) } # Read-only
+sub auto_features { shift()->{phash}{auto_features}->access(@_) }
+
+sub features {
+ my $self = shift;
+ my $ph = $self->{phash};
+
+ if (@_) {
+ my $key = shift;
+ if ($ph->{features}->exists($key)) {
+ return $ph->{features}->access($key, @_);
+ }
+
+ if (my $info = $ph->{auto_features}->access($key)) {
+ my $disabled;
+ for my $type ( @{$self->prereq_action_types} ) {
+ next if $type eq 'description' || $type eq 'recommends' || ! exists $info->{$type};
+ my $prereqs = $info->{$type};
+ for my $modname ( sort keys %$prereqs ) {
+ my $spec = $prereqs->{$modname};
+ my $status = $self->check_installed_status($modname, $spec);
+ if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
+ if ( ! eval "require $modname; 1" ) { return 0; }
+ }
+ }
+ return 1;
+ }
+
+ return $ph->{features}->access($key, @_);
+ }
+
+ # No args - get the auto_features & overlay the regular features
+ my %features;
+ my %auto_features = $ph->{auto_features}->access();
+ while (my ($name, $info) = each %auto_features) {
+ my $failures = $self->prereq_failures($info);
+ my $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/,
+ keys %$failures ) ? 1 : 0;
+ $features{$name} = $disabled ? 0 : 1;
+ }
+ %features = (%features, $ph->{features}->access());
+
+ return wantarray ? %features : \%features;
+}
+BEGIN { *feature = \&features } # Alias
+
+sub _mb_feature {
+ my $self = shift;
+
+ if (($self->module_name || '') eq 'Module::Build') {
+ # We're building Module::Build itself, so ...::ConfigData isn't
+ # valid, but $self->features() should be.
+ return $self->feature(@_);
+ } else {
+ require Module::Build::ConfigData;
+ return Module::Build::ConfigData->feature(@_);
+ }
+}
+
+sub _warn_mb_feature_deps {
+ my $self = shift;
+ my $name = shift;
+ $self->log_warn(
+ "The '$name' feature is not available. Please install missing\n" .
+ "feature dependencies and try again.\n".
+ $self->_feature_deps_msg($name) . "\n"
+ );
+}
+
+sub add_build_element {
+ my ($self, $elem) = @_;
+ my $elems = $self->build_elements;
+ push @$elems, $elem unless grep { $_ eq $elem } @$elems;
+}
+
+sub ACTION_config_data {
+ my $self = shift;
+ return unless $self->has_config_data;
+
+ my $module_name = $self->module_name
+ or die "The config_data feature requires that 'module_name' be set";
+ my $notes_name = $module_name . '::ConfigData'; # TODO: Customize name ???
+ my $notes_pm = File::Spec->catfile($self->blib, 'lib', split /::/, "$notes_name.pm");
+
+ return if $self->up_to_date(['Build.PL',
+ $self->config_file('config_data'),
+ $self->config_file('features')
+ ], $notes_pm);
+
+ $self->log_verbose("Writing config notes to $notes_pm\n");
+ File::Path::mkpath(File::Basename::dirname($notes_pm));
+
+ Module::Build::Notes->write_config_data
+ (
+ file => $notes_pm,
+ module => $module_name,
+ config_module => $notes_name,
+ config_data => scalar $self->config_data,
+ feature => scalar $self->{phash}{features}->access(),
+ auto_features => scalar $self->auto_features,
+ );
+}
+
+########################################################################
+{ # enclosing these lexicals -- TODO
+ my %valid_properties = ( __PACKAGE__, {} );
+ my %additive_properties;
+
+ sub _mb_classes {
+ my $class = ref($_[0]) || $_[0];
+ return ($class, $class->mb_parents);
+ }
+
+ sub valid_property {
+ my ($class, $prop) = @_;
+ return grep exists( $valid_properties{$_}{$prop} ), $class->_mb_classes;
+ }
+
+ sub valid_properties {
+ return keys %{ shift->valid_properties_defaults() };
+ }
+
+ sub valid_properties_defaults {
+ my %out;
+ for my $class (reverse shift->_mb_classes) {
+ @out{ keys %{ $valid_properties{$class} } } = map {
+ $_->()
+ } values %{ $valid_properties{$class} };
+ }
+ return \%out;
+ }
+
+ sub array_properties {
+ for (shift->_mb_classes) {
+ return @{$additive_properties{$_}->{ARRAY}}
+ if exists $additive_properties{$_}->{ARRAY};
+ }
+ }
+
+ sub hash_properties {
+ for (shift->_mb_classes) {
+ return @{$additive_properties{$_}->{'HASH'}}
+ if exists $additive_properties{$_}->{'HASH'};
+ }
+ }
+
+ sub add_property {
+ my ($class, $property) = (shift, shift);
+ die "Property '$property' already exists"
+ if $class->valid_property($property);
+ my %p = @_ == 1 ? ( default => shift ) : @_;
+
+ my $type = ref $p{default};
+ $valid_properties{$class}{$property} =
+ $type eq 'CODE' ? $p{default} :
+ $type eq 'HASH' ? sub { return { %{ $p{default} } } } :
+ $type eq 'ARRAY'? sub { return [ @{ $p{default} } ] } :
+ sub { return $p{default} } ;
+
+ push @{$additive_properties{$class}->{$type}}, $property
+ if $type;
+
+ unless ($class->can($property)) {
+ # TODO probably should put these in a util package
+ my $sub = $type eq 'HASH'
+ ? _make_hash_accessor($property, \%p)
+ : _make_accessor($property, \%p);
+ no strict 'refs';
+ *{"$class\::$property"} = $sub;
+ }
+
+ return $class;
+ }
+
+ sub property_error {
+ my $self = shift;
+ die 'ERROR: ', @_;
+ }
+
+ sub _set_defaults {
+ my $self = shift;
+
+ # Set the build class.
+ $self->{properties}{build_class} ||= ref $self;
+
+ # If there was no orig_dir, set to the same as base_dir
+ $self->{properties}{orig_dir} ||= $self->{properties}{base_dir};
+
+ my $defaults = $self->valid_properties_defaults;
+
+ foreach my $prop (keys %$defaults) {
+ $self->{properties}{$prop} = $defaults->{$prop}
+ unless exists $self->{properties}{$prop};
+ }
+
+ # Copy defaults for arrays any arrays.
+ for my $prop ($self->array_properties) {
+ $self->{properties}{$prop} = [@{$defaults->{$prop}}]
+ unless exists $self->{properties}{$prop};
+ }
+ # Copy defaults for arrays any hashes.
+ for my $prop ($self->hash_properties) {
+ $self->{properties}{$prop} = {%{$defaults->{$prop}}}
+ unless exists $self->{properties}{$prop};
+ }
+ }
+
+} # end closure
+########################################################################
+sub _make_hash_accessor {
+ my ($property, $p) = @_;
+ my $check = $p->{check} || sub { 1 };
+
+ return sub {
+ my $self = shift;
+
+ # This is only here to deprecate the historic accident of calling
+ # properties as class methods - I suspect it only happens in our
+ # test suite.
+ unless(ref($self)) {
+ carp("\n$property not a class method (@_)");
+ return;
+ }
+
+ my $x = $self->{properties};
+ return $x->{$property} unless @_;
+
+ my $prop = $x->{$property};
+ if ( defined $_[0] && !ref $_[0] ) {
+ if ( @_ == 1 ) {
+ return exists $prop->{$_[0]} ? $prop->{$_[0]} : undef;
+ } elsif ( @_ % 2 == 0 ) {
+ my %new = (%{ $prop }, @_);
+ local $_ = \%new;
+ $x->{$property} = \%new if $check->($self);
+ return $x->{$property};
+ } else {
+ die "Unexpected arguments for property '$property'\n";
+ }
+ } else {
+ die "Unexpected arguments for property '$property'\n"
+ if defined $_[0] && ref $_[0] ne 'HASH';
+ local $_ = $_[0];
+ $x->{$property} = shift if $check->($self);
+ }
+ };
+}
+########################################################################
+sub _make_accessor {
+ my ($property, $p) = @_;
+ my $check = $p->{check} || sub { 1 };
+
+ return sub {
+ my $self = shift;
+
+ # This is only here to deprecate the historic accident of calling
+ # properties as class methods - I suspect it only happens in our
+ # test suite.
+ unless(ref($self)) {
+ carp("\n$property not a class method (@_)");
+ return;
+ }
+
+ my $x = $self->{properties};
+ return $x->{$property} unless @_;
+ local $_ = $_[0];
+ $x->{$property} = shift if $check->($self);
+ return $x->{$property};
+ };
+}
+########################################################################
+
+# Add the default properties.
+__PACKAGE__->add_property(auto_configure_requires => 1);
+__PACKAGE__->add_property(blib => 'blib');
+__PACKAGE__->add_property(build_class => 'Module::Build');
+__PACKAGE__->add_property(build_elements => [qw(PL support pm xs share_dir pod script)]);
+__PACKAGE__->add_property(build_script => 'Build');
+__PACKAGE__->add_property(build_bat => 0);
+__PACKAGE__->add_property(bundle_inc => []);
+__PACKAGE__->add_property(bundle_inc_preload => []);
+__PACKAGE__->add_property(config_dir => '_build');
+__PACKAGE__->add_property(include_dirs => []);
+__PACKAGE__->add_property(license => 'unknown');
+__PACKAGE__->add_property(metafile => 'META.yml');
+__PACKAGE__->add_property(mymetafile => 'MYMETA.yml');
+__PACKAGE__->add_property(recurse_into => []);
+__PACKAGE__->add_property(use_rcfile => 1);
+__PACKAGE__->add_property(create_packlist => 1);
+__PACKAGE__->add_property(allow_mb_mismatch => 0);
+__PACKAGE__->add_property(config => undef);
+__PACKAGE__->add_property(test_file_exts => ['.t']);
+__PACKAGE__->add_property(use_tap_harness => 0);
+__PACKAGE__->add_property(cpan_client => 'cpan');
+__PACKAGE__->add_property(tap_harness_args => {});
+__PACKAGE__->add_property(
+ 'installdirs',
+ default => 'site',
+ check => sub {
+ return 1 if /^(core|site|vendor)$/;
+ return shift->property_error(
+ $_ eq 'perl'
+ ? 'Perhaps you meant installdirs to be "core" rather than "perl"?'
+ : 'installdirs must be one of "core", "site", or "vendor"'
+ );
+ return shift->property_error("Perhaps you meant 'core'?") if $_ eq 'perl';
+ return 0;
+ },
+);
+
+{
+ my $Is_ActivePerl = eval {require ActivePerl::DocTools};
+ __PACKAGE__->add_property(html_css => $Is_ActivePerl ? 'Active.css' : '');
+}
+
+{
+ my @prereq_action_types = qw(requires build_requires conflicts recommends);
+ foreach my $type (@prereq_action_types) {
+ __PACKAGE__->add_property($type => {});
+ }
+ __PACKAGE__->add_property(prereq_action_types => \@prereq_action_types);
+}
+
+__PACKAGE__->add_property($_ => {}) for qw(
+ get_options
+ install_base_relpaths
+ install_path
+ install_sets
+ meta_add
+ meta_merge
+ original_prefix
+ prefix_relpaths
+ configure_requires
+);
+
+__PACKAGE__->add_property($_) for qw(
+ PL_files
+ autosplit
+ base_dir
+ bindoc_dirs
+ c_source
+ create_license
+ create_makefile_pl
+ create_readme
+ debugger
+ destdir
+ dist_abstract
+ dist_author
+ dist_name
+ dist_version
+ dist_version_from
+ extra_compiler_flags
+ extra_linker_flags
+ has_config_data
+ install_base
+ libdoc_dirs
+ magic_number
+ mb_version
+ module_name
+ needs_compiler
+ orig_dir
+ perl
+ pm_files
+ pod_files
+ pollute
+ prefix
+ program_name
+ quiet
+ recursive_test_files
+ script_files
+ scripts
+ share_dir
+ sign
+ test_files
+ verbose
+ debug
+ xs_files
+);
+
+sub config {
+ my $self = shift;
+ my $c = ref($self) ? $self->{config} : 'Module::Build::Config';
+ return $c->all_config unless @_;
+
+ my $key = shift;
+ return $c->get($key) unless @_;
+
+ my $val = shift;
+ return $c->set($key => $val);
+}
+
+sub mb_parents {
+ # Code borrowed from Class::ISA.
+ my @in_stack = (shift);
+ my %seen = ($in_stack[0] => 1);
+
+ my ($current, @out);
+ while (@in_stack) {
+ next unless defined($current = shift @in_stack)
+ && $current->isa('Module::Build::Base');
+ push @out, $current;
+ next if $current eq 'Module::Build::Base';
+ no strict 'refs';
+ unshift @in_stack,
+ map {
+ my $c = $_; # copy, to avoid being destructive
+ substr($c,0,2) = "main::" if substr($c,0,2) eq '::';
+ # Canonize the :: -> main::, ::foo -> main::foo thing.
+ # Should I ever canonize the Foo'Bar = Foo::Bar thing?
+ $seen{$c}++ ? () : $c;
+ } @{"$current\::ISA"};
+
+ # I.e., if this class has any parents (at least, ones I've never seen
+ # before), push them, in order, onto the stack of classes I need to
+ # explore.
+ }
+ shift @out;
+ return @out;
+}
+
+sub extra_linker_flags { shift->_list_accessor('extra_linker_flags', @_) }
+sub extra_compiler_flags { shift->_list_accessor('extra_compiler_flags', @_) }
+
+sub _list_accessor {
+ (my $self, local $_) = (shift, shift);
+ my $p = $self->{properties};
+ $p->{$_} = [@_] if @_;
+ $p->{$_} = [] unless exists $p->{$_};
+ return ref($p->{$_}) ? $p->{$_} : [$p->{$_}];
+}
+
+# XXX Problem - if Module::Build is loaded from a different directory,
+# it'll look for (and perhaps destroy/create) a _build directory.
+sub subclass {
+ my ($pack, %opts) = @_;
+
+ my $build_dir = '_build'; # XXX The _build directory is ostensibly settable by the user. Shouldn't hard-code here.
+ $pack->delete_filetree($build_dir) if -e $build_dir;
+
+ die "Must provide 'code' or 'class' option to subclass()\n"
+ unless $opts{code} or $opts{class};
+
+ $opts{code} ||= '';
+ $opts{class} ||= 'MyModuleBuilder';
+
+ my $filename = File::Spec->catfile($build_dir, 'lib', split '::', $opts{class}) . '.pm';
+ my $filedir = File::Basename::dirname($filename);
+ $pack->log_verbose("Creating custom builder $filename in $filedir\n");
+
+ File::Path::mkpath($filedir);
+ die "Can't create directory $filedir: $!" unless -d $filedir;
+
+ my $fh = IO::File->new("> $filename") or die "Can't create $filename: $!";
+ print $fh <<EOF;
+package $opts{class};
+use $pack;
+\@ISA = qw($pack);
+$opts{code}
+1;
+EOF
+ close $fh;
+
+ unshift @INC, File::Spec->catdir(File::Spec->rel2abs($build_dir), 'lib');
+ eval "use $opts{class}";
+ die $@ if $@;
+
+ return $opts{class};
+}
+
+sub _guess_module_name {
+ my $self = shift;
+ my $p = $self->{properties};
+ return if $p->{module_name};
+ if ( $p->{dist_version_from} && -e $p->{dist_version_from} ) {
+ my $mi = Module::Build::ModuleInfo->new_from_file($self->dist_version_from);
+ $p->{module_name} = $mi->name;
+ }
+ else {
+ my $mod_path = my $mod_name = $p->{dist_name};
+ $mod_name =~ s{-}{::}g;
+ $mod_path =~ s{-}{/}g;
+ $mod_path .= ".pm";
+ if ( -e $mod_path || -e "lib/$mod_path" ) {
+ $p->{module_name} = $mod_name;
+ }
+ else {
+ $self->log_warn( << 'END_WARN' );
+No 'module_name' was provided and it could not be inferred
+from other properties. This will prevent a packlist from
+being written for this file. Please set either 'module_name'
+or 'dist_version_from' in Build.PL.
+END_WARN
+ }
+ }
+}
+
+sub dist_name {
+ my $self = shift;
+ my $p = $self->{properties};
+ return $p->{dist_name} if defined $p->{dist_name};
+
+ die "Can't determine distribution name, must supply either 'dist_name' or 'module_name' parameter"
+ unless $self->module_name;
+
+ ($p->{dist_name} = $self->module_name) =~ s/::/-/g;
+
+ return $p->{dist_name};
+}
+
+sub dist_version_from {
+ my ($self) = @_;
+ my $p = $self->{properties};
+ if ($self->module_name) {
+ $p->{dist_version_from} ||=
+ join( '/', 'lib', split(/::/, $self->module_name) ) . '.pm';
+ }
+ return $p->{dist_version_from} || undef;
+}
+
+sub dist_version {
+ my ($self) = @_;
+ my $p = $self->{properties};
+
+ return $p->{dist_version} if defined $p->{dist_version};
+
+ if ( my $dist_version_from = $self->dist_version_from ) {
+ my $version_from = File::Spec->catfile( split( qr{/}, $dist_version_from ) );
+ my $pm_info = Module::Build::ModuleInfo->new_from_file( $version_from )
+ or die "Can't find file $version_from to determine version";
+ $p->{dist_version} = $self->normalize_version( $pm_info->version() );
+ }
+
+ die ("Can't determine distribution version, must supply either 'dist_version',\n".
+ "'dist_version_from', or 'module_name' parameter")
+ unless defined $p->{dist_version};
+
+ return $p->{dist_version};
+}
+
+sub dist_author { shift->_pod_parse('author') }
+sub dist_abstract { shift->_pod_parse('abstract') }
+
+sub _pod_parse {
+ my ($self, $part) = @_;
+ my $p = $self->{properties};
+ my $member = "dist_$part";
+ return $p->{$member} if defined $p->{$member};
+
+ my $docfile = $self->_main_docfile
+ or return;
+ my $fh = IO::File->new($docfile)
+ or return;
+
+ require Module::Build::PodParser;
+ my $parser = Module::Build::PodParser->new(fh => $fh);
+ my $method = "get_$part";
+ return $p->{$member} = $parser->$method();
+}
+
+sub version_from_file { # Method provided for backwards compatibility
+ return Module::Build::ModuleInfo->new_from_file($_[1])->version();
+}
+
+sub find_module_by_name { # Method provided for backwards compatibility
+ return Module::Build::ModuleInfo->find_module_by_name(@_[1,2]);
+}
+
+sub add_to_cleanup {
+ my $self = shift;
+ my %files = map {$self->localize_file_path($_), 1} @_;
+ $self->{phash}{cleanup}->write(\%files);
+}
+
+sub cleanup {
+ my $self = shift;
+ my $all = $self->{phash}{cleanup}->read;
+ return keys %$all;
+}
+
+sub config_file {
+ my $self = shift;
+ return unless -d $self->config_dir;
+ return File::Spec->catfile($self->config_dir, @_);
+}
+
+sub read_config {
+ my ($self) = @_;
+
+ my $file = $self->config_file('build_params')
+ or die "Can't find 'build_params' in " . $self->config_dir;
+ my $fh = IO::File->new($file) or die "Can't read '$file': $!";
+ my $ref = eval do {local $/; <$fh>};
+ die if $@;
+ my $c;
+ ($self->{args}, $c, $self->{properties}) = @$ref;
+ $self->{config} = Module::Build::Config->new(values => $c);
+ close $fh;
+}
+
+sub has_config_data {
+ my $self = shift;
+ return scalar grep $self->{phash}{$_}->has_data(), qw(config_data features auto_features);
+}
+
+sub _write_data {
+ my ($self, $filename, $data) = @_;
+
+ my $file = $self->config_file($filename);
+ my $fh = IO::File->new("> $file") or die "Can't create '$file': $!";
+ unless (ref($data)) { # e.g. magicnum
+ print $fh $data;
+ return;
+ }
+
+ print {$fh} Module::Build::Dumper->_data_dump($data);
+}
+
+sub write_config {
+ my ($self) = @_;
+
+ File::Path::mkpath($self->{properties}{config_dir});
+ -d $self->{properties}{config_dir} or die "Can't mkdir $self->{properties}{config_dir}: $!";
+
+ my @items = @{ $self->prereq_action_types };
+ $self->_write_data('prereqs', { map { $_, $self->$_() } @items });
+ $self->_write_data('build_params', [$self->{args}, $self->{config}->values_set, $self->{properties}]);
+
+ # Set a new magic number and write it to a file
+ $self->_write_data('magicnum', $self->magic_number(int rand 1_000_000));
+
+ $self->{phash}{$_}->write() foreach qw(notes cleanup features auto_features config_data runtime_params);
+}
+
+{
+ # packfile map -- keys are guts of regular expressions; If they match,
+ # values are module names corresponding to the packlist
+ my %packlist_map = (
+ '^File::Spec' => 'Cwd',
+ '^Devel::AssertOS' => 'Devel::CheckOS',
+ );
+
+ sub _find_packlist {
+ my ($self, $inst, $mod) = @_;
+ my $lookup = $mod;
+ my $packlist = eval { $inst->packlist($lookup) };
+ if ( ! $packlist ) {
+ # try from packlist_map
+ while ( my ($re, $new_mod) = each %packlist_map ) {
+ if ( $mod =~ qr/$re/ ) {
+ $lookup = $new_mod;
+ $packlist = eval { $inst->packlist($lookup) };
+ last;
+ }
+ }
+ }
+ return $packlist ? $lookup : undef;
+ }
+
+ sub set_bundle_inc {
+ my $self = shift;
+
+ my $bundle_inc = $self->{properties}{bundle_inc};
+ my $bundle_inc_preload = $self->{properties}{bundle_inc_preload};
+ # We're in author mode if inc::latest is loaded, but not from cwd
+ return unless inc::latest->can('loaded_modules');
+ require ExtUtils::Installed;
+ # ExtUtils::Installed is buggy about finding additions to default @INC
+ my $inst = eval { ExtUtils::Installed->new(extra_libs => [@INC]) };
+ if ($@) {
+ $self->log_warn( << "EUI_ERROR" );
+Bundling in inc/ is disabled because ExtUtils::Installed could not
+create a list of your installed modules. Here is the error:
+$@
+EUI_ERROR
+ return;
+ }
+ my @bundle_list = map { [ $_, 0 ] } inc::latest->loaded_modules;
+
+ # XXX TODO: Need to get ordering of prerequisites correct so they are
+ # are loaded in the right order. Use an actual tree?!
+
+ while( @bundle_list ) {
+ my ($mod, $prereq) = @{ shift @bundle_list };
+
+ # XXX TODO: Append prereqs to list
+ # skip if core or already in bundle or preload lists
+ # push @bundle_list, [$_, 1] for prereqs()
+
+ # Locate packlist for bundling
+ my $lookup = $self->_find_packlist($inst,$mod);
+ if ( ! $lookup ) {
+ # XXX Really needs a more helpful error message here
+ die << "NO_PACKLIST";
+Could not find a packlist for '$mod'. If it's a core module, try
+force installing it from CPAN.
+NO_PACKLIST
+ }
+ else {
+ push @{ $prereq ? $bundle_inc_preload : $bundle_inc }, $lookup;
+ }
+ }
+ } # sub check_bundling
+}
+
+sub check_autofeatures {
+ my ($self) = @_;
+ my $features = $self->auto_features;
+
+ return 1 unless %$features;
+
+ # TODO refactor into ::Util
+ my $longest = sub {
+ my @str = @_ or croak("no strings given");
+
+ my @len = map({length($_)} @str);
+ my $max = 0;
+ my $longest;
+ for my $i (0..$#len) {
+ ($max, $longest) = ($len[$i], $str[$i]) if($len[$i] > $max);
+ }
+ return($longest);
+ };
+ my $max_name_len = length($longest->(keys %$features));
+
+ my ($num_disabled, $log_text) = (0, "\nChecking optional features...\n");
+ for my $name ( sort keys %$features ) {
+ $log_text .= $self->_feature_deps_msg($name, $max_name_len);
+ }
+
+ $num_disabled = () = $log_text =~ /disabled/g;
+
+ # warn user if features disabled
+ if ( $num_disabled ) {
+ $self->log_warn( $log_text );
+ return 0;
+ }
+ else {
+ $self->log_verbose( $log_text );
+ return 1;
+ }
+}
+
+sub _feature_deps_msg {
+ my ($self, $name, $max_name_len) = @_;
+ $max_name_len ||= length $name;
+ my $features = $self->auto_features;
+ my $info = $features->{$name};
+ my $feature_text = "$name" . '.' x ($max_name_len - length($name) + 4);
+
+ my ($log_text, $disabled) = ('','');
+ if ( my $failures = $self->prereq_failures($info) ) {
+ $disabled = grep( /^(?:\w+_)?(?:requires|conflicts)$/,
+ keys %$failures ) ? 1 : 0;
+ $feature_text .= $disabled ? "disabled\n" : "enabled\n";
+
+ for my $type ( @{ $self->prereq_action_types } ) {
+ next unless exists $failures->{$type};
+ $feature_text .= " $type:\n";
+ my $prereqs = $failures->{$type};
+ for my $module ( sort keys %$prereqs ) {
+ my $status = $prereqs->{$module};
+ my $required =
+ ($type =~ /^(?:\w+_)?(?:requires|conflicts)$/) ? 1 : 0;
+ my $prefix = ($required) ? '!' : '*';
+ $feature_text .= " $prefix $status->{message}\n";
+ }
+ }
+ } else {
+ $feature_text .= "enabled\n";
+ }
+ $log_text .= $feature_text if $disabled || $self->verbose;
+ return $log_text;
+}
+
+# Automatically detect and add prerequisites based on configuration
+sub auto_require {
+ my ($self) = @_;
+ my $p = $self->{properties};
+
+ # add current Module::Build to configure_requires if there
+ # isn't one already specified (but not ourself, so we're not circular)
+ if ( $self->dist_name ne 'Module-Build'
+ && $self->auto_configure_requires
+ && ! exists $p->{configure_requires}{'Module::Build'}
+ ) {
+ (my $ver = $VERSION) =~ s/^(\d+\.\d\d).*$/$1/; # last major release only
+ $self->_add_prereq('configure_requires', 'Module::Build', $ver);
+ }
+
+ # if we're in author mode, add inc::latest modules to
+ # configure_requires if not already set. If we're not in author mode
+ # then configure_requires will have been satisfied, or we'll just
+ # live with what we've bundled
+ if ( inc::latest->can('loaded_module') ) {
+ for my $mod ( inc::latest->loaded_modules ) {
+ next if exists $p->{configure_requires}{$mod};
+ $self->_add_prereq('configure_requires', $mod, $mod->VERSION);
+ }
+ }
+
+ # If needs_compiler is not explictly set, automatically set it
+ # If set, we need ExtUtils::CBuilder (and a compiler)
+ my $xs_files = $self->find_xs_files;
+ if ( ! defined $p->{needs_compiler} ) {
+ $self->needs_compiler( keys %$xs_files || defined $self->c_source );
+ }
+ if ($self->needs_compiler) {
+ $self->_add_prereq('build_requires', 'ExtUtils::CBuilder', 0);
+ if ( ! $self->have_c_compiler ) {
+ $self->log_warn(<<'EOM');
+Warning: ExtUtils::CBuilder not installed or no compiler detected
+Proceeding with configuration, but compilation may fail during Build
+
+EOM
+ }
+ }
+
+ # If using share_dir, require File::ShareDir
+ if ( $self->share_dir ) {
+ $self->_add_prereq( 'requires', 'File::ShareDir', '1.00' );
+ }
+
+ return;
+}
+
+sub _add_prereq {
+ my ($self, $type, $module, $version) = @_;
+ my $p = $self->{properties};
+ $version = 0 unless defined $version;
+ if ( exists $p->{$type}{$module} ) {
+ return if $self->compare_versions( $version, '<=', $p->{$type}{$module} );
+ }
+ $self->log_verbose("Adding to $type\: $module => $version\n");
+ $p->{$type}{$module} = $version;
+ return 1;
+}
+
+sub prereq_failures {
+ my ($self, $info) = @_;
+
+ my @types = @{ $self->prereq_action_types };
+ $info ||= {map {$_, $self->$_()} @types};
+
+ my $out;
+
+ foreach my $type (@types) {
+ my $prereqs = $info->{$type};
+ for my $modname ( keys %$prereqs ) {
+ my $spec = $prereqs->{$modname};
+ my $status = $self->check_installed_status($modname, $spec);
+
+ if ($type =~ /^(?:\w+_)?conflicts$/) {
+ next if !$status->{ok};
+ $status->{conflicts} = delete $status->{need};
+ $status->{message} = "$modname ($status->{have}) conflicts with this distribution";
+
+ } elsif ($type =~ /^(?:\w+_)?recommends$/) {
+ next if $status->{ok};
+ $status->{message} = (!ref($status->{have}) && $status->{have} eq '<none>'
+ ? "$modname is not installed"
+ : "$modname ($status->{have}) is installed, but we prefer to have $spec");
+ } else {
+ next if $status->{ok};
+ }
+
+ $out->{$type}{$modname} = $status;
+ }
+ }
+
+ return $out;
+}
+
+# returns a hash of defined prerequisites; i.e. only prereq types with values
+sub _enum_prereqs {
+ my $self = shift;
+ my %prereqs;
+ foreach my $type ( @{ $self->prereq_action_types } ) {
+ if ( $self->can( $type ) ) {
+ my $prereq = $self->$type() || {};
+ $prereqs{$type} = $prereq if %$prereq;
+ }
+ }
+ return \%prereqs;
+}
+
+sub check_prereq {
+ my $self = shift;
+
+ # Check to see if there are any prereqs to check
+ my $info = $self->_enum_prereqs;
+ return 1 unless $info;
+
+ my $log_text = "Checking prerequisites...\n";
+
+ my $failures = $self->prereq_failures($info);
+
+ if ( $failures ) {
+ $self->log_warn($log_text);
+ for my $type ( @{ $self->prereq_action_types } ) {
+ my $prereqs = $failures->{$type};
+ $self->log_warn(" ${type}:\n") if keys %$prereqs;
+ for my $module ( sort keys %$prereqs ) {
+ my $status = $prereqs->{$module};
+ my $prefix = ($type =~ /^(?:\w+_)?recommends$/) ? "* " : "! ";
+ $self->log_warn(" $prefix $status->{message}\n");
+ }
+ }
+ return 0;
+ } else {
+ $self->log_verbose($log_text . "Looks good\n\n");
+ return 1;
+ }
+}
+
+sub perl_version {
+ my ($self) = @_;
+ # Check the current perl interpreter
+ # It's much more convenient to use $] here than $^V, but 'man
+ # perlvar' says I'm not supposed to. Bloody tyrant.
+ return $^V ? $self->perl_version_to_float(sprintf "%vd", $^V) : $];
+}
+
+sub perl_version_to_float {
+ my ($self, $version) = @_;
+ return $version if grep( /\./, $version ) < 2;
+ $version =~ s/\./../;
+ $version =~ s/\.(\d+)/sprintf '%03d', $1/eg;
+ return $version;
+}
+
+sub _parse_conditions {
+ my ($self, $spec) = @_;
+
+ if ($spec =~ /^\s*([\w.]+)\s*$/) { # A plain number, maybe with dots, letters, and underscores
+ return (">= $spec");
+ } else {
+ return split /\s*,\s*/, $spec;
+ }
+}
+
+sub check_installed_status {
+ my ($self, $modname, $spec) = @_;
+ my %status = (need => $spec);
+
+ if ($modname eq 'perl') {
+ $status{have} = $self->perl_version;
+
+ } elsif (eval { no strict; $status{have} = ${"${modname}::VERSION"} }) {
+ # Don't try to load if it's already loaded
+
+ } else {
+ my $pm_info = Module::Build::ModuleInfo->new_from_module( $modname );
+ unless (defined( $pm_info )) {
+ @status{ qw(have message) } = ('<none>', "$modname is not installed");
+ return \%status;
+ }
+
+ $status{have} = $pm_info->version();
+ if ($spec and !defined($status{have})) {
+ @status{ qw(have message) } = (undef, "Couldn't find a \$VERSION in prerequisite $modname");
+ return \%status;
+ }
+ }
+
+ my @conditions = $self->_parse_conditions($spec);
+
+ foreach (@conditions) {
+ my ($op, $version) = /^\s* (<=?|>=?|==|!=) \s* ([\w.]+) \s*$/x
+ or die "Invalid prerequisite condition '$_' for $modname";
+
+ $version = $self->perl_version_to_float($version)
+ if $modname eq 'perl';
+
+ next if $op eq '>=' and !$version; # Module doesn't have to actually define a $VERSION
+
+ unless ($self->compare_versions( $status{have}, $op, $version )) {
+ $status{message} = "$modname ($status{have}) is installed, but we need version $op $version";
+ return \%status;
+ }
+ }
+
+ $status{ok} = 1;
+ return \%status;
+}
+
+sub compare_versions {
+ my $self = shift;
+ my ($v1, $op, $v2) = @_;
+ $v1 = Module::Build::Version->new($v1)
+ unless UNIVERSAL::isa($v1,'Module::Build::Version');
+
+ my $eval_str = "\$v1 $op \$v2";
+ my $result = eval $eval_str;
+ $self->log_warn("error comparing versions: '$eval_str' $@") if $@;
+
+ return $result;
+}
+
+# I wish I could set $! to a string, but I can't, so I use $@
+sub check_installed_version {
+ my ($self, $modname, $spec) = @_;
+
+ my $status = $self->check_installed_status($modname, $spec);
+
+ if ($status->{ok}) {
+ return $status->{have} if $status->{have} and "$status->{have}" ne '<none>';
+ return '0 but true';
+ }
+
+ $@ = $status->{message};
+ return 0;
+}
+
+sub make_executable {
+ # Perl's chmod() is mapped to useful things on various non-Unix
+ # platforms, so we use it in the base class even though it looks
+ # Unixish.
+
+ my $self = shift;
+ foreach (@_) {
+ my $current_mode = (stat $_)[2];
+ chmod $current_mode | oct(111), $_;
+ }
+}
+
+sub is_executable {
+ # We assume this does the right thing on generic platforms, though
+ # we do some other more specific stuff on Unixish platforms.
+ my ($self, $file) = @_;
+ return -x $file;
+}
+
+sub _startperl { shift()->config('startperl') }
+
+# Return any directories in @INC which are not in the default @INC for
+# this perl. For example, stuff passed in with -I or loaded with "use lib".
+sub _added_to_INC {
+ my $self = shift;
+
+ my %seen;
+ $seen{$_}++ foreach $self->_default_INC;
+ return grep !$seen{$_}++, @INC;
+}
+
+# Determine the default @INC for this Perl
+{
+ my @default_inc; # Memoize
+ sub _default_INC {
+ my $self = shift;
+ return @default_inc if @default_inc;
+
+ local $ENV{PERL5LIB}; # this is not considered part of the default.
+
+ my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter;
+
+ my @inc = $self->_backticks($perl, '-le', 'print for @INC');
+ chomp @inc;
+
+ return @default_inc = @inc;
+ }
+}
+
+sub print_build_script {
+ my ($self, $fh) = @_;
+
+ my $build_package = $self->build_class;
+
+ my $closedata="";
+
+ my %q = map {$_, $self->$_()} qw(config_dir base_dir);
+
+ my $case_tolerant = 0+(File::Spec->can('case_tolerant')
+ && File::Spec->case_tolerant);
+ $q{base_dir} = uc $q{base_dir} if $case_tolerant;
+ $q{base_dir} = Win32::GetShortPathName($q{base_dir}) if $self->is_windowsish;
+
+ $q{magic_numfile} = $self->config_file('magicnum');
+
+ my @myINC = $self->_added_to_INC;
+ for (@myINC, values %q) {
+ $_ = File::Spec->canonpath( $_ );
+ s/([\\\'])/\\$1/g;
+ }
+
+ my $quoted_INC = join ",\n", map " '$_'", @myINC;
+ my $shebang = $self->_startperl;
+ my $magic_number = $self->magic_number;
+
+ print $fh <<EOF;
+$shebang
+
+use strict;
+use Cwd;
+use File::Basename;
+use File::Spec;
+
+sub magic_number_matches {
+ return 0 unless -e '$q{magic_numfile}';
+ local *FH;
+ open FH, '$q{magic_numfile}' or return 0;
+ my \$filenum = <FH>;
+ close FH;
+ return \$filenum == $magic_number;
+}
+
+my \$progname;
+my \$orig_dir;
+BEGIN {
+ \$^W = 1; # Use warnings
+ \$progname = basename(\$0);
+ \$orig_dir = Cwd::cwd();
+ my \$base_dir = '$q{base_dir}';
+ if (!magic_number_matches()) {
+ unless (chdir(\$base_dir)) {
+ die ("Couldn't chdir(\$base_dir), aborting\\n");
+ }
+ unless (magic_number_matches()) {
+ die ("Configuration seems to be out of date, please re-run 'perl Build.PL' again.\\n");
+ }
+ }
+ unshift \@INC,
+ (
+$quoted_INC
+ );
+}
+
+close(*DATA) unless eof(*DATA); # ensure no open handles to this script
+
+use $build_package;
+
+# Some platforms have problems setting \$^X in shebang contexts, fix it up here
+\$^X = Module::Build->find_perl_interpreter;
+
+if (-e 'Build.PL' and not $build_package->up_to_date('Build.PL', \$progname)) {
+ warn "Warning: Build.PL has been altered. You may need to run 'perl Build.PL' again.\\n";
+}
+
+# This should have just enough arguments to be able to bootstrap the rest.
+my \$build = $build_package->resume (
+ properties => {
+ config_dir => '$q{config_dir}',
+ orig_dir => \$orig_dir,
+ },
+);
+
+\$build->dispatch;
+EOF
+}
+
+sub create_mymeta {
+ my ($self) = @_;
+ my $mymetafile = $self->mymetafile;
+ my $metafile = $self->metafile;
+
+ # cleanup
+ if ( $self->delete_filetree($mymetafile) ) {
+ $self->log_verbose("Removed previous '$mymetafile'\n");
+ }
+ $self->log_info("Creating new '$mymetafile' with configuration results\n");
+
+ # use old meta and update prereqs, if possible
+ my $mymeta;
+ if ( -f $metafile ) {
+ $mymeta = eval { $self->read_metafile( $self->metafile ) };
+ }
+ # if we read META OK, just update it
+ if ( defined $mymeta ) {
+ my $prereqs = $self->_normalize_prereqs;
+ for my $t ( keys %$prereqs ) {
+ $mymeta->{$t} = $prereqs->{$t};
+ }
+ }
+ # but generate from scratch, ignoring errors if META doesn't exist
+ else {
+ $mymeta = $self->get_metadata( fatal => 0 );
+ }
+
+ # MYMETA is always static
+ $mymeta->{dynamic_config} = 0;
+ # Note which M::B created it
+ $mymeta->{generated_by} = "Module::Build version $Module::Build::VERSION";
+
+ $self->write_metafile( $mymetafile, $mymeta );
+ return 1;
+}
+
+sub create_build_script {
+ my ($self) = @_;
+
+ $self->write_config;
+ $self->create_mymeta;
+
+ # Create Build
+ my ($build_script, $dist_name, $dist_version)
+ = map $self->$_(), qw(build_script dist_name dist_version);
+
+ if ( $self->delete_filetree($build_script) ) {
+ $self->log_verbose("Removed previous script '$build_script'\n");
+ }
+
+ $self->log_info("Creating new '$build_script' script for ",
+ "'$dist_name' version '$dist_version'\n");
+ my $fh = IO::File->new(">$build_script") or die "Can't create '$build_script': $!";
+ $self->print_build_script($fh);
+ close $fh;
+
+ $self->make_executable($build_script);
+
+ return 1;
+}
+
+sub check_manifest {
+ my $self = shift;
+ return unless -e 'MANIFEST';
+
+ # Stolen nearly verbatim from MakeMaker. But ExtUtils::Manifest
+ # could easily be re-written into a modern Perl dialect.
+
+ require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean.
+ local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
+
+ $self->log_verbose("Checking whether your kit is complete...\n");
+ if (my @missed = ExtUtils::Manifest::manicheck()) {
+ $self->log_warn("WARNING: the following files are missing in your kit:\n",
+ "\t", join("\n\t", @missed), "\n",
+ "Please inform the author.\n\n");
+ } else {
+ $self->log_verbose("Looks good\n\n");
+ }
+}
+
+sub dispatch {
+ my $self = shift;
+ local $self->{_completed_actions} = {};
+
+ if (@_) {
+ my ($action, %p) = @_;
+ my $args = $p{args} ? delete($p{args}) : {};
+
+ local $self->{invoked_action} = $action;
+ local $self->{args} = {%{$self->{args}}, %$args};
+ local $self->{properties} = {%{$self->{properties}}, %p};
+ return $self->_call_action($action);
+ }
+
+ die "No build action specified" unless $self->{action};
+ local $self->{invoked_action} = $self->{action};
+ $self->_call_action($self->{action});
+}
+
+sub _call_action {
+ my ($self, $action) = @_;
+
+ return if $self->{_completed_actions}{$action}++;
+
+ local $self->{action} = $action;
+ my $method = $self->can_action( $action );
+ die "No action '$action' defined, try running the 'help' action.\n" unless $method;
+ $self->log_debug("Starting ACTION_$action\n");
+ my $rc = $self->$method();
+ $self->log_debug("Finished ACTION_$action\n");
+ return $rc;
+}
+
+sub can_action {
+ my ($self, $action) = @_;
+ return $self->can( "ACTION_$action" );
+}
+
+# cuts the user-specified options out of the command-line args
+sub cull_options {
+ my $self = shift;
+ my (@argv) = @_;
+
+ # XXX is it even valid to call this as a class method?
+ return({}, @argv) unless(ref($self)); # no object
+
+ my $specs = $self->get_options;
+ return({}, @argv) unless($specs and %$specs); # no user options
+
+ require Getopt::Long;
+ # XXX Should we let Getopt::Long handle M::B's options? That would
+ # be easy-ish to add to @specs right here, but wouldn't handle options
+ # passed without "--" as M::B currently allows. We might be able to
+ # get around this by setting the "prefix_pattern" Configure option.
+ my @specs;
+ my $args = {};
+ # Construct the specifications for GetOptions.
+ while (my ($k, $v) = each %$specs) {
+ # Throw an error if specs conflict with our own.
+ die "Option specification '$k' conflicts with a " . ref $self
+ . " option of the same name"
+ if $self->valid_property($k);
+ push @specs, $k . (defined $v->{type} ? $v->{type} : '');
+ push @specs, $v->{store} if exists $v->{store};
+ $args->{$k} = $v->{default} if exists $v->{default};
+ }
+
+ local @ARGV = @argv; # No other way to dupe Getopt::Long
+
+ # Get the options values and return them.
+ # XXX Add option to allow users to set options?
+ if ( @specs ) {
+ Getopt::Long::Configure('pass_through');
+ Getopt::Long::GetOptions($args, @specs);
+ }
+
+ return $args, @ARGV;
+}
+
+sub unparse_args {
+ my ($self, $args) = @_;
+ my @out;
+ while (my ($k, $v) = each %$args) {
+ push @out, (UNIVERSAL::isa($v, 'HASH') ? map {+"--$k", "$_=$v->{$_}"} keys %$v :
+ UNIVERSAL::isa($v, 'ARRAY') ? map {+"--$k", $_} @$v :
+ ("--$k", $v));
+ }
+ return @out;
+}
+
+sub args {
+ my $self = shift;
+ return wantarray ? %{ $self->{args} } : $self->{args} unless @_;
+ my $key = shift;
+ $self->{args}{$key} = shift if @_;
+ return $self->{args}{$key};
+}
+
+# allows select parameters (with underscores) to be spoken with dashes
+# when used as command-line options
+sub _translate_option {
+ my $self = shift;
+ my $opt = shift;
+
+ (my $tr_opt = $opt) =~ tr/-/_/;
+
+ return $tr_opt if grep $tr_opt =~ /^(?:no_?)?$_$/, qw(
+ create_license
+ create_makefile_pl
+ create_readme
+ extra_compiler_flags
+ extra_linker_flags
+ html_css
+ install_base
+ install_path
+ meta_add
+ meta_merge
+ test_files
+ use_rcfile
+ use_tap_harness
+ tap_harness_args
+ cpan_client
+ ); # normalize only selected option names
+
+ return $opt;
+}
+
+sub _read_arg {
+ my ($self, $args, $key, $val) = @_;
+
+ $key = $self->_translate_option($key);
+
+ if ( exists $args->{$key} ) {
+ $args->{$key} = [ $args->{$key} ] unless ref $args->{$key};
+ push @{$args->{$key}}, $val;
+ } else {
+ $args->{$key} = $val;
+ }
+}
+
+# decide whether or not an option requires/has an operand
+sub _optional_arg {
+ my $self = shift;
+ my $opt = shift;
+ my $argv = shift;
+
+ $opt = $self->_translate_option($opt);
+
+ my @bool_opts = qw(
+ build_bat
+ create_license
+ create_readme
+ pollute
+ quiet
+ uninst
+ use_rcfile
+ verbose
+ debug
+ sign
+ use_tap_harness
+ );
+
+ # inverted boolean options; eg --noverbose or --no-verbose
+ # converted to proper name & returned with false value (verbose, 0)
+ if ( grep $opt =~ /^no[-_]?$_$/, @bool_opts ) {
+ $opt =~ s/^no-?//;
+ return ($opt, 0);
+ }
+
+ # non-boolean option; return option unchanged along with its argument
+ return ($opt, shift(@$argv)) unless grep $_ eq $opt, @bool_opts;
+
+ # we're punting a bit here, if an option appears followed by a digit
+ # we take the digit as the argument for the option. If there is
+ # nothing that looks like a digit, we pretend the option is a flag
+ # that is being set and has no argument.
+ my $arg = 1;
+ $arg = shift(@$argv) if @$argv && $argv->[0] =~ /^\d+$/;
+
+ return ($opt, $arg);
+}
+
+sub read_args {
+ my $self = shift;
+
+ (my $args, @_) = $self->cull_options(@_);
+ my %args = %$args;
+
+ my $opt_re = qr/[\w\-]+/;
+
+ my ($action, @argv);
+ while (@_) {
+ local $_ = shift;
+ if ( /^(?:--)?($opt_re)=(.*)$/ ) {
+ $self->_read_arg(\%args, $1, $2);
+ } elsif ( /^--($opt_re)$/ ) {
+ my($opt, $arg) = $self->_optional_arg($1, \@_);
+ $self->_read_arg(\%args, $opt, $arg);
+ } elsif ( /^($opt_re)$/ and !defined($action)) {
+ $action = $1;
+ } else {
+ push @argv, $_;
+ }
+ }
+ $args{ARGV} = \@argv;
+
+ for ('extra_compiler_flags', 'extra_linker_flags') {
+ $args{$_} = [ $self->split_like_shell($args{$_}) ] if exists $args{$_};
+ }
+
+ # Convert to arrays
+ for ('include_dirs') {
+ $args{$_} = [ $args{$_} ] if exists $args{$_} && !ref $args{$_}
+ }
+
+ # Hashify these parameters
+ for ($self->hash_properties, 'config') {
+ next unless exists $args{$_};
+ my %hash;
+ $args{$_} ||= [];
+ $args{$_} = [ $args{$_} ] unless ref $args{$_};
+ foreach my $arg ( @{$args{$_}} ) {
+ $arg =~ /(\w+)=(.*)/
+ or die "Malformed '$_' argument: '$arg' should be something like 'foo=bar'";
+ $hash{$1} = $2;
+ }
+ $args{$_} = \%hash;
+ }
+
+ # De-tilde-ify any path parameters
+ for my $key (qw(prefix install_base destdir)) {
+ next if !defined $args{$key};
+ $args{$key} = $self->_detildefy($args{$key});
+ }
+
+ for my $key (qw(install_path)) {
+ next if !defined $args{$key};
+
+ for my $subkey (keys %{$args{$key}}) {
+ next if !defined $args{$key}{$subkey};
+ my $subkey_ext = $self->_detildefy($args{$key}{$subkey});
+ if ( $subkey eq 'html' ) { # translate for compatibility
+ $args{$key}{binhtml} = $subkey_ext;
+ $args{$key}{libhtml} = $subkey_ext;
+ } else {
+ $args{$key}{$subkey} = $subkey_ext;
+ }
+ }
+ }
+
+ if ($args{makefile_env_macros}) {
+ require Module::Build::Compat;
+ %args = (%args, Module::Build::Compat->makefile_to_build_macros);
+ }
+
+ return \%args, $action;
+}
+
+# Default: do nothing. Overridden for Unix & Windows.
+sub _detildefy {}
+
+
+# merge Module::Build argument lists that have already been parsed
+# by read_args(). Takes two references to option hashes and merges
+# the contents, giving priority to the first.
+sub _merge_arglist {
+ my( $self, $opts1, $opts2 ) = @_;
+
+ $opts1 ||= {};
+ $opts2 ||= {};
+ my %new_opts = %$opts1;
+ while (my ($key, $val) = each %$opts2) {
+ if ( exists( $opts1->{$key} ) ) {
+ if ( ref( $val ) eq 'HASH' ) {
+ while (my ($k, $v) = each %$val) {
+ $new_opts{$key}{$k} = $v unless exists( $opts1->{$key}{$k} );
+ }
+ }
+ } else {
+ $new_opts{$key} = $val
+ }
+ }
+
+ return %new_opts;
+}
+
+# Look for a home directory on various systems.
+sub _home_dir {
+ my @home_dirs;
+ push( @home_dirs, $ENV{HOME} ) if $ENV{HOME};
+
+ push( @home_dirs, File::Spec->catpath($ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '') )
+ if $ENV{HOMEDRIVE} && $ENV{HOMEPATH};
+
+ my @other_home_envs = qw( USERPROFILE APPDATA WINDIR SYS$LOGIN );
+ push( @home_dirs, map $ENV{$_}, grep $ENV{$_}, @other_home_envs );
+
+ my @real_home_dirs = grep -d, @home_dirs;
+
+ return wantarray ? @real_home_dirs : shift( @real_home_dirs );
+}
+
+sub _find_user_config {
+ my $self = shift;
+ my $file = shift;
+ foreach my $dir ( $self->_home_dir ) {
+ my $path = File::Spec->catfile( $dir, $file );
+ return $path if -e $path;
+ }
+ return undef;
+}
+
+# read ~/.modulebuildrc returning global options '*' and
+# options specific to the currently executing $action.
+sub read_modulebuildrc {
+ my( $self, $action ) = @_;
+
+ return () unless $self->use_rcfile;
+
+ my $modulebuildrc;
+ if ( exists($ENV{MODULEBUILDRC}) && $ENV{MODULEBUILDRC} eq 'NONE' ) {
+ return ();
+ } elsif ( exists($ENV{MODULEBUILDRC}) && -e $ENV{MODULEBUILDRC} ) {
+ $modulebuildrc = $ENV{MODULEBUILDRC};
+ } elsif ( exists($ENV{MODULEBUILDRC}) ) {
+ $self->log_warn("WARNING: Can't find resource file " .
+ "'$ENV{MODULEBUILDRC}' defined in environment.\n" .
+ "No options loaded\n");
+ return ();
+ } else {
+ $modulebuildrc = $self->_find_user_config( '.modulebuildrc' );
+ return () unless $modulebuildrc;
+ }
+
+ my $fh = IO::File->new( $modulebuildrc )
+ or die "Can't open $modulebuildrc: $!";
+
+ my %options; my $buffer = '';
+ while (defined( my $line = <$fh> )) {
+ chomp( $line );
+ $line =~ s/#.*$//;
+ next unless length( $line );
+
+ if ( $line =~ /^\S/ ) {
+ if ( $buffer ) {
+ my( $action, $options ) = split( /\s+/, $buffer, 2 );
+ $options{$action} .= $options . ' ';
+ $buffer = '';
+ }
+ $buffer = $line;
+ } else {
+ $buffer .= $line;
+ }
+ }
+
+ if ( $buffer ) { # anything left in $buffer ?
+ my( $action, $options ) = split( /\s+/, $buffer, 2 );
+ $options{$action} .= $options . ' '; # merge if more than one line
+ }
+
+ my ($global_opts) =
+ $self->read_args( $self->split_like_shell( $options{'*'} || '' ) );
+ my ($action_opts) =
+ $self->read_args( $self->split_like_shell( $options{$action} || '' ) );
+
+ # specific $action options take priority over global options '*'
+ return $self->_merge_arglist( $action_opts, $global_opts );
+}
+
+# merge the relevant options in ~/.modulebuildrc into Module::Build's
+# option list where they do not conflict with commandline options.
+sub merge_modulebuildrc {
+ my( $self, $action, %cmdline_opts ) = @_;
+ my %rc_opts = $self->read_modulebuildrc( $action || $self->{action} || 'build' );
+ my %new_opts = $self->_merge_arglist( \%cmdline_opts, \%rc_opts );
+ $self->merge_args( $action, %new_opts );
+}
+
+sub merge_args {
+ my ($self, $action, %args) = @_;
+ $self->{action} = $action if defined $action;
+
+ my %additive = map { $_ => 1 } $self->hash_properties;
+
+ # Extract our 'properties' from $cmd_args, the rest are put in 'args'.
+ while (my ($key, $val) = each %args) {
+ $self->{phash}{runtime_params}->access( $key => $val )
+ if $self->valid_property($key);
+
+ if ($key eq 'config') {
+ $self->config($_ => $val->{$_}) foreach keys %$val;
+ } else {
+ my $add_to = $additive{$key} ? $self->{properties}{$key} :
+ $self->valid_property($key) ? $self->{properties} :
+ $self->{args} ;
+
+ if ($additive{$key}) {
+ $add_to->{$_} = $val->{$_} foreach keys %$val;
+ } else {
+ $add_to->{$key} = $val;
+ }
+ }
+ }
+}
+
+sub cull_args {
+ my $self = shift;
+ my @arg_list = @_;
+ unshift @arg_list, $self->split_like_shell($ENV{PERL_MB_OPT})
+ if $ENV{PERL_MB_OPT};
+ my ($args, $action) = $self->read_args(@arg_list);
+ $self->merge_args($action, %$args);
+ $self->merge_modulebuildrc( $action, %$args );
+}
+
+sub super_classes {
+ my ($self, $class, $seen) = @_;
+ $class ||= ref($self) || $self;
+ $seen ||= {};
+
+ no strict 'refs';
+ my @super = grep {not $seen->{$_}++} $class, @{ $class . '::ISA' };
+ return @super, map {$self->super_classes($_,$seen)} @super;
+}
+
+sub known_actions {
+ my ($self) = @_;
+
+ my %actions;
+ no strict 'refs';
+
+ foreach my $class ($self->super_classes) {
+ foreach ( keys %{ $class . '::' } ) {
+ $actions{$1}++ if /^ACTION_(\w+)/;
+ }
+ }
+
+ return wantarray ? sort keys %actions : \%actions;
+}
+
+sub get_action_docs {
+ my ($self, $action) = @_;
+ my $actions = $self->known_actions;
+ die "No known action '$action'" unless $actions->{$action};
+
+ my ($files_found, @docs) = (0);
+ foreach my $class ($self->super_classes) {
+ (my $file = $class) =~ s{::}{/}g;
+ # NOTE: silently skipping relative paths if any chdir() happened
+ $file = $INC{$file . '.pm'} or next;
+ my $fh = IO::File->new("< $file") or next;
+ $files_found++;
+
+ # Code below modified from /usr/bin/perldoc
+
+ # Skip to ACTIONS section
+ local $_;
+ while (<$fh>) {
+ last if /^=head1 ACTIONS\s/;
+ }
+
+ # Look for our action and determine the style
+ my $style;
+ while (<$fh>) {
+ last if /^=head1 /;
+
+ # only item and head2 are allowed (3&4 are not in 5.005)
+ if(/^=(item|head2)\s+\Q$action\E\b/) {
+ $style = $1;
+ push @docs, $_;
+ last;
+ }
+ }
+ $style or next; # not here
+
+ # and the content
+ if($style eq 'item') {
+ my ($found, $inlist) = (0, 0);
+ while (<$fh>) {
+ if (/^=(item|back)/) {
+ last unless $inlist;
+ }
+ push @docs, $_;
+ ++$inlist if /^=over/;
+ --$inlist if /^=back/;
+ }
+ }
+ else { # head2 style
+ # stop at anything equal or greater than the found level
+ while (<$fh>) {
+ last if(/^=(?:head[12]|cut)/);
+ push @docs, $_;
+ }
+ }
+ # TODO maybe disallow overriding just pod for an action
+ # TODO and possibly: @docs and last;
+ }
+
+ unless ($files_found) {
+ $@ = "Couldn't find any documentation to search";
+ return;
+ }
+ unless (@docs) {
+ $@ = "Couldn't find any docs for action '$action'";
+ return;
+ }
+
+ return join '', @docs;
+}
+
+sub ACTION_prereq_report {
+ my $self = shift;
+ $self->log_info( $self->prereq_report );
+}
+
+sub ACTION_prereq_data {
+ my $self = shift;
+ $self->log_info( Module::Build::Dumper->_data_dump( $self->prereq_data ) );
+}
+
+sub prereq_data {
+ my $self = shift;
+ my @types = ('configure_requires', @{ $self->prereq_action_types } );
+ my $info = { map { $_ => $self->$_() } grep { %{$self->$_()} } @types };
+ return $info;
+}
+
+sub prereq_report {
+ my $self = shift;
+ my $info = $self->prereq_data;
+
+ my $output = '';
+ foreach my $type (keys %$info) {
+ my $prereqs = $info->{$type};
+ $output .= "\n$type:\n";
+ my $mod_len = 2;
+ my $ver_len = 4;
+ my %mods;
+ while ( my ($modname, $spec) = each %$prereqs ) {
+ my $len = length $modname;
+ $mod_len = $len if $len > $mod_len;
+ $spec ||= '0';
+ $len = length $spec;
+ $ver_len = $len if $len > $ver_len;
+
+ my $mod = $self->check_installed_status($modname, $spec);
+ $mod->{name} = $modname;
+ $mod->{ok} ||= 0;
+ $mod->{ok} = ! $mod->{ok} if $type =~ /^(\w+_)?conflicts$/;
+
+ $mods{lc $modname} = $mod;
+ }
+
+ my $space = q{ } x ($mod_len - 3);
+ my $vspace = q{ } x ($ver_len - 3);
+ my $sline = q{-} x ($mod_len - 3);
+ my $vline = q{-} x ($ver_len - 3);
+ my $disposition = ($type =~ /^(\w+_)?conflicts$/) ?
+ 'Clash' : 'Need';
+ $output .=
+ " Module $space $disposition $vspace Have\n".
+ " ------$sline+------$vline-+----------\n";
+
+
+ for my $k (sort keys %mods) {
+ my $mod = $mods{$k};
+ my $space = q{ } x ($mod_len - length $k);
+ my $vspace = q{ } x ($ver_len - length $mod->{need});
+ my $f = $mod->{ok} ? ' ' : '!';
+ $output .=
+ " $f $mod->{name} $space $mod->{need} $vspace ".
+ (defined($mod->{have}) ? $mod->{have} : "")."\n";
+ }
+ }
+ return $output;
+}
+
+sub ACTION_help {
+ my ($self) = @_;
+ my $actions = $self->known_actions;
+
+ if (@{$self->{args}{ARGV}}) {
+ my $msg = eval {$self->get_action_docs($self->{args}{ARGV}[0], $actions)};
+ print $@ ? "$@\n" : $msg;
+ return;
+ }
+
+ print <<EOF;
+
+ Usage: $0 <action> arg1=value arg2=value ...
+ Example: $0 test verbose=1
+
+ Actions defined:
+EOF
+
+ print $self->_action_listing($actions);
+
+ print "\nRun `Build help <action>` for details on an individual action.\n";
+ print "See `perldoc Module::Build` for complete documentation.\n";
+}
+
+sub _action_listing {
+ my ($self, $actions) = @_;
+
+ # Flow down columns, not across rows
+ my @actions = sort keys %$actions;
+ @actions = map $actions[($_ + ($_ % 2) * @actions) / 2], 0..$#actions;
+
+ my $out = '';
+ while (my ($one, $two) = splice @actions, 0, 2) {
+ $out .= sprintf(" %-12s %-12s\n", $one, $two||'');
+ }
+ $out =~ s{\s*$}{}mg; # remove trailing spaces
+ return $out;
+}
+
+sub ACTION_retest {
+ my ($self) = @_;
+
+ # Protect others against our @INC changes
+ local @INC = @INC;
+
+ # Filter out nonsensical @INC entries - some versions of
+ # Test::Harness will really explode the number of entries here
+ @INC = grep {ref() || -d} @INC if @INC > 100;
+
+ $self->do_tests;
+}
+
+sub ACTION_testall {
+ my ($self) = @_;
+
+ my @types;
+ for my $action (grep { $_ ne 'all' } $self->get_test_types) {
+ # XXX We can't just dispatch because we get multiple summaries but
+ # we'll need to dispatch to support custom setup/teardown in the
+ # action. To support that, we'll need to call something besides
+ # Harness::runtests() because we'll need to collect the results in
+ # parts, then run the summary.
+ push(@types, $action);
+ #$self->_call_action( "test$action" );
+ }
+ $self->generic_test(types => ['default', @types]);
+}
+
+sub get_test_types {
+ my ($self) = @_;
+
+ my $t = $self->{properties}->{test_types};
+ return ( defined $t ? ( keys %$t ) : () );
+}
+
+
+sub ACTION_test {
+ my ($self) = @_;
+ $self->generic_test(type => 'default');
+}
+
+sub generic_test {
+ my $self = shift;
+ (@_ % 2) and croak('Odd number of elements in argument hash');
+ my %args = @_;
+
+ my $p = $self->{properties};
+
+ my @types = (
+ (exists($args{type}) ? $args{type} : ()),
+ (exists($args{types}) ? @{$args{types}} : ()),
+ );
+ @types or croak "need some types of tests to check";
+
+ my %test_types = (
+ default => $p->{test_file_exts},
+ (defined($p->{test_types}) ? %{$p->{test_types}} : ()),
+ );
+
+ for my $type (@types) {
+ croak "$type not defined in test_types!"
+ unless defined $test_types{ $type };
+ }
+
+ # we use local here because it ends up two method calls deep
+ local $p->{test_file_exts} = [ map { ref $_ ? @$_ : $_ } @test_types{@types} ];
+ $self->depends_on('code');
+
+ # Protect others against our @INC changes
+ local @INC = @INC;
+
+ # Make sure we test the module in blib/
+ unshift @INC, (File::Spec->catdir($p->{base_dir}, $self->blib, 'lib'),
+ File::Spec->catdir($p->{base_dir}, $self->blib, 'arch'));
+
+ # Filter out nonsensical @INC entries - some versions of
+ # Test::Harness will really explode the number of entries here
+ @INC = grep {ref() || -d} @INC if @INC > 100;
+
+ $self->do_tests;
+}
+
+# Test::Harness dies on failure but TAP::Harness does not, so we must
+# die if running under TAP::Harness
+sub do_tests {
+ my $self = shift;
+
+ my $tests = $self->find_test_files;
+
+ if(@$tests) {
+ my $args = $self->tap_harness_args;
+ if($self->use_tap_harness or ($args and %$args)) {
+ my $aggregate = $self->run_tap_harness($tests);
+ if ( $aggregate->has_errors ) {
+ die "Errors in testing. Cannot continue.\n";
+ }
+ }
+ else {
+ $self->run_test_harness($tests);
+ }
+ }
+ else {
+ $self->log_info("No tests defined.\n");
+ }
+
+ $self->run_visual_script;
+}
+
+sub run_tap_harness {
+ my ($self, $tests) = @_;
+
+ require TAP::Harness;
+
+ # TODO allow the test @INC to be set via our API?
+
+ my $aggregate = TAP::Harness->new({
+ lib => [@INC],
+ verbosity => $self->{properties}{verbose},
+ switches => [ $self->harness_switches ],
+ %{ $self->tap_harness_args },
+ })->runtests(@$tests);
+
+ return $aggregate;
+}
+
+sub run_test_harness {
+ my ($self, $tests) = @_;
+ require Test::Harness;
+ my $p = $self->{properties};
+ my @harness_switches = $self->harness_switches;
+
+ # Work around a Test::Harness bug that loses the particular perl
+ # we're running under. $self->perl is trustworthy, but $^X isn't.
+ local $^X = $self->perl;
+
+ # Do everything in our power to work with all versions of Test::Harness
+ local $Test::Harness::switches = join ' ', grep defined, $Test::Harness::switches, @harness_switches;
+ local $Test::Harness::Switches = join ' ', grep defined, $Test::Harness::Switches, @harness_switches;
+ local $ENV{HARNESS_PERL_SWITCHES} = join ' ', grep defined, $ENV{HARNESS_PERL_SWITCHES}, @harness_switches;
+
+ $Test::Harness::switches = undef unless length $Test::Harness::switches;
+ $Test::Harness::Switches = undef unless length $Test::Harness::Switches;
+ delete $ENV{HARNESS_PERL_SWITCHES} unless length $ENV{HARNESS_PERL_SWITCHES};
+
+ local ($Test::Harness::verbose,
+ $Test::Harness::Verbose,
+ $ENV{TEST_VERBOSE},
+ $ENV{HARNESS_VERBOSE}) = ($p->{verbose} || 0) x 4;
+
+ Test::Harness::runtests(@$tests);
+}
+
+sub run_visual_script {
+ my $self = shift;
+ # This will get run and the user will see the output. It doesn't
+ # emit Test::Harness-style output.
+ $self->run_perl_script('visual.pl', '-Mblib='.$self->blib)
+ if -e 'visual.pl';
+}
+
+sub harness_switches {
+ shift->{properties}{debugger} ? qw(-w -d) : ();
+}
+
+sub test_files {
+ my $self = shift;
+ my $p = $self->{properties};
+ if (@_) {
+ return $p->{test_files} = (@_ == 1 ? shift : [@_]);
+ }
+ return $self->find_test_files;
+}
+
+sub expand_test_dir {
+ my ($self, $dir) = @_;
+ my $exts = $self->{properties}{test_file_exts};
+
+ return sort map { @{$self->rscan_dir($dir, qr{^[^.].*\Q$_\E$})} } @$exts
+ if $self->recursive_test_files;
+
+ return sort map { glob File::Spec->catfile($dir, "*$_") } @$exts;
+}
+
+sub ACTION_testdb {
+ my ($self) = @_;
+ local $self->{properties}{debugger} = 1;
+ $self->depends_on('test');
+}
+
+sub ACTION_testcover {
+ my ($self) = @_;
+
+ unless (Module::Build::ModuleInfo->find_module_by_name('Devel::Cover')) {
+ warn("Cannot run testcover action unless Devel::Cover is installed.\n");
+ return;
+ }
+
+ $self->add_to_cleanup('coverage', 'cover_db');
+ $self->depends_on('code');
+
+ # See whether any of the *.pm files have changed since last time
+ # testcover was run. If so, start over.
+ if (-e 'cover_db') {
+ my $pm_files = $self->rscan_dir
+ (File::Spec->catdir($self->blib, 'lib'), file_qr('\.pm$') );
+ my $cover_files = $self->rscan_dir('cover_db', sub {-f $_ and not /\.html$/});
+
+ $self->do_system(qw(cover -delete))
+ unless $self->up_to_date($pm_files, $cover_files)
+ && $self->up_to_date($self->test_files, $cover_files);
+ }
+
+ local $Test::Harness::switches =
+ local $Test::Harness::Switches =
+ local $ENV{HARNESS_PERL_SWITCHES} = "-MDevel::Cover";
+
+ $self->depends_on('test');
+ $self->do_system('cover');
+}
+
+sub ACTION_code {
+ my ($self) = @_;
+
+ # All installable stuff gets created in blib/ .
+ # Create blib/arch to keep blib.pm happy
+ my $blib = $self->blib;
+ $self->add_to_cleanup($blib);
+ File::Path::mkpath( File::Spec->catdir($blib, 'arch') );
+
+ if (my $split = $self->autosplit) {
+ $self->autosplit_file($_, $blib) for ref($split) ? @$split : ($split);
+ }
+
+ foreach my $element (@{$self->build_elements}) {
+ my $method = "process_${element}_files";
+ $method = "process_files_by_extension" unless $self->can($method);
+ $self->$method($element);
+ }
+
+ $self->depends_on('config_data');
+}
+
+sub ACTION_build {
+ my $self = shift;
+ $self->log_info("Building " . $self->dist_name . "\n");
+ $self->depends_on('code');
+ $self->depends_on('docs');
+}
+
+sub process_files_by_extension {
+ my ($self, $ext) = @_;
+
+ my $method = "find_${ext}_files";
+ my $files = $self->can($method) ? $self->$method() : $self->_find_file_by_type($ext, 'lib');
+
+ while (my ($file, $dest) = each %$files) {
+ $self->copy_if_modified(from => $file, to => File::Spec->catfile($self->blib, $dest) );
+ }
+}
+
+sub process_support_files {
+ my $self = shift;
+ my $p = $self->{properties};
+ return unless $p->{c_source};
+
+ push @{$p->{include_dirs}}, $p->{c_source};
+
+ my $files = $self->rscan_dir($p->{c_source}, file_qr('\.c(c|p|pp|xx|\+\+)?$'));
+ foreach my $file (@$files) {
+ push @{$p->{objects}}, $self->compile_c($file);
+ }
+}
+
+sub process_share_dir_files {
+ my $self = shift;
+ my $files = $self->_find_share_dir_files;
+ return unless $files;
+
+ # root for all File::ShareDir paths
+ my $share_prefix = File::Spec->catdir($self->blib, qw/lib auto share/);
+
+ # copy all share files to blib
+ while (my ($file, $dest) = each %$files) {
+ $self->copy_if_modified(
+ from => $file, to => File::Spec->catfile( $share_prefix, $dest )
+ );
+ }
+}
+
+sub _find_share_dir_files {
+ my $self = shift;
+ my $share_dir = $self->share_dir;
+ return unless $share_dir;
+
+ my @file_map;
+ if ( $share_dir->{dist} ) {
+ my $prefix = "dist/".$self->dist_name;
+ push @file_map, $self->_share_dir_map( $prefix, $share_dir->{dist} );
+ }
+
+ if ( $share_dir->{module} ) {
+ for my $mod ( keys %{ $share_dir->{module} } ) {
+ (my $altmod = $mod) =~ s{::}{-}g;
+ my $prefix = "module/$altmod";
+ push @file_map, $self->_share_dir_map($prefix, $share_dir->{module}{$mod});
+ }
+ }
+
+ return { @file_map };
+}
+
+sub _share_dir_map {
+ my ($self, $prefix, $list) = @_;
+ my %files;
+ for my $dir ( @$list ) {
+ for my $f ( @{ $self->rscan_dir( $dir, sub {-f} )} ) {
+ $f =~ s{\A.*\Q$dir\E/}{};
+ $files{"$dir/$f"} = "$prefix/$f";
+ }
+ }
+ return %files;
+}
+
+sub process_PL_files {
+ my ($self) = @_;
+ my $files = $self->find_PL_files;
+
+ while (my ($file, $to) = each %$files) {
+ unless ($self->up_to_date( $file, $to )) {
+ $self->run_perl_script($file, [], [@$to]) or die "$file failed";
+ $self->add_to_cleanup(@$to);
+ }
+ }
+}
+
+sub process_xs_files {
+ my $self = shift;
+ my $files = $self->find_xs_files;
+ while (my ($from, $to) = each %$files) {
+ unless ($from eq $to) {
+ $self->add_to_cleanup($to);
+ $self->copy_if_modified( from => $from, to => $to );
+ }
+ $self->process_xs($to);
+ }
+}
+
+sub process_pod_files { shift()->process_files_by_extension(shift()) }
+sub process_pm_files { shift()->process_files_by_extension(shift()) }
+
+sub process_script_files {
+ my $self = shift;
+ my $files = $self->find_script_files;
+ return unless keys %$files;
+
+ my $script_dir = File::Spec->catdir($self->blib, 'script');
+ File::Path::mkpath( $script_dir );
+
+ foreach my $file (keys %$files) {
+ my $result = $self->copy_if_modified($file, $script_dir, 'flatten') or next;
+ $self->fix_shebang_line($result) unless $self->is_vmsish;
+ $self->make_executable($result);
+ }
+}
+
+sub find_PL_files {
+ my $self = shift;
+ if (my $files = $self->{properties}{PL_files}) {
+ # 'PL_files' is given as a Unix file spec, so we localize_file_path().
+
+ if (UNIVERSAL::isa($files, 'ARRAY')) {
+ return { map {$_, [/^(.*)\.PL$/]}
+ map $self->localize_file_path($_),
+ @$files };
+
+ } elsif (UNIVERSAL::isa($files, 'HASH')) {
+ my %out;
+ while (my ($file, $to) = each %$files) {
+ $out{ $self->localize_file_path($file) } = [ map $self->localize_file_path($_),
+ ref $to ? @$to : ($to) ];
+ }
+ return \%out;
+
+ } else {
+ die "'PL_files' must be a hash reference or array reference";
+ }
+ }
+
+ return unless -d 'lib';
+ return { map {$_, [/^(.*)\.PL$/i ]} @{ $self->rscan_dir('lib',
+ file_qr('\.PL$')) } };
+}
+
+sub find_pm_files { shift->_find_file_by_type('pm', 'lib') }
+sub find_pod_files { shift->_find_file_by_type('pod', 'lib') }
+sub find_xs_files { shift->_find_file_by_type('xs', 'lib') }
+
+sub find_script_files {
+ my $self = shift;
+ if (my $files = $self->script_files) {
+ # Always given as a Unix file spec. Values in the hash are
+ # meaningless, but we preserve if present.
+ return { map {$self->localize_file_path($_), $files->{$_}} keys %$files };
+ }
+
+ # No default location for script files
+ return {};
+}
+
+sub find_test_files {
+ my $self = shift;
+ my $p = $self->{properties};
+
+ if (my $files = $p->{test_files}) {
+ $files = [keys %$files] if UNIVERSAL::isa($files, 'HASH');
+ $files = [map { -d $_ ? $self->expand_test_dir($_) : $_ }
+ map glob,
+ $self->split_like_shell($files)];
+
+ # Always given as a Unix file spec.
+ return [ map $self->localize_file_path($_), @$files ];
+
+ } else {
+ # Find all possible tests in t/ or test.pl
+ my @tests;
+ push @tests, 'test.pl' if -e 'test.pl';
+ push @tests, $self->expand_test_dir('t') if -e 't' and -d _;
+ return \@tests;
+ }
+}
+
+sub _find_file_by_type {
+ my ($self, $type, $dir) = @_;
+
+ if (my $files = $self->{properties}{"${type}_files"}) {
+ # Always given as a Unix file spec
+ return { map $self->localize_file_path($_), %$files };
+ }
+
+ return {} unless -d $dir;
+ return { map {$_, $_}
+ map $self->localize_file_path($_),
+ grep !/\.\#/,
+ @{ $self->rscan_dir($dir, file_qr("\\.$type\$")) } };
+}
+
+sub localize_file_path {
+ my ($self, $path) = @_;
+ return File::Spec->catfile( split m{/}, $path );
+}
+
+sub localize_dir_path {
+ my ($self, $path) = @_;
+ return File::Spec->catdir( split m{/}, $path );
+}
+
+sub fix_shebang_line { # Adapted from fixin() in ExtUtils::MM_Unix 1.35
+ my ($self, @files) = @_;
+ my $c = ref($self) ? $self->{config} : 'Module::Build::Config';
+
+ my ($does_shbang) = $c->get('sharpbang') =~ /^\s*\#\!/;
+ for my $file (@files) {
+ my $FIXIN = IO::File->new($file) or die "Can't process '$file': $!";
+ local $/ = "\n";
+ chomp(my $line = <$FIXIN>);
+ next unless $line =~ s/^\s*\#!\s*//; # Not a shbang file.
+
+ my ($cmd, $arg) = (split(' ', $line, 2), '');
+ next unless $cmd =~ /perl/i;
+ my $interpreter = $self->{properties}{perl};
+
+ $self->log_verbose("Changing sharpbang in $file to $interpreter");
+ my $shb = '';
+ $shb .= $c->get('sharpbang')."$interpreter $arg\n" if $does_shbang;
+
+ # I'm not smart enough to know the ramifications of changing the
+ # embedded newlines here to \n, so I leave 'em in.
+ $shb .= qq{
+eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
+ if 0; # not running under some shell
+} unless $self->is_windowsish; # this won't work on win32, so don't
+
+ my $FIXOUT = IO::File->new(">$file.new")
+ or die "Can't create new $file: $!\n";
+
+ # Print out the new #! line (or equivalent).
+ local $\;
+ undef $/; # Was localized above
+ print $FIXOUT $shb, <$FIXIN>;
+ close $FIXIN;
+ close $FIXOUT;
+
+ rename($file, "$file.bak")
+ or die "Can't rename $file to $file.bak: $!";
+
+ rename("$file.new", $file)
+ or die "Can't rename $file.new to $file: $!";
+
+ $self->delete_filetree("$file.bak")
+ or $self->log_warn("Couldn't clean up $file.bak, leaving it there");
+
+ $self->do_system($c->get('eunicefix'), $file) if $c->get('eunicefix') ne ':';
+ }
+}
+
+
+sub ACTION_testpod {
+ my $self = shift;
+ $self->depends_on('docs');
+
+ eval q{use Test::Pod 0.95; 1}
+ or die "The 'testpod' action requires Test::Pod version 0.95";
+
+ my @files = sort keys %{$self->_find_pods($self->libdoc_dirs)},
+ keys %{$self->_find_pods
+ ($self->bindoc_dirs,
+ exclude => [ file_qr('\.bat$') ])}
+ or die "Couldn't find any POD files to test\n";
+
+ { package # hide from PAUSE
+ Module::Build::PodTester; # Don't want to pollute the main namespace
+ Test::Pod->import( tests => scalar @files );
+ pod_file_ok($_) foreach @files;
+ }
+}
+
+sub ACTION_testpodcoverage {
+ my $self = shift;
+
+ $self->depends_on('docs');
+
+ eval q{use Test::Pod::Coverage 1.00; 1}
+ or die "The 'testpodcoverage' action requires ",
+ "Test::Pod::Coverage version 1.00";
+
+ # TODO this needs test coverage!
+
+ # XXX work-around a bug in Test::Pod::Coverage previous to v1.09
+ # Make sure we test the module in blib/
+ local @INC = @INC;
+ my $p = $self->{properties};
+ unshift(@INC,
+ # XXX any reason to include arch?
+ File::Spec->catdir($p->{base_dir}, $self->blib, 'lib'),
+ #File::Spec->catdir($p->{base_dir}, $self->blib, 'arch')
+ );
+
+ all_pod_coverage_ok();
+}
+
+sub ACTION_docs {
+ my $self = shift;
+
+ $self->depends_on('code');
+ $self->depends_on('manpages', 'html');
+}
+
+# Given a file type, will return true if the file type would normally
+# be installed when neither install-base nor prefix has been set.
+# I.e. it will be true only if the path is set from Config.pm or
+# set explicitly by the user via install-path.
+sub _is_default_installable {
+ my $self = shift;
+ my $type = shift;
+ return ( $self->install_destination($type) &&
+ ( $self->install_path($type) ||
+ $self->install_sets($self->installdirs)->{$type} )
+ ) ? 1 : 0;
+}
+
+sub ACTION_manpages {
+ my $self = shift;
+
+ return unless $self->_mb_feature('manpage_support');
+
+ $self->depends_on('code');
+
+ foreach my $type ( qw(bin lib) ) {
+ my $files = $self->_find_pods( $self->{properties}{"${type}doc_dirs"},
+ exclude => [ file_qr('\.bat$') ] );
+ next unless %$files;
+
+ my $sub = $self->can("manify_${type}_pods");
+ next unless defined( $sub );
+
+ if ( $self->invoked_action eq 'manpages' ) {
+ $self->$sub();
+ } elsif ( $self->_is_default_installable("${type}doc") ) {
+ $self->$sub();
+ }
+ }
+
+}
+
+sub manify_bin_pods {
+ my $self = shift;
+
+ my $files = $self->_find_pods( $self->{properties}{bindoc_dirs},
+ exclude => [ file_qr('\.bat$') ] );
+ return unless keys %$files;
+
+ my $mandir = File::Spec->catdir( $self->blib, 'bindoc' );
+ File::Path::mkpath( $mandir, 0, oct(777) );
+
+ require Pod::Man;
+ foreach my $file (keys %$files) {
+ # Pod::Simple based parsers only support one document per instance.
+ # This is expected to change in a future version (Pod::Simple > 3.03).
+ my $parser = Pod::Man->new( section => 1 ); # binaries go in section 1
+ my $manpage = $self->man1page_name( $file ) . '.' .
+ $self->config( 'man1ext' );
+ my $outfile = File::Spec->catfile($mandir, $manpage);
+ next if $self->up_to_date( $file, $outfile );
+ $self->log_verbose("Manifying $file -> $outfile\n");
+ eval { $parser->parse_from_file( $file, $outfile ); 1 }
+ or $self->log_warn("Error creating '$outfile': $@\n");
+ $files->{$file} = $outfile;
+ }
+}
+
+sub manify_lib_pods {
+ my $self = shift;
+
+ my $files = $self->_find_pods($self->{properties}{libdoc_dirs});
+ return unless keys %$files;
+
+ my $mandir = File::Spec->catdir( $self->blib, 'libdoc' );
+ File::Path::mkpath( $mandir, 0, oct(777) );
+
+ require Pod::Man;
+ while (my ($file, $relfile) = each %$files) {
+ # Pod::Simple based parsers only support one document per instance.
+ # This is expected to change in a future version (Pod::Simple > 3.03).
+ my $parser = Pod::Man->new( section => 3 ); # libraries go in section 3
+ my $manpage = $self->man3page_name( $relfile ) . '.' .
+ $self->config( 'man3ext' );
+ my $outfile = File::Spec->catfile( $mandir, $manpage);
+ next if $self->up_to_date( $file, $outfile );
+ $self->log_verbose("Manifying $file -> $outfile\n");
+ eval { $parser->parse_from_file( $file, $outfile ); 1 }
+ or $self->log_warn("Error creating '$outfile': $@\n");
+ $files->{$file} = $outfile;
+ }
+}
+
+sub _find_pods {
+ my ($self, $dirs, %args) = @_;
+ my %files;
+ foreach my $spec (@$dirs) {
+ my $dir = $self->localize_dir_path($spec);
+ next unless -e $dir;
+
+ FILE: foreach my $file ( @{ $self->rscan_dir( $dir ) } ) {
+ foreach my $regexp ( @{ $args{exclude} } ) {
+ next FILE if $file =~ $regexp;
+ }
+ $files{$file} = File::Spec->abs2rel($file, $dir) if $self->contains_pod( $file )
+ }
+ }
+ return \%files;
+}
+
+sub contains_pod {
+ my ($self, $file) = @_;
+ return '' unless -T $file; # Only look at text files
+
+ my $fh = IO::File->new( $file ) or die "Can't open $file: $!";
+ while (my $line = <$fh>) {
+ return 1 if $line =~ /^\=(?:head|pod|item)/;
+ }
+
+ return '';
+}
+
+sub ACTION_html {
+ my $self = shift;
+
+ return unless $self->_mb_feature('HTML_support');
+
+ $self->depends_on('code');
+
+ foreach my $type ( qw(bin lib) ) {
+ my $files = $self->_find_pods( $self->{properties}{"${type}doc_dirs"},
+ exclude =>
+ [ file_qr('\.(?:bat|com|html)$') ] );
+ next unless %$files;
+
+ if ( $self->invoked_action eq 'html' ) {
+ $self->htmlify_pods( $type );
+ } elsif ( $self->_is_default_installable("${type}html") ) {
+ $self->htmlify_pods( $type );
+ }
+ }
+
+}
+
+
+# 1) If it's an ActiveState perl install, we need to run
+# ActivePerl::DocTools->UpdateTOC;
+# 2) Links to other modules are not being generated
+sub htmlify_pods {
+ my $self = shift;
+ my $type = shift;
+ my $htmldir = shift || File::Spec->catdir($self->blib, "${type}html");
+
+ require Module::Build::PodParser;
+ require Pod::Html;
+
+ $self->add_to_cleanup('pod2htm*');
+
+ my $pods = $self->_find_pods( $self->{properties}{"${type}doc_dirs"},
+ exclude => [ file_qr('\.(?:bat|com|html)$') ] );
+ return unless %$pods; # nothing to do
+
+ unless ( -d $htmldir ) {
+ File::Path::mkpath($htmldir, 0, oct(755))
+ or die "Couldn't mkdir $htmldir: $!";
+ }
+
+ my @rootdirs = ($type eq 'bin') ? qw(bin) :
+ $self->installdirs eq 'core' ? qw(lib) : qw(site lib);
+
+ my $podpath = join ':',
+ map $_->[1],
+ grep -e $_->[0],
+ map [File::Spec->catdir($self->blib, $_), $_],
+ qw( script lib );
+
+ foreach my $pod ( keys %$pods ) {
+
+ my ($name, $path) = File::Basename::fileparse($pods->{$pod},
+ file_qr('\.(?:pm|plx?|pod)$'));
+ my @dirs = File::Spec->splitdir( File::Spec->canonpath( $path ) );
+ pop( @dirs ) if scalar(@dirs) && $dirs[-1] eq File::Spec->curdir;
+
+ my $fulldir = File::Spec->catfile($htmldir, @rootdirs, @dirs);
+ my $outfile = File::Spec->catfile($fulldir, "${name}.html");
+ my $infile = File::Spec->abs2rel($pod);
+
+ next if $self->up_to_date($infile, $outfile);
+
+ unless ( -d $fulldir ){
+ File::Path::mkpath($fulldir, 0, oct(755))
+ or die "Couldn't mkdir $fulldir: $!";
+ }
+
+ my $path2root = join( '/', ('..') x (@rootdirs+@dirs) );
+ my $htmlroot = join( '/',
+ ($path2root,
+ $self->installdirs eq 'core' ? () : qw(site) ) );
+
+ my $fh = IO::File->new($infile) or die "Can't read $infile: $!";
+ my $abstract = Module::Build::PodParser->new(fh => $fh)->get_abstract();
+
+ my $title = join( '::', (@dirs, $name) );
+ $title .= " - $abstract" if $abstract;
+
+ my @opts = (
+ '--flush',
+ "--title=$title",
+ "--podpath=$podpath",
+ "--infile=$infile",
+ "--outfile=$outfile",
+ '--podroot=' . $self->blib,
+ "--htmlroot=$htmlroot",
+ );
+
+ if ( eval{Pod::Html->VERSION(1.03)} ) {
+ push( @opts, ('--header', '--backlink=Back to Top') );
+ push( @opts, "--css=$path2root/" . $self->html_css) if $self->html_css;
+ }
+
+ $self->log_verbose("HTMLifying $infile -> $outfile\n");
+ $self->log_verbose("pod2html @opts\n");
+ eval { Pod::Html::pod2html(@opts); 1 }
+ or $self->log_warn("pod2html @opts failed: $@");
+ }
+
+}
+
+# Adapted from ExtUtils::MM_Unix
+sub man1page_name {
+ my $self = shift;
+ return File::Basename::basename( shift );
+}
+
+# Adapted from ExtUtils::MM_Unix and Pod::Man
+# Depending on M::B's dependency policy, it might make more sense to refactor
+# Pod::Man::begin_pod() to extract a name() methods, and use them...
+# -spurkis
+sub man3page_name {
+ my $self = shift;
+ my ($vol, $dirs, $file) = File::Spec->splitpath( shift );
+ my @dirs = File::Spec->splitdir( File::Spec->canonpath($dirs) );
+
+ # Remove known exts from the base name
+ $file =~ s/\.p(?:od|m|l)\z//i;
+
+ return join( $self->manpage_separator, @dirs, $file );
+}
+
+sub manpage_separator {
+ return '::';
+}
+
+# For systems that don't have 'diff' executable, should use Algorithm::Diff
+sub ACTION_diff {
+ my $self = shift;
+ $self->depends_on('build');
+ my $local_lib = File::Spec->rel2abs('lib');
+ my @myINC = grep {$_ ne $local_lib} @INC;
+
+ # The actual install destination might not be in @INC, so check there too.
+ push @myINC, map $self->install_destination($_), qw(lib arch);
+
+ my @flags = @{$self->{args}{ARGV}};
+ @flags = $self->split_like_shell($self->{args}{flags} || '') unless @flags;
+
+ my $installmap = $self->install_map;
+ delete $installmap->{read};
+ delete $installmap->{write};
+
+ my $text_suffix = file_qr('\.(pm|pod)$');
+
+ while (my $localdir = each %$installmap) {
+ my @localparts = File::Spec->splitdir($localdir);
+ my $files = $self->rscan_dir($localdir, sub {-f});
+
+ foreach my $file (@$files) {
+ my @parts = File::Spec->splitdir($file);
+ @parts = @parts[@localparts .. $#parts]; # Get rid of blib/lib or similar
+
+ my $installed = Module::Build::ModuleInfo->find_module_by_name(
+ join('::', @parts), \@myINC );
+ if (not $installed) {
+ print "Only in lib: $file\n";
+ next;
+ }
+
+ my $status = File::Compare::compare($installed, $file);
+ next if $status == 0; # Files are the same
+ die "Can't compare $installed and $file: $!" if $status == -1;
+
+ if ($file =~ $text_suffix) {
+ $self->do_system('diff', @flags, $installed, $file);
+ } else {
+ print "Binary files $file and $installed differ\n";
+ }
+ }
+ }
+}
+
+sub ACTION_pure_install {
+ shift()->depends_on('install');
+}
+
+sub ACTION_install {
+ my ($self) = @_;
+ require ExtUtils::Install;
+ $self->depends_on('build');
+ ExtUtils::Install::install($self->install_map, $self->verbose, 0, $self->{args}{uninst}||0);
+}
+
+sub ACTION_fakeinstall {
+ my ($self) = @_;
+ require ExtUtils::Install;
+ my $eui_version = ExtUtils::Install->VERSION;
+ if ( $eui_version < 1.32 ) {
+ $self->log_warn(
+ "The 'fakeinstall' action requires Extutils::Install 1.32 or later.\n"
+ . "(You only have version $eui_version)."
+ );
+ return;
+ }
+ $self->depends_on('build');
+ ExtUtils::Install::install($self->install_map, !$self->quiet, 1, $self->{args}{uninst}||0);
+}
+
+sub ACTION_versioninstall {
+ my ($self) = @_;
+
+ die "You must have only.pm 0.25 or greater installed for this operation: $@\n"
+ unless eval { require only; 'only'->VERSION(0.25); 1 };
+
+ $self->depends_on('build');
+
+ my %onlyargs = map {exists($self->{args}{$_}) ? ($_ => $self->{args}{$_}) : ()}
+ qw(version versionlib);
+ only::install::install(%onlyargs);
+}
+
+sub ACTION_installdeps {
+ my ($self) = @_;
+
+ # XXX include feature prerequisites as optional prereqs?
+
+ my $info = $self->_enum_prereqs;
+ if (! $info ) {
+ $self->log_info( "No prerequisites detected\n" );
+ return;
+ }
+
+ my $failures = $self->prereq_failures($info);
+ if ( ! $failures ) {
+ $self->log_info( "All prerequisites satisfied\n" );
+ return;
+ }
+
+ my @install;
+ while (my ($type, $prereqs) = each %$failures) {
+ if($type =~ m/^(?:\w+_)?requires$/) {
+ push(@install, keys %$prereqs);
+ next;
+ }
+ $self->log_info("Checking optional dependencies:\n");
+ while (my ($module, $status) = each %$prereqs) {
+ push(@install, $module) if($self->y_n("Install $module?", 'y'));
+ }
+ }
+
+ return unless @install;
+
+ my ($command, @opts) = $self->split_like_shell($self->cpan_client);
+
+ # relative command should be relative to our active Perl
+ # so we need to locate that command
+ if ( ! File::Spec->file_name_is_absolute( $command ) ) {
+ my @bindirs = File::Basename::dirname($self->perl);
+ push @bindirs, map {$self->config->{"install${_}bin"}} '','site','vendor';
+ for my $d ( @bindirs ) {
+ my $abs_cmd = $self->find_command(File::Spec->catfile( $d, $command ));
+ if ( defined $abs_cmd ) {
+ $command = $abs_cmd;
+ last;
+ }
+ }
+ }
+
+ if ( ! -x $command ) {
+ die "cpan_client '$command' is not executable\n";
+ }
+
+ $self->do_system($command, @opts, @install);
+}
+
+sub ACTION_clean {
+ my ($self) = @_;
+ $self->log_info("Cleaning up build files\n");
+ foreach my $item (map glob($_), $self->cleanup) {
+ $self->delete_filetree($item);
+ }
+}
+
+sub ACTION_realclean {
+ my ($self) = @_;
+ $self->depends_on('clean');
+ $self->log_info("Cleaning up configuration files\n");
+ $self->delete_filetree(
+ $self->config_dir, $self->mymetafile, $self->build_script
+ );
+}
+
+sub ACTION_ppd {
+ my ($self) = @_;
+
+ require Module::Build::PPMMaker;
+ my $ppd = Module::Build::PPMMaker->new();
+ my $file = $ppd->make_ppd(%{$self->{args}}, build => $self);
+ $self->add_to_cleanup($file);
+}
+
+sub ACTION_ppmdist {
+ my ($self) = @_;
+
+ $self->depends_on( 'build' );
+
+ my $ppm = $self->ppm_name;
+ $self->delete_filetree( $ppm );
+ $self->log_info( "Creating $ppm\n" );
+ $self->add_to_cleanup( $ppm, "$ppm.tar.gz" );
+
+ my %types = ( # translate types/dirs to those expected by ppm
+ lib => 'lib',
+ arch => 'arch',
+ bin => 'bin',
+ script => 'script',
+ bindoc => 'man1',
+ libdoc => 'man3',
+ binhtml => undef,
+ libhtml => undef,
+ );
+
+ foreach my $type ($self->install_types) {
+ next if exists( $types{$type} ) && !defined( $types{$type} );
+
+ my $dir = File::Spec->catdir( $self->blib, $type );
+ next unless -e $dir;
+
+ my $files = $self->rscan_dir( $dir );
+ foreach my $file ( @$files ) {
+ next unless -f $file;
+ my $rel_file =
+ File::Spec->abs2rel( File::Spec->rel2abs( $file ),
+ File::Spec->rel2abs( $dir ) );
+ my $to_file =
+ File::Spec->catfile( $ppm, 'blib',
+ exists( $types{$type} ) ? $types{$type} : $type,
+ $rel_file );
+ $self->copy_if_modified( from => $file, to => $to_file );
+ }
+ }
+
+ foreach my $type ( qw(bin lib) ) {
+ local $self->{properties}{html_css} = 'Active.css';
+ $self->htmlify_pods( $type, File::Spec->catdir($ppm, 'blib', 'html') );
+ }
+
+ # create a tarball;
+ # the directory tar'ed must be blib so we need to do a chdir first
+ my $target = File::Spec->catfile( File::Spec->updir, $ppm );
+ $self->_do_in_dir( $ppm, sub { $self->make_tarball( 'blib', $target ) } );
+
+ $self->depends_on( 'ppd' );
+
+ $self->delete_filetree( $ppm );
+}
+
+sub ACTION_pardist {
+ my ($self) = @_;
+
+ # Need PAR::Dist
+ if ( not eval { require PAR::Dist; PAR::Dist->VERSION(0.17) } ) {
+ $self->log_warn(
+ "In order to create .par distributions, you need to\n"
+ . "install PAR::Dist first."
+ );
+ return();
+ }
+
+ $self->depends_on( 'build' );
+
+ return PAR::Dist::blib_to_par(
+ name => $self->dist_name,
+ version => $self->dist_version,
+ );
+}
+
+sub ACTION_dist {
+ my ($self) = @_;
+
+ $self->depends_on('distdir');
+
+ my $dist_dir = $self->dist_dir;
+
+ $self->make_tarball($dist_dir);
+ $self->delete_filetree($dist_dir);
+}
+
+sub ACTION_distcheck {
+ my ($self) = @_;
+
+ $self->_check_manifest_skip unless $self->invoked_action eq 'distclean';
+
+ require ExtUtils::Manifest;
+ local $^W; # ExtUtils::Manifest is not warnings clean.
+ my ($missing, $extra) = ExtUtils::Manifest::fullcheck();
+
+ return unless @$missing || @$extra;
+
+ my $msg = "MANIFEST appears to be out of sync with the distribution\n";
+ if ( $self->invoked_action eq 'distcheck' ) {
+ die $msg;
+ } else {
+ warn $msg;
+ }
+}
+
+sub _check_mymeta_skip {
+ my $self = shift;
+ my $maniskip = shift || 'MANIFEST.SKIP';
+
+ require ExtUtils::Manifest;
+ local $^W; # ExtUtils::Manifest is not warnings clean.
+
+ # older ExtUtils::Manifest had a private _maniskip
+ my $skip_factory = ExtUtils::Manifest->can('maniskip')
+ || ExtUtils::Manifest->can('_maniskip');
+
+ my $mymetafile = $self->mymetafile;
+ # we can't check it, just add it anyway to be safe
+ unless ( $skip_factory && $skip_factory->($maniskip)->($mymetafile) ) {
+ $self->log_warn("File '$maniskip' does not include '$mymetafile'. Adding it now.\n");
+ $self->_append_maniskip("^$mymetafile\$", $maniskip);
+ }
+}
+
+sub _add_to_manifest {
+ my ($self, $manifest, $lines) = @_;
+ $lines = [$lines] unless ref $lines;
+
+ my $existing_files = $self->_read_manifest($manifest);
+ return unless defined( $existing_files );
+
+ @$lines = grep {!exists $existing_files->{$_}} @$lines
+ or return;
+
+ my $mode = (stat $manifest)[2];
+ chmod($mode | oct(222), $manifest) or die "Can't make $manifest writable: $!";
+
+ my $fh = IO::File->new("< $manifest") or die "Can't read $manifest: $!";
+ my $last_line = (<$fh>)[-1] || "\n";
+ my $has_newline = $last_line =~ /\n$/;
+ $fh->close;
+
+ $fh = IO::File->new(">> $manifest") or die "Can't write to $manifest: $!";
+ print $fh "\n" unless $has_newline;
+ print $fh map "$_\n", @$lines;
+ close $fh;
+ chmod($mode, $manifest);
+
+ $self->log_verbose(map "Added to $manifest: $_\n", @$lines);
+}
+
+sub _sign_dir {
+ my ($self, $dir) = @_;
+
+ unless (eval { require Module::Signature; 1 }) {
+ $self->log_warn("Couldn't load Module::Signature for 'distsign' action:\n $@\n");
+ return;
+ }
+
+ # Add SIGNATURE to the MANIFEST
+ {
+ my $manifest = File::Spec->catfile($dir, 'MANIFEST');
+ die "Signing a distribution requires a MANIFEST file" unless -e $manifest;
+ $self->_add_to_manifest($manifest, "SIGNATURE Added here by Module::Build");
+ }
+
+ # Would be nice if Module::Signature took a directory argument.
+
+ $self->_do_in_dir($dir, sub {local $Module::Signature::Quiet = 1; Module::Signature::sign()});
+}
+
+sub _do_in_dir {
+ my ($self, $dir, $do) = @_;
+
+ my $start_dir = $self->cwd;
+ chdir $dir or die "Can't chdir() to $dir: $!";
+ eval {$do->()};
+ my @err = $@ ? ($@) : ();
+ chdir $start_dir or push @err, "Can't chdir() back to $start_dir: $!";
+ die join "\n", @err if @err;
+}
+
+sub ACTION_distsign {
+ my ($self) = @_;
+ {
+ local $self->{properties}{sign} = 0; # We'll sign it ourselves
+ $self->depends_on('distdir') unless -d $self->dist_dir;
+ }
+ $self->_sign_dir($self->dist_dir);
+}
+
+sub ACTION_skipcheck {
+ my ($self) = @_;
+
+ require ExtUtils::Manifest;
+ local $^W; # ExtUtils::Manifest is not warnings clean.
+ ExtUtils::Manifest::skipcheck();
+}
+
+sub ACTION_distclean {
+ my ($self) = @_;
+
+ $self->depends_on('realclean');
+ $self->depends_on('distcheck');
+}
+
+sub do_create_makefile_pl {
+ my $self = shift;
+ require Module::Build::Compat;
+ $self->log_info("Creating Makefile.PL\n");
+ Module::Build::Compat->create_makefile_pl($self->create_makefile_pl, $self, @_);
+ $self->_add_to_manifest('MANIFEST', 'Makefile.PL');
+}
+
+sub do_create_license {
+ my $self = shift;
+ $self->log_info("Creating LICENSE file\n");
+
+ if ( ! $self->_mb_feature('license_creation') ) {
+ $self->_warn_mb_feature_deps('license_creation');
+ die "Aborting.\n";
+ }
+
+ my $l = $self->license
+ or die "No license specified";
+
+ my $key = $self->valid_licenses->{$l}
+ or die "'$l' isn't a license key we know about";
+ my $class = "Software::License::$key";
+
+ eval "use $class; 1"
+ or die "Can't load Software::License::$key to create LICENSE file: $@";
+
+ $self->delete_filetree('LICENSE');
+
+ my $author = join " & ", @{ $self->dist_author };
+ my $license = $class->new({holder => $author});
+ my $fh = IO::File->new('> LICENSE')
+ or die "Can't write LICENSE file: $!";
+ print $fh $license->fulltext;
+ close $fh;
+
+ $self->_add_to_manifest('MANIFEST', 'LICENSE');
+}
+
+sub do_create_readme {
+ my $self = shift;
+ $self->delete_filetree('README');
+
+ my $docfile = $self->_main_docfile;
+ unless ( $docfile ) {
+ $self->log_warn(<<EOF);
+Cannot create README: can't determine which file contains documentation;
+Must supply either 'dist_version_from', or 'module_name' parameter.
+EOF
+ return;
+ }
+
+ # work around some odd Pod::Readme->new() failures in test reports by
+ # confirming that new() is available
+ if ( eval {require Pod::Readme; Pod::Readme->can('new') } ) {
+ $self->log_info("Creating README using Pod::Readme\n");
+
+ my $parser = Pod::Readme->new;
+ $parser->parse_from_file($docfile, 'README', @_);
+
+ } elsif ( eval {require Pod::Text; 1} ) {
+ $self->log_info("Creating README using Pod::Text\n");
+
+ my $fh = IO::File->new('> README');
+ if ( defined($fh) ) {
+ local $^W = 0;
+ no strict "refs";
+
+ # work around bug in Pod::Text 3.01, which expects
+ # Pod::Simple::parse_file to take input and output filehandles
+ # when it actually only takes an input filehandle
+
+ my $old_parse_file;
+ $old_parse_file = \&{"Pod::Simple::parse_file"}
+ and
+ local *{"Pod::Simple::parse_file"} = sub {
+ my $self = shift;
+ $self->output_fh($_[1]) if $_[1];
+ $self->$old_parse_file($_[0]);
+ }
+ if $Pod::Text::VERSION
+ == 3.01; # Split line to avoid evil version-finder
+
+ Pod::Text::pod2text( $docfile, $fh );
+
+ $fh->close;
+ } else {
+ $self->log_warn(
+ "Cannot create 'README' file: Can't open file for writing\n" );
+ return;
+ }
+
+ } else {
+ $self->log_warn("Can't load Pod::Readme or Pod::Text to create README\n");
+ return;
+ }
+
+ $self->_add_to_manifest('MANIFEST', 'README');
+}
+
+sub _main_docfile {
+ my $self = shift;
+ if ( my $pm_file = $self->dist_version_from ) {
+ (my $pod_file = $pm_file) =~ s/.pm$/.pod/;
+ return (-e $pod_file ? $pod_file : $pm_file);
+ } else {
+ return undef;
+ }
+}
+
+sub do_create_bundle_inc {
+ my $self = shift;
+ my $dist_inc = File::Spec->catdir( $self->dist_dir, 'inc' );
+ require inc::latest;
+ inc::latest->write($dist_inc, @{$self->bundle_inc_preload});
+ inc::latest->bundle_module($_, $dist_inc) for @{$self->bundle_inc};
+ return 1;
+}
+
+sub ACTION_distdir {
+ my ($self) = @_;
+
+ if ( @{$self->bundle_inc} && ! $self->_mb_feature('inc_bundling_support') ) {
+ $self->_warn_mb_feature_deps('inc_bundling_support');
+ die "Aborting.\n";
+ }
+
+ $self->depends_on('distmeta');
+
+ # Must not include MYMETA
+ $self->_check_mymeta_skip('MANIFEST.SKIP');
+
+ my $dist_files = $self->_read_manifest('MANIFEST')
+ or die "Can't create distdir without a MANIFEST file - run 'manifest' action first.\n";
+ delete $dist_files->{SIGNATURE}; # Don't copy, create a fresh one
+ die "No files found in MANIFEST - try running 'manifest' action?\n"
+ unless ($dist_files and keys %$dist_files);
+ my $metafile = $self->metafile;
+ $self->log_warn("*** Did you forget to add $metafile to the MANIFEST?\n")
+ unless exists $dist_files->{$metafile};
+
+ my $dist_dir = $self->dist_dir;
+ $self->delete_filetree($dist_dir);
+ $self->log_info("Creating $dist_dir\n");
+ $self->add_to_cleanup($dist_dir);
+
+ foreach my $file (keys %$dist_files) {
+ my $new = $self->copy_if_modified(from => $file, to_dir => $dist_dir, verbose => 0);
+ }
+
+ $self->do_create_bundle_inc if @{$self->bundle_inc};
+
+ $self->_sign_dir($dist_dir) if $self->{properties}{sign};
+}
+
+sub ACTION_disttest {
+ my ($self) = @_;
+
+ $self->depends_on('distdir');
+
+ $self->_do_in_dir
+ ( $self->dist_dir,
+ sub {
+ # XXX could be different names for scripts
+
+ $self->run_perl_script('Build.PL') # XXX Should this be run w/ --nouse-rcfile
+ or die "Error executing 'Build.PL' in dist directory: $!";
+ $self->run_perl_script('Build')
+ or die "Error executing 'Build' in dist directory: $!";
+ $self->run_perl_script('Build', [], ['test'])
+ or die "Error executing 'Build test' in dist directory";
+ });
+}
+
+
+=begin private
+
+ my $has_include = $build->_eumanifest_has_include;
+
+Returns true if the installed version of ExtUtils::Manifest supports
+#include and #include_default directives. False otherwise.
+
+=end private
+
+=cut
+
+# #!include and #!include_default were added in 1.50
+sub _eumanifest_has_include {
+ my $self = shift;
+
+ require ExtUtils::Manifest;
+ return eval { ExtUtils::Manifest->VERSION(1.50); 1 };
+}
+
+
+=begin private
+
+ my $maniskip_file = $build->_default_maniskip;
+
+Returns the location of the installed MANIFEST.SKIP file used by
+default.
+
+=end private
+
+=cut
+
+sub _default_maniskip {
+ my $self = shift;
+
+ my $default_maniskip;
+ for my $dir (@INC) {
+ $default_maniskip = File::Spec->catfile($dir, "ExtUtils", "MANIFEST.SKIP");
+ last if -r $default_maniskip;
+ }
+
+ return $default_maniskip;
+}
+
+
+=begin private
+
+ my $content = $build->_slurp($file);
+
+Reads $file and returns the $content.
+
+=end private
+
+=cut
+
+sub _slurp {
+ my $self = shift;
+ my $file = shift;
+ open my $fh, "<", $file or croak "Can't open $file: $!";
+ local $/;
+ return <$fh>;
+}
+
+
+
+sub _append_maniskip {
+ my $self = shift;
+ my $skip = shift;
+ my $file = shift || 'MANIFEST.SKIP';
+ return unless defined $skip && length $skip;
+ my $fh = IO::File->new(">> $file")
+ or die "Can't open $file: $!";
+
+ print $fh "$skip\n";
+ $fh->close();
+}
+
+sub _write_default_maniskip {
+ my $self = shift;
+ my $file = shift || 'MANIFEST.SKIP';
+ my $fh = IO::File->new("> $file")
+ or die "Can't open $file: $!";
+
+ my $content = $self->_eumanifest_has_include ? "#!include_default\n"
+ : $self->_slurp( $self->_default_maniskip );
+
+ $content .= <<'EOF';
+# Avoid configuration metadata file
+^MYMETA\.
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\bBuild.bat$
+\b_build
+\bBuild.COM$
+\bBUILD.COM$
+\bbuild.com$
+^MANIFEST\.SKIP
+
+# Avoid archives of this distribution
+EOF
+
+ # Skip, for example, 'Module-Build-0.27.tar.gz'
+ $content .= '\b'.$self->dist_name.'-[\d\.\_]+'."\n";
+
+ print $fh $content;
+
+ return;
+}
+
+sub _check_manifest_skip {
+ my ($self) = @_;
+
+ my $maniskip = 'MANIFEST.SKIP';
+
+ if ( ! -e $maniskip ) {
+ $self->log_warn("File '$maniskip' does not exist: Creating a temporary '$maniskip'\n");
+ $self->_write_default_maniskip($maniskip);
+ $self->add_to_cleanup($maniskip);
+ }
+ else {
+ # MYMETA must not be added to MANIFEST, so always confirm the skip
+ $self->_check_mymeta_skip( $maniskip );
+ }
+
+ return;
+}
+
+sub ACTION_manifest {
+ my ($self) = @_;
+
+ $self->_check_manifest_skip;
+
+ require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean.
+ local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
+ ExtUtils::Manifest::mkmanifest();
+}
+
+# Case insensitive regex for files
+sub file_qr {
+ return File::Spec->case_tolerant ? qr($_[0])i : qr($_[0]);
+}
+
+sub dist_dir {
+ my ($self) = @_;
+ return join "-", $self->dist_name, $self->dist_version;
+}
+
+sub ppm_name {
+ my $self = shift;
+ return 'PPM-' . $self->dist_dir;
+}
+
+sub _files_in {
+ my ($self, $dir) = @_;
+ return unless -d $dir;
+
+ local *DH;
+ opendir DH, $dir or die "Can't read directory $dir: $!";
+
+ my @files;
+ while (defined (my $file = readdir DH)) {
+ my $full_path = File::Spec->catfile($dir, $file);
+ next if -d $full_path;
+ push @files, $full_path;
+ }
+ return @files;
+}
+
+sub share_dir {
+ my $self = shift;
+ my $p = $self->{properties};
+
+ $p->{share_dir} = shift if @_;
+
+ # Always coerce to proper hash form
+ if ( ! defined $p->{share_dir} ) {
+ return;
+ }
+ elsif ( ! ref $p->{share_dir} ) {
+ # scalar -- treat as a single 'dist' directory
+ $p->{share_dir} = { dist => [ $p->{share_dir} ] };
+ }
+ elsif ( ref $p->{share_dir} eq 'ARRAY' ) {
+ # array -- treat as a list of 'dist' directories
+ $p->{share_dir} = { dist => $p->{share_dir} };
+ }
+ elsif ( ref $p->{share_dir} eq 'HASH' ) {
+ # hash -- check structure
+ my $share_dir = $p->{share_dir};
+ # check dist key
+ if ( defined $share_dir->{dist} ) {
+ if ( ! ref $share_dir->{dist} ) {
+ # scalar, so upgrade to arrayref
+ $share_dir->{dist} = [ $share_dir->{dist} ];
+ }
+ elsif ( ref $share_dir->{dist} ne 'ARRAY' ) {
+ die "'dist' key in 'share_dir' must be scalar or arrayref";
+ }
+ }
+ # check module key
+ if ( defined $share_dir->{module} ) {
+ my $mod_hash = $share_dir->{module};
+ if ( ref $mod_hash eq 'HASH' ) {
+ for my $k ( keys %$mod_hash ) {
+ if ( ! ref $mod_hash->{$k} ) {
+ $mod_hash->{$k} = [ $mod_hash->{$k} ];
+ }
+ elsif( ref $mod_hash->{$k} ne 'ARRAY' ) {
+ die "modules in 'module' key of 'share_dir' must be scalar or arrayref";
+ }
+ }
+ }
+ else {
+ die "'module' key in 'share_dir' must be hashref";
+ }
+ }
+ }
+ else {
+ die "'share_dir' must be hashref, arrayref or string";
+ }
+
+ return $p->{share_dir};
+}
+
+sub script_files {
+ my $self = shift;
+
+ for ($self->{properties}{script_files}) {
+ $_ = shift if @_;
+ next unless $_;
+
+ # Always coerce into a hash
+ return $_ if UNIVERSAL::isa($_, 'HASH');
+ return $_ = { map {$_,1} @$_ } if UNIVERSAL::isa($_, 'ARRAY');
+
+ die "'script_files' must be a hashref, arrayref, or string" if ref();
+
+ return $_ = { map {$_,1} $self->_files_in( $_ ) } if -d $_;
+ return $_ = {$_ => 1};
+ }
+
+ my %pl_files = map {
+ File::Spec->canonpath( File::Spec->case_tolerant ? uc $_ : $_ ) => 1
+ } keys %{ $self->PL_files || {} };
+
+ my @bin_files = $self->_files_in('bin');
+
+ my %bin_map = map {
+ $_ => File::Spec->canonpath( File::Spec->case_tolerant ? uc $_ : $_ )
+ } @bin_files;
+
+ return $_ = { map {$_ => 1} grep !$pl_files{$bin_map{$_}}, @bin_files };
+}
+BEGIN { *scripts = \&script_files; }
+
+{
+ my %licenses = (
+ perl => 'Perl_5',
+ apache => 'Apache_2_0',
+ apache_1_1 => 'Apache_1_1',
+ artistic => 'Artistic_1_0',
+ artistic_2 => 'Artistic_2_0',
+ lgpl => 'LGPL_2_1',
+ lgpl2 => 'LGPL_2_1',
+ lgpl3 => 'LGPL_3_0',
+ bsd => 'BSD',
+ gpl => 'GPL_1',
+ gpl2 => 'GPL_2',
+ gpl3 => 'GPL_3',
+ mit => 'MIT',
+ mozilla => 'Mozilla_1_1',
+ open_source => undef,
+ unrestricted => undef,
+ restrictive => undef,
+ unknown => undef,
+ );
+
+ # TODO - would be nice to not have these here, since they're more
+ # properly stored only in Software::License
+ my %license_urls = (
+ perl => 'http://dev.perl.org/licenses/',
+ apache => 'http://apache.org/licenses/LICENSE-2.0',
+ apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1',
+ artistic => 'http://opensource.org/licenses/artistic-license.php',
+ artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php',
+ lgpl => 'http://opensource.org/licenses/lgpl-license.php',
+ lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php',
+ lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html',
+ bsd => 'http://opensource.org/licenses/bsd-license.php',
+ gpl => 'http://opensource.org/licenses/gpl-license.php',
+ gpl2 => 'http://opensource.org/licenses/gpl-2.0.php',
+ gpl3 => 'http://opensource.org/licenses/gpl-3.0.html',
+ mit => 'http://opensource.org/licenses/mit-license.php',
+ mozilla => 'http://opensource.org/licenses/mozilla1.1.php',
+ open_source => undef,
+ unrestricted => undef,
+ restrictive => undef,
+ unknown => undef,
+ );
+ sub valid_licenses {
+ return \%licenses;
+ }
+ sub _license_url {
+ return $license_urls{$_[1]};
+ }
+}
+
+sub _hash_merge {
+ my ($self, $h, $k, $v) = @_;
+ if (ref $h->{$k} eq 'ARRAY') {
+ push @{$h->{$k}}, ref $v ? @$v : $v;
+ } elsif (ref $h->{$k} eq 'HASH') {
+ $h->{$k}{$_} = $v->{$_} foreach keys %$v;
+ } else {
+ $h->{$k} = $v;
+ }
+}
+
+sub ACTION_distmeta {
+ my ($self) = @_;
+
+ $self->do_create_makefile_pl if $self->create_makefile_pl;
+ $self->do_create_readme if $self->create_readme;
+ $self->do_create_license if $self->create_license;
+ $self->do_create_metafile;
+}
+
+sub do_create_metafile {
+ my $self = shift;
+ return if $self->{wrote_metadata};
+
+ my $p = $self->{properties};
+ my $metafile = $self->metafile;
+
+ unless ($p->{license}) {
+ $self->log_warn("No license specified, setting license = 'unknown'\n");
+ $p->{license} = 'unknown';
+ }
+ unless (exists $self->valid_licenses->{ $p->{license} }) {
+ die "Unknown license type '$p->{license}'";
+ }
+
+ # If we're in the distdir, the metafile may exist and be non-writable.
+ $self->delete_filetree($metafile);
+ $self->log_info("Creating $metafile\n");
+
+ # Since we're building ourself, we have to do some special stuff
+ # here: the ConfigData module is found in blib/lib.
+ local @INC = @INC;
+ if (($self->module_name || '') eq 'Module::Build') {
+ $self->depends_on('config_data');
+ push @INC, File::Spec->catdir($self->blib, 'lib');
+ }
+
+ if ($self->write_metafile($self->metafile,$self->get_metadata(fatal=>1))){
+ $self->{wrote_metadata} = 1;
+ $self->_add_to_manifest('MANIFEST', $metafile);
+ }
+
+ return 1;
+}
+
+sub read_metafile {
+ my $self = shift;
+ my ($metafile) = @_;
+ my $yaml;
+
+ my $class = $self->_mb_feature('YAML_support')
+ ? 'YAML::Tiny' : 'Module::Build::YAML' ;
+
+ eval "require $class; 1" or die $@;
+ my $meta = $class->read($metafile)
+ or $self->log_warn( "Error reading '$metafile': " . $class->errstr . "\n");
+
+ return $meta->[0] || {};
+}
+
+sub write_metafile {
+ my $self = shift;
+ my ($metafile, $node) = @_;
+ my $yaml;
+
+ if ($self->_mb_feature('YAML_support')) {
+ # XXX this is probably redundant, but stick with it
+ require YAML::Tiny;
+ $yaml = YAML::Tiny->new($node);
+ } else {
+ require Module::Build::YAML;
+ $yaml = Module::Build::YAML->new($node);
+ }
+ my $result = $yaml->write($metafile)
+ or $self->log_warn( "Error writing '$metafile': " . $yaml->errstr . "\n");
+ return $result;
+}
+
+sub normalize_version {
+ my ($self, $version) = @_;
+ if ( $version =~ /[=<>!,]/ ) { # logic, not just version
+ # take as is without modification
+ }
+ elsif ( ref $version eq 'version' ||
+ ref $version eq 'Module::Build::Version' ) { # version objects
+ $version = $version->is_qv ? $version->normal : $version->stringify;
+ }
+ elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots
+ # normalize string tuples without "v": "1.2.3" -> "v1.2.3"
+ $version = "v$version";
+ }
+ else {
+ # leave alone
+ }
+ return $version;
+}
+
+sub _normalize_prereqs {
+ my ($self) = @_;
+ my $p = $self->{properties};
+
+ # copy prereq data structures so we can modify them before writing to META
+ my %prereq_types;
+ for my $type ( 'configure_requires', @{$self->prereq_action_types} ) {
+ if (exists $p->{$type}) {
+ for my $mod ( keys %{ $p->{$type} } ) {
+ $prereq_types{$type}{$mod} =
+ $self->normalize_version($p->{$type}{$mod});
+ }
+ }
+ }
+ return \%prereq_types;
+}
+
+
+# wrapper around old prepare_metadata API;
+sub get_metadata {
+ my ($self, %args) = @_;
+ my $metadata = {};
+ $self->prepare_metadata( $metadata, undef, \%args );
+ return $metadata;
+}
+
+# To preserve compatibility with old API, $node *must* be a hashref
+# passed in to prepare_metadata. $keys is an arrayref holding a
+# list of keys -- it's use is optional and generally no longer needed
+# but kept for back compatibility. $args is an optional parameter to
+# support the new 'fatal' toggle
+
+sub prepare_metadata {
+ my ($self, $node, $keys, $args) = @_;
+ unless ( ref $node eq 'HASH' ) {
+ croak "prepare_metadata() requires a hashref argument to hold output\n";
+ }
+ my $fatal = $args->{fatal} || 0;
+ my $p = $self->{properties};
+
+ # A little helper sub
+ my $add_node = sub {
+ my ($name, $val) = @_;
+ $node->{$name} = $val;
+ push @$keys, $name if $keys;
+ };
+
+ foreach (qw(dist_name dist_version dist_author dist_abstract license)) {
+ (my $name = $_) =~ s/^dist_//;
+ $add_node->($name, $self->$_());
+ unless ( defined($node->{$name}) && length($node->{$name}) ) {
+ my $err = "ERROR: Missing required field '$_' for metafile\n";
+ if ( $fatal ) {
+ die $err;
+ }
+ else {
+ $self->log_warn($err);
+ }
+ }
+ }
+ $node->{version} = $self->normalize_version($node->{version});
+
+ if (defined( my $l = $self->license )) {
+ unless ( exists $self->valid_licenses->{ $l } ) {
+ my $err = "Unknown license string '$l'";
+ if ( $fatal ) {
+ die $err;
+ }
+ else {
+ $self->log_warn($err);
+ }
+ }
+
+ if (my $key = $self->valid_licenses->{ $l }) {
+ my $class = "Software::License::$key";
+ if (eval "require Software::License; require $class; 1") {
+ # S::L requires a 'holder' key
+ $node->{resources}{license} = $class->new({holder=>"nobody"})->url;
+ }
+ else {
+ $node->{resources}{license} = $self->_license_url($l);
+ }
+ }
+ # XXX we are silently omitting the url for any unknown license
+ }
+
+
+ my $prereqs = $self->_normalize_prereqs;
+ for my $t ( keys %$prereqs ) {
+ $add_node->($t, $prereqs->{$t});
+ }
+
+ if (exists $p->{dynamic_config}) {
+ $add_node->('dynamic_config', $p->{dynamic_config});
+ }
+ my $pkgs = eval { $self->find_dist_packages };
+ if ($@) {
+ $self->log_warn("$@\nWARNING: Possible missing or corrupt 'MANIFEST' file.\n" .
+ "Nothing to enter for 'provides' field in metafile.\n");
+ } else {
+ $node->{provides} = $pkgs if %$pkgs;
+ }
+;
+ if (exists $p->{no_index}) {
+ $add_node->('no_index', $p->{no_index});
+ }
+
+ $add_node->('generated_by', "Module::Build version $Module::Build::VERSION");
+
+ $add_node->('meta-spec',
+ {version => '1.4',
+ url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
+ });
+
+ while (my($k, $v) = each %{$self->meta_add}) {
+ $add_node->($k, $v);
+ }
+
+ while (my($k, $v) = each %{$self->meta_merge}) {
+ $self->_hash_merge($node, $k, $v);
+ }
+
+ return $node;
+}
+
+sub _read_manifest {
+ my ($self, $file) = @_;
+ return undef unless -e $file;
+
+ require ExtUtils::Manifest; # ExtUtils::Manifest is not warnings clean.
+ local ($^W, $ExtUtils::Manifest::Quiet) = (0,1);
+ return scalar ExtUtils::Manifest::maniread($file);
+}
+
+sub find_dist_packages {
+ my $self = shift;
+
+ # Only packages in .pm files are candidates for inclusion here.
+ # Only include things in the MANIFEST, not things in developer's
+ # private stock.
+
+ my $manifest = $self->_read_manifest('MANIFEST')
+ or die "Can't find dist packages without a MANIFEST file\nRun 'Build manifest' to generate one\n";
+
+ # Localize
+ my %dist_files = map { $self->localize_file_path($_) => $_ }
+ keys %$manifest;
+
+ my @pm_files = grep { $_ !~ m{^t} } # skip things in t/
+ grep {exists $dist_files{$_}}
+ keys %{ $self->find_pm_files };
+
+ return $self->find_packages_in_files(\@pm_files, \%dist_files);
+}
+
+sub find_packages_in_files {
+ my ($self, $file_list, $filename_map) = @_;
+
+ # First, we enumerate all packages & versions,
+ # separating into primary & alternative candidates
+ my( %prime, %alt );
+ foreach my $file (@{$file_list}) {
+ my $mapped_filename = $filename_map->{$file};
+ my @path = split( /\//, $mapped_filename );
+ (my $prime_package = join( '::', @path[1..$#path] )) =~ s/\.pm$//;
+
+ my $pm_info = Module::Build::ModuleInfo->new_from_file( $file );
+
+ foreach my $package ( $pm_info->packages_inside ) {
+ next if $package eq 'main'; # main can appear numerous times, ignore
+ next if $package eq 'DB'; # special debugging package, ignore
+ next if grep /^_/, split( /::/, $package ); # private package, ignore
+
+ my $version = $pm_info->version( $package );
+
+ if ( $package eq $prime_package ) {
+ if ( exists( $prime{$package} ) ) {
+ # M::B::ModuleInfo will handle this conflict
+ die "Unexpected conflict in '$package'; multiple versions found.\n";
+ } else {
+ $prime{$package}{file} = $mapped_filename;
+ $prime{$package}{version} = $version if defined( $version );
+ }
+ } else {
+ push( @{$alt{$package}}, {
+ file => $mapped_filename,
+ version => $version,
+ } );
+ }
+ }
+ }
+
+ # Then we iterate over all the packages found above, identifying conflicts
+ # and selecting the "best" candidate for recording the file & version
+ # for each package.
+ foreach my $package ( keys( %alt ) ) {
+ my $result = $self->_resolve_module_versions( $alt{$package} );
+
+ if ( exists( $prime{$package} ) ) { # primary package selected
+
+ if ( $result->{err} ) {
+ # Use the selected primary package, but there are conflicting
+ # errors among multiple alternative packages that need to be
+ # reported
+ $self->log_warn(
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ $result->{err}
+ );
+
+ } elsif ( defined( $result->{version} ) ) {
+ # There is a primary package selected, and exactly one
+ # alternative package
+
+ if ( exists( $prime{$package}{version} ) &&
+ defined( $prime{$package}{version} ) ) {
+ # Unless the version of the primary package agrees with the
+ # version of the alternative package, report a conflict
+ if ( $self->compare_versions( $prime{$package}{version}, '!=',
+ $result->{version} ) ) {
+ $self->log_warn(
+ "Found conflicting versions for package '$package'\n" .
+ " $prime{$package}{file} ($prime{$package}{version})\n" .
+ " $result->{file} ($result->{version})\n"
+ );
+ }
+
+ } else {
+ # The prime package selected has no version so, we choose to
+ # use any alternative package that does have a version
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version};
+ }
+
+ } else {
+ # no alt package found with a version, but we have a prime
+ # package so we use it whether it has a version or not
+ }
+
+ } else { # No primary package was selected, use the best alternative
+
+ if ( $result->{err} ) {
+ $self->log_warn(
+ "Found conflicting versions for package '$package'\n" .
+ $result->{err}
+ );
+ }
+
+ # Despite possible conflicting versions, we choose to record
+ # something rather than nothing
+ $prime{$package}{file} = $result->{file};
+ $prime{$package}{version} = $result->{version}
+ if defined( $result->{version} );
+ }
+ }
+
+ # Normalize versions. Can't use exists() here because of bug in YAML::Node.
+ # XXX "bug in YAML::Node" comment seems irrelvant -- dagolden, 2009-05-18
+ for (grep defined $_->{version}, values %prime) {
+ $_->{version} = $self->normalize_version( $_->{version} );
+ }
+
+ return \%prime;
+}
+
+# separate out some of the conflict resolution logic from
+# $self->find_dist_packages(), above, into a helper function.
+#
+sub _resolve_module_versions {
+ my $self = shift;
+
+ my $packages = shift;
+
+ my( $file, $version );
+ my $err = '';
+ foreach my $p ( @$packages ) {
+ if ( defined( $p->{version} ) ) {
+ if ( defined( $version ) ) {
+ if ( $self->compare_versions( $version, '!=', $p->{version} ) ) {
+ $err .= " $p->{file} ($p->{version})\n";
+ } else {
+ # same version declared multiple times, ignore
+ }
+ } else {
+ $file = $p->{file};
+ $version = $p->{version};
+ }
+ }
+ $file ||= $p->{file} if defined( $p->{file} );
+ }
+
+ if ( $err ) {
+ $err = " $file ($version)\n" . $err;
+ }
+
+ my %result = (
+ file => $file,
+ version => $version,
+ err => $err
+ );
+
+ return \%result;
+}
+
+sub make_tarball {
+ my ($self, $dir, $file) = @_;
+ $file ||= $dir;
+
+ $self->log_info("Creating $file.tar.gz\n");
+
+ if ($self->{args}{tar}) {
+ my $tar_flags = $self->verbose ? 'cvf' : 'cf';
+ $self->do_system($self->split_like_shell($self->{args}{tar}), $tar_flags, "$file.tar", $dir);
+ $self->do_system($self->split_like_shell($self->{args}{gzip}), "$file.tar") if $self->{args}{gzip};
+ } else {
+ eval { require Archive::Tar && Archive::Tar->VERSION(1.09); 1 }
+ or die "You must install Archive::Tar 1.09+ to make a distribution tarball\n".
+ "or specify a binary tar program with the '--tar' option.\n".
+ "See the documentation for the 'dist' action.\n";
+
+ my $files = $self->rscan_dir($dir);
+
+ # Archive::Tar versions >= 1.09 use the following to enable a compatibility
+ # hack so that the resulting archive is compatible with older clients.
+ # If no file path is 100 chars or longer, we disable the prefix field
+ # for maximum compatibility. If there are any long file paths then we
+ # need the prefix field after all.
+ $Archive::Tar::DO_NOT_USE_PREFIX =
+ (grep { length($_) >= 100 } @$files) ? 0 : 1;
+
+ my $tar = Archive::Tar->new;
+ $tar->add_files(@$files);
+ for my $f ($tar->get_files) {
+ $f->mode($f->mode & ~022); # chmod go-w
+ }
+ $tar->write("$file.tar.gz", 1);
+ }
+}
+
+sub install_path {
+ my $self = shift;
+ my( $type, $value ) = ( @_, '<empty>' );
+
+ Carp::croak( 'Type argument missing' )
+ unless defined( $type );
+
+ my $map = $self->{properties}{install_path};
+ return $map unless @_;
+
+ # delete existing value if $value is literal undef()
+ unless ( defined( $value ) ) {
+ delete( $map->{$type} );
+ return undef;
+ }
+
+ # return existing value if no new $value is given
+ if ( $value eq '<empty>' ) {
+ return undef unless exists $map->{$type};
+ return $map->{$type};
+ }
+
+ # set value if $value is a valid relative path
+ return $map->{$type} = $value;
+}
+
+sub install_sets {
+ # Usage: install_sets('site'), install_sets('site', 'lib'),
+ # or install_sets('site', 'lib' => $value);
+ my ($self, $dirs, $key, $value) = @_;
+ $dirs = $self->installdirs unless defined $dirs;
+ # update property before merging with defaults
+ if ( @_ == 4 && defined $dirs && defined $key) {
+ # $value can be undef; will mask default
+ $self->{properties}{install_sets}{$dirs}{$key} = $value;
+ }
+ my $map = { $self->_merge_arglist(
+ $self->{properties}{install_sets},
+ $self->_default_install_paths->{install_sets}
+ )};
+ if ( defined $dirs && defined $key ) {
+ return $map->{$dirs}{$key};
+ }
+ elsif ( defined $dirs ) {
+ return $map->{$dirs};
+ }
+ else {
+ croak "Can't determine installdirs for install_sets()";
+ }
+}
+
+sub original_prefix {
+ # Usage: original_prefix(), original_prefix('lib'),
+ # or original_prefix('lib' => $value);
+ my ($self, $key, $value) = @_;
+ # update property before merging with defaults
+ if ( @_ == 3 && defined $key) {
+ # $value can be undef; will mask default
+ $self->{properties}{original_prefix}{$key} = $value;
+ }
+ my $map = { $self->_merge_arglist(
+ $self->{properties}{original_prefix},
+ $self->_default_install_paths->{original_prefix}
+ )};
+ return $map unless defined $key;
+ return $map->{$key}
+}
+
+sub install_base_relpaths {
+ # Usage: install_base_relpaths(), install_base_relpaths('lib'),
+ # or install_base_relpaths('lib' => $value);
+ my $self = shift;
+ if ( @_ > 1 ) { # change values before merge
+ $self->_set_relpaths($self->{properties}{install_base_relpaths}, @_);
+ }
+ my $map = { $self->_merge_arglist(
+ $self->{properties}{install_base_relpaths},
+ $self->_default_install_paths->{install_base_relpaths}
+ )};
+ return $map unless @_;
+ my $relpath = $map->{$_[0]};
+ return defined $relpath ? File::Spec->catdir( @$relpath ) : undef;
+}
+
+# Defaults to use in case the config install paths cannot be prefixified.
+sub prefix_relpaths {
+ # Usage: prefix_relpaths('site'), prefix_relpaths('site', 'lib'),
+ # or prefix_relpaths('site', 'lib' => $value);
+ my $self = shift;
+ my $installdirs = shift || $self->installdirs
+ or croak "Can't determine installdirs for prefix_relpaths()";
+ if ( @_ > 1 ) { # change values before merge
+ $self->{properties}{prefix_relpaths}{$installdirs} ||= {};
+ $self->_set_relpaths($self->{properties}{prefix_relpaths}{$installdirs}, @_);
+ }
+ my $map = {$self->_merge_arglist(
+ $self->{properties}{prefix_relpaths}{$installdirs},
+ $self->_default_install_paths->{prefix_relpaths}{$installdirs}
+ )};
+ return $map unless @_;
+ my $relpath = $map->{$_[0]};
+ return defined $relpath ? File::Spec->catdir( @$relpath ) : undef;
+}
+
+sub _set_relpaths {
+ my $self = shift;
+ my( $map, $type, $value ) = @_;
+
+ Carp::croak( 'Type argument missing' )
+ unless defined( $type );
+
+ # set undef if $value is literal undef()
+ if ( ! defined( $value ) ) {
+ $map->{$type} = undef;
+ return;
+ }
+ # set value if $value is a valid relative path
+ else {
+ Carp::croak( "Value must be a relative path" )
+ if File::Spec::Unix->file_name_is_absolute($value);
+
+ my @value = split( /\//, $value );
+ $map->{$type} = \@value;
+ }
+}
+
+# Translated from ExtUtils::MM_Any::init_INSTALL_from_PREFIX
+sub prefix_relative {
+ my ($self, $type) = @_;
+ my $installdirs = $self->installdirs;
+
+ my $relpath = $self->install_sets($installdirs)->{$type};
+
+ return $self->_prefixify($relpath,
+ $self->original_prefix($installdirs),
+ $type,
+ );
+}
+
+# Translated from ExtUtils::MM_Unix::prefixify()
+sub _prefixify {
+ my($self, $path, $sprefix, $type) = @_;
+
+ my $rprefix = $self->prefix;
+ $rprefix .= '/' if $sprefix =~ m|/$|;
+
+ $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n")
+ if defined( $path ) && length( $path );
+
+ if( !defined( $path ) || ( length( $path ) == 0 ) ) {
+ $self->log_verbose(" no path to prefixify, falling back to default.\n");
+ return $self->_prefixify_default( $type, $rprefix );
+ } elsif( !File::Spec->file_name_is_absolute($path) ) {
+ $self->log_verbose(" path is relative, not prefixifying.\n");
+ } elsif( $path !~ s{^\Q$sprefix\E\b}{}s ) {
+ $self->log_verbose(" cannot prefixify, falling back to default.\n");
+ return $self->_prefixify_default( $type, $rprefix );
+ }
+
+ $self->log_verbose(" now $path in $rprefix\n");
+
+ return $path;
+}
+
+sub _prefixify_default {
+ my $self = shift;
+ my $type = shift;
+ my $rprefix = shift;
+
+ my $default = $self->prefix_relpaths($self->installdirs, $type);
+ if( !$default ) {
+ $self->log_verbose(" no default install location for type '$type', using prefix '$rprefix'.\n");
+ return $rprefix;
+ } else {
+ return $default;
+ }
+}
+
+sub install_destination {
+ my ($self, $type) = @_;
+
+ return $self->install_path($type) if $self->install_path($type);
+
+ if ( $self->install_base ) {
+ my $relpath = $self->install_base_relpaths($type);
+ return $relpath ? File::Spec->catdir($self->install_base, $relpath) : undef;
+ }
+
+ if ( $self->prefix ) {
+ my $relpath = $self->prefix_relative($type);
+ return $relpath ? File::Spec->catdir($self->prefix, $relpath) : undef;
+ }
+
+ return $self->install_sets($self->installdirs)->{$type};
+}
+
+sub install_types {
+ my $self = shift;
+
+ my %types;
+ if ( $self->install_base ) {
+ %types = %{$self->install_base_relpaths};
+ } elsif ( $self->prefix ) {
+ %types = %{$self->prefix_relpaths};
+ } else {
+ %types = %{$self->install_sets($self->installdirs)};
+ }
+
+ %types = (%types, %{$self->install_path});
+
+ return sort keys %types;
+}
+
+sub install_map {
+ my ($self, $blib) = @_;
+ $blib ||= $self->blib;
+
+ my( %map, @skipping );
+ foreach my $type ($self->install_types) {
+ my $localdir = File::Spec->catdir( $blib, $type );
+ next unless -e $localdir;
+
+ if (my $dest = $self->install_destination($type)) {
+ $map{$localdir} = $dest;
+ } else {
+ push( @skipping, $type );
+ }
+ }
+
+ $self->log_warn(
+ "WARNING: Can't figure out install path for types: @skipping\n" .
+ "Files will not be installed.\n"
+ ) if @skipping;
+
+ # Write the packlist into the same place as ExtUtils::MakeMaker.
+ if ($self->create_packlist and my $module_name = $self->module_name) {
+ my $archdir = $self->install_destination('arch');
+ my @ext = split /::/, $module_name;
+ $map{write} = File::Spec->catfile($archdir, 'auto', @ext, '.packlist');
+ }
+
+ # Handle destdir
+ if (length(my $destdir = $self->destdir || '')) {
+ foreach (keys %map) {
+ # Need to remove volume from $map{$_} using splitpath, or else
+ # we'll create something crazy like C:\Foo\Bar\E:\Baz\Quux
+ # VMS will always have the file separate than the path.
+ my ($volume, $path, $file) = File::Spec->splitpath( $map{$_}, 0 );
+
+ # catdir needs a list of directories, or it will create something
+ # crazy like volume:[Foo.Bar.volume.Baz.Quux]
+ my @dirs = File::Spec->splitdir($path);
+
+ # First merge the directories
+ $path = File::Spec->catdir($destdir, @dirs);
+
+ # Then put the file back on if there is one.
+ if ($file ne '') {
+ $map{$_} = File::Spec->catfile($path, $file)
+ } else {
+ $map{$_} = $path;
+ }
+ }
+ }
+
+ $map{read} = ''; # To keep ExtUtils::Install quiet
+
+ return \%map;
+}
+
+sub depends_on {
+ my $self = shift;
+ foreach my $action (@_) {
+ $self->_call_action($action);
+ }
+}
+
+sub rscan_dir {
+ my ($self, $dir, $pattern) = @_;
+ my @result;
+ local $_; # find() can overwrite $_, so protect ourselves
+ my $subr = !$pattern ? sub {push @result, $File::Find::name} :
+ !ref($pattern) || (ref $pattern eq 'Regexp') ? sub {push @result, $File::Find::name if /$pattern/} :
+ ref($pattern) eq 'CODE' ? sub {push @result, $File::Find::name if $pattern->()} :
+ die "Unknown pattern type";
+
+ File::Find::find({wanted => $subr, no_chdir => 1}, $dir);
+ return \@result;
+}
+
+sub delete_filetree {
+ my $self = shift;
+ my $deleted = 0;
+ foreach (@_) {
+ next unless -e $_;
+ $self->log_verbose("Deleting $_\n");
+ File::Path::rmtree($_, 0, 0);
+ die "Couldn't remove '$_': $!\n" if -e $_;
+ $deleted++;
+ }
+ return $deleted;
+}
+
+sub autosplit_file {
+ my ($self, $file, $to) = @_;
+ require AutoSplit;
+ my $dir = File::Spec->catdir($to, 'lib', 'auto');
+ AutoSplit::autosplit($file, $dir);
+}
+
+sub cbuilder {
+ # Returns a CBuilder object
+
+ my $self = shift;
+ my $s = $self->{stash};
+ return $s->{_cbuilder} if $s->{_cbuilder};
+
+ require ExtUtils::CBuilder;
+ return $s->{_cbuilder} = ExtUtils::CBuilder->new(
+ config => $self->config,
+ ($self->quiet ? (quiet => 1 ) : ()),
+ );
+}
+
+sub have_c_compiler {
+ my ($self) = @_;
+
+ my $p = $self->{properties};
+ return $p->{_have_c_compiler} if defined $p->{_have_c_compiler};
+
+ $self->log_verbose("Checking if compiler tools configured... ");
+ my $b = eval { $self->cbuilder };
+ my $have = $b && eval { $b->have_compiler };
+ $self->log_verbose($have ? "ok.\n" : "failed.\n");
+ return $p->{_have_c_compiler} = $have;
+}
+
+sub compile_c {
+ my ($self, $file, %args) = @_;
+
+ if ( ! $self->have_c_compiler ) {
+ die "Error: no compiler detected to compile '$file'. Aborting\n";
+ }
+
+ my $b = $self->cbuilder;
+ my $obj_file = $b->object_file($file);
+ $self->add_to_cleanup($obj_file);
+ return $obj_file if $self->up_to_date($file, $obj_file);
+
+ $b->compile(source => $file,
+ defines => $args{defines},
+ object_file => $obj_file,
+ include_dirs => $self->include_dirs,
+ extra_compiler_flags => $self->extra_compiler_flags,
+ );
+
+ return $obj_file;
+}
+
+sub link_c {
+ my ($self, $spec) = @_;
+ my $p = $self->{properties}; # For convenience
+
+ $self->add_to_cleanup($spec->{lib_file});
+
+ my $objects = $p->{objects} || [];
+
+ return $spec->{lib_file}
+ if $self->up_to_date([$spec->{obj_file}, @$objects],
+ $spec->{lib_file});
+
+ my $module_name = $spec->{module_name} || $self->module_name;
+
+ $self->cbuilder->link(
+ module_name => $module_name,
+ objects => [$spec->{obj_file}, @$objects],
+ lib_file => $spec->{lib_file},
+ extra_linker_flags => $p->{extra_linker_flags} );
+
+ return $spec->{lib_file};
+}
+
+sub compile_xs {
+ my ($self, $file, %args) = @_;
+
+ $self->log_verbose("$file -> $args{outfile}\n");
+
+ if (eval {require ExtUtils::ParseXS; 1}) {
+
+ ExtUtils::ParseXS::process_file(
+ filename => $file,
+ prototypes => 0,
+ output => $args{outfile},
+ );
+ } else {
+ # Ok, I give up. Just use backticks.
+
+ my $xsubpp = Module::Build::ModuleInfo->find_module_by_name('ExtUtils::xsubpp')
+ or die "Can't find ExtUtils::xsubpp in INC (@INC)";
+
+ my @typemaps;
+ push @typemaps, Module::Build::ModuleInfo->find_module_by_name(
+ 'ExtUtils::typemap', \@INC
+ );
+ my $lib_typemap = Module::Build::ModuleInfo->find_module_by_name(
+ 'typemap', [File::Basename::dirname($file), File::Spec->rel2abs('.')]
+ );
+ push @typemaps, $lib_typemap if $lib_typemap;
+ @typemaps = map {+'-typemap', $_} @typemaps;
+
+ my $cf = $self->{config};
+ my $perl = $self->{properties}{perl};
+
+ my @command = ($perl, "-I".$cf->get('installarchlib'), "-I".$cf->get('installprivlib'), $xsubpp, '-noprototypes',
+ @typemaps, $file);
+
+ $self->log_info("@command\n");
+ my $fh = IO::File->new("> $args{outfile}") or die "Couldn't write $args{outfile}: $!";
+ print {$fh} $self->_backticks(@command);
+ close $fh;
+ }
+}
+
+sub split_like_shell {
+ my ($self, $string) = @_;
+
+ return () unless defined($string);
+ return @$string if UNIVERSAL::isa($string, 'ARRAY');
+ $string =~ s/^\s+|\s+$//g;
+ return () unless length($string);
+
+ return Text::ParseWords::shellwords($string);
+}
+
+sub oneliner {
+ # Returns a string that the shell can evaluate as a perl command.
+ # This should be avoided whenever possible, since "the shell" really
+ # means zillions of shells on zillions of platforms and it's really
+ # hard to get it right all the time.
+
+ # Some of this code is stolen with permission from ExtUtils::MakeMaker.
+
+ my($self, $cmd, $switches, $args) = @_;
+ $switches = [] unless defined $switches;
+ $args = [] unless defined $args;
+
+ # Strip leading and trailing newlines
+ $cmd =~ s{^\n+}{};
+ $cmd =~ s{\n+$}{};
+
+ my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter;
+ return $self->_quote_args($perl, @$switches, '-e', $cmd, @$args);
+}
+
+sub run_perl_script {
+ my ($self, $script, $preargs, $postargs) = @_;
+ foreach ($preargs, $postargs) {
+ $_ = [ $self->split_like_shell($_) ] unless ref();
+ }
+ return $self->run_perl_command([@$preargs, $script, @$postargs]);
+}
+
+sub run_perl_command {
+ # XXX Maybe we should accept @args instead of $args? Must resolve
+ # this before documenting.
+ my ($self, $args) = @_;
+ $args = [ $self->split_like_shell($args) ] unless ref($args);
+ my $perl = ref($self) ? $self->perl : $self->find_perl_interpreter;
+
+ # Make sure our local additions to @INC are propagated to the subprocess
+ local $ENV{PERL5LIB} = join $self->config('path_sep'), $self->_added_to_INC;
+
+ return $self->do_system($perl, @$args);
+}
+
+# Infer various data from the path of the input filename
+# that is needed to create output files.
+# The input filename is expected to be of the form:
+# lib/Module/Name.ext or Module/Name.ext
+sub _infer_xs_spec {
+ my $self = shift;
+ my $file = shift;
+
+ my $cf = $self->{config};
+
+ my %spec;
+
+ my( $v, $d, $f ) = File::Spec->splitpath( $file );
+ my @d = File::Spec->splitdir( $d );
+ (my $file_base = $f) =~ s/\.[^.]+$//i;
+
+ $spec{base_name} = $file_base;
+
+ $spec{src_dir} = File::Spec->catpath( $v, $d, '' );
+
+ # the module name
+ shift( @d ) while @d && ($d[0] eq 'lib' || $d[0] eq '');
+ pop( @d ) while @d && $d[-1] eq '';
+ $spec{module_name} = join( '::', (@d, $file_base) );
+
+ $spec{archdir} = File::Spec->catdir($self->blib, 'arch', 'auto',
+ @d, $file_base);
+
+ $spec{bs_file} = File::Spec->catfile($spec{archdir}, "${file_base}.bs");
+
+ $spec{lib_file} = File::Spec->catfile($spec{archdir},
+ "${file_base}.".$cf->get('dlext'));
+
+ $spec{c_file} = File::Spec->catfile( $spec{src_dir},
+ "${file_base}.c" );
+
+ $spec{obj_file} = File::Spec->catfile( $spec{src_dir},
+ "${file_base}".$cf->get('obj_ext') );
+
+ return \%spec;
+}
+
+sub process_xs {
+ my ($self, $file) = @_;
+
+ my $spec = $self->_infer_xs_spec($file);
+
+ # File name, minus the suffix
+ (my $file_base = $file) =~ s/\.[^.]+$//;
+
+ # .xs -> .c
+ $self->add_to_cleanup($spec->{c_file});
+
+ unless ($self->up_to_date($file, $spec->{c_file})) {
+ $self->compile_xs($file, outfile => $spec->{c_file});
+ }
+
+ # .c -> .o
+ my $v = $self->dist_version;
+ $self->compile_c($spec->{c_file},
+ defines => {VERSION => qq{"$v"}, XS_VERSION => qq{"$v"}});
+
+ # archdir
+ File::Path::mkpath($spec->{archdir}, 0, oct(777)) unless -d $spec->{archdir};
+
+ # .xs -> .bs
+ $self->add_to_cleanup($spec->{bs_file});
+ unless ($self->up_to_date($file, $spec->{bs_file})) {
+ require ExtUtils::Mkbootstrap;
+ $self->log_info("ExtUtils::Mkbootstrap::Mkbootstrap('$spec->{bs_file}')\n");
+ ExtUtils::Mkbootstrap::Mkbootstrap($spec->{bs_file}); # Original had $BSLOADLIBS - what's that?
+ {my $fh = IO::File->new(">> $spec->{bs_file}")} # create
+ utime((time)x2, $spec->{bs_file}); # touch
+ }
+
+ # .o -> .(a|bundle)
+ $self->link_c($spec);
+}
+
+sub do_system {
+ my ($self, @cmd) = @_;
+ $self->log_verbose("@cmd\n");
+
+ # Some systems proliferate huge PERL5LIBs, try to ameliorate:
+ my %seen;
+ my $sep = $self->config('path_sep');
+ local $ENV{PERL5LIB} =
+ ( !exists($ENV{PERL5LIB}) ? '' :
+ length($ENV{PERL5LIB}) < 500
+ ? $ENV{PERL5LIB}
+ : join $sep, grep { ! $seen{$_}++ and -d $_ } split($sep, $ENV{PERL5LIB})
+ );
+
+ my $status = system(@cmd);
+ if ($status and $! =~ /Argument list too long/i) {
+ my $env_entries = '';
+ foreach (sort keys %ENV) { $env_entries .= "$_=>".length($ENV{$_})."; " }
+ warn "'Argument list' was 'too long', env lengths are $env_entries";
+ }
+ return !$status;
+}
+
+sub copy_if_modified {
+ my $self = shift;
+ my %args = (@_ > 3
+ ? ( @_ )
+ : ( from => shift, to_dir => shift, flatten => shift )
+ );
+ $args{verbose} = !$self->quiet
+ unless exists $args{verbose};
+
+ my $file = $args{from};
+ unless (defined $file and length $file) {
+ die "No 'from' parameter given to copy_if_modified";
+ }
+
+ # makes no sense to replicate an absolute path, so assume flatten
+ $args{flatten} = 1 if File::Spec->file_name_is_absolute( $file );
+
+ my $to_path;
+ if (defined $args{to} and length $args{to}) {
+ $to_path = $args{to};
+ } elsif (defined $args{to_dir} and length $args{to_dir}) {
+ $to_path = File::Spec->catfile( $args{to_dir}, $args{flatten}
+ ? File::Basename::basename($file)
+ : $file );
+ } else {
+ die "No 'to' or 'to_dir' parameter given to copy_if_modified";
+ }
+
+ return if $self->up_to_date($file, $to_path); # Already fresh
+
+ {
+ local $self->{properties}{quiet} = 1;
+ $self->delete_filetree($to_path); # delete destination if exists
+ }
+
+ # Create parent directories
+ File::Path::mkpath(File::Basename::dirname($to_path), 0, oct(777));
+
+ $self->log_verbose("Copying $file -> $to_path\n");
+
+ if ($^O eq 'os2') {# copy will not overwrite; 0x1 = overwrite
+ chmod 0666, $to_path;
+ File::Copy::syscopy($file, $to_path, 0x1) or die "Can't copy('$file', '$to_path'): $!";
+ } else {
+ File::Copy::copy($file, $to_path) or die "Can't copy('$file', '$to_path'): $!";
+ }
+
+ # mode is read-only + (executable if source is executable)
+ my $mode = oct(444) | ( $self->is_executable($file) ? oct(111) : 0 );
+ chmod( $mode, $to_path );
+
+ return $to_path;
+}
+
+sub up_to_date {
+ my ($self, $source, $derived) = @_;
+ $source = [$source] unless ref $source;
+ $derived = [$derived] unless ref $derived;
+
+ # empty $derived means $source should always run
+ return 0 if @$source && !@$derived || grep {not -e} @$derived;
+
+ my $most_recent_source = time / (24*60*60);
+ foreach my $file (@$source) {
+ unless (-e $file) {
+ $self->log_warn("Can't find source file $file for up-to-date check");
+ next;
+ }
+ $most_recent_source = -M _ if -M _ < $most_recent_source;
+ }
+
+ foreach my $derived (@$derived) {
+ return 0 if -M $derived > $most_recent_source;
+ }
+ return 1;
+}
+
+sub dir_contains {
+ my ($self, $first, $second) = @_;
+ # File::Spec doesn't have an easy way to check whether one directory
+ # is inside another, unfortunately.
+
+ ($first, $second) = map File::Spec->canonpath($_), ($first, $second);
+ my @first_dirs = File::Spec->splitdir($first);
+ my @second_dirs = File::Spec->splitdir($second);
+
+ return 0 if @second_dirs < @first_dirs;
+
+ my $is_same = ( File::Spec->case_tolerant
+ ? sub {lc(shift()) eq lc(shift())}
+ : sub {shift() eq shift()} );
+
+ while (@first_dirs) {
+ return 0 unless $is_same->(shift @first_dirs, shift @second_dirs);
+ }
+
+ return 1;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Base - Default methods for Module::Build
+
+=head1 SYNOPSIS
+
+ Please see the Module::Build documentation.
+
+=head1 DESCRIPTION
+
+The C<Module::Build::Base> module defines the core functionality of
+C<Module::Build>. Its methods may be overridden by any of the
+platform-dependent modules in the C<Module::Build::Platform::>
+namespace, but the intention here is to make this base module as
+platform-neutral as possible. Nicely enough, Perl has several core
+tools available in the C<File::> namespace for doing this, so the task
+isn't very difficult.
+
+Please see the C<Module::Build> documentation for more details.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Bundling.pod b/Master/tlpkg/tlperl/lib/Module/Build/Bundling.pod
new file mode 100644
index 00000000000..5e7b9f98075
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Bundling.pod
@@ -0,0 +1,147 @@
+=head1 NAME
+
+Module::Build::Bundling - How to bundle Module::Build with a distribution
+
+=head1 SYNOPSIS
+
+ # Build.PL
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+=head1 DESCRIPTION
+
+B<WARNING -- THIS IS AN EXPERIMENTAL FEATURE>
+
+In order to install a distribution using Module::Build, users must
+have Module::Build available on their systems. There are two ways
+to do this. The first way is to include Module::Build in the
+C<configure_requires> metadata field. This field is supported by
+recent versions L<CPAN> and L<CPANPLUS> and is a standard feature
+in the Perl core as of Perl 5.10.1. Module::Build now adds itself
+to C<configure_requires> by default.
+
+The second way supports older Perls that have not upgraded CPAN or
+CPANPLUS and involves bundling an entire copy of Module::Build
+into the distribution's C<inc/> directory. This is the same approach
+used by L<Module::Install>, a modern wrapper around ExtUtils::MakeMaker
+for Makefile.PL based distributions.
+
+The "trick" to making this work for Module::Build is making sure the
+highest version Module::Build is used, whether this is in C<inc/> or
+already installed on the user's system. This ensures that all necessary
+features are available as well as any new bug fixes. This is done using
+the new L<inc::latest> module.
+
+A "normal" Build.PL looks like this (with only the minimum required
+fields):
+
+ use Module::Build;
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+A "bundling" Build.PL replaces the initial "use" line with a nearly
+transparent replacement:
+
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+For I<authors>, when "Build dist" is run, Module::Build will be
+automatically bundled into C<inc> according to the rules for
+L<inc::latest>.
+
+For I<users>, inc::latest will load the latest Module::Build, whether
+installed or bundled in C<inc/>.
+
+=head1 BUNDLING OTHER CONFIGURATION DEPENDENCIES
+
+The same approach works for other configuration dependencies -- modules
+that I<must> be available for Build.PL to run. All other dependencies can
+be specified as usual in the Build.PL and CPAN or CPANPLUS will install
+them after Build.PL finishes.
+
+For example, to bundle the L<Devel::AssertOS::Unix> module (which ensures a
+"Unix-like" operating system), one could do this:
+
+ use inc::latest 'Devel::AssertOS::Unix';
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+The C<inc::latest> module creates bundled directories based on the packlist
+file of an installed distribution. Even though C<inc::latest> takes module
+name arguments, it is better to think of it as bundling and making
+available entire I<distributions>. When a module is loaded through
+C<inc::latest>, it looks in all bundled distributions in C<inc/> for a
+newer module than can be found in the existing C<@INC> array.
+
+Thus, the module-name provided should usually be the "top-level" module
+name of a distribution, though this is not strictly required. For example,
+L<Module::Build> has a number of heuristics to map module names to
+packlists, allowing users to do things like this:
+
+ use inc::latest 'Devel::AssertOS::Unix';
+
+even though Devel::AssertOS::Unix is contained within the Devel-CheckOS
+distribution.
+
+At the current time, packlists are required. Thus, bundling dual-core
+modules, I<including Module::Build>, may require a 'forced install' over
+versions in the latest version of perl in order to create the necessary
+packlist for bundling. This limitation will hopefully be addressed in a
+future version of Module::Build.
+
+=head2 WARNING -- How to Manage Dependency Chains
+
+Before bundling a distribution you must ensure that all prerequisites are
+also bundled and load in the correct order. For Module::Build itself, this
+should not be necessary, but it is necessary for any other distribution.
+(A future release of Module::Build will hopefully address this deficiency.)
+
+For example, if you need C<Wibble>, but C<Wibble> depends on C<Wobble>,
+your Build.PL might look like this:
+
+ use inc::latest 'Wobble';
+ use inc::latest 'Wibble';
+ use inc::latest 'Module::Build';
+
+ Module::Build->new(
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ )->create_build_script;
+
+Authors are strongly suggested to limit the bundling of additional
+dependencies if at all possible and to carefully test their distribution
+tarballs on older versions of Perl before uploading to CPAN.
+
+=head1 AUTHOR
+
+David Golden <dagolden@cpan.org>
+
+Development questions, bug reports, and patches should be sent to the
+Module-Build mailing list at <module-build@perl.org>.
+
+Bug reports are also welcome at
+<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build>.
+
+=head1 SEE ALSO
+
+perl(1), L<inc::latest>, L<Module::Build>(3), L<Module::Build::API>(3),
+L<Module::Build::Cookbook>(3),
+
+=cut
+
+# vim: tw=75
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Compat.pm b/Master/tlpkg/tlperl/lib/Module/Build/Compat.pm
new file mode 100644
index 00000000000..95d695f6f56
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Compat.pm
@@ -0,0 +1,628 @@
+package Module::Build::Compat;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+
+use File::Basename ();
+use File::Spec;
+use IO::File;
+use Config;
+use Module::Build;
+use Module::Build::ModuleInfo;
+use Module::Build::Version;
+use Data::Dumper;
+
+my %convert_installdirs = (
+ PERL => 'core',
+ SITE => 'site',
+ VENDOR => 'vendor',
+);
+
+my %makefile_to_build =
+ (
+ TEST_VERBOSE => 'verbose',
+ VERBINST => 'verbose',
+ INC => sub { map {(extra_compiler_flags => $_)} Module::Build->split_like_shell(shift) },
+ POLLUTE => sub { (extra_compiler_flags => '-DPERL_POLLUTE') },
+ INSTALLDIRS => sub { (installdirs => $convert_installdirs{uc shift()}) },
+ LIB => sub {
+ my $lib = shift;
+ my %config = (
+ installprivlib => $lib,
+ installsitelib => $lib,
+ installarchlib => "$lib/$Config{archname}",
+ installsitearch => "$lib/$Config{archname}"
+ );
+ return map { (config => "$_=$config{$_}") } keys %config;
+ },
+
+ # Convert INSTALLVENDORLIB and friends.
+ (
+ map {
+ my $name = $_;
+ $name => sub {
+ my @ret = (config => lc($name) . "=" . shift );
+ print STDERR "# Converted to @ret\n";
+
+ return @ret;
+ }
+ } qw(
+ INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH
+ INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB
+ INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN
+ INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT
+ INSTALLMAN1DIR INSTALLSITEMAN1DIR INSTALLVENDORMAN1DIR
+ INSTALLMAN3DIR INSTALLSITEMAN3DIR INSTALLVENDORMAN3DIR
+ )
+ ),
+
+ # Some names they have in common
+ map {$_, lc($_)} qw(DESTDIR PREFIX INSTALL_BASE UNINST),
+ );
+
+my %macro_to_build = %makefile_to_build;
+# "LIB=foo make" is not the same as "perl Makefile.PL LIB=foo"
+delete $macro_to_build{LIB};
+
+sub _simple_prereq {
+ return $_[0] =~ /^[0-9_]+\.?[0-9_]*$/; # crudly, a decimal literal
+}
+
+sub _merge_prereq {
+ my ($req, $breq) = @_;
+ $req ||= {};
+ $breq ||= {};
+
+ # validate formats
+ for my $p ( $req, $breq ) {
+ for my $k (keys %$p) {
+ next if $k eq 'perl';
+ die "Prereq '$p->{$k}' for '$k' is not supported by Module::Build::Compat\n"
+ unless _simple_prereq($p->{$k});
+ }
+ }
+ # merge
+ my $merge = { %$req };
+ for my $k ( keys %$breq ) {
+ my $v1 = $merge->{$k} || 0;
+ my $v2 = $breq->{$k};
+ $merge->{$k} = $v1 > $v2 ? $v1 : $v2;
+ }
+ return %$merge;
+}
+
+
+sub create_makefile_pl {
+ my ($package, $type, $build, %args) = @_;
+
+ die "Don't know how to build Makefile.PL of type '$type'"
+ unless $type =~ /^(small|passthrough|traditional)$/;
+
+ if ($type eq 'passthrough') {
+ $build->log_warn(<<"HERE");
+
+IMPORTANT NOTE: The '$type' style of Makefile.PL is deprecated and
+may be removed in a future version of Module::Build in favor of the
+'configure_requires' property. See Module::Build::Compat
+documentation for details.
+
+HERE
+ }
+
+ my $fh;
+ if ($args{fh}) {
+ $fh = $args{fh};
+ } else {
+ $args{file} ||= 'Makefile.PL';
+ local $build->{properties}{quiet} = 1;
+ $build->delete_filetree($args{file});
+ $fh = IO::File->new("> $args{file}") or die "Can't write $args{file}: $!";
+ }
+
+ print {$fh} "# Note: this file was auto-generated by ", __PACKAGE__, " version $VERSION\n";
+
+ # Minimum perl version should be specified as "require 5.XXXXXX" in
+ # Makefile.PL
+ my $requires = $build->requires;
+ if ( my $minimum_perl = $requires->{perl} ) {
+ my $min_ver = Module::Build::Version->new($minimum_perl)->numify;
+ print {$fh} "require $min_ver;\n";
+ }
+
+ # If a *bundled* custom subclass is being used, make sure we add its
+ # directory to @INC. Also, lib.pm always needs paths in Unix format.
+ my $subclass_load = '';
+ if (ref($build) ne "Module::Build") {
+ my $subclass_dir = $package->subclass_dir($build);
+
+ if (File::Spec->file_name_is_absolute($subclass_dir)) {
+ my $base_dir = $build->base_dir;
+
+ if ($build->dir_contains($base_dir, $subclass_dir)) {
+ $subclass_dir = File::Spec->abs2rel($subclass_dir, $base_dir);
+ $subclass_dir = $package->unixify_dir($subclass_dir);
+ $subclass_load = "use lib '$subclass_dir';";
+ }
+ # Otherwise, leave it the empty string
+
+ } else {
+ $subclass_dir = $package->unixify_dir($subclass_dir);
+ $subclass_load = "use lib '$subclass_dir';";
+ }
+ }
+
+ if ($type eq 'small') {
+ printf {$fh} <<'EOF', $subclass_load, ref($build), ref($build);
+ use Module::Build::Compat 0.02;
+ %s
+ Module::Build::Compat->run_build_pl(args => \@ARGV);
+ require %s;
+ Module::Build::Compat->write_makefile(build_class => '%s');
+EOF
+
+ } elsif ($type eq 'passthrough') {
+ printf {$fh} <<'EOF', $subclass_load, ref($build), ref($build);
+
+ unless (eval "use Module::Build::Compat 0.02; 1" ) {
+ print "This module requires Module::Build to install itself.\n";
+
+ require ExtUtils::MakeMaker;
+ my $yn = ExtUtils::MakeMaker::prompt
+ (' Install Module::Build now from CPAN?', 'y');
+
+ unless ($yn =~ /^y/i) {
+ die " *** Cannot install without Module::Build. Exiting ...\n";
+ }
+
+ require Cwd;
+ require File::Spec;
+ require CPAN;
+
+ # Save this 'cause CPAN will chdir all over the place.
+ my $cwd = Cwd::cwd();
+
+ CPAN::Shell->install('Module::Build::Compat');
+ CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
+ or die "Couldn't install Module::Build, giving up.\n";
+
+ chdir $cwd or die "Cannot chdir() back to $cwd: $!";
+ }
+ eval "use Module::Build::Compat 0.02; 1" or die $@;
+ %s
+ Module::Build::Compat->run_build_pl(args => \@ARGV);
+ my $build_script = 'Build';
+ $build_script .= '.com' if $^O eq 'VMS';
+ exit(0) unless(-e $build_script); # cpantesters convention
+ require %s;
+ Module::Build::Compat->write_makefile(build_class => '%s');
+EOF
+
+ } elsif ($type eq 'traditional') {
+
+ my (%MM_Args, %prereq);
+ if (eval "use Tie::IxHash; 1") {
+ tie %MM_Args, 'Tie::IxHash'; # Don't care if it fails here
+ tie %prereq, 'Tie::IxHash'; # Don't care if it fails here
+ }
+
+ my %name = ($build->module_name
+ ? (NAME => $build->module_name)
+ : (DISTNAME => $build->dist_name));
+
+ my %version = ($build->dist_version_from
+ ? (VERSION_FROM => $build->dist_version_from)
+ : (VERSION => $build->dist_version)
+ );
+ %MM_Args = (%name, %version);
+
+ %prereq = _merge_prereq( $build->requires, $build->build_requires );
+ %prereq = map {$_, $prereq{$_}} sort keys %prereq;
+
+ delete $prereq{perl};
+ $MM_Args{PREREQ_PM} = \%prereq;
+
+ $MM_Args{INSTALLDIRS} = $build->installdirs eq 'core' ? 'perl' : $build->installdirs;
+
+ $MM_Args{EXE_FILES} = [ sort keys %{$build->script_files} ] if $build->script_files;
+
+ $MM_Args{PL_FILES} = $build->PL_files || {};
+
+ if ($build->recursive_test_files) {
+ $MM_Args{test} = { TESTS => join q{ }, $package->_test_globs($build) };
+ }
+
+ local $Data::Dumper::Terse = 1;
+ my $args = Data::Dumper::Dumper(\%MM_Args);
+ $args =~ s/\{(.*)\}/($1)/s;
+
+ print $fh <<"EOF";
+use ExtUtils::MakeMaker;
+WriteMakefile
+$args;
+EOF
+ }
+}
+
+sub _test_globs {
+ my ($self, $build) = @_;
+
+ return map { File::Spec->catfile($_, '*.t') }
+ @{$build->rscan_dir('t', sub { -d $File::Find::name })};
+}
+
+sub subclass_dir {
+ my ($self, $build) = @_;
+
+ return (Module::Build::ModuleInfo->find_module_dir_by_name(ref $build)
+ || File::Spec->catdir($build->config_dir, 'lib'));
+}
+
+sub unixify_dir {
+ my ($self, $path) = @_;
+ return join '/', File::Spec->splitdir($path);
+}
+
+sub makefile_to_build_args {
+ my $class = shift;
+ my @out;
+ foreach my $arg (@_) {
+ next if $arg eq '';
+
+ my ($key, $val) = ($arg =~ /^(\w+)=(.+)/ ? ($1, $2) :
+ die "Malformed argument '$arg'");
+
+ # Do tilde-expansion if it looks like a tilde prefixed path
+ ( $val ) = Module::Build->_detildefy( $val ) if $val =~ /^~/;
+
+ if (exists $makefile_to_build{$key}) {
+ my $trans = $makefile_to_build{$key};
+ push @out, $class->_argvify( ref($trans) ? $trans->($val) : ($trans => $val) );
+ } elsif (exists $Config{lc($key)}) {
+ push @out, $class->_argvify( config => lc($key) . "=$val" );
+ } else {
+ # Assume M::B can handle it in lowercase form
+ push @out, $class->_argvify("\L$key" => $val);
+ }
+ }
+ return @out;
+}
+
+sub _argvify {
+ my ($self, @pairs) = @_;
+ my @out;
+ while (@pairs) {
+ my ($k, $v) = splice @pairs, 0, 2;
+ push @out, ("--$k", $v);
+ }
+ return @out;
+}
+
+sub makefile_to_build_macros {
+ my @out;
+ my %config; # must accumulate and return as a hashref
+ while (my ($macro, $trans) = each %macro_to_build) {
+ # On some platforms (e.g. Cygwin with 'make'), the mere presence
+ # of "EXPORT: FOO" in the Makefile will make $ENV{FOO} defined.
+ # Therefore we check length() too.
+ next unless exists $ENV{$macro} && length $ENV{$macro};
+ my $val = $ENV{$macro};
+ my @args = ref($trans) ? $trans->($val) : ($trans => $val);
+ while (@args) {
+ my ($k, $v) = splice(@args, 0, 2);
+ if ( $k eq 'config' ) {
+ if ( $v =~ /^([^=]+)=(.*)$/ ) {
+ $config{$1} = $2;
+ }
+ else {
+ warn "Couldn't parse config '$v'\n";
+ }
+ }
+ else {
+ push @out, ($k => $v);
+ }
+ }
+ }
+ push @out, (config => \%config) if %config;
+ return @out;
+}
+
+sub run_build_pl {
+ my ($pack, %in) = @_;
+ $in{script} ||= 'Build.PL';
+ my @args = $in{args} ? $pack->makefile_to_build_args(@{$in{args}}) : ();
+ print "# running $in{script} @args\n";
+ Module::Build->run_perl_script($in{script}, [], \@args) or die "Couldn't run $in{script}: $!";
+}
+
+sub fake_makefile {
+ my ($self, %args) = @_;
+ unless (exists $args{build_class}) {
+ warn "Unknown 'build_class', defaulting to 'Module::Build'\n";
+ $args{build_class} = 'Module::Build';
+ }
+ my $class = $args{build_class};
+
+ my $perl = $class->find_perl_interpreter;
+
+ # VMS MMS/MMK need to use MCR to run the Perl image.
+ $perl = 'MCR ' . $perl if $self->_is_vms_mms;
+
+ my $noop = ($class->is_windowsish ? 'rem>nul' :
+ $self->_is_vms_mms ? 'Continue' :
+ 'true');
+
+ my $filetype = $class->is_vmsish ? '.COM' : '';
+
+ my $Build = 'Build' . $filetype . ' --makefile_env_macros 1';
+ my $unlink = $class->oneliner('1 while unlink $ARGV[0]', [], [$args{makefile}]);
+ $unlink =~ s/\$/\$\$/g unless $class->is_vmsish;
+
+ my $maketext = ($^O eq 'os2' ? "SHELL = sh\n\n" : '');
+
+ $maketext .= <<"EOF";
+all : force_do_it
+ $perl $Build
+realclean : force_do_it
+ $perl $Build realclean
+ $unlink
+distclean : force_do_it
+ $perl $Build distclean
+ $unlink
+
+
+force_do_it :
+ @ $noop
+EOF
+
+ foreach my $action ($class->known_actions) {
+ next if $action =~ /^(all|distclean|realclean|force_do_it)$/; # Don't double-define
+ $maketext .= <<"EOF";
+$action : force_do_it
+ $perl $Build $action
+EOF
+ }
+
+ if ($self->_is_vms_mms) {
+ # Roll our own .EXPORT as MMS/MMK don't honor that directive.
+ $maketext .= "\n.FIRST\n\t\@ $noop\n";
+ for my $macro (keys %macro_to_build) {
+ $maketext .= ".IFDEF $macro\n\tDEFINE $macro \"\$($macro)\"\n.ENDIF\n";
+ }
+ $maketext .= "\n";
+ }
+ else {
+ $maketext .= "\n.EXPORT : " . join(' ', keys %macro_to_build) . "\n\n";
+ }
+
+ return $maketext;
+}
+
+sub fake_prereqs {
+ my $file = File::Spec->catfile('_build', 'prereqs');
+ my $fh = IO::File->new("< $file") or die "Can't read $file: $!";
+ my $prereqs = eval do {local $/; <$fh>};
+ close $fh;
+
+ my %merged = _merge_prereq( $prereqs->{requires}, $prereqs->{build_requires} );
+ my @prereq;
+ foreach (sort keys %merged) {
+ next if $_ eq 'perl';
+ push @prereq, "$_=>q[$merged{$_}]";
+ }
+ return unless @prereq;
+ return "# PREREQ_PM => { " . join(", ", @prereq) . " }\n\n";
+}
+
+
+sub write_makefile {
+ my ($pack, %in) = @_;
+
+ unless (exists $in{build_class}) {
+ warn "Unknown 'build_class', defaulting to 'Module::Build'\n";
+ $in{build_class} = 'Module::Build';
+ }
+ my $class = $in{build_class};
+ $in{makefile} ||= $pack->_is_vms_mms ? 'Descrip.MMS' : 'Makefile';
+
+ open MAKE, "> $in{makefile}" or die "Cannot write $in{makefile}: $!";
+ print MAKE $pack->fake_prereqs;
+ print MAKE $pack->fake_makefile(%in);
+ close MAKE;
+}
+
+sub _is_vms_mms {
+ return Module::Build->is_vmsish && ($Config{make} =~ m/MM[SK]/i);
+}
+
+1;
+__END__
+
+=for :stopwords passthrough
+
+=head1 NAME
+
+Module::Build::Compat - Compatibility with ExtUtils::MakeMaker
+
+
+=head1 SYNOPSIS
+
+ # In a Build.PL :
+ use Module::Build;
+ my $build = Module::Build->new
+ ( module_name => 'Foo::Bar',
+ license => 'perl',
+ create_makefile_pl => 'traditional' );
+ ...
+
+
+=head1 DESCRIPTION
+
+Because C<ExtUtils::MakeMaker> has been the standard way to distribute
+modules for a long time, many tools (CPAN.pm, or your system
+administrator) may expect to find a working F<Makefile.PL> in every
+distribution they download from CPAN. If you want to throw them a
+bone, you can use C<Module::Build::Compat> to automatically generate a
+F<Makefile.PL> for you, in one of several different styles.
+
+C<Module::Build::Compat> also provides some code that helps out the
+F<Makefile.PL> at runtime.
+
+
+=head1 METHODS
+
+=over 4
+
+=item create_makefile_pl($style, $build)
+
+Creates a F<Makefile.PL> in the current directory in one of several
+styles, based on the supplied C<Module::Build> object C<$build>. This is
+typically controlled by passing the desired style as the
+C<create_makefile_pl> parameter to C<Module::Build>'s C<new()> method;
+the F<Makefile.PL> will then be automatically created during the
+C<distdir> action.
+
+The currently supported styles are:
+
+=over 4
+
+=item traditional
+
+A F<Makefile.PL> will be created in the "traditional" style, i.e. it will
+use C<ExtUtils::MakeMaker> and won't rely on C<Module::Build> at all.
+In order to create the F<Makefile.PL>, we'll include the C<requires> and
+C<build_requires> dependencies as the C<PREREQ_PM> parameter.
+
+You don't want to use this style if during the C<perl Build.PL> stage
+you ask the user questions, or do some auto-sensing about the user's
+environment, or if you subclass C<Module::Build> to do some
+customization, because the vanilla F<Makefile.PL> won't do any of that.
+
+=item small
+
+A small F<Makefile.PL> will be created that passes all functionality
+through to the F<Build.PL> script in the same directory. The user must
+already have C<Module::Build> installed in order to use this, or else
+they'll get a module-not-found error.
+
+=item passthrough (DEPRECATED)
+
+This is just like the C<small> option above, but if C<Module::Build> is
+not already installed on the user's system, the script will offer to
+use C<CPAN.pm> to download it and install it before continuing with
+the build.
+
+This option has been deprecated and may be removed in a future version
+of Module::Build. Modern CPAN.pm and CPANPLUS will recognize the
+C<configure_requires> metadata property and install Module::Build before
+running Build.PL if Module::Build is listed and Module::Build now
+adds itself to configure_requires by default.
+
+Perl 5.10.1 includes C<configure_requires> support. In the future, when
+C<configure_requires> support is deemed sufficiently widespread, the
+C<passthrough> style will be removed.
+
+=back
+
+=item run_build_pl(args => \@ARGV)
+
+This method runs the F<Build.PL> script, passing it any arguments the
+user may have supplied to the C<perl Makefile.PL> command. Because
+C<ExtUtils::MakeMaker> and C<Module::Build> accept different arguments, this
+method also performs some translation between the two.
+
+C<run_build_pl()> accepts the following named parameters:
+
+=over 4
+
+=item args
+
+The C<args> parameter specifies the parameters that would usually
+appear on the command line of the C<perl Makefile.PL> command -
+typically you'll just pass a reference to C<@ARGV>.
+
+=item script
+
+This is the filename of the script to run - it defaults to C<Build.PL>.
+
+=back
+
+=item write_makefile()
+
+This method writes a 'dummy' F<Makefile> that will pass all commands
+through to the corresponding C<Module::Build> actions.
+
+C<write_makefile()> accepts the following named parameters:
+
+=over 4
+
+=item makefile
+
+The name of the file to write - defaults to the string C<Makefile>.
+
+=back
+
+=back
+
+
+=head1 SCENARIOS
+
+So, some common scenarios are:
+
+=over 4
+
+=item 1.
+
+Just include a F<Build.PL> script (without a F<Makefile.PL>
+script), and give installation directions in a F<README> or F<INSTALL>
+document explaining how to install the module. In particular, explain
+that the user must install C<Module::Build> before installing your
+module.
+
+Note that if you do this, you may make things easier for yourself, but
+harder for people with older versions of CPAN or CPANPLUS on their
+system, because those tools generally only understand the
+F<Makefile.PL>/C<ExtUtils::MakeMaker> way of doing things.
+
+=item 2.
+
+Include a F<Build.PL> script and a "traditional" F<Makefile.PL>,
+created either manually or with C<create_makefile_pl()>. Users won't
+ever have to install C<Module::Build> if they use the F<Makefile.PL>, but
+they won't get to take advantage of C<Module::Build>'s extra features
+either.
+
+For good measure, of course, test both the F<Makefile.PL> and the
+F<Build.PL> before shipping.
+
+=item 3.
+
+Include a F<Build.PL> script and a "pass-through" F<Makefile.PL>
+built using C<Module::Build::Compat>. This will mean that people can
+continue to use the "old" installation commands, and they may never
+notice that it's actually doing something else behind the scenes. It
+will also mean that your installation process is compatible with older
+versions of tools like CPAN and CPANPLUS.
+
+=back
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+L<Module::Build>(3), L<ExtUtils::MakeMaker>(3)
+
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Config.pm b/Master/tlpkg/tlperl/lib/Module/Build/Config.pm
new file mode 100644
index 00000000000..997960073fd
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Config.pm
@@ -0,0 +1,59 @@
+package Module::Build::Config;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Config;
+
+sub new {
+ my ($pack, %args) = @_;
+ return bless {
+ stack => {},
+ values => $args{values} || {},
+ }, $pack;
+}
+
+sub get {
+ my ($self, $key) = @_;
+ return $self->{values}{$key} if ref($self) && exists $self->{values}{$key};
+ return $Config{$key};
+}
+
+sub set {
+ my ($self, $key, $val) = @_;
+ $self->{values}{$key} = $val;
+}
+
+sub push {
+ my ($self, $key, $val) = @_;
+ push @{$self->{stack}{$key}}, $self->{values}{$key}
+ if exists $self->{values}{$key};
+ $self->{values}{$key} = $val;
+}
+
+sub pop {
+ my ($self, $key) = @_;
+
+ my $val = delete $self->{values}{$key};
+ if ( exists $self->{stack}{$key} ) {
+ $self->{values}{$key} = pop @{$self->{stack}{$key}};
+ delete $self->{stack}{$key} unless @{$self->{stack}{$key}};
+ }
+
+ return $val;
+}
+
+sub values_set {
+ my $self = shift;
+ return undef unless ref($self);
+ return $self->{values};
+}
+
+sub all_config {
+ my $self = shift;
+ my $v = ref($self) ? $self->{values} : {};
+ return {%Config, %$v};
+}
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/ConfigData.pm b/Master/tlpkg/tlperl/lib/Module/Build/ConfigData.pm
new file mode 100644
index 00000000000..15114ee072b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/ConfigData.pm
@@ -0,0 +1,220 @@
+package Module::Build::ConfigData;
+use strict;
+my $arrayref = eval do {local $/; <DATA>}
+ or die "Couldn't load ConfigData data: $@";
+close DATA;
+my ($config, $features, $auto_features) = @$arrayref;
+
+sub config { $config->{$_[1]} }
+
+sub set_config { $config->{$_[1]} = $_[2] }
+sub set_feature { $features->{$_[1]} = 0+!!$_[2] } # Constrain to 1 or 0
+
+sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features }
+
+sub feature_names {
+ my @features = (keys %$features, auto_feature_names());
+ @features;
+}
+
+sub config_names { keys %$config }
+
+sub write {
+ my $me = __FILE__;
+ require IO::File;
+
+ # Can't use Module::Build::Dumper here because M::B is only a
+ # build-time prereq of this module
+ require Data::Dumper;
+
+ my $mode_orig = (stat $me)[2] & 07777;
+ chmod($mode_orig | 0222, $me); # Make it writeable
+ my $fh = IO::File->new($me, 'r+') or die "Can't rewrite $me: $!";
+ seek($fh, 0, 0);
+ while (<$fh>) {
+ last if /^__DATA__$/;
+ }
+ die "Couldn't find __DATA__ token in $me" if eof($fh);
+
+ seek($fh, tell($fh), 0);
+ my $data = [$config, $features, $auto_features];
+ $fh->print( 'do{ my '
+ . Data::Dumper->new([$data],['x'])->Purity(1)->Dump()
+ . '$x; }' );
+ truncate($fh, tell($fh));
+ $fh->close;
+
+ chmod($mode_orig, $me)
+ or warn "Couldn't restore permissions on $me: $!";
+}
+
+sub feature {
+ my ($package, $key) = @_;
+ return $features->{$key} if exists $features->{$key};
+
+ my $info = $auto_features->{$key} or return 0;
+
+ # Under perl 5.005, each(%$foo) isn't working correctly when $foo
+ # was reanimated with Data::Dumper and eval(). Not sure why, but
+ # copying to a new hash seems to solve it.
+ my %info = %$info;
+
+ require Module::Build; # XXX should get rid of this
+ while (my ($type, $prereqs) = each %info) {
+ next if $type eq 'description' || $type eq 'recommends';
+
+ my %p = %$prereqs; # Ditto here.
+ while (my ($modname, $spec) = each %p) {
+ my $status = Module::Build->check_installed_status($modname, $spec);
+ if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
+ if ( ! eval "require $modname; 1" ) { return 0; }
+ }
+ }
+ return 1;
+}
+
+
+=head1 NAME
+
+Module::Build::ConfigData - Configuration for Module::Build
+
+=head1 SYNOPSIS
+
+ use Module::Build::ConfigData;
+ $value = Module::Build::ConfigData->config('foo');
+ $value = Module::Build::ConfigData->feature('bar');
+
+ @names = Module::Build::ConfigData->config_names;
+ @names = Module::Build::ConfigData->feature_names;
+
+ Module::Build::ConfigData->set_config(foo => $new_value);
+ Module::Build::ConfigData->set_feature(bar => $new_value);
+ Module::Build::ConfigData->write; # Save changes
+
+
+=head1 DESCRIPTION
+
+This module holds the configuration data for the C<Module::Build>
+module. It also provides a programmatic interface for getting or
+setting that configuration data. Note that in order to actually make
+changes, you'll have to have write access to the C<Module::Build::ConfigData>
+module, and you should attempt to understand the repercussions of your
+actions.
+
+
+=head1 METHODS
+
+=over 4
+
+=item config($name)
+
+Given a string argument, returns the value of the configuration item
+by that name, or C<undef> if no such item exists.
+
+=item feature($name)
+
+Given a string argument, returns the value of the feature by that
+name, or C<undef> if no such feature exists.
+
+=item set_config($name, $value)
+
+Sets the configuration item with the given name to the given value.
+The value may be any Perl scalar that will serialize correctly using
+C<Data::Dumper>. This includes references, objects (usually), and
+complex data structures. It probably does not include transient
+things like filehandles or sockets.
+
+=item set_feature($name, $value)
+
+Sets the feature with the given name to the given boolean value. The
+value will be converted to 0 or 1 automatically.
+
+=item config_names()
+
+Returns a list of all the names of config items currently defined in
+C<Module::Build::ConfigData>, or in scalar context the number of items.
+
+=item feature_names()
+
+Returns a list of all the names of features currently defined in
+C<Module::Build::ConfigData>, or in scalar context the number of features.
+
+=item auto_feature_names()
+
+Returns a list of all the names of features whose availability is
+dynamically determined, or in scalar context the number of such
+features. Does not include such features that have later been set to
+a fixed value.
+
+=item write()
+
+Commits any changes from C<set_config()> and C<set_feature()> to disk.
+Requires write access to the C<Module::Build::ConfigData> module.
+
+=back
+
+
+=head1 AUTHOR
+
+C<Module::Build::ConfigData> was automatically created using C<Module::Build>.
+C<Module::Build> was written by Ken Williams, but he holds no
+authorship claim or copyright claim to the contents of C<Module::Build::ConfigData>.
+
+=cut
+
+
+__DATA__
+do{ my $x = [
+ {},
+ {},
+ {
+ 'license_creation' => {
+ 'requires' => {
+ 'Software::License' => 0
+ },
+ 'description' => 'Create licenses automatically in distributions'
+ },
+ 'inc_bundling_support' => {
+ 'requires' => {
+ 'ExtUtils::Installed' => '1.999',
+ 'ExtUtils::Install' => '1.54'
+ },
+ 'description' => 'Bundle Module::Build in inc/'
+ },
+ 'YAML_support' => {
+ 'requires' => {
+ 'YAML::Tiny' => '1.38'
+ },
+ 'description' => 'Use YAML::Tiny to write META.yml files'
+ },
+ 'manpage_support' => {
+ 'requires' => {
+ 'Pod::Man' => 0
+ },
+ 'description' => 'Create Unix man pages'
+ },
+ 'PPM_support' => {
+ 'requires' => {
+ 'IO::File' => '1.13'
+ },
+ 'description' => 'Generate PPM files for distributions'
+ },
+ 'dist_authoring' => {
+ 'requires' => {
+ 'Archive::Tar' => '1.09'
+ },
+ 'recommends' => {
+ 'Module::Signature' => '0.21',
+ 'Pod::Readme' => '0.04'
+ },
+ 'description' => 'Create new distributions'
+ },
+ 'HTML_support' => {
+ 'requires' => {
+ 'Pod::Html' => 0
+ },
+ 'description' => 'Create HTML documentation'
+ }
+ }
+ ];
+$x; } \ No newline at end of file
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Cookbook.pm b/Master/tlpkg/tlperl/lib/Module/Build/Cookbook.pm
new file mode 100644
index 00000000000..a68dca540ab
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Cookbook.pm
@@ -0,0 +1,529 @@
+package Module::Build::Cookbook;
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+
+
+=head1 NAME
+
+Module::Build::Cookbook - Examples of Module::Build Usage
+
+=head1 DESCRIPTION
+
+C<Module::Build> isn't conceptually very complicated, but examples are
+always helpful. The following recipes should help developers and/or
+installers put together the pieces from the other parts of the
+documentation.
+
+
+=head1 BASIC RECIPES
+
+
+=head2 Installing modules that use Module::Build
+
+In most cases, you can just issue the following commands:
+
+ perl Build.PL
+ ./Build
+ ./Build test
+ ./Build install
+
+There's nothing complicated here - first you're running a script
+called F<Build.PL>, then you're running a (newly-generated) script
+called F<Build> and passing it various arguments.
+
+The exact commands may vary a bit depending on how you invoke perl
+scripts on your system. For instance, if you have multiple versions
+of perl installed, you can install to one particular perl's library
+directories like so:
+
+ /usr/bin/perl5.8.1 Build.PL
+ ./Build
+ ./Build test
+ ./Build install
+
+If you're on Windows where the current directory is always searched
+first for scripts, you'll probably do something like this:
+
+ perl Build.PL
+ Build
+ Build test
+ Build install
+
+On the old Mac OS (version 9 or lower) using MacPerl, you can
+double-click on the F<Build.PL> script to create the F<Build> script,
+then double-click on the F<Build> script to run its C<build>, C<test>,
+and C<install> actions.
+
+The F<Build> script knows what perl was used to run F<Build.PL>, so
+you don't need to re-invoke the F<Build> script with the complete perl
+path each time. If you invoke it with the I<wrong> perl path, you'll
+get a warning or a fatal error.
+
+=head2 Modifying Config.pm values
+
+C<Module::Build> relies heavily on various values from perl's
+C<Config.pm> to do its work. For example, default installation paths
+are given by C<installsitelib> and C<installvendorman3dir> and
+friends, C linker & compiler settings are given by C<ld>,
+C<lddlflags>, C<cc>, C<ccflags>, and so on. I<If you're pretty sure
+you know what you're doing>, you can tell C<Module::Build> to pretend
+there are different values in F<Config.pm> than what's really there,
+by passing arguments for the C<--config> parameter on the command
+line:
+
+ perl Build.PL --config cc=gcc --config ld=gcc
+
+Inside the C<Build.PL> script the same thing can be accomplished by
+passing values for the C<config> parameter to C<new()>:
+
+ my $build = Module::Build->new
+ (
+ ...
+ config => { cc => 'gcc', ld => 'gcc' },
+ ...
+ );
+
+In custom build code, the same thing can be accomplished by calling
+the L<Module::Build/config> method:
+
+ $build->config( cc => 'gcc' ); # Set
+ $build->config( ld => 'gcc' ); # Set
+ ...
+ my $linker = $build->config('ld'); # Get
+
+
+=head2 Installing modules using the programmatic interface
+
+If you need to build, test, and/or install modules from within some
+other perl code (as opposed to having the user type installation
+commands at the shell), you can use the programmatic interface.
+Create a Module::Build object (or an object of a custom Module::Build
+subclass) and then invoke its C<dispatch()> method to run various
+actions.
+
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ license => 'perl',
+ requires => { 'Some::Module' => '1.23' },
+ );
+ $build->dispatch('build');
+ $build->dispatch('test', verbose => 1);
+ $build->dispatch('install');
+
+The first argument to C<dispatch()> is the name of the action, and any
+following arguments are named parameters.
+
+This is the interface we use to test Module::Build itself in the
+regression tests.
+
+
+=head2 Installing to a temporary directory
+
+To create packages for package managers like RedHat's C<rpm> or
+Debian's C<deb>, you may need to install to a temporary directory
+first and then create the package from that temporary installation.
+To do this, specify the C<destdir> parameter to the C<install> action:
+
+ ./Build install --destdir /tmp/my-package-1.003
+
+This essentially just prepends all the installation paths with the
+F</tmp/my-package-1.003> directory.
+
+
+=head2 Installing to a non-standard directory
+
+To install to a non-standard directory (for example, if you don't have
+permission to install in the system-wide directories), you can use the
+C<install_base> or C<prefix> parameters:
+
+ ./Build install --install_base /foo/bar
+
+See L<Module::Build/"INSTALL PATHS"> for a much more complete
+discussion of how installation paths are determined.
+
+
+=head2 Installing in the same location as ExtUtils::MakeMaker
+
+With the introduction of C<--prefix> in Module::Build 0.28 and
+C<INSTALL_BASE> in C<ExtUtils::MakeMaker> 6.31 its easy to get them both
+to install to the same locations.
+
+First, ensure you have at least version 0.28 of Module::Build
+installed and 6.31 of C<ExtUtils::MakeMaker>. Prior versions have
+differing (and in some cases quite strange) installation behaviors.
+
+The following installation flags are equivalent between
+C<ExtUtils::MakeMaker> and C<Module::Build>.
+
+ MakeMaker Module::Build
+ PREFIX=... --prefix ...
+ INSTALL_BASE=... --install_base ...
+ DESTDIR=... --destdir ...
+ LIB=... --install_path lib=...
+ INSTALLDIRS=... --installdirs ...
+ INSTALLDIRS=perl --installdirs core
+ UNINST=... --uninst ...
+ INC=... --extra_compiler_flags ...
+ POLLUTE=1 --extra_compiler_flags -DPERL_POLLUTE
+
+For example, if you are currently installing C<MakeMaker> modules with
+this command:
+
+ perl Makefile.PL PREFIX=~
+ make test
+ make install UNINST=1
+
+You can install into the same location with Module::Build using this:
+
+ perl Build.PL --prefix ~
+ ./Build test
+ ./Build install --uninst 1
+
+=head3 C<prefix> vs C<install_base>
+
+The behavior of C<prefix> is complicated and depends on
+how your Perl is configured. The resulting installation locations
+will vary from machine to machine and even different installations of
+Perl on the same machine. Because of this, it's difficult to document
+where C<prefix> will place your modules.
+
+In contrast, C<install_base> has predictable, easy to explain
+installation locations. Now that C<Module::Build> and C<MakeMaker> both
+have C<install_base> there is little reason to use C<prefix> other
+than to preserve your existing installation locations. If you are
+starting a fresh Perl installation we encourage you to use
+C<install_base>. If you have an existing installation installed via
+C<prefix>, consider moving it to an installation structure matching
+C<install_base> and using that instead.
+
+
+=head2 Running a single test file
+
+C<Module::Build> supports running a single test, which enables you to
+track down errors more quickly. Use the following format:
+
+ ./Build test --test_files t/mytest.t
+
+In addition, you may want to run the test in verbose mode to get more
+informative output:
+
+ ./Build test --test_files t/mytest.t --verbose 1
+
+I run this so frequently that I define the following shell alias:
+
+ alias t './Build test --verbose 1 --test_files'
+
+So then I can just execute C<t t/mytest.t> to run a single test.
+
+
+=head1 ADVANCED RECIPES
+
+
+=head2 Making a CPAN.pm-compatible distribution
+
+New versions of CPAN.pm understand how to use a F<Build.PL> script,
+but old versions don't. If authors want to help users who have old
+versions, some form of F<Makefile.PL> should be supplied. The easiest
+way to accomplish this is to use the C<create_makefile_pl> parameter to
+C<< Module::Build->new() >> in the C<Build.PL> script, which can
+create various flavors of F<Makefile.PL> during the C<dist> action.
+
+As a best practice, we recommend using the "traditional" style of
+F<Makefile.PL> unless your distribution has needs that can't be
+accomplished that way.
+
+The C<Module::Build::Compat> module, which is part of
+C<Module::Build>'s distribution, is responsible for creating these
+F<Makefile.PL>s. Please see L<Module::Build::Compat> for the details.
+
+
+=head2 Changing the order of the build process
+
+The C<build_elements> property specifies the steps C<Module::Build>
+will take when building a distribution. To change the build order,
+change the order of the entries in that property:
+
+ # Process pod files first
+ my @e = @{$build->build_elements};
+ my ($i) = grep {$e[$_] eq 'pod'} 0..$#e;
+ unshift @e, splice @e, $i, 1;
+
+Currently, C<build_elements> has the following default value:
+
+ [qw( PL support pm xs pod script )]
+
+Do take care when altering this property, since there may be
+non-obvious (and non-documented!) ordering dependencies in the
+C<Module::Build> code.
+
+
+=head2 Adding new file types to the build process
+
+Sometimes you might have extra types of files that you want to install
+alongside the standard types like F<.pm> and F<.pod> files. For
+instance, you might have a F<Bar.dat> file containing some data
+related to the C<Foo::Bar> module and you'd like for it to end up as
+F<Foo/Bar.dat> somewhere in perl's C<@INC> path so C<Foo::Bar> can
+access it easily at runtime. The following code from a sample
+C<Build.PL> file demonstrates how to accomplish this:
+
+ use Module::Build;
+ my $build = Module::Build->new
+ (
+ module_name => 'Foo::Bar',
+ ...other stuff here...
+ );
+ $build->add_build_element('dat');
+ $build->create_build_script;
+
+This will find all F<.dat> files in the F<lib/> directory, copy them
+to the F<blib/lib/> directory during the C<build> action, and install
+them during the C<install> action.
+
+If your extra files aren't located in the C<lib/> directory in your
+distribution, you can explicitly say where they are, just as you'd do
+with F<.pm> or F<.pod> files:
+
+ use Module::Build;
+ my $build = new Module::Build
+ (
+ module_name => 'Foo::Bar',
+ dat_files => {'some/dir/Bar.dat' => 'lib/Foo/Bar.dat'},
+ ...other stuff here...
+ );
+ $build->add_build_element('dat');
+ $build->create_build_script;
+
+If your extra files actually need to be created on the user's machine,
+or if they need some other kind of special processing, you'll probably
+want to subclass C<Module::Build> and create a special method to
+process them, named C<process_${kind}_files()>:
+
+ use Module::Build;
+ my $class = Module::Build->subclass(code => <<'EOF');
+ sub process_dat_files {
+ my $self = shift;
+ ... locate and process *.dat files,
+ ... and create something in blib/lib/
+ }
+ EOF
+ my $build = $class->new
+ (
+ module_name => 'Foo::Bar',
+ ...other stuff here...
+ );
+ $build->add_build_element('dat');
+ $build->create_build_script;
+
+If your extra files don't go in F<lib/> but in some other place, see
+L<"Adding new elements to the install process"> for how to actually
+get them installed.
+
+Please note that these examples use some capabilities of Module::Build
+that first appeared in version 0.26. Before that it could
+still be done, but the simple cases took a bit more work.
+
+
+=head2 Adding new elements to the install process
+
+By default, Module::Build creates seven subdirectories of the F<blib>
+directory during the build process: F<lib>, F<arch>, F<bin>,
+F<script>, F<bindoc>, F<libdoc>, and F<html> (some of these may be
+missing or empty if there's nothing to go in them). Anything copied
+to these directories during the build will eventually be installed
+during the C<install> action (see L<Module::Build/"INSTALL PATHS">.
+
+If you need to create a new custom type of installable element, e.g. C<conf>,
+then you need to tell Module::Build where things in F<blib/conf/>
+should be installed. To do this, use the C<install_path> parameter to
+the C<new()> method:
+
+ my $build = Module::Build->new
+ (
+ ...other stuff here...
+ install_path => { conf => $installation_path }
+ );
+
+Or you can call the C<install_path()> method later:
+
+ $build->install_path(conf => $installation_path);
+
+The user may also specify the path on the command line:
+
+ perl Build.PL --install_path conf=/foo/path/etc
+
+The important part, though, is that I<somehow> the install path needs
+to be set, or else nothing in the F<blib/conf/> directory will get
+installed, and a runtime error during the C<install> action will
+result.
+
+See also L<"Adding new file types to the build process"> for how to
+create the stuff in F<blib/conf/> in the first place.
+
+
+=head1 EXAMPLES ON CPAN
+
+Several distributions on CPAN are making good use of various features
+of Module::Build. They can serve as real-world examples for others.
+
+
+=head2 SVN-Notify-Mirror
+
+L<http://search.cpan.org/~jpeacock/SVN-Notify-Mirror/>
+
+John Peacock, author of the C<SVN-Notify-Mirror> distribution, says:
+
+=over 4
+
+=item 1. Using C<auto_features>, I check to see whether two optional
+modules are available - SVN::Notify::Config and Net::SSH;
+
+=item 2. If the S::N::Config module is loaded, I automatically
+generate test files for it during Build (using the C<PL_files>
+property).
+
+=item 3. If the C<ssh_feature> is available, I ask if the user wishes
+to perform the ssh tests (since it requires a little preliminary
+setup);
+
+=item 4. Only if the user has C<ssh_feature> and answers yes to the
+testing, do I generate a test file.
+
+I'm sure I could not have handled this complexity with EU::MM, but it
+was very easy to do with M::B.
+
+=back
+
+
+=head2 Modifying an action
+
+Sometimes you might need an to have an action, say C<./Build install>,
+do something unusual. For instance, you might need to change the
+ownership of a file or do something else peculiar to your application.
+
+You can subclass C<Module::Build> on the fly using the C<subclass()>
+method and override the methods that perform the actions. You may
+need to read through C<Module::Build::Authoring> and
+C<Module::Build::API> to find the methods you want to override. All
+"action" methods are implemented by a method called "ACTION_" followed
+by the action's name, so here's an example of how it would work for
+the C<install> action:
+
+ # Build.PL
+ use Module::Build;
+ my $class = Module::Build->subclass(
+ class => "Module::Build::Custom",
+ code => <<'SUBCLASS' );
+
+ sub ACTION_install {
+ my $self = shift;
+ # YOUR CODE HERE
+ $self->SUPER::ACTION_install;
+ }
+ SUBCLASS
+
+ $class->new(
+ module_name => 'Your::Module',
+ # rest of the usual Module::Build parameters
+ )->create_build_script;
+
+
+=head2 Adding an action
+
+You can add a new C<./Build> action simply by writing the method for
+it in your subclass. Use C<depends_on> to declare that another action
+must have been run before your action.
+
+For example, let's say you wanted to be able to write C<./Build
+commit> to test your code and commit it to Subversion.
+
+ # Build.PL
+ use Module::Build;
+ my $class = Module::Build->subclass(
+ class => "Module::Build::Custom",
+ code => <<'SUBCLASS' );
+
+ sub ACTION_commit {
+ my $self = shift;
+
+ $self->depends_on("test");
+ $self->do_system(qw(svn commit));
+ }
+ SUBCLASS
+
+
+=head2 Bundling Module::Build
+
+Note: This section probably needs an update as the technology improves
+(see contrib/bundle.pl in the distribution).
+
+Suppose you want to use some new-ish features of Module::Build,
+e.g. newer than the version of Module::Build your users are likely to
+already have installed on their systems. The first thing you should
+do is set C<configure_requires> to your minimum version of
+Module::Build. See L<Module::Build::Authoring>.
+
+But not every build system honors C<configure_requires> yet. Here's
+how you can ship a copy of Module::Build, but still use a newer
+installed version to take advantage of any bug fixes and upgrades.
+
+First, install Module::Build into F<Your-Project/inc/Module-Build>.
+CPAN will not index anything in the F<inc> directory so this copy will
+not show up in CPAN searches.
+
+ cd Module-Build
+ perl Build.PL --install_base /path/to/Your-Project/inc/Module-Build
+ ./Build test
+ ./Build install
+
+You should now have all the Module::Build .pm files in
+F<Your-Project/inc/Module-Build/lib/perl5>.
+
+Next, add this to the top of your F<Build.PL>.
+
+ my $Bundled_MB = 0.30; # or whatever version it was.
+
+ # Find out what version of Module::Build is installed or fail quietly.
+ # This should be cross-platform.
+ my $Installed_MB =
+ `$^X -e "eval q{require Module::Build; print Module::Build->VERSION} or exit 1";
+
+ # some operating systems put a newline at the end of every print.
+ chomp $Installed_MB;
+
+ $Installed_MB = 0 if $?;
+
+ # Use our bundled copy of Module::Build if it's newer than the installed.
+ unshift @INC, "inc/Module-Build/lib/perl5" if $Bundled_MB > $Installed_MB;
+
+ require Module::Build;
+
+And write the rest of your F<Build.PL> normally. Module::Build will
+remember your change to C<@INC> and use it when you run F<./Build>.
+
+In the future, we hope to provide a more automated solution for this
+scenario; see C<inc/latest.pm> in the Module::Build distribution for
+one indication of the direction we're moving.
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2008 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3), L<Module::Build::Authoring>(3),
+L<Module::Build::API>(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Dumper.pm b/Master/tlpkg/tlperl/lib/Module/Build/Dumper.pm
new file mode 100644
index 00000000000..2a9bad1b637
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Dumper.pm
@@ -0,0 +1,19 @@
+package Module::Build::Dumper;
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+
+# This is just a split-out of a wrapper function to do Data::Dumper
+# stuff "the right way". See:
+# http://groups.google.com/group/perl.module.build/browse_thread/thread/c8065052b2e0d741
+
+use Data::Dumper;
+
+sub _data_dump {
+ my ($self, $data) = @_;
+ return ("do{ my "
+ . Data::Dumper->new([$data],['x'])->Purity(1)->Terse(0)->Dump()
+ . '$x; }')
+}
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/ModuleInfo.pm b/Master/tlpkg/tlperl/lib/Module/Build/ModuleInfo.pm
new file mode 100644
index 00000000000..053ae18d523
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/ModuleInfo.pm
@@ -0,0 +1,491 @@
+# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*-
+# vim:ts=8:sw=2:et:sta:sts=2
+package Module::Build::ModuleInfo;
+
+# This module provides routines to gather information about
+# perl modules (assuming this may be expanded in the distant
+# parrot future to look at other types of modules).
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+use File::Spec;
+use IO::File;
+use Module::Build::Version;
+
+my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal
+
+my $PKG_REGEXP = qr{ # match a package declaration
+ ^[\s\{;]* # intro chars on a line
+ package # the word 'package'
+ \s+ # whitespace
+ ([\w:]+) # a package name
+ \s* # optional whitespace
+ ($V_NUM_REGEXP)? # optional version number
+ \s* # optional whitesapce
+ ; # semicolon line terminator
+}x;
+
+my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name
+ ([\$*]) # sigil - $ or *
+ (
+ ( # optional leading package name
+ (?:::|\')? # possibly starting like just :: (Ì la $::VERSION)
+ (?:\w+(?:::|\'))* # Foo::Bar:: ...
+ )?
+ VERSION
+ )\b
+}x;
+
+my $VERS_REGEXP = qr{ # match a VERSION definition
+ (?:
+ \(\s*$VARNAME_REGEXP\s*\) # with parens
+ |
+ $VARNAME_REGEXP # without parens
+ )
+ \s*
+ =[^=~] # = but not ==, nor =~
+}x;
+
+
+sub new_from_file {
+ my $class = shift;
+ my $filename = File::Spec->rel2abs( shift );
+
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init(undef, $filename, @_);
+}
+
+sub new_from_module {
+ my $class = shift;
+ my $module = shift;
+ my %props = @_;
+
+ $props{inc} ||= \@INC;
+ my $filename = $class->find_module_by_name( $module, $props{inc} );
+ return undef unless defined( $filename ) && -f $filename;
+ return $class->_init($module, $filename, %props);
+}
+
+sub _init {
+ my $class = shift;
+ my $module = shift;
+ my $filename = shift;
+ my %props = @_;
+
+ my( %valid_props, @valid_props );
+ @valid_props = qw( collect_pod inc );
+ @valid_props{@valid_props} = delete( @props{@valid_props} );
+ warn "Unknown properties: @{[keys %props]}\n" if scalar( %props );
+
+ my %data = (
+ module => $module,
+ filename => $filename,
+ version => undef,
+ packages => [],
+ versions => {},
+ pod => {},
+ pod_headings => [],
+ collect_pod => 0,
+
+ %valid_props,
+ );
+
+ my $self = bless(\%data, $class);
+
+ $self->_parse_file();
+
+ unless($self->{module} and length($self->{module})) {
+ my ($v, $d, $f) = File::Spec->splitpath($self->{filename});
+ if($f =~ /\.pm$/) {
+ $f =~ s/\..+$//;
+ my @candidates = grep /$f$/, @{$self->{packages}};
+ $self->{module} = shift(@candidates); # punt
+ }
+ else {
+ if(grep /main/, @{$self->{packages}}) {
+ $self->{module} = 'main';
+ }
+ else {
+ $self->{module} = $self->{packages}[0] || '';
+ }
+ }
+ }
+
+ $self->{version} = $self->{versions}{$self->{module}}
+ if defined( $self->{module} );
+
+ return $self;
+}
+
+# class method
+sub _do_find_module {
+ my $class = shift;
+ my $module = shift || die 'find_module_by_name() requires a package name';
+ my $dirs = shift || \@INC;
+
+ my $file = File::Spec->catfile(split( /::/, $module));
+ foreach my $dir ( @$dirs ) {
+ my $testfile = File::Spec->catfile($dir, $file);
+ return [ File::Spec->rel2abs( $testfile ), $dir ]
+ if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp
+ return [ File::Spec->rel2abs( "$testfile.pm" ), $dir ]
+ if -e "$testfile.pm";
+ }
+ return;
+}
+
+# class method
+sub find_module_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[0];
+}
+
+# class method
+sub find_module_dir_by_name {
+ my $found = shift()->_do_find_module(@_) or return;
+ return $found->[1];
+}
+
+
+# given a line of perl code, attempt to parse it if it looks like a
+# $VERSION assignment, returning sigil, full name, & package name
+sub _parse_version_expression {
+ my $self = shift;
+ my $line = shift;
+
+ my( $sig, $var, $pkg );
+ if ( $line =~ $VERS_REGEXP ) {
+ ( $sig, $var, $pkg ) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 );
+ if ( $pkg ) {
+ $pkg = ($pkg eq '::') ? 'main' : $pkg;
+ $pkg =~ s/::$//;
+ }
+ }
+
+ return ( $sig, $var, $pkg );
+}
+
+sub _parse_file {
+ my $self = shift;
+
+ my $filename = $self->{filename};
+ my $fh = IO::File->new( $filename )
+ or die( "Can't open '$filename': $!" );
+
+ $self->_parse_fh($fh);
+}
+
+sub _parse_fh {
+ my ($self, $fh) = @_;
+
+ my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 );
+ my( @pkgs, %vers, %pod, @pod );
+ my $pkg = 'main';
+ my $pod_sect = '';
+ my $pod_data = '';
+
+ while (defined( my $line = <$fh> )) {
+ my $line_num = $.;
+
+ chomp( $line );
+ next if $line =~ /^\s*#/;
+
+ $in_pod = ($line =~ /^=(?!cut)/) ? 1 : ($line =~ /^=cut/) ? 0 : $in_pod;
+
+ # Would be nice if we could also check $in_string or something too
+ last if !$in_pod && $line =~ /^__(?:DATA|END)__$/;
+
+ if ( $in_pod || $line =~ /^=cut/ ) {
+
+ if ( $line =~ /^=head\d\s+(.+)\s*$/ ) {
+ push( @pod, $1 );
+ if ( $self->{collect_pod} && length( $pod_data ) ) {
+ $pod{$pod_sect} = $pod_data;
+ $pod_data = '';
+ }
+ $pod_sect = $1;
+
+
+ } elsif ( $self->{collect_pod} ) {
+ $pod_data .= "$line\n";
+
+ }
+
+ } else {
+
+ $pod_sect = '';
+ $pod_data = '';
+
+ # parse $line to see if it's a $VERSION declaration
+ my( $vers_sig, $vers_fullname, $vers_pkg ) =
+ $self->_parse_version_expression( $line );
+
+ if ( $line =~ $PKG_REGEXP ) {
+ $pkg = $1;
+ push( @pkgs, $pkg ) unless grep( $pkg eq $_, @pkgs );
+ $vers{$pkg} = (defined $2 ? $2 : undef) unless exists( $vers{$pkg} );
+ $need_vers = defined $2 ? 0 : 1;
+
+ # VERSION defined with full package spec, i.e. $Module::VERSION
+ } elsif ( $vers_fullname && $vers_pkg ) {
+ push( @pkgs, $vers_pkg ) unless grep( $vers_pkg eq $_, @pkgs );
+ $need_vers = 0 if $vers_pkg eq $pkg;
+
+ unless ( defined $vers{$vers_pkg} && length $vers{$vers_pkg} ) {
+ $vers{$vers_pkg} =
+ $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line );
+ } else {
+ # Warn unless the user is using the "$VERSION = eval
+ # $VERSION" idiom (though there are probably other idioms
+ # that we should watch out for...)
+ warn <<"EOM" unless $line =~ /=\s*eval/;
+Package '$vers_pkg' already declared with version '$vers{$vers_pkg}',
+ignoring subsequent declaration on line $line_num.
+EOM
+ }
+
+ # first non-comment line in undeclared package main is VERSION
+ } elsif ( !exists($vers{main}) && $pkg eq 'main' && $vers_fullname ) {
+ $need_vers = 0;
+ my $v =
+ $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line );
+ $vers{$pkg} = $v;
+ push( @pkgs, 'main' );
+
+ # first non-comment line in undeclared package defines package main
+ } elsif ( !exists($vers{main}) && $pkg eq 'main' && $line =~ /\w+/ ) {
+ $need_vers = 1;
+ $vers{main} = '';
+ push( @pkgs, 'main' );
+
+ # only keep if this is the first $VERSION seen
+ } elsif ( $vers_fullname && $need_vers ) {
+ $need_vers = 0;
+ my $v =
+ $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line );
+
+
+ unless ( defined $vers{$pkg} && length $vers{$pkg} ) {
+ $vers{$pkg} = $v;
+ } else {
+ warn <<"EOM";
+Package '$pkg' already declared with version '$vers{$pkg}'
+ignoring new version '$v' on line $line_num.
+EOM
+ }
+
+ }
+
+ }
+
+ }
+
+ if ( $self->{collect_pod} && length($pod_data) ) {
+ $pod{$pod_sect} = $pod_data;
+ }
+
+ $self->{versions} = \%vers;
+ $self->{packages} = \@pkgs;
+ $self->{pod} = \%pod;
+ $self->{pod_headings} = \@pod;
+}
+
+{
+my $pn = 0;
+sub _evaluate_version_line {
+ my $self = shift;
+ my( $sigil, $var, $line ) = @_;
+
+ # Some of this code came from the ExtUtils:: hierarchy.
+
+ # We compile into $vsub because 'use version' would cause
+ # compiletime/runtime issues with local()
+ my $vsub;
+ $pn++; # everybody gets their own package
+ my $eval = qq{BEGIN { q# Hide from _packages_inside()
+ #; package Module::Build::ModuleInfo::_version::p$pn;
+ use Module::Build::Version;
+ no strict;
+
+ local $sigil$var;
+ \$$var=undef;
+ \$vsub = sub {
+ $line;
+ \$$var
+ };
+ }};
+
+ local $^W;
+ # Try to get the $VERSION
+ eval $eval;
+ # some modules say $VERSION = $Foo::Bar::VERSION, but Foo::Bar isn't
+ # installed, so we need to hunt in ./lib for it
+ if ( $@ =~ /Can't locate/ && -d 'lib' ) {
+ local @INC = ('lib',@INC);
+ eval $eval;
+ }
+ warn "Error evaling version line '$eval' in $self->{filename}: $@\n"
+ if $@;
+ (ref($vsub) eq 'CODE') or
+ die "failed to build version sub for $self->{filename}";
+ my $result = eval { $vsub->() };
+ die "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n"
+ if $@;
+
+ # Activestate apparently creates custom versions like '1.23_45_01', which
+ # cause M::B::Version to think it's an invalid alpha. So check for that
+ # and strip them
+ my $num_dots = () = $result =~ m{\.}g;
+ my $num_unders = () = $result =~ m{_}g;
+ if ( substr($result,0,1) ne 'v' && $num_dots < 2 && $num_unders > 1 ) {
+ $result =~ s{_}{}g;
+ }
+
+ # Bless it into our own version class
+ eval { $result = Module::Build::Version->new($result) };
+ die "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n"
+ if $@;
+
+ return $result;
+}
+}
+
+
+############################################################
+
+# accessors
+sub name { $_[0]->{module} }
+
+sub filename { $_[0]->{filename} }
+sub packages_inside { @{$_[0]->{packages}} }
+sub pod_inside { @{$_[0]->{pod_headings}} }
+sub contains_pod { $#{$_[0]->{pod_headings}} }
+
+sub version {
+ my $self = shift;
+ my $mod = shift || $self->{module};
+ my $vers;
+ if ( defined( $mod ) && length( $mod ) &&
+ exists( $self->{versions}{$mod} ) ) {
+ return $self->{versions}{$mod};
+ } else {
+ return undef;
+ }
+}
+
+sub pod {
+ my $self = shift;
+ my $sect = shift;
+ if ( defined( $sect ) && length( $sect ) &&
+ exists( $self->{pod}{$sect} ) ) {
+ return $self->{pod}{$sect};
+ } else {
+ return undef;
+ }
+}
+
+1;
+
+__END__
+
+=for :stopwords ModuleInfo
+
+=head1 NAME
+
+ModuleInfo - Gather package and POD information from a perl module file
+
+
+=head1 DESCRIPTION
+
+=over 4
+
+=item new_from_file($filename, collect_pod => 1)
+
+Construct a C<ModuleInfo> object given the path to a file. Takes an optional
+argument C<collect_pod> which is a boolean that determines whether
+POD data is collected and stored for reference. POD data is not
+collected by default. POD headings are always collected.
+
+=item new_from_module($module, collect_pod => 1, inc => \@dirs)
+
+Construct a C<ModuleInfo> object given a module or package name. In addition
+to accepting the C<collect_pod> argument as described above, this
+method accepts a C<inc> argument which is a reference to an array of
+of directories to search for the module. If none are given, the
+default is @INC.
+
+=item name()
+
+Returns the name of the package represented by this module. If there
+are more than one packages, it makes a best guess based on the
+filename. If it's a script (i.e. not a *.pm) the package name is
+'main'.
+
+=item version($package)
+
+Returns the version as defined by the $VERSION variable for the
+package as returned by the C<name> method if no arguments are
+given. If given the name of a package it will attempt to return the
+version of that package if it is specified in the file.
+
+=item filename()
+
+Returns the absolute path to the file.
+
+=item packages_inside()
+
+Returns a list of packages.
+
+=item pod_inside()
+
+Returns a list of POD sections.
+
+=item contains_pod()
+
+Returns true if there is any POD in the file.
+
+=item pod($section)
+
+Returns the POD data in the given section.
+
+=item find_module_by_name($module, \@dirs)
+
+Returns the path to a module given the module or package name. A list
+of directories can be passed in as an optional parameter, otherwise
+@INC is searched.
+
+Can be called as either an object or a class method.
+
+=item find_module_dir_by_name($module, \@dirs)
+
+Returns the entry in C<@dirs> (or C<@INC> by default) that contains
+the module C<$module>. A list of directories can be passed in as an
+optional parameter, otherwise @INC is searched.
+
+Can be called as either an object or a class method.
+
+=back
+
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3)
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Notes.pm b/Master/tlpkg/tlperl/lib/Module/Build/Notes.pm
new file mode 100644
index 00000000000..cf85d4ee3d3
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Notes.pm
@@ -0,0 +1,332 @@
+package Module::Build::Notes;
+
+# A class for persistent hashes
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Data::Dumper;
+use IO::File;
+use Module::Build::Dumper;
+
+sub new {
+ my ($class, %args) = @_;
+ my $file = delete $args{file} or die "Missing required parameter 'file' to new()";
+ my $self = bless {
+ disk => {},
+ new => {},
+ file => $file,
+ %args,
+ }, $class;
+}
+
+sub restore {
+ my $self = shift;
+
+ my $fh = IO::File->new("< $self->{file}") or die "Can't read $self->{file}: $!";
+ $self->{disk} = eval do {local $/; <$fh>};
+ die $@ if $@;
+ $self->{new} = {};
+}
+
+sub access {
+ my $self = shift;
+ return $self->read() unless @_;
+
+ my $key = shift;
+ return $self->read($key) unless @_;
+
+ my $value = shift;
+ $self->write({ $key => $value });
+ return $self->read($key);
+}
+
+sub has_data {
+ my $self = shift;
+ return keys %{$self->read()} > 0;
+}
+
+sub exists {
+ my ($self, $key) = @_;
+ return exists($self->{new}{$key}) || exists($self->{disk}{$key});
+}
+
+sub read {
+ my $self = shift;
+
+ if (@_) {
+ # Return 1 key as a scalar
+ my $key = shift;
+ return $self->{new}{$key} if exists $self->{new}{$key};
+ return $self->{disk}{$key};
+ }
+
+ # Return all data
+ my $out = (keys %{$self->{new}}
+ ? {%{$self->{disk}}, %{$self->{new}}}
+ : $self->{disk});
+ return wantarray ? %$out : $out;
+}
+
+sub _same {
+ my ($self, $x, $y) = @_;
+ return 1 if !defined($x) and !defined($y);
+ return 0 if !defined($x) or !defined($y);
+ return $x eq $y;
+}
+
+sub write {
+ my ($self, $href) = @_;
+ $href ||= {};
+
+ @{$self->{new}}{ keys %$href } = values %$href; # Merge
+
+ # Do some optimization to avoid unnecessary writes
+ foreach my $key (keys %{ $self->{new} }) {
+ next if ref $self->{new}{$key};
+ next if ref $self->{disk}{$key} or !exists $self->{disk}{$key};
+ delete $self->{new}{$key} if $self->_same($self->{new}{$key}, $self->{disk}{$key});
+ }
+
+ if (my $file = $self->{file}) {
+ my ($vol, $dir, $base) = File::Spec->splitpath($file);
+ $dir = File::Spec->catpath($vol, $dir, '');
+ return unless -e $dir && -d $dir; # The user needs to arrange for this
+
+ return if -e $file and !keys %{ $self->{new} }; # Nothing to do
+
+ @{$self->{disk}}{ keys %{$self->{new}} } = values %{$self->{new}}; # Merge
+ $self->_dump($file, $self->{disk});
+
+ $self->{new} = {};
+ }
+ return $self->read;
+}
+
+sub _dump {
+ my ($self, $file, $data) = @_;
+
+ my $fh = IO::File->new("> $file") or die "Can't create '$file': $!";
+ print {$fh} Module::Build::Dumper->_data_dump($data);
+}
+
+my $orig_template = do { local $/; <DATA> };
+close DATA;
+
+sub write_config_data {
+ my ($self, %args) = @_;
+
+ my $template = $orig_template;
+ $template =~ s/NOTES_NAME/$args{config_module}/g;
+ $template =~ s/MODULE_NAME/$args{module}/g;
+ $template =~ s/=begin private\n//;
+ $template =~ s/=end private/=cut/;
+
+ # strip out private POD markers we use to keep pod from being
+ # recognized for *this* source file
+ $template =~ s{$_\n}{} for '=begin private', '=end private';
+
+ my $fh = IO::File->new("> $args{file}") or die "Can't create '$args{file}': $!";
+ print {$fh} $template;
+ print {$fh} "\n__DATA__\n";
+ print {$fh} Module::Build::Dumper->_data_dump([$args{config_data}, $args{feature}, $args{auto_features}]);
+
+}
+
+1;
+
+
+=head1 NAME
+
+Module::Build::Notes - Create persistent distribution configuration modules
+
+=head1 DESCRIPTION
+
+This module is used internally by Module::Build to create persistent
+configuration files that can be installed with a distribution. See
+L<Module::Build::ConfigData> for an example.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+perl(1), L<Module::Build>(3)
+
+=cut
+
+__DATA__
+package NOTES_NAME;
+use strict;
+my $arrayref = eval do {local $/; <DATA>}
+ or die "Couldn't load ConfigData data: $@";
+close DATA;
+my ($config, $features, $auto_features) = @$arrayref;
+
+sub config { $config->{$_[1]} }
+
+sub set_config { $config->{$_[1]} = $_[2] }
+sub set_feature { $features->{$_[1]} = 0+!!$_[2] } # Constrain to 1 or 0
+
+sub auto_feature_names { grep !exists $features->{$_}, keys %$auto_features }
+
+sub feature_names {
+ my @features = (keys %$features, auto_feature_names());
+ @features;
+}
+
+sub config_names { keys %$config }
+
+sub write {
+ my $me = __FILE__;
+ require IO::File;
+
+ # Can't use Module::Build::Dumper here because M::B is only a
+ # build-time prereq of this module
+ require Data::Dumper;
+
+ my $mode_orig = (stat $me)[2] & 07777;
+ chmod($mode_orig | 0222, $me); # Make it writeable
+ my $fh = IO::File->new($me, 'r+') or die "Can't rewrite $me: $!";
+ seek($fh, 0, 0);
+ while (<$fh>) {
+ last if /^__DATA__$/;
+ }
+ die "Couldn't find __DATA__ token in $me" if eof($fh);
+
+ seek($fh, tell($fh), 0);
+ my $data = [$config, $features, $auto_features];
+ $fh->print( 'do{ my '
+ . Data::Dumper->new([$data],['x'])->Purity(1)->Dump()
+ . '$x; }' );
+ truncate($fh, tell($fh));
+ $fh->close;
+
+ chmod($mode_orig, $me)
+ or warn "Couldn't restore permissions on $me: $!";
+}
+
+sub feature {
+ my ($package, $key) = @_;
+ return $features->{$key} if exists $features->{$key};
+
+ my $info = $auto_features->{$key} or return 0;
+
+ # Under perl 5.005, each(%$foo) isn't working correctly when $foo
+ # was reanimated with Data::Dumper and eval(). Not sure why, but
+ # copying to a new hash seems to solve it.
+ my %info = %$info;
+
+ require Module::Build; # XXX should get rid of this
+ while (my ($type, $prereqs) = each %info) {
+ next if $type eq 'description' || $type eq 'recommends';
+
+ my %p = %$prereqs; # Ditto here.
+ while (my ($modname, $spec) = each %p) {
+ my $status = Module::Build->check_installed_status($modname, $spec);
+ if ((!$status->{ok}) xor ($type =~ /conflicts$/)) { return 0; }
+ if ( ! eval "require $modname; 1" ) { return 0; }
+ }
+ }
+ return 1;
+}
+
+=begin private
+
+=head1 NAME
+
+NOTES_NAME - Configuration for MODULE_NAME
+
+=head1 SYNOPSIS
+
+ use NOTES_NAME;
+ $value = NOTES_NAME->config('foo');
+ $value = NOTES_NAME->feature('bar');
+
+ @names = NOTES_NAME->config_names;
+ @names = NOTES_NAME->feature_names;
+
+ NOTES_NAME->set_config(foo => $new_value);
+ NOTES_NAME->set_feature(bar => $new_value);
+ NOTES_NAME->write; # Save changes
+
+
+=head1 DESCRIPTION
+
+This module holds the configuration data for the C<MODULE_NAME>
+module. It also provides a programmatic interface for getting or
+setting that configuration data. Note that in order to actually make
+changes, you'll have to have write access to the C<NOTES_NAME>
+module, and you should attempt to understand the repercussions of your
+actions.
+
+
+=head1 METHODS
+
+=over 4
+
+=item config($name)
+
+Given a string argument, returns the value of the configuration item
+by that name, or C<undef> if no such item exists.
+
+=item feature($name)
+
+Given a string argument, returns the value of the feature by that
+name, or C<undef> if no such feature exists.
+
+=item set_config($name, $value)
+
+Sets the configuration item with the given name to the given value.
+The value may be any Perl scalar that will serialize correctly using
+C<Data::Dumper>. This includes references, objects (usually), and
+complex data structures. It probably does not include transient
+things like filehandles or sockets.
+
+=item set_feature($name, $value)
+
+Sets the feature with the given name to the given boolean value. The
+value will be converted to 0 or 1 automatically.
+
+=item config_names()
+
+Returns a list of all the names of config items currently defined in
+C<NOTES_NAME>, or in scalar context the number of items.
+
+=item feature_names()
+
+Returns a list of all the names of features currently defined in
+C<NOTES_NAME>, or in scalar context the number of features.
+
+=item auto_feature_names()
+
+Returns a list of all the names of features whose availability is
+dynamically determined, or in scalar context the number of such
+features. Does not include such features that have later been set to
+a fixed value.
+
+=item write()
+
+Commits any changes from C<set_config()> and C<set_feature()> to disk.
+Requires write access to the C<NOTES_NAME> module.
+
+=back
+
+
+=head1 AUTHOR
+
+C<NOTES_NAME> was automatically created using C<Module::Build>.
+C<Module::Build> was written by Ken Williams, but he holds no
+authorship claim or copyright claim to the contents of C<NOTES_NAME>.
+
+=end private
+
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/PPMMaker.pm b/Master/tlpkg/tlperl/lib/Module/Build/PPMMaker.pm
new file mode 100644
index 00000000000..977b4370d91
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/PPMMaker.pm
@@ -0,0 +1,189 @@
+package Module::Build::PPMMaker;
+
+use strict;
+use Config;
+use vars qw($VERSION);
+use IO::File;
+
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+# This code is mostly borrowed from ExtUtils::MM_Unix 6.10_03, with a
+# few tweaks based on the PPD spec at
+# http://www.xav.com/perl/site/lib/XML/PPD.html
+
+# The PPD spec is based on <http://www.w3.org/TR/NOTE-OSD>
+
+sub new {
+ my $package = shift;
+ return bless {@_}, $package;
+}
+
+sub make_ppd {
+ my ($self, %args) = @_;
+ my $build = delete $args{build};
+
+ my @codebase;
+ if (exists $args{codebase}) {
+ @codebase = ref $args{codebase} ? @{$args{codebase}} : ($args{codebase});
+ } else {
+ my $distfile = $build->ppm_name . '.tar.gz';
+ print "Using default codebase '$distfile'\n";
+ @codebase = ($distfile);
+ }
+
+ my %dist;
+ foreach my $info (qw(name author abstract version)) {
+ my $method = "dist_$info";
+ $dist{$info} = $build->$method() or die "Can't determine distribution's $info\n";
+ }
+
+ $self->_simple_xml_escape($_) foreach $dist{abstract}, @{$dist{author}};
+
+ # TODO: could add <LICENSE HREF=...> tag if we knew what the URLs were for
+ # various licenses
+ my $ppd = <<"PPD";
+<SOFTPKG NAME=\"$dist{name}\" VERSION=\"$dist{version}\">
+ <ABSTRACT>$dist{abstract}</ABSTRACT>
+@{[ join "\n", map " <AUTHOR>$_</AUTHOR>", @{$dist{author}} ]}
+ <IMPLEMENTATION>
+PPD
+
+ # We don't include recommended dependencies because PPD has no way
+ # to distinguish them from normal dependencies. We don't include
+ # build_requires dependencies because the PPM installer doesn't
+ # build or test before installing. And obviously we don't include
+ # conflicts either.
+
+ foreach my $type (qw(requires)) {
+ my $prereq = $build->$type();
+ while (my ($modname, $spec) = each %$prereq) {
+ next if $modname eq 'perl';
+
+ my $min_version = '0.0';
+ foreach my $c ($build->_parse_conditions($spec)) {
+ my ($op, $version) = $c =~ /^\s* (<=?|>=?|==|!=) \s* ([\w.]+) \s*$/x;
+
+ # This is a nasty hack because it fails if there is no >= op
+ if ($op eq '>=') {
+ $min_version = $version;
+ last;
+ }
+ }
+
+ # PPM4 spec requires a '::' for top level modules
+ $modname .= '::' unless $modname =~ /::/;
+
+ $ppd .= qq! <REQUIRE NAME="$modname" VERSION="$min_version" />\n!;
+ }
+ }
+
+ # We only include these tags if this module involves XS, on the
+ # assumption that pure Perl modules will work on any OS.
+ if (keys %{$build->find_xs_files}) {
+ my $perl_version = $self->_ppd_version($build->perl_version);
+ $ppd .= sprintf(<<'EOF', $self->_varchname($build->config) );
+ <ARCHITECTURE NAME="%s" />
+EOF
+ }
+
+ foreach my $codebase (@codebase) {
+ $self->_simple_xml_escape($codebase);
+ $ppd .= sprintf(<<'EOF', $codebase);
+ <CODEBASE HREF="%s" />
+EOF
+ }
+
+ $ppd .= <<'EOF';
+ </IMPLEMENTATION>
+</SOFTPKG>
+EOF
+
+ my $ppd_file = "$dist{name}.ppd";
+ my $fh = IO::File->new(">$ppd_file")
+ or die "Cannot write to $ppd_file: $!";
+
+ my $io_file_ok = eval { IO::File->VERSION(1.13); 1 };
+ $fh->binmode(":utf8")
+ if $io_file_ok && $fh->can('binmode') && $] >= 5.008 && $Config{useperlio};
+ print $fh $ppd;
+ close $fh;
+
+ return $ppd_file;
+}
+
+sub _ppd_version {
+ my ($self, $version) = @_;
+
+ # generates something like "0,18,0,0"
+ return join ',', (split(/\./, $version), (0)x4)[0..3];
+}
+
+sub _varchname { # Copied from PPM.pm
+ my ($self, $config) = @_;
+ my $varchname = $config->{archname};
+ # Append "-5.8" to architecture name for Perl 5.8 and later
+ if ($] >= 5.008) {
+ my $vstring = sprintf "%vd", $^V;
+ $vstring =~ s/\.\d+$//;
+ $varchname .= "-$vstring";
+ }
+ return $varchname;
+}
+
+{
+ my %escapes = (
+ "\n" => "\\n",
+ '"' => '&quot;',
+ '&' => '&amp;',
+ '>' => '&gt;',
+ '<' => '&lt;',
+ );
+ my $rx = join '|', keys %escapes;
+
+ sub _simple_xml_escape {
+ $_[1] =~ s/($rx)/$escapes{$1}/go;
+ }
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::PPMMaker - Perl Package Manager file creation
+
+
+=head1 SYNOPSIS
+
+ On the command line, builds a .ppd file:
+ ./Build ppd
+
+
+=head1 DESCRIPTION
+
+This package contains the code that builds F<.ppd> "Perl Package
+Description" files, in support of ActiveState's "Perl Package
+Manager". Details are here:
+L<http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/>
+
+
+=head1 AUTHOR
+
+Dave Rolsky <autarch@urth.org>, Ken Williams <kwilliams@cpan.org>
+
+
+=head1 COPYRIGHT
+
+Copyright (c) 2001-2006 Ken Williams. All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/Amiga.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Amiga.pm
new file mode 100644
index 00000000000..9356325c9f4
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Amiga.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::Amiga;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::Amiga - Builder class for Amiga platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/Default.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Default.pm
new file mode 100644
index 00000000000..8d46fc47d56
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Default.pm
@@ -0,0 +1,33 @@
+package Module::Build::Platform::Default;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::Default - Stub class for unknown platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/EBCDIC.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/EBCDIC.pm
new file mode 100644
index 00000000000..140e27872aa
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/EBCDIC.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::EBCDIC;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::EBCDIC - Builder class for EBCDIC platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/MPEiX.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/MPEiX.pm
new file mode 100644
index 00000000000..66bbdc95da6
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/MPEiX.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::MPEiX;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::MPEiX - Builder class for MPEiX platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/MacOS.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/MacOS.pm
new file mode 100644
index 00000000000..b80781bd955
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/MacOS.pm
@@ -0,0 +1,152 @@
+package Module::Build::Platform::MacOS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+use ExtUtils::Install;
+
+sub have_forkpipe { 0 }
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+
+ # $Config{sitelib} and $Config{sitearch} are, unfortunately, missing.
+ foreach ('sitelib', 'sitearch') {
+ $self->config($_ => $self->config("install$_"))
+ unless $self->config($_);
+ }
+
+ # For some reason $Config{startperl} is filled with a bunch of crap.
+ (my $sp = $self->config('startperl')) =~ s/.*Exit \{Status\}\s//;
+ $self->config(startperl => $sp);
+
+ return $self;
+}
+
+sub make_executable {
+ my $self = shift;
+ require MacPerl;
+ foreach (@_) {
+ MacPerl::SetFileInfo('McPL', 'TEXT', $_);
+ }
+}
+
+sub dispatch {
+ my $self = shift;
+
+ if( !@_ and !@ARGV ) {
+ require MacPerl;
+
+ # What comes first in the action list.
+ my @action_list = qw(build test install);
+ my %actions = map {+($_, 1)} $self->known_actions;
+ delete @actions{@action_list};
+ push @action_list, sort { $a cmp $b } keys %actions;
+
+ my %toolserver = map {+$_ => 1} qw(test disttest diff testdb);
+ foreach (@action_list) {
+ $_ .= ' *' if $toolserver{$_};
+ }
+
+ my $cmd = MacPerl::Pick("What build command? ('*' requires ToolServer)", @action_list);
+ return unless defined $cmd;
+ $cmd =~ s/ \*$//;
+ $ARGV[0] = ($cmd);
+
+ my $args = MacPerl::Ask('Any extra arguments? (ie. verbose=1)', '');
+ return unless defined $args;
+ push @ARGV, $self->split_like_shell($args);
+ }
+
+ $self->SUPER::dispatch(@_);
+}
+
+sub ACTION_realclean {
+ my $self = shift;
+ chmod 0666, $self->{properties}{build_script};
+ $self->SUPER::ACTION_realclean;
+}
+
+# ExtUtils::Install has a hard-coded '.' directory in versions less
+# than 1.30. We use a sneaky trick to turn that into ':'.
+#
+# Note that we do it here in a cross-platform way, so this code could
+# actually go in Module::Build::Base. But we put it here to be less
+# intrusive for other platforms.
+
+sub ACTION_install {
+ my $self = shift;
+
+ return $self->SUPER::ACTION_install(@_)
+ if eval {ExtUtils::Install->VERSION('1.30'); 1};
+
+ local $^W = 0; # Avoid a 'redefine' warning
+ local *ExtUtils::Install::find = sub {
+ my ($code, @dirs) = @_;
+
+ @dirs = map { $_ eq '.' ? File::Spec->curdir : $_ } @dirs;
+
+ return File::Find::find($code, @dirs);
+ };
+
+ return $self->SUPER::ACTION_install(@_);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Module::Build::Platform::MacOS - Builder class for MacOS platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base> and override a few methods. Please see
+L<Module::Build> for the docs.
+
+=head2 Overridden Methods
+
+=over 4
+
+=item new()
+
+MacPerl doesn't define $Config{sitelib} or $Config{sitearch} for some
+reason, but $Config{installsitelib} and $Config{installsitearch} are
+there. So we copy the install variables to the other location
+
+=item make_executable()
+
+On MacOS we set the file type and creator to MacPerl so it will run
+with a double-click.
+
+=item dispatch()
+
+Because there's no easy way to say "./Build test" on MacOS, if
+dispatch is called with no arguments and no @ARGV a dialog box will
+pop up asking what action to take and any extra arguments.
+
+Default action is "test".
+
+=item ACTION_realclean()
+
+Need to unlock the Build program before deleting.
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/RiscOS.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/RiscOS.pm
new file mode 100644
index 00000000000..95e31515876
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/RiscOS.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::RiscOS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::RiscOS - Builder class for RiscOS platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/Unix.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Unix.pm
new file mode 100644
index 00000000000..0be5fc7df07
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Unix.pm
@@ -0,0 +1,73 @@
+package Module::Build::Platform::Unix;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+sub is_executable {
+ # We consider the owner bit to be authoritative on a file, because
+ # -x will always return true if the user is root and *any*
+ # executable bit is set. The -x test seems to try to answer the
+ # question "can I execute this file", but I think we want "is this
+ # file executable".
+
+ my ($self, $file) = @_;
+ return +(stat $file)[2] & 0100;
+}
+
+sub _startperl { "#! " . shift()->perl }
+
+sub _construct {
+ my $self = shift()->SUPER::_construct(@_);
+
+ # perl 5.8.1-RC[1-3] had some broken %Config entries, and
+ # unfortunately Red Hat 9 shipped it like that. Fix 'em up here.
+ my $c = $self->{config};
+ for (qw(siteman1 siteman3 vendorman1 vendorman3)) {
+ $c->{"install${_}dir"} ||= $c->{"install${_}"};
+ }
+
+ return $self;
+}
+
+# Open group says username should be portable filename characters,
+# but some Unix OS working with ActiveDirectory wind up with user-names
+# with back-slashes in the name. The new code below is very liberal
+# in what it accepts.
+sub _detildefy {
+ my ($self, $value) = @_;
+ $value =~ s[^~([^/]+)?(?=/|$)] # tilde with optional username
+ [$1 ?
+ ((getpwnam $1)[7] || "~$1") :
+ ($ENV{HOME} || (getpwuid $>)[7])
+ ]ex;
+ return $value;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::Unix - Builder class for Unix platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/VMS.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/VMS.pm
new file mode 100644
index 00000000000..f406b7afb6f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/VMS.pm
@@ -0,0 +1,539 @@
+package Module::Build::Platform::VMS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+use Config;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+
+=head1 NAME
+
+Module::Build::Platform::VMS - Builder class for VMS platforms
+
+=head1 DESCRIPTION
+
+This module inherits from C<Module::Build::Base> and alters a few
+minor details of its functionality. Please see L<Module::Build> for
+the general docs.
+
+=head2 Overridden Methods
+
+=over 4
+
+=item _set_defaults
+
+Change $self->{build_script} to 'Build.com' so @Build works.
+
+=cut
+
+sub _set_defaults {
+ my $self = shift;
+ $self->SUPER::_set_defaults(@_);
+
+ $self->{properties}{build_script} = 'Build.com';
+}
+
+
+=item cull_args
+
+'@Build foo' on VMS will not preserve the case of 'foo'. Rather than forcing
+people to write '@Build "foo"' we'll dispatch case-insensitively.
+
+=cut
+
+sub cull_args {
+ my $self = shift;
+ my($action, $args) = $self->SUPER::cull_args(@_);
+ my @possible_actions = grep { lc $_ eq lc $action } $self->known_actions;
+
+ die "Ambiguous action '$action'. Could be one of @possible_actions"
+ if @possible_actions > 1;
+
+ return ($possible_actions[0], $args);
+}
+
+
+=item manpage_separator
+
+Use '__' instead of '::'.
+
+=cut
+
+sub manpage_separator {
+ return '__';
+}
+
+
+=item prefixify
+
+Prefixify taking into account VMS' filepath syntax.
+
+=cut
+
+# Translated from ExtUtils::MM_VMS::prefixify()
+sub _prefixify {
+ my($self, $path, $sprefix, $type) = @_;
+ my $rprefix = $self->prefix;
+
+ $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n");
+
+ # Translate $(PERLPREFIX) to a real path.
+ $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
+ $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
+
+ $self->log_verbose(" rprefix translated to $rprefix\n".
+ " sprefix translated to $sprefix\n");
+
+ if( length $path == 0 ) {
+ $self->log_verbose(" no path to prefixify.\n")
+ }
+ elsif( !File::Spec->file_name_is_absolute($path) ) {
+ $self->log_verbose(" path is relative, not prefixifying.\n");
+ }
+ elsif( $sprefix eq $rprefix ) {
+ $self->log_verbose(" no new prefix.\n");
+ }
+ else {
+ my($path_vol, $path_dirs) = File::Spec->splitpath( $path );
+ my $vms_prefix = $self->config('vms_prefix');
+ if( $path_vol eq $vms_prefix.':' ) {
+ $self->log_verbose(" $vms_prefix: seen\n");
+
+ $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
+ $path = $self->_catprefix($rprefix, $path_dirs);
+ }
+ else {
+ $self->log_verbose(" cannot prefixify.\n");
+ return $self->prefix_relpaths($self->installdirs, $type);
+ }
+ }
+
+ $self->log_verbose(" now $path\n");
+
+ return $path;
+}
+
+=item _quote_args
+
+Command-line arguments (but not the command itself) must be quoted
+to ensure case preservation.
+
+=cut
+
+sub _quote_args {
+ # Returns a string that can become [part of] a command line with
+ # proper quoting so that the subprocess sees this same list of args,
+ # or if we get a single arg that is an array reference, quote the
+ # elements of it and return the reference.
+ my ($self, @args) = @_;
+ my $got_arrayref = (scalar(@args) == 1
+ && UNIVERSAL::isa($args[0], 'ARRAY'))
+ ? 1
+ : 0;
+
+ # Do not quote qualifiers that begin with '/'.
+ map { if (!/^\//) {
+ $_ =~ s/\"/""/g; # escape C<"> by doubling
+ $_ = q(").$_.q(");
+ }
+ }
+ ($got_arrayref ? @{$args[0]}
+ : @args
+ );
+
+ return $got_arrayref ? $args[0]
+ : join(' ', @args);
+}
+
+=item have_forkpipe
+
+There is no native fork(), so some constructs depending on it are not
+available.
+
+=cut
+
+sub have_forkpipe { 0 }
+
+=item _backticks
+
+Override to ensure that we quote the arguments but not the command.
+
+=cut
+
+sub _backticks {
+ # The command must not be quoted but the arguments to it must be.
+ my ($self, @cmd) = @_;
+ my $cmd = shift @cmd;
+ my $args = $self->_quote_args(@cmd);
+ return `$cmd $args`;
+}
+
+=item find_command
+
+Local an executable program
+
+=cut
+
+sub find_command {
+ my ($self, $command) = @_;
+
+ # a lot of VMS executables have a symbol defined
+ # check those first
+ if ( $^O eq 'VMS' ) {
+ require VMS::DCLsym;
+ my $syms = VMS::DCLsym->new;
+ return $command if scalar $syms->getsym( uc $command );
+ }
+
+ $self->SUPER::find_command($command);
+}
+
+# _maybe_command copied from ExtUtils::MM_VMS::maybe_command
+
+=item _maybe_command (override)
+
+Follows VMS naming conventions for executable files.
+If the name passed in doesn't exactly match an executable file,
+appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
+to check for DCL procedure. If this fails, checks directories in DCL$PATH
+and finally F<Sys$System:> for an executable file having the name specified,
+with or without the F<.Exe>-equivalent suffix.
+
+=cut
+
+sub _maybe_command {
+ my($self,$file) = @_;
+ return $file if -x $file && ! -d _;
+ my(@dirs) = ('');
+ my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
+
+ if ($file !~ m![/:>\]]!) {
+ for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
+ my $dir = $ENV{"DCL\$PATH;$i"};
+ $dir .= ':' unless $dir =~ m%[\]:]$%;
+ push(@dirs,$dir);
+ }
+ push(@dirs,'Sys$System:');
+ foreach my $dir (@dirs) {
+ my $sysfile = "$dir$file";
+ foreach my $ext (@exts) {
+ return $file if -x "$sysfile$ext" && ! -d _;
+ }
+ }
+ }
+ return;
+}
+
+=item do_system
+
+Override to ensure that we quote the arguments but not the command.
+
+=cut
+
+sub do_system {
+ # The command must not be quoted but the arguments to it must be.
+ my ($self, @cmd) = @_;
+ $self->log_verbose("@cmd\n");
+ my $cmd = shift @cmd;
+ my $args = $self->_quote_args(@cmd);
+ return !system("$cmd $args");
+}
+
+=item oneliner
+
+Override to ensure that we do not quote the command.
+
+=cut
+
+sub oneliner {
+ my $self = shift;
+ my $oneliner = $self->SUPER::oneliner(@_);
+
+ $oneliner =~ s/^\"\S+\"//;
+
+ return "MCR $^X $oneliner";
+}
+
+=item _infer_xs_spec
+
+Inherit the standard version but tweak the library file name to be
+something Dynaloader can find.
+
+=cut
+
+sub _infer_xs_spec {
+ my $self = shift;
+ my $file = shift;
+
+ my $spec = $self->SUPER::_infer_xs_spec($file);
+
+ # Need to create with the same name as DynaLoader will load with.
+ if (defined &DynaLoader::mod2fname) {
+ my $file = $$spec{module_name} . '.' . $self->{config}->get('dlext');
+ $file =~ tr/:/_/;
+ $file = DynaLoader::mod2fname([$file]);
+ $$spec{lib_file} = File::Spec->catfile($$spec{archdir}, $file);
+ }
+
+ return $spec;
+}
+
+=item rscan_dir
+
+Inherit the standard version but remove dots at end of name.
+If the extended character set is in effect, do not remove dots from filenames
+with Unix path delimiters.
+
+=cut
+
+sub rscan_dir {
+ my ($self, $dir, $pattern) = @_;
+
+ my $result = $self->SUPER::rscan_dir( $dir, $pattern );
+
+ for my $file (@$result) {
+ if (!_efs() && ($file =~ m#/#)) {
+ $file =~ s/\.$//;
+ }
+ }
+ return $result;
+}
+
+=item dist_dir
+
+Inherit the standard version but replace embedded dots with underscores because
+a dot is the directory delimiter on VMS.
+
+=cut
+
+sub dist_dir {
+ my $self = shift;
+
+ my $dist_dir = $self->SUPER::dist_dir;
+ $dist_dir =~ s/\./_/g unless _efs();
+ return $dist_dir;
+}
+
+=item man3page_name
+
+Inherit the standard version but chop the extra manpage delimiter off the front if
+there is one. The VMS version of splitdir('[.foo]') returns '', 'foo'.
+
+=cut
+
+sub man3page_name {
+ my $self = shift;
+
+ my $mpname = $self->SUPER::man3page_name( shift );
+ my $sep = $self->manpage_separator;
+ $mpname =~ s/^$sep//;
+ return $mpname;
+}
+
+=item expand_test_dir
+
+Inherit the standard version but relativize the paths as the native glob() doesn't
+do that for us.
+
+=cut
+
+sub expand_test_dir {
+ my ($self, $dir) = @_;
+
+ my @reldirs = $self->SUPER::expand_test_dir( $dir );
+
+ for my $eachdir (@reldirs) {
+ my ($v,$d,$f) = File::Spec->splitpath( $eachdir );
+ my $reldir = File::Spec->abs2rel( File::Spec->catpath( $v, $d, '' ) );
+ $eachdir = File::Spec->catfile( $reldir, $f );
+ }
+ return @reldirs;
+}
+
+=item _detildefy
+
+The home-grown glob() does not currently handle tildes, so provide limited support
+here. Expect only UNIX format file specifications for now.
+
+=cut
+
+sub _detildefy {
+ my ($self, $arg) = @_;
+
+ # Apparently double ~ are not translated.
+ return $arg if ($arg =~ /^~~/);
+
+ # Apparently ~ followed by whitespace are not translated.
+ return $arg if ($arg =~ /^~ /);
+
+ if ($arg =~ /^~/) {
+ my $spec = $arg;
+
+ # Remove the tilde
+ $spec =~ s/^~//;
+
+ # Remove any slash following the tilde if present.
+ $spec =~ s#^/##;
+
+ # break up the paths for the merge
+ my $home = VMS::Filespec::unixify($ENV{HOME});
+
+ # In the default VMS mode, the trailing slash is present.
+ # In Unix report mode it is not. The parsing logic assumes that
+ # it is present.
+ $home .= '/' unless $home =~ m#/$#;
+
+ # Trivial case of just ~ by it self
+ if ($spec eq '') {
+ $home =~ s#/$##;
+ return $home;
+ }
+
+ my ($hvol, $hdir, $hfile) = File::Spec::Unix->splitpath($home);
+ if ($hdir eq '') {
+ # Someone has tampered with $ENV{HOME}
+ # So hfile is probably the directory since this should be
+ # a path.
+ $hdir = $hfile;
+ }
+
+ my ($vol, $dir, $file) = File::Spec::Unix->splitpath($spec);
+
+ my @hdirs = File::Spec::Unix->splitdir($hdir);
+ my @dirs = File::Spec::Unix->splitdir($dir);
+
+ my $newdirs;
+
+ # Two cases of tilde handling
+ if ($arg =~ m#^~/#) {
+
+ # Simple case, just merge together
+ $newdirs = File::Spec::Unix->catdir(@hdirs, @dirs);
+
+ } else {
+
+ # Complex case, need to add an updir - No delimiters
+ my @backup = File::Spec::Unix->splitdir(File::Spec::Unix->updir);
+
+ $newdirs = File::Spec::Unix->catdir(@hdirs, @backup, @dirs);
+
+ }
+
+ # Now put the two cases back together
+ $arg = File::Spec::Unix->catpath($hvol, $newdirs, $file);
+
+ }
+ return $arg;
+
+}
+
+=item find_perl_interpreter
+
+On VMS, $^X returns the fully qualified absolute path including version
+number. It's logically impossible to improve on it for getting the perl
+we're currently running, and attempting to manipulate it is usually
+lossy.
+
+=cut
+
+sub find_perl_interpreter {
+ return VMS::Filespec::vmsify($^X);
+}
+
+=item localize_file_path
+
+Convert the file path to the local syntax
+
+=cut
+
+sub localize_file_path {
+ my ($self, $path) = @_;
+ $path = VMS::Filespec::vmsify($path);
+ $path =~ s/\.\z//;
+ return $path;
+}
+
+=item localize_dir_path
+
+Convert the directory path to the local syntax
+
+=cut
+
+sub localize_dir_path {
+ my ($self, $path) = @_;
+ return VMS::Filespec::vmspath($path);
+}
+
+=item ACTION_clean
+
+The home-grown glob() expands a bit too aggressively when given a bare name,
+so default in a zero-length extension.
+
+=cut
+
+sub ACTION_clean {
+ my ($self) = @_;
+ foreach my $item (map glob(VMS::Filespec::rmsexpand($_, '.;0')), $self->cleanup) {
+ $self->delete_filetree($item);
+ }
+}
+
+
+# Need to look up the feature settings. The preferred way is to use the
+# VMS::Feature module, but that may not be available to dual life modules.
+
+my $use_feature;
+BEGIN {
+ if (eval { local $SIG{__DIE__}; require VMS::Feature; }) {
+ $use_feature = 1;
+ }
+}
+
+# Need to look up the UNIX report mode. This may become a dynamic mode
+# in the future.
+sub _unix_rpt {
+ my $unix_rpt;
+ if ($use_feature) {
+ $unix_rpt = VMS::Feature::current("filename_unix_report");
+ } else {
+ my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || '';
+ $unix_rpt = $env_unix_rpt =~ /^[ET1]/i;
+ }
+ return $unix_rpt;
+}
+
+# Need to look up the EFS character set mode. This may become a dynamic
+# mode in the future.
+sub _efs {
+ my $efs;
+ if ($use_feature) {
+ $efs = VMS::Feature::current("efs_charset");
+ } else {
+ my $env_efs = $ENV{'DECC$EFS_CHARSET'} || '';
+ $efs = $env_efs =~ /^[ET1]/i;
+ }
+ return $efs;
+}
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+Ken Williams <kwilliams@cpan.org>
+Craig A. Berry <craigberry@mac.com>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/VOS.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/VOS.pm
new file mode 100644
index 00000000000..001a9507d44
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/VOS.pm
@@ -0,0 +1,34 @@
+package Module::Build::Platform::VOS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::VOS - Builder class for VOS platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base>. Please see the L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/Windows.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Windows.pm
new file mode 100644
index 00000000000..1e248a75c5f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/Windows.pm
@@ -0,0 +1,320 @@
+package Module::Build::Platform::Windows;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+
+use Config;
+use File::Basename;
+use File::Spec;
+use IO::File;
+
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+sub manpage_separator {
+ return '.';
+}
+
+sub have_forkpipe { 0 }
+
+sub _detildefy {
+ my ($self, $value) = @_;
+ $value =~ s,^~(?= [/\\] | $ ),$ENV{HOME},x
+ if $ENV{HOME};
+ return $value;
+}
+
+sub ACTION_realclean {
+ my ($self) = @_;
+
+ $self->SUPER::ACTION_realclean();
+
+ my $basename = basename($0);
+ $basename =~ s/(?:\.bat)?$//i;
+
+ if ( lc $basename eq lc $self->build_script ) {
+ if ( $self->build_bat ) {
+ $self->log_verbose("Deleting $basename.bat\n");
+ my $full_progname = $0;
+ $full_progname =~ s/(?:\.bat)?$/.bat/i;
+
+ # Voodoo required to have a batch file delete itself without error;
+ # Syntax differs between 9x & NT: the later requires a null arg (???)
+ require Win32;
+ my $null_arg = (Win32::IsWinNT()) ? '""' : '';
+ my $cmd = qq(start $null_arg /min "\%comspec\%" /c del "$full_progname");
+
+ my $fh = IO::File->new(">> $basename.bat")
+ or die "Can't create $basename.bat: $!";
+ print $fh $cmd;
+ close $fh ;
+ } else {
+ $self->delete_filetree($self->build_script . '.bat');
+ }
+ }
+}
+
+sub make_executable {
+ my $self = shift;
+
+ $self->SUPER::make_executable(@_);
+
+ foreach my $script (@_) {
+
+ # Native batch script
+ if ( $script =~ /\.(bat|cmd)$/ ) {
+ $self->SUPER::make_executable($script);
+ next;
+
+ # Perl script that needs to be wrapped in a batch script
+ } else {
+ my %opts = ();
+ if ( $script eq $self->build_script ) {
+ $opts{ntargs} = q(-x -S %0 --build_bat %*);
+ $opts{otherargs} = q(-x -S "%0" --build_bat %1 %2 %3 %4 %5 %6 %7 %8 %9);
+ }
+
+ my $out = eval {$self->pl2bat(in => $script, update => 1, %opts)};
+ if ( $@ ) {
+ $self->log_warn("WARNING: Unable to convert file '$script' to an executable script:\n$@");
+ } else {
+ $self->SUPER::make_executable($out);
+ }
+ }
+ }
+}
+
+# This routine was copied almost verbatim from the 'pl2bat' utility
+# distributed with perl. It requires too much voodoo with shell quoting
+# differences and shortcomings between the various flavors of Windows
+# to reliably shell out
+sub pl2bat {
+ my $self = shift;
+ my %opts = @_;
+
+ # NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate
+ $opts{ntargs} = '-x -S %0 %*' unless exists $opts{ntargs};
+ $opts{otherargs} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $opts{otherargs};
+
+ $opts{stripsuffix} = '/\\.plx?/' unless exists $opts{stripsuffix};
+ $opts{stripsuffix} = ($opts{stripsuffix} =~ m{^/([^/]*[^/\$]|)\$?/?$} ? $1 : "\Q$opts{stripsuffix}\E");
+
+ unless (exists $opts{out}) {
+ $opts{out} = $opts{in};
+ $opts{out} =~ s/$opts{stripsuffix}$//oi;
+ $opts{out} .= '.bat' unless $opts{in} =~ /\.bat$/i or $opts{in} =~ /^-$/;
+ }
+
+ my $head = <<EOT;
+ \@rem = '--*-Perl-*--
+ \@echo off
+ if "%OS%" == "Windows_NT" goto WinNT
+ perl $opts{otherargs}
+ goto endofperl
+ :WinNT
+ perl $opts{ntargs}
+ if NOT "%COMSPEC%" == "%SystemRoot%\\system32\\cmd.exe" goto endofperl
+ if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+ if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+ goto endofperl
+ \@rem ';
+EOT
+
+ $head =~ s/^\s+//gm;
+ my $headlines = 2 + ($head =~ tr/\n/\n/);
+ my $tail = "\n__END__\n:endofperl\n";
+
+ my $linedone = 0;
+ my $taildone = 0;
+ my $linenum = 0;
+ my $skiplines = 0;
+
+ my $start = $Config{startperl};
+ $start = "#!perl" unless $start =~ /^#!.*perl/;
+
+ my $in = IO::File->new("< $opts{in}") or die "Can't open $opts{in}: $!";
+ my @file = <$in>;
+ $in->close;
+
+ foreach my $line ( @file ) {
+ $linenum++;
+ if ( $line =~ /^:endofperl\b/ ) {
+ if (!exists $opts{update}) {
+ warn "$opts{in} has already been converted to a batch file!\n";
+ return;
+ }
+ $taildone++;
+ }
+ if ( not $linedone and $line =~ /^#!.*perl/ ) {
+ if (exists $opts{update}) {
+ $skiplines = $linenum - 1;
+ $line .= "#line ".(1+$headlines)."\n";
+ } else {
+ $line .= "#line ".($linenum+$headlines)."\n";
+ }
+ $linedone++;
+ }
+ if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) {
+ $line = "";
+ }
+ }
+
+ my $out = IO::File->new("> $opts{out}") or die "Can't open $opts{out}: $!";
+ print $out $head;
+ print $out $start, ( $opts{usewarnings} ? " -w" : "" ),
+ "\n#line ", ($headlines+1), "\n" unless $linedone;
+ print $out @file[$skiplines..$#file];
+ print $out $tail unless $taildone;
+ $out->close;
+
+ return $opts{out};
+}
+
+
+sub _quote_args {
+ # Returns a string that can become [part of] a command line with
+ # proper quoting so that the subprocess sees this same list of args.
+ my ($self, @args) = @_;
+
+ my @quoted;
+
+ for (@args) {
+ if ( /^[^\s*?!\$<>;|'"\[\]\{\}]+$/ ) {
+ # Looks pretty safe
+ push @quoted, $_;
+ } else {
+ # XXX this will obviously have to improve - is there already a
+ # core module lying around that does proper quoting?
+ s/"/\\"/g;
+ push @quoted, qq("$_");
+ }
+ }
+
+ return join " ", @quoted;
+}
+
+
+sub split_like_shell {
+ # As it turns out, Windows command-parsing is very different from
+ # Unix command-parsing. Double-quotes mean different things,
+ # backslashes don't necessarily mean escapes, and so on. So we
+ # can't use Text::ParseWords::shellwords() to break a command string
+ # into words. The algorithm below was bashed out by Randy and Ken
+ # (mostly Randy), and there are a lot of regression tests, so we
+ # should feel free to adjust if desired.
+
+ (my $self, local $_) = @_;
+
+ return @$_ if defined() && UNIVERSAL::isa($_, 'ARRAY');
+
+ my @argv;
+ return @argv unless defined() && length();
+
+ my $arg = '';
+ my( $i, $quote_mode ) = ( 0, 0 );
+
+ while ( $i < length() ) {
+
+ my $ch = substr( $_, $i , 1 );
+ my $next_ch = substr( $_, $i+1, 1 );
+
+ if ( $ch eq '\\' && $next_ch eq '"' ) {
+ $arg .= '"';
+ $i++;
+ } elsif ( $ch eq '\\' && $next_ch eq '\\' ) {
+ $arg .= '\\';
+ $i++;
+ } elsif ( $ch eq '"' && $next_ch eq '"' && $quote_mode ) {
+ $quote_mode = !$quote_mode;
+ $arg .= '"';
+ $i++;
+ } elsif ( $ch eq '"' && $next_ch eq '"' && !$quote_mode &&
+ ( $i + 2 == length() ||
+ substr( $_, $i + 2, 1 ) eq ' ' )
+ ) { # for cases like: a"" => [ 'a' ]
+ push( @argv, $arg );
+ $arg = '';
+ $i += 2;
+ } elsif ( $ch eq '"' ) {
+ $quote_mode = !$quote_mode;
+ } elsif ( $ch eq ' ' && !$quote_mode ) {
+ push( @argv, $arg ) if $arg;
+ $arg = '';
+ ++$i while substr( $_, $i + 1, 1 ) eq ' ';
+ } else {
+ $arg .= $ch;
+ }
+
+ $i++;
+ }
+
+ push( @argv, $arg ) if defined( $arg ) && length( $arg );
+ return @argv;
+}
+
+
+# system(@cmd) does not like having double-quotes in it on Windows.
+# So we quote them and run it as a single command.
+sub do_system {
+ my ($self, @cmd) = @_;
+
+ my $cmd = $self->_quote_args(@cmd);
+ my $status = system($cmd);
+ if ($status and $! =~ /Argument list too long/i) {
+ my $env_entries = '';
+ foreach (sort keys %ENV) { $env_entries .= "$_=>".length($ENV{$_})."; " }
+ warn "'Argument list' was 'too long', env lengths are $env_entries";
+ }
+ return !$status;
+}
+
+# Copied from ExtUtils::MM_Win32
+sub _maybe_command {
+ my($self,$file) = @_;
+ my @e = exists($ENV{'PATHEXT'})
+ ? split(/;/, $ENV{PATHEXT})
+ : qw(.com .exe .bat .cmd);
+ my $e = '';
+ for (@e) { $e .= "\Q$_\E|" }
+ chop $e;
+ # see if file ends in one of the known extensions
+ if ($file =~ /($e)$/i) {
+ return $file if -e $file;
+ }
+ else {
+ for (@e) {
+ return "$file$_" if -e "$file$_";
+ }
+ }
+ return;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Module::Build::Platform::Windows - Builder class for Windows platforms
+
+=head1 DESCRIPTION
+
+The sole purpose of this module is to inherit from
+C<Module::Build::Base> and override a few methods. Please see
+L<Module::Build> for the docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/aix.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/aix.pm
new file mode 100644
index 00000000000..dab064805d3
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/aix.pm
@@ -0,0 +1,40 @@
+package Module::Build::Platform::aix;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+# This class isn't necessary anymore, but we can't delete it, because
+# some people might still have the old copy in their @INC, containing
+# code we don't want to execute, so we have to make sure an upgrade
+# will replace it with this empty subclass.
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::aix - Builder class for AIX platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the AIX
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/cygwin.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/cygwin.pm
new file mode 100644
index 00000000000..eb45b62f0e6
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/cygwin.pm
@@ -0,0 +1,55 @@
+package Module::Build::Platform::cygwin;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.360301'; # patched in bleadperl
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+sub manpage_separator {
+ '.'
+}
+
+# Copied from ExtUtils::MM_Cygwin::maybe_command()
+# If our path begins with F</cygdrive/> then we use M::B::Platform::Windows
+# to determine if it may be a command. Otherwise we use the tests
+# from M::B::Platform::Unix.
+
+sub _maybe_command {
+ my ($self, $file) = @_;
+
+ if ($file =~ m{^/cygdrive/}i) {
+ require Module::Build::Platform::Windows;
+ return Module::Build::Platform::Windows->_maybe_command($file);
+ }
+
+ return $self->SUPER::_maybe_command($file);
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::cygwin - Builder class for Cygwin platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the cygwin
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Initial stub by Yitzchak Scott-Thoennes <sthoenna@efn.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/darwin.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/darwin.pm
new file mode 100644
index 00000000000..c2f3126c440
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/darwin.pm
@@ -0,0 +1,40 @@
+package Module::Build::Platform::darwin;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+# This class isn't necessary anymore, but we can't delete it, because
+# some people might still have the old copy in their @INC, containing
+# code we don't want to execute, so we have to make sure an upgrade
+# will replace it with this empty subclass.
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::darwin - Builder class for Mac OS X platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the Mac OS X
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Platform/os2.pm b/Master/tlpkg/tlperl/lib/Module/Build/Platform/os2.pm
new file mode 100644
index 00000000000..be164ae980b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Platform/os2.pm
@@ -0,0 +1,49 @@
+package Module::Build::Platform::os2;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use Module::Build::Platform::Unix;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Platform::Unix);
+
+sub manpage_separator { '.' }
+
+sub have_forkpipe { 0 }
+
+# Copied from ExtUtils::MM_OS2::maybe_command
+sub _maybe_command {
+ my($self,$file) = @_;
+ $file =~ s,[/\\]+,/,g;
+ return $file if -x $file && ! -d _;
+ return "$file.exe" if -x "$file.exe" && ! -d _;
+ return "$file.cmd" if -x "$file.cmd" && ! -d _;
+ return;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Module::Build::Platform::os2 - Builder class for OS/2 platform
+
+=head1 DESCRIPTION
+
+This module provides some routines very specific to the OS/2
+platform.
+
+Please see the L<Module::Build> for the general docs.
+
+=head1 AUTHOR
+
+Ken Williams <kwilliams@cpan.org>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/PodParser.pm b/Master/tlpkg/tlperl/lib/Module/Build/PodParser.pm
new file mode 100644
index 00000000000..225450c6b98
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/PodParser.pm
@@ -0,0 +1,106 @@
+package Module::Build::PodParser;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.3603';
+$VERSION = eval $VERSION;
+use vars qw(@ISA);
+
+sub new {
+ # Perl is so fun.
+ my $package = shift;
+
+ my $self;
+
+ # Try using Pod::Parser first
+ if (eval{ require Pod::Parser; 1; }) {
+ @ISA = qw(Pod::Parser);
+ $self = $package->SUPER::new(@_);
+ $self->{have_pod_parser} = 1;
+ } else {
+ @ISA = ();
+ *parse_from_filehandle = \&_myparse_from_filehandle;
+ $self = bless {have_pod_parser => 0, @_}, $package;
+ }
+
+ unless ($self->{fh}) {
+ die "No 'file' or 'fh' parameter given" unless $self->{file};
+ $self->{fh} = IO::File->new($self->{file}) or die "Couldn't open $self->{file}: $!";
+ }
+
+ return $self;
+}
+
+sub _myparse_from_filehandle {
+ my ($self, $fh) = @_;
+
+ local $_;
+ while (<$fh>) {
+ next unless /^=(?!cut)/ .. /^=cut/; # in POD
+ last if ($self->{abstract}) = /^ (?: [a-z:]+ \s+ - \s+ ) (.*\S) /ix;
+ }
+
+ my @author;
+ while (<$fh>) {
+ next unless /^=head1\s+AUTHORS?/i ... /^=/;
+ next if /^=/;
+ push @author, $_ if /\@/;
+ }
+ return unless @author;
+ s/^\s+|\s+$//g foreach @author;
+
+ $self->{author} = \@author;
+
+ return;
+}
+
+sub get_abstract {
+ my $self = shift;
+ return $self->{abstract} if defined $self->{abstract};
+
+ $self->parse_from_filehandle($self->{fh});
+
+ return $self->{abstract};
+}
+
+sub get_author {
+ my $self = shift;
+ return $self->{author} if defined $self->{author};
+
+ $self->parse_from_filehandle($self->{fh});
+
+ return $self->{author} || [];
+}
+
+################## Pod::Parser overrides ###########
+sub initialize {
+ my $self = shift;
+ $self->{_head} = '';
+ $self->SUPER::initialize();
+}
+
+sub command {
+ my ($self, $cmd, $text) = @_;
+ if ( $cmd eq 'head1' ) {
+ $text =~ s/^\s+//;
+ $text =~ s/\s+$//;
+ $self->{_head} = $text;
+ }
+}
+
+sub textblock {
+ my ($self, $text) = @_;
+ $text =~ s/^\s+//;
+ $text =~ s/\s+$//;
+ if (uc $self->{_head} eq 'NAME') {
+ my ($name, $abstract) = split( /\s+-\s+/, $text, 2 );
+ $self->{abstract} = $abstract;
+ } elsif ($self->{_head} =~ /^AUTHORS?$/i) {
+ push @{$self->{author}}, $text if $text =~ /\@/;
+ }
+}
+
+sub verbatim {}
+sub interior_sequence {}
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/Version.pm b/Master/tlpkg/tlperl/lib/Module/Build/Version.pm
new file mode 100644
index 00000000000..21abe00cbe0
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/Version.pm
@@ -0,0 +1,684 @@
+package Module::Build::Version;
+use strict;
+
+use vars qw($VERSION);
+$VERSION = 0.77;
+
+eval "use version $VERSION";
+if ($@) { # can't locate version files, use our own
+
+ # Avoid redefined warnings if an old version.pm was available
+ delete $version::{$_} foreach keys %version::;
+
+ # first we get the stub version module
+ my $version;
+ while (<DATA>) {
+ s/(\$VERSION)\s=\s\d+/\$VERSION = 0/;
+ $version .= $_ if $_;
+ last if /^1;$/;
+ }
+
+ # and now get the current version::vpp code
+ my $vpp;
+ while (<DATA>) {
+ s/(\$VERSION)\s=\s\d+/\$VERSION = 0/;
+ $vpp .= $_ if $_;
+ last if /^1;$/;
+ }
+
+ # but we eval them in reverse order since version depends on
+ # version::vpp to already exist
+ eval $vpp; die $@ if $@;
+ $INC{'version/vpp.pm'} = 'inside Module::Build::Version';
+ eval $version; die $@ if $@;
+ $INC{'version.pm'} = 'inside Module::Build::Version';
+}
+
+# now we can safely subclass version, installed or not
+use vars qw(@ISA);
+@ISA = qw(version);
+
+1;
+__DATA__
+# stub version module to make everything else happy
+package version;
+
+use 5.005_04;
+use strict;
+
+use vars qw(@ISA $VERSION $CLASS *declare *qv);
+
+$VERSION = 0.77;
+
+$CLASS = 'version';
+
+push @ISA, "version::vpp";
+local $^W;
+*version::qv = \&version::vpp::qv;
+*version::declare = \&version::vpp::declare;
+*version::_VERSION = \&version::vpp::_VERSION;
+if ($] > 5.009001 && $] <= 5.010000) {
+ no strict 'refs';
+ *{'version::stringify'} = \*version::vpp::stringify;
+ *{'version::(""'} = \*version::vpp::stringify;
+ *{'version::new'} = \*version::vpp::new;
+}
+
+# Preloaded methods go here.
+sub import {
+ no strict 'refs';
+ my ($class) = shift;
+
+ # Set up any derived class
+ unless ($class eq 'version') {
+ local $^W;
+ *{$class.'::declare'} = \&version::declare;
+ *{$class.'::qv'} = \&version::qv;
+ }
+
+ my %args;
+ if (@_) { # any remaining terms are arguments
+ map { $args{$_} = 1 } @_
+ }
+ else { # no parameters at all on use line
+ %args =
+ (
+ qv => 1,
+ 'UNIVERSAL::VERSION' => 1,
+ );
+ }
+
+ my $callpkg = caller();
+
+ if (exists($args{declare})) {
+ *{$callpkg."::declare"} =
+ sub {return $class->declare(shift) }
+ unless defined(&{$callpkg.'::declare'});
+ }
+
+ if (exists($args{qv})) {
+ *{$callpkg."::qv"} =
+ sub {return $class->qv(shift) }
+ unless defined(&{"$callpkg\::qv"});
+ }
+
+ if (exists($args{'UNIVERSAL::VERSION'})) {
+ local $^W;
+ *UNIVERSAL::VERSION = \&version::_VERSION;
+ }
+
+ if (exists($args{'VERSION'})) {
+ *{$callpkg."::VERSION"} = \&version::_VERSION;
+ }
+}
+
+1;
+
+# replace everything from here to the end with the current version/vpp.pm
+package version::vpp;
+use strict;
+
+use POSIX qw/locale_h/;
+use locale;
+use vars qw ($VERSION @ISA @REGEXS);
+$VERSION = '0.77';
+$VERSION = eval $VERSION;
+
+push @REGEXS, qr/
+ ^v? # optional leading 'v'
+ (\d*) # major revision not required
+ \. # requires at least one decimal
+ (?:(\d+)\.?){1,}
+ /x;
+
+use overload (
+ '""' => \&stringify,
+ '0+' => \&numify,
+ 'cmp' => \&vcmp,
+ '<=>' => \&vcmp,
+ 'bool' => \&vbool,
+ 'nomethod' => \&vnoop,
+);
+
+my $VERSION_MAX = 0x7FFFFFFF;
+
+eval "use warnings";
+if ($@) {
+ eval '
+ package warnings;
+ sub enabled {return $^W;}
+ 1;
+ ';
+}
+
+sub new
+{
+ my ($class, $value) = @_;
+ my $self = bless ({}, ref ($class) || $class);
+
+ if ( ref($value) && eval('$value->isa("version")') ) {
+ # Can copy the elements directly
+ $self->{version} = [ @{$value->{version} } ];
+ $self->{qv} = 1 if $value->{qv};
+ $self->{alpha} = 1 if $value->{alpha};
+ $self->{original} = ''.$value->{original};
+ return $self;
+ }
+
+ my $currlocale = setlocale(LC_ALL);
+
+ # if the current locale uses commas for decimal points, we
+ # just replace commas with decimal places, rather than changing
+ # locales
+ if ( localeconv()->{decimal_point} eq ',' ) {
+ $value =~ tr/,/./;
+ }
+
+ if ( not defined $value or $value =~ /^undef$/ ) {
+ # RT #19517 - special case for undef comparison
+ # or someone forgot to pass a value
+ push @{$self->{version}}, 0;
+ $self->{original} = "0";
+ return ($self);
+ }
+
+ if ( $#_ == 2 ) { # must be CVS-style
+ $value = 'v'.$_[2];
+ }
+
+ $value = _un_vstring($value);
+
+ # exponential notation
+ if ( $value =~ /\d+.?\d*e[-+]?\d+/ ) {
+ $value = sprintf("%.9f",$value);
+ $value =~ s/(0+)$//; # trim trailing zeros
+ }
+
+ # This is not very efficient, but it is morally equivalent
+ # to the XS code (as that is the reference implementation).
+ # See vutil/vutil.c for details
+ my $qv = 0;
+ my $alpha = 0;
+ my $width = 3;
+ my $saw_period = 0;
+ my $vinf = 0;
+ my ($start, $last, $pos, $s);
+ $s = 0;
+
+ while ( substr($value,$s,1) =~ /\s/ ) { # leading whitespace is OK
+ $s++;
+ }
+
+ if (substr($value,$s,1) eq 'v') {
+ $s++; # get past 'v'
+ $qv = 1; # force quoted version processing
+ }
+
+ $start = $last = $pos = $s;
+
+ # pre-scan the input string to check for decimals/underbars
+ while ( substr($value,$pos,1) =~ /[._\d,]/ ) {
+ if ( substr($value,$pos,1) eq '.' ) {
+ if ($alpha) {
+ Carp::croak("Invalid version format ".
+ "(underscores before decimal)");
+ }
+ $saw_period++;
+ $last = $pos;
+ }
+ elsif ( substr($value,$pos,1) eq '_' ) {
+ if ($alpha) {
+ require Carp;
+ Carp::croak("Invalid version format ".
+ "(multiple underscores)");
+ }
+ $alpha = 1;
+ $width = $pos - $last - 1; # natural width of sub-version
+ }
+ elsif ( substr($value,$pos,1) eq ','
+ and substr($value,$pos+1,1) =~ /[0-9]/ ) {
+ # looks like an unhandled locale
+ $saw_period++;
+ $last = $pos;
+ }
+ $pos++;
+ }
+
+ if ( $alpha && !$saw_period ) {
+ require Carp;
+ Carp::croak("Invalid version format ".
+ "(alpha without decimal)");
+ }
+
+ if ( $alpha && $saw_period && $width == 0 ) {
+ require Carp;
+ Carp::croak("Invalid version format ".
+ "(misplaced _ in number)");
+ }
+
+ if ( $saw_period > 1 ) {
+ $qv = 1; # force quoted version processing
+ }
+
+ $last = $pos;
+ $pos = $s;
+
+ if ( $qv ) {
+ $self->{qv} = 1;
+ }
+
+ if ( $alpha ) {
+ $self->{alpha} = 1;
+ }
+
+ if ( !$qv && $width < 3 ) {
+ $self->{width} = $width;
+ }
+
+ while ( substr($value,$pos,1) =~ /\d/ ) {
+ $pos++;
+ }
+
+ if ( substr($value,$pos,1) !~ /[a-z]/ ) { ### FIX THIS ###
+ my $rev;
+
+ while (1) {
+ $rev = 0;
+ {
+
+ # this is atoi() that delimits on underscores
+ my $end = $pos;
+ my $mult = 1;
+ my $orev;
+
+ # the following if() will only be true after the decimal
+ # point of a version originally created with a bare
+ # floating point number, i.e. not quoted in any way
+ if ( !$qv && $s > $start && $saw_period == 1 ) {
+ $mult *= 100;
+ while ( $s < $end ) {
+ $orev = $rev;
+ $rev += substr($value,$s,1) * $mult;
+ $mult /= 10;
+ if ( abs($orev) > abs($rev)
+ || abs($rev) > abs($VERSION_MAX) ) {
+ if ( warnings::enabled("overflow") ) {
+ require Carp;
+ Carp::carp("Integer overflow in version");
+ }
+ $s = $end - 1;
+ $rev = $VERSION_MAX;
+ }
+ $s++;
+ if ( substr($value,$s,1) eq '_' ) {
+ $s++;
+ }
+ }
+ }
+ else {
+ while (--$end >= $s) {
+ $orev = $rev;
+ $rev += substr($value,$end,1) * $mult;
+ $mult *= 10;
+ if ( abs($orev) > abs($rev)
+ || abs($rev) > abs($VERSION_MAX) ) {
+ if ( warnings::enabled("overflow") ) {
+ require Carp;
+ Carp::carp("Integer overflow in version");
+ }
+ $end = $s - 1;
+ $rev = $VERSION_MAX;
+ }
+ }
+ }
+ }
+
+ # Append revision
+ push @{$self->{version}}, $rev;
+ if ( substr($value,$pos,1) eq '.'
+ && substr($value,$pos+1,1) =~ /\d/ ) {
+ $s = ++$pos;
+ }
+ elsif ( substr($value,$pos,1) eq '_'
+ && substr($value,$pos+1,1) =~ /\d/ ) {
+ $s = ++$pos;
+ }
+ elsif ( substr($value,$pos,1) eq ','
+ && substr($value,$pos+1,1) =~ /\d/ ) {
+ $s = ++$pos;
+ }
+ elsif ( substr($value,$pos,1) =~ /\d/ ) {
+ $s = $pos;
+ }
+ else {
+ $s = $pos;
+ last;
+ }
+ if ( $qv ) {
+ while ( substr($value,$pos,1) =~ /\d/ ) {
+ $pos++;
+ }
+ }
+ else {
+ my $digits = 0;
+ while (substr($value,$pos,1) =~ /[\d_]/ && $digits < 3) {
+ if ( substr($value,$pos,1) ne '_' ) {
+ $digits++;
+ }
+ $pos++;
+ }
+ }
+ }
+ }
+ if ( $qv ) { # quoted versions always get at least three terms
+ my $len = scalar @{$self->{version}};
+ $len = 3 - $len;
+ while ($len-- > 0) {
+ push @{$self->{version}}, 0;
+ }
+ }
+
+ if ( substr($value,$pos) ) { # any remaining text
+ if ( warnings::enabled("misc") ) {
+ require Carp;
+ Carp::carp("Version string '$value' contains invalid data; ".
+ "ignoring: '".substr($value,$pos)."'");
+ }
+ }
+
+ # cache the original value for use when stringification
+ if ( $vinf ) {
+ $self->{vinf} = 1;
+ $self->{original} = 'v.Inf';
+ }
+ else {
+ $self->{original} = substr($value,0,$pos);
+ }
+
+ return ($self);
+}
+
+*parse = \&new;
+
+sub numify
+{
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $width = $self->{width} || 3;
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("%d.", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ if ( $width < 3 ) {
+ my $denom = 10**(3-$width);
+ my $quot = int($digit/$denom);
+ my $rem = $digit - ($quot * $denom);
+ $string .= sprintf("%0".$width."d_%d", $quot, $rem);
+ }
+ else {
+ $string .= sprintf("%03d", $digit);
+ }
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha && $width == 3 ) {
+ $string .= "_";
+ }
+ $string .= sprintf("%0".$width."d", $digit);
+ }
+ else # $len = 0
+ {
+ $string .= sprintf("000");
+ }
+
+ return $string;
+}
+
+sub normal
+{
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $alpha = $self->{alpha} || "";
+ my $len = $#{$self->{version}};
+ my $digit = $self->{version}[0];
+ my $string = sprintf("v%d", $digit );
+
+ for ( my $i = 1 ; $i < $len ; $i++ ) {
+ $digit = $self->{version}[$i];
+ $string .= sprintf(".%d", $digit);
+ }
+
+ if ( $len > 0 ) {
+ $digit = $self->{version}[$len];
+ if ( $alpha ) {
+ $string .= sprintf("_%0d", $digit);
+ }
+ else {
+ $string .= sprintf(".%0d", $digit);
+ }
+ }
+
+ if ( $len <= 2 ) {
+ for ( $len = 2 - $len; $len != 0; $len-- ) {
+ $string .= sprintf(".%0d", 0);
+ }
+ }
+
+ return $string;
+}
+
+sub stringify
+{
+ my ($self) = @_;
+ unless (_verify($self)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ return exists $self->{original}
+ ? $self->{original}
+ : exists $self->{qv}
+ ? $self->normal
+ : $self->numify;
+}
+
+sub vcmp
+{
+ require UNIVERSAL;
+ my ($left,$right,$swap) = @_;
+ my $class = ref($left);
+ unless ( UNIVERSAL::isa($right, $class) ) {
+ $right = $class->new($right);
+ }
+
+ if ( $swap ) {
+ ($left, $right) = ($right, $left);
+ }
+ unless (_verify($left)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ unless (_verify($right)) {
+ require Carp;
+ Carp::croak("Invalid version object");
+ }
+ my $l = $#{$left->{version}};
+ my $r = $#{$right->{version}};
+ my $m = $l < $r ? $l : $r;
+ my $lalpha = $left->is_alpha;
+ my $ralpha = $right->is_alpha;
+ my $retval = 0;
+ my $i = 0;
+ while ( $i <= $m && $retval == 0 ) {
+ $retval = $left->{version}[$i] <=> $right->{version}[$i];
+ $i++;
+ }
+
+ # tiebreaker for alpha with identical terms
+ if ( $retval == 0
+ && $l == $r
+ && $left->{version}[$m] == $right->{version}[$m]
+ && ( $lalpha || $ralpha ) ) {
+
+ if ( $lalpha && !$ralpha ) {
+ $retval = -1;
+ }
+ elsif ( $ralpha && !$lalpha) {
+ $retval = +1;
+ }
+ }
+
+ # possible match except for trailing 0's
+ if ( $retval == 0 && $l != $r ) {
+ if ( $l < $r ) {
+ while ( $i <= $r && $retval == 0 ) {
+ if ( $right->{version}[$i] != 0 ) {
+ $retval = -1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ else {
+ while ( $i <= $l && $retval == 0 ) {
+ if ( $left->{version}[$i] != 0 ) {
+ $retval = +1; # not a match after all
+ }
+ $i++;
+ }
+ }
+ }
+
+ return $retval;
+}
+
+sub vbool {
+ my ($self) = @_;
+ return vcmp($self,$self->new("0"),1);
+}
+
+sub vnoop {
+ require Carp;
+ Carp::croak("operation not supported with version object");
+}
+
+sub is_alpha {
+ my ($self) = @_;
+ return (exists $self->{alpha});
+}
+
+sub qv {
+ my $value = shift;
+ my $class = 'version';
+ if (@_) {
+ $class = ref($value) || $value;
+ $value = shift;
+ }
+
+ $value = _un_vstring($value);
+ $value = 'v'.$value unless $value =~ /(^v|\d+\.\d+\.\d)/;
+ my $version = $class->new($value);
+ return $version;
+}
+
+*declare = \&qv;
+
+sub is_qv {
+ my ($self) = @_;
+ return (exists $self->{qv});
+}
+
+
+sub _verify {
+ my ($self) = @_;
+ if ( ref($self)
+ && eval { exists $self->{version} }
+ && ref($self->{version}) eq 'ARRAY'
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+sub _un_vstring {
+ my $value = shift;
+ # may be a v-string
+ if ( $] >= 5.006_000 && length($value) >= 3 && $value !~ /[._]/ ) {
+ my $tvalue = sprintf("v%vd",$value);
+ if ( $tvalue =~ /^v\d+\.\d+\.\d+$/ ) {
+ # must be a v-string
+ $value = $tvalue;
+ }
+ }
+ return $value;
+}
+
+sub _VERSION {
+ my ($obj, $req) = @_;
+ my $class = ref($obj) || $obj;
+
+ no strict 'refs';
+ if ( exists $INC{"$class.pm"} and not %{"$class\::"} and $] >= 5.008) {
+ # file but no package
+ require Carp;
+ Carp::croak( "$class defines neither package nor VERSION"
+ ."--version check failed");
+ }
+
+ my $version = eval "\$$class\::VERSION";
+ if ( defined $version ) {
+ local $^W if $] <= 5.008;
+ $version = version::vpp->new($version);
+ }
+
+ if ( defined $req ) {
+ unless ( defined $version ) {
+ require Carp;
+ my $msg = $] < 5.006
+ ? "$class version $req required--this is only version "
+ : "$class does not define \$$class\::VERSION"
+ ."--version check failed";
+
+ if ( $ENV{VERSION_DEBUG} ) {
+ Carp::confess($msg);
+ }
+ else {
+ Carp::croak($msg);
+ }
+ }
+
+ $req = version::vpp->new($req);
+
+ if ( $req > $version ) {
+ require Carp;
+ if ( $req->is_qv ) {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->normal, $version->normal)
+ );
+ }
+ else {
+ Carp::croak(
+ sprintf ("%s version %s required--".
+ "this is only version %s", $class,
+ $req->stringify, $version->stringify)
+ );
+ }
+ }
+ }
+
+ return defined $version ? $version->stringify : undef;
+}
+
+1; #this line is important and will help the module return a true value
diff --git a/Master/tlpkg/tlperl/lib/Module/Build/YAML.pm b/Master/tlpkg/tlperl/lib/Module/Build/YAML.pm
new file mode 100644
index 00000000000..2da91f22563
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Build/YAML.pm
@@ -0,0 +1,600 @@
+# Adapted from YAML::Tiny 1.40
+package Module::Build::YAML;
+
+use strict;
+use Carp 'croak';
+
+# UTF Support?
+sub HAVE_UTF8 () { $] >= 5.007003 }
+BEGIN {
+ if ( HAVE_UTF8 ) {
+ # The string eval helps hide this from Test::MinimumVersion
+ eval "require utf8;";
+ die "Failed to load UTF-8 support" if $@;
+ }
+
+ # Class structure
+ require 5.004;
+
+ $Module::Build::YAML::VERSION = '1.40';
+
+ # Error storage
+ $Module::Build::YAML::errstr = '';
+}
+
+# The character class of all characters we need to escape
+# NOTE: Inlined, since it's only used once
+# my $RE_ESCAPE = '[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f\"\n]';
+
+# Printed form of the unprintable characters in the lowest range
+# of ASCII characters, listed by ASCII ordinal position.
+my @UNPRINTABLE = qw(
+ z x01 x02 x03 x04 x05 x06 a
+ x08 t n v f r x0e x0f
+ x10 x11 x12 x13 x14 x15 x16 x17
+ x18 x19 x1a e x1c x1d x1e x1f
+);
+
+# Printable characters for escapes
+my %UNESCAPES = (
+ z => "\x00", a => "\x07", t => "\x09",
+ n => "\x0a", v => "\x0b", f => "\x0c",
+ r => "\x0d", e => "\x1b", '\\' => '\\',
+);
+
+# Special magic boolean words
+my %QUOTE = map { $_ => 1 } qw{
+ null Null NULL
+ y Y yes Yes YES n N no No NO
+ true True TRUE false False FALSE
+ on On ON off Off OFF
+};
+
+#####################################################################
+# Implementation
+
+# Create an empty Module::Build::YAML object
+sub new {
+ my $class = shift;
+ bless [ @_ ], $class;
+}
+
+# Create an object from a file
+sub read {
+ my $class = ref $_[0] ? ref shift : shift;
+
+ # Check the file
+ my $file = shift or return $class->_error( 'You did not specify a file name' );
+ return $class->_error( "File '$file' does not exist" ) unless -e $file;
+ return $class->_error( "'$file' is a directory, not a file" ) unless -f _;
+ return $class->_error( "Insufficient permissions to read '$file'" ) unless -r _;
+
+ # Slurp in the file
+ local $/ = undef;
+ local *CFG;
+ unless ( open(CFG, $file) ) {
+ return $class->_error("Failed to open file '$file': $!");
+ }
+ my $contents = <CFG>;
+ unless ( close(CFG) ) {
+ return $class->_error("Failed to close file '$file': $!");
+ }
+
+ $class->read_string( $contents );
+}
+
+# Create an object from a string
+sub read_string {
+ my $class = ref $_[0] ? ref shift : shift;
+ my $self = bless [], $class;
+ my $string = $_[0];
+ unless ( defined $string ) {
+ return $self->_error("Did not provide a string to load");
+ }
+
+ # Byte order marks
+ # NOTE: Keeping this here to educate maintainers
+ # my %BOM = (
+ # "\357\273\277" => 'UTF-8',
+ # "\376\377" => 'UTF-16BE',
+ # "\377\376" => 'UTF-16LE',
+ # "\377\376\0\0" => 'UTF-32LE'
+ # "\0\0\376\377" => 'UTF-32BE',
+ # );
+ if ( $string =~ /^(?:\376\377|\377\376|\377\376\0\0|\0\0\376\377)/ ) {
+ return $self->_error("Stream has a non UTF-8 BOM");
+ } else {
+ # Strip UTF-8 bom if found, we'll just ignore it
+ $string =~ s/^\357\273\277//;
+ }
+
+ # Try to decode as utf8
+ utf8::decode($string) if HAVE_UTF8;
+
+ # Check for some special cases
+ return $self unless length $string;
+ unless ( $string =~ /[\012\015]+\z/ ) {
+ return $self->_error("Stream does not end with newline character");
+ }
+
+ # Split the file into lines
+ my @lines = grep { ! /^\s*(?:\#.*)?\z/ }
+ split /(?:\015{1,2}\012|\015|\012)/, $string;
+
+ # Strip the initial YAML header
+ @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines;
+
+ # A nibbling parser
+ while ( @lines ) {
+ # Do we have a document header?
+ if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) {
+ # Handle scalar documents
+ shift @lines;
+ if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) {
+ push @$self, $self->_read_scalar( "$1", [ undef ], \@lines );
+ next;
+ }
+ }
+
+ if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) {
+ # A naked document
+ push @$self, undef;
+ while ( @lines and $lines[0] !~ /^---/ ) {
+ shift @lines;
+ }
+
+ } elsif ( $lines[0] =~ /^\s*\-/ ) {
+ # An array at the root
+ my $document = [ ];
+ push @$self, $document;
+ $self->_read_array( $document, [ 0 ], \@lines );
+
+ } elsif ( $lines[0] =~ /^(\s*)\S/ ) {
+ # A hash at the root
+ my $document = { };
+ push @$self, $document;
+ $self->_read_hash( $document, [ length($1) ], \@lines );
+
+ } else {
+ croak("Module::Build::YAML failed to classify the line '$lines[0]'");
+ }
+ }
+
+ $self;
+}
+
+# Deparse a scalar string to the actual scalar
+sub _read_scalar {
+ my ($self, $string, $indent, $lines) = @_;
+
+ # Trim trailing whitespace
+ $string =~ s/\s*\z//;
+
+ # Explitic null/undef
+ return undef if $string eq '~';
+
+ # Quotes
+ if ( $string =~ /^\'(.*?)\'\z/ ) {
+ return '' unless defined $1;
+ $string = $1;
+ $string =~ s/\'\'/\'/g;
+ return $string;
+ }
+ if ( $string =~ /^\"((?:\\.|[^\"])*)\"\z/ ) {
+ # Reusing the variable is a little ugly,
+ # but avoids a new variable and a string copy.
+ $string = $1;
+ $string =~ s/\\"/"/g;
+ $string =~ s/\\([never\\fartz]|x([0-9a-fA-F]{2}))/(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}/gex;
+ return $string;
+ }
+
+ # Special cases
+ if ( $string =~ /^[\'\"!&]/ ) {
+ croak("Module::Build::YAML does not support a feature in line '$lines->[0]'");
+ }
+ return {} if $string eq '{}';
+ return [] if $string eq '[]';
+
+ # Regular unquoted string
+ return $string unless $string =~ /^[>|]/;
+
+ # Error
+ croak("Module::Build::YAML failed to find multi-line scalar content") unless @$lines;
+
+ # Check the indent depth
+ $lines->[0] =~ /^(\s*)/;
+ $indent->[-1] = length("$1");
+ if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) {
+ croak("Module::Build::YAML found bad indenting in line '$lines->[0]'");
+ }
+
+ # Pull the lines
+ my @multiline = ();
+ while ( @$lines ) {
+ $lines->[0] =~ /^(\s*)/;
+ last unless length($1) >= $indent->[-1];
+ push @multiline, substr(shift(@$lines), length($1));
+ }
+
+ my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n";
+ my $t = (substr($string, 1, 1) eq '-') ? '' : "\n";
+ return join( $j, @multiline ) . $t;
+}
+
+# Parse an array
+sub _read_array {
+ my ($self, $array, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ croak("Module::Build::YAML found bad indenting in line '$lines->[0]'");
+ }
+
+ if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) {
+ # Inline nested hash
+ my $indent2 = length("$1");
+ $lines->[0] =~ s/-/ /;
+ push @$array, { };
+ $self->_read_hash( $array->[-1], [ @$indent, $indent2 ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) {
+ # Array entry with a value
+ shift @$lines;
+ push @$array, $self->_read_scalar( "$2", [ @$indent, undef ], $lines );
+
+ } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) {
+ shift @$lines;
+ unless ( @$lines ) {
+ push @$array, undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)\-/ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] == $indent2 ) {
+ # Null array entry
+ push @$array, undef;
+ } else {
+ # Naked indenter
+ push @$array, [ ];
+ $self->_read_array( $array->[-1], [ @$indent, $indent2 ], $lines );
+ }
+
+ } elsif ( $lines->[0] =~ /^(\s*)\S/ ) {
+ push @$array, { };
+ $self->_read_hash( $array->[-1], [ @$indent, length("$1") ], $lines );
+
+ } else {
+ croak("Module::Build::YAML failed to classify line '$lines->[0]'");
+ }
+
+ } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) {
+ # This is probably a structure like the following...
+ # ---
+ # foo:
+ # - list
+ # bar: value
+ #
+ # ... so lets return and let the hash parser handle it
+ return 1;
+
+ } else {
+ croak("Module::Build::YAML failed to classify line '$lines->[0]'");
+ }
+ }
+
+ return 1;
+}
+
+# Parse an array
+sub _read_hash {
+ my ($self, $hash, $indent, $lines) = @_;
+
+ while ( @$lines ) {
+ # Check for a new document
+ if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) {
+ while ( @$lines and $lines->[0] !~ /^---/ ) {
+ shift @$lines;
+ }
+ return 1;
+ }
+
+ # Check the indent level
+ $lines->[0] =~ /^(\s*)/;
+ if ( length($1) < $indent->[-1] ) {
+ return 1;
+ } elsif ( length($1) > $indent->[-1] ) {
+ croak("Module::Build::YAML found bad indenting in line '$lines->[0]'");
+ }
+
+ # Get the key
+ unless ( $lines->[0] =~ s/^\s*([^\'\" ][^\n]*?)\s*:(\s+|$)// ) {
+ if ( $lines->[0] =~ /^\s*[?\'\"]/ ) {
+ croak("Module::Build::YAML does not support a feature in line '$lines->[0]'");
+ }
+ croak("Module::Build::YAML failed to classify line '$lines->[0]'");
+ }
+ my $key = $1;
+
+ # Do we have a value?
+ if ( length $lines->[0] ) {
+ # Yes
+ $hash->{$key} = $self->_read_scalar( shift(@$lines), [ @$indent, undef ], $lines );
+ } else {
+ # An indent
+ shift @$lines;
+ unless ( @$lines ) {
+ $hash->{$key} = undef;
+ return 1;
+ }
+ if ( $lines->[0] =~ /^(\s*)-/ ) {
+ $hash->{$key} = [];
+ $self->_read_array( $hash->{$key}, [ @$indent, length($1) ], $lines );
+ } elsif ( $lines->[0] =~ /^(\s*)./ ) {
+ my $indent2 = length("$1");
+ if ( $indent->[-1] >= $indent2 ) {
+ # Null hash entry
+ $hash->{$key} = undef;
+ } else {
+ $hash->{$key} = {};
+ $self->_read_hash( $hash->{$key}, [ @$indent, length($1) ], $lines );
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+# Save an object to a file
+sub write {
+ my $self = shift;
+ my $file = shift or return $self->_error('No file name provided');
+
+ # Write it to the file
+ open( CFG, '>' . $file ) or return $self->_error(
+ "Failed to open file '$file' for writing: $!"
+ );
+ print CFG $self->write_string;
+ close CFG;
+
+ return 1;
+}
+
+# Save an object to a string
+sub write_string {
+ my $self = shift;
+ return '' unless @$self;
+
+ # Iterate over the documents
+ my $indent = 0;
+ my @lines = ();
+ foreach my $cursor ( @$self ) {
+ push @lines, '---';
+
+ # An empty document
+ if ( ! defined $cursor ) {
+ # Do nothing
+
+ # A scalar document
+ } elsif ( ! ref $cursor ) {
+ $lines[-1] .= ' ' . $self->_write_scalar( $cursor, $indent );
+
+ # A list at the root
+ } elsif ( ref $cursor eq 'ARRAY' ) {
+ unless ( @$cursor ) {
+ $lines[-1] .= ' []';
+ next;
+ }
+ push @lines, $self->_write_array( $cursor, $indent, {} );
+
+ # A hash at the root
+ } elsif ( ref $cursor eq 'HASH' ) {
+ unless ( %$cursor ) {
+ $lines[-1] .= ' {}';
+ next;
+ }
+ push @lines, $self->_write_hash( $cursor, $indent, {} );
+
+ } else {
+ croak("Cannot serialize " . ref($cursor));
+ }
+ }
+
+ join '', map { "$_\n" } @lines;
+}
+
+sub _write_scalar {
+ my $string = $_[1];
+ return '~' unless defined $string;
+ return "''" unless length $string;
+ if ( $string =~ /[\x00-\x08\x0b-\x0d\x0e-\x1f\"\'\n]/ ) {
+ $string =~ s/\\/\\\\/g;
+ $string =~ s/"/\\"/g;
+ $string =~ s/\n/\\n/g;
+ $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;
+ return qq|"$string"|;
+ }
+ if ( $string =~ /(?:^\W|\s)/ or $QUOTE{$string} ) {
+ return "'$string'";
+ }
+ return $string;
+}
+
+sub _write_array {
+ my ($self, $array, $indent, $seen) = @_;
+ if ( $seen->{refaddr($array)}++ ) {
+ die "Module::Build::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $el ( @$array ) {
+ my $line = (' ' x $indent) . '-';
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_write_scalar( $el, $indent + 1 );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die "Module::Build::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+}
+
+sub _write_hash {
+ my ($self, $hash, $indent, $seen) = @_;
+ if ( $seen->{refaddr($hash)}++ ) {
+ die "Module::Build::YAML does not support circular references";
+ }
+ my @lines = ();
+ foreach my $name ( sort keys %$hash ) {
+ my $el = $hash->{$name};
+ my $line = (' ' x $indent) . "$name:";
+ my $type = ref $el;
+ if ( ! $type ) {
+ $line .= ' ' . $self->_write_scalar( $el, $indent + 1 );
+ push @lines, $line;
+
+ } elsif ( $type eq 'ARRAY' ) {
+ if ( @$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_array( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' []';
+ push @lines, $line;
+ }
+
+ } elsif ( $type eq 'HASH' ) {
+ if ( keys %$el ) {
+ push @lines, $line;
+ push @lines, $self->_write_hash( $el, $indent + 1, $seen );
+ } else {
+ $line .= ' {}';
+ push @lines, $line;
+ }
+
+ } else {
+ die "Module::Build::YAML does not support $type references";
+ }
+ }
+
+ @lines;
+}
+
+# Set error
+sub _error {
+ $Module::Build::YAML::errstr = $_[1];
+ undef;
+}
+
+# Retrieve error
+sub errstr {
+ $Module::Build::YAML::errstr;
+}
+
+#####################################################################
+# YAML Compatibility
+
+sub Dump {
+ Module::Build::YAML->new(@_)->write_string;
+}
+
+sub Load {
+ my $self = Module::Build::YAML->read_string(@_);
+ unless ( $self ) {
+ croak("Failed to load YAML document from string");
+ }
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # To match YAML.pm, return the last document
+ return $self->[-1];
+ }
+}
+
+BEGIN {
+ *freeze = *Dump;
+ *thaw = *Load;
+}
+
+sub DumpFile {
+ my $file = shift;
+ Module::Build::YAML->new(@_)->write($file);
+}
+
+sub LoadFile {
+ my $self = Module::Build::YAML->read($_[0]);
+ unless ( $self ) {
+ croak("Failed to load YAML document from '" . ($_[0] || '') . "'");
+ }
+ if ( wantarray ) {
+ return @$self;
+ } else {
+ # Return only the last document to match YAML.pm,
+ return $self->[-1];
+ }
+}
+
+#####################################################################
+# Use Scalar::Util if possible, otherwise emulate it
+
+BEGIN {
+ eval {
+ require Scalar::Util;
+ };
+ if ( $@ ) {
+ # Failed to load Scalar::Util
+ eval <<'END_PERL';
+sub refaddr {
+ my $pkg = ref($_[0]) or return undef;
+ if (!!UNIVERSAL::can($_[0], 'can')) {
+ bless $_[0], 'Scalar::Util::Fake';
+ } else {
+ $pkg = undef;
+ }
+ "$_[0]" =~ /0x(\w+)/;
+ my $i = do { local $^W; hex $1 };
+ bless $_[0], $pkg if defined $pkg;
+ $i;
+}
+END_PERL
+ } else {
+ Scalar::Util->import('refaddr');
+ }
+}
+
+1;
+
+__END__
+
diff --git a/Master/tlpkg/tlperl/lib/Module/CoreList.pm b/Master/tlpkg/tlperl/lib/Module/CoreList.pm
new file mode 100644
index 00000000000..d507e88828c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/CoreList.pm
@@ -0,0 +1,22855 @@
+package Module::CoreList;
+use strict;
+use vars qw/$VERSION %released %version %families %upstream
+ %bug_tracker %deprecated/;
+$VERSION = '2.43';
+
+=head1 NAME
+
+Module::CoreList - what modules shipped with versions of perl
+
+=head1 SYNOPSIS
+
+ use Module::CoreList;
+
+ print $Module::CoreList::version{5.00503}{CPAN}; # prints 1.48
+
+ print Module::CoreList->first_release('File::Spec'); # prints 5.00405
+ print Module::CoreList->first_release_by_date('File::Spec'); # prints 5.005
+ print Module::CoreList->first_release('File::Spec', 0.82); # prints 5.006001
+
+ print join ', ', Module::CoreList->find_modules(qr/Data/);
+ # prints 'Data::Dumper'
+ print join ', ', Module::CoreList->find_modules(qr/test::h.*::.*s/i, 5.008008);
+ # prints 'Test::Harness::Assert, Test::Harness::Straps'
+
+ print join ", ", @{ $Module::CoreList::families{5.005} };
+ # prints "5.005, 5.00503, 5.00504"
+
+=head1 DESCRIPTION
+
+Module::CoreList provides information on which core and dual-life modules shipped
+with each version of L<perl>.
+
+It provides a number of mechanisms for querying this information.
+
+There is a utility called L<corelist> provided with this module
+which is a convenient way of querying from the command-line.
+
+There is a functional programming API available for programmers to query
+information.
+
+Programmers may also query the contained hash structures to find relevant
+information.
+
+=head1 FUNCTIONS API
+
+These are the functions that are available, they may either be called as functions or class methods:
+
+ Module::CoreList::first_release('File::Spec'); # as a function
+
+ Module::CoreList->first_release('File::Spec'); # class method
+
+=over
+
+=item C<first_release( MODULE )>
+
+Behaviour since version 2.11
+
+Requires a MODULE name as an argument, returns the perl version when that module first
+appeared in core as ordered by perl version number or undef if that module is not in core.
+
+=item C<first_release_by_date( MODULE )>
+
+Requires a MODULE name as an argument, returns the perl version when that module first
+appeared in core as ordered by release date or undef if that module is not in core.
+
+=item C<find_modules( REGEX, [ LIST OF PERLS ] )>
+
+Takes a regex as an argument, returns a list of modules that match the regex given.
+If only a regex is provided applies to all modules in all perl versions. Optionally
+you may provide a list of perl versions to limit the regex search.
+
+=item C<find_version( PERL_VERSION )>
+
+Takes a perl version as an argument. Returns that perl version if it exists or C<undef>
+otherwise.
+
+=item C<is_deprecated( MODULE, PERL_VERSION )>
+
+Available in version 2.22 and above.
+
+Returns true if MODULE is marked as deprecated in PERL_VERSION. If PERL_VERSION is
+omitted, it defaults to the current version of Perl.
+
+=item C<removed_from( MODULE )>
+
+Available in version 2.32 and above
+
+Takes a module name as an argument, returns the first perl version where that module
+was removed from core. Returns undef if the given module was never in core or remains
+in core.
+
+=item C<removed_from_by_date( MODULE )>
+
+Available in version 2.32 and above
+
+Takes a module name as an argument, returns the first perl version by release date where that module
+was removed from core. Returns undef if the given module was never in core or remains
+in core.
+
+=back
+
+=head1 DATA STRUCTURES
+
+These are the hash data structures that are available:
+
+=over
+
+=item C<%Module::CoreList::version>
+
+A hash of hashes that is keyed on perl version as indicated
+in $]. The second level hash is module => version pairs.
+
+Note, it is possible for the version of a module to be unspecified,
+whereby the value is C<undef>, so use C<exists $version{$foo}{$bar}> if
+that's what you're testing for.
+
+Starting with 2.10, the special module name C<Unicode> refers to the version of
+the Unicode Character Database bundled with Perl.
+
+=item C<%Module::CoreList::released>
+
+Keyed on perl version this contains ISO
+formatted versions of the release dates, as gleaned from L<perlhist>.
+
+=item C<%Module::CoreList::families>
+
+New, in 1.96, a hash that
+clusters known perl releases by their major versions.
+
+=item C<%Module::CoreList::deprecated>
+
+A hash of hashes keyed on perl version and on module name.
+If a module is defined it indicates that that module is
+deprecated in that perl version and is scheduled for removal
+from core at some future point.
+
+=item C<%Module::CoreList::upstream>
+
+A hash that contains information on where patches should be directed
+for each core module.
+
+UPSTREAM indicates where patches should go. C<undef> implies
+that this hasn't been discussed for the module at hand.
+C<blead> indicates that the copy of the module in the blead
+sources is to be considered canonical, C<cpan> means that the
+module on CPAN is to be patched first. C<first-come> means
+that blead can be patched freely if it is in sync with the
+latest release on CPAN.
+
+=item C<%Module::CoreList::bug_tracker>
+
+A hash that contains information on the appropriate bug tracker
+for each core module.
+
+BUGS is an email or url to post bug reports. For modules with
+UPSTREAM => 'blead', use perl5-porters@perl.org. rt.cpan.org
+appears to automatically provide a URL for CPAN modules; any value
+given here overrides the default:
+http://rt.cpan.org/Public/Dist/Display.html?Name=$ModuleName
+
+=back
+
+=head1 CAVEATS
+
+Module::CoreList currently covers the 5.000, 5.001, 5.002, 5.003_07,
+5.004, 5.004_05, 5.005, 5.005_03, 5.005_04, 5.6.0, 5.6.1, 5.6.2, 5.7.3,
+5.8.0, 5.8.1, 5.8.2, 5.8.3, 5.8.4, 5.8.5, 5.8.6, 5.8.7, 5.8.8, 5.8.9,
+5.9.0, 5.9.1, 5.9.2, 5.9.3, 5.9.4, 5.9.5, 5.10.0, 5.10.1, 5.11.0, 5.11.1,
+5.11.2, 5.11.3, 5.11.4, 5.11.5, 5.12.0, 5.12.1, 5.12.2, 5.12.3, 5.13.0,
+5.13.1, 5.13.2, 5.13.3, 5.13.4, 5.13.5, 5.13.6, 5.13.7 and 5.13.8
+releases of perl.
+
+=head1 HISTORY
+
+Moved to Changes file.
+
+=head1 AUTHOR
+
+Richard Clamp E<lt>richardc@unixbeard.netE<gt>
+
+Currently maintained by the perl 5 porters E<lt>perl5-porters@perl.orgE<gt>.
+
+=head1 LICENSE
+
+Copyright (C) 2002-2009 Richard Clamp. All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<corelist>, L<Module::Info>, L<perl>
+
+=cut
+
+my $dumpinc = 0;
+sub import {
+ my $self = shift;
+ my $what = shift || '';
+ if ($what eq 'dumpinc') {
+ $dumpinc = 1;
+ }
+}
+
+END {
+ print "---INC---\n", join "\n" => keys %INC
+ if $dumpinc;
+}
+
+
+sub first_release_raw {
+ my $module = shift;
+ $module = shift if $module->isa(__PACKAGE__)
+ and scalar @_ and $_[0] =~ m#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z#;
+ my $version = shift;
+
+ my @perls = $version
+ ? grep { exists $version{$_}{ $module } &&
+ $version{$_}{ $module } ge $version } keys %version
+ : grep { exists $version{$_}{ $module } } keys %version;
+
+ return @perls;
+}
+
+sub first_release_by_date {
+ my @perls = &first_release_raw;
+ return unless @perls;
+ return (sort { $released{$a} cmp $released{$b} } @perls)[0];
+}
+
+sub first_release {
+ my @perls = &first_release_raw;
+ return unless @perls;
+ return (sort { $a cmp $b } @perls)[0];
+}
+
+sub find_modules {
+ my $regex = shift;
+ $regex = shift if $regex->isa(__PACKAGE__);
+ my @perls = @_;
+ @perls = keys %version unless @perls;
+
+ my %mods;
+ foreach (@perls) {
+ while (my ($k, $v) = each %{$version{$_}}) {
+ $mods{$k}++ if $k =~ $regex;
+ }
+ }
+ return sort keys %mods
+}
+
+sub find_version {
+ my $v = shift;
+ $v = shift if $v->isa(__PACKAGE__);
+ return $version{$v} if defined $version{$v};
+ return undef;
+}
+
+sub is_deprecated {
+ my $module = shift;
+ $module = shift if $module->isa(__PACKAGE__)
+ and scalar @_ and $_[0] =~ m#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z#;
+ my $perl_version = shift;
+ $perl_version ||= $];
+ return unless $module && exists $deprecated{$perl_version}{$module};
+ return $deprecated{$perl_version}{$module};
+}
+
+sub removed_from {
+ my @perls = &removed_raw;
+ return shift @perls;
+}
+
+sub removed_from_by_date {
+ my @perls = sort { $released{$a} cmp $released{$b} } &removed_raw;
+ return shift @perls;
+}
+
+sub removed_raw {
+ my $mod = shift;
+ $mod = shift if $mod->isa(__PACKAGE__)
+ and scalar @_ and $_[0] =~ m#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z#;
+ return unless my @perls = sort { $a cmp $b } first_release_raw($mod);
+ my $last = pop @perls;
+ my @removed = grep { $_ > $last } sort { $a cmp $b } keys %version;
+ return @removed;
+}
+
+# When things escaped.
+# NB. If you put version numbers with trailing zeroes here, you
+# should also add an alias for the numerical ($]) version; see
+# just before the __END__ of this module.
+%released = (
+ 5.000 => '1994-10-17',
+ 5.001 => '1995-03-14',
+ 5.002 => '1996-02-29',
+ 5.00307 => '1996-10-10',
+ 5.004 => '1997-05-15',
+ 5.005 => '1998-07-22',
+ 5.00503 => '1999-03-28',
+ 5.00405 => '1999-04-29',
+ 5.006 => '2000-03-22',
+ 5.006001 => '2001-04-08',
+ 5.007003 => '2002-03-05',
+ 5.008 => '2002-07-19',
+ 5.008001 => '2003-09-25',
+ 5.009 => '2003-10-27',
+ 5.008002 => '2003-11-05',
+ 5.006002 => '2003-11-15',
+ 5.008003 => '2004-01-14',
+ 5.00504 => '2004-02-23',
+ 5.009001 => '2004-03-16',
+ 5.008004 => '2004-04-21',
+ 5.008005 => '2004-07-19',
+ 5.008006 => '2004-11-27',
+ 5.009002 => '2005-04-01',
+ 5.008007 => '2005-05-30',
+ 5.009003 => '2006-01-28',
+ 5.008008 => '2006-01-31',
+ 5.009004 => '2006-08-15',
+ 5.009005 => '2007-07-07',
+ 5.010000 => '2007-12-18',
+ 5.008009 => '2008-12-14',
+ 5.010001 => '2009-08-22',
+ 5.011000 => '2009-10-02',
+ 5.011001 => '2009-10-20',
+ 5.011002 => '2009-11-20',
+ 5.011003 => '2009-12-20',
+ 5.011004 => '2010-01-20',
+ 5.011005 => '2010-02-20',
+ 5.012000 => '2010-04-12',
+ 5.013000 => '2010-04-20',
+ 5.012001 => '2010-05-16',
+ 5.013001 => '2010-05-20',
+ 5.013002 => '2010-06-22',
+ 5.013003 => '2010-07-20',
+ 5.013004 => '2010-08-20',
+ 5.012002 => '2010-09-06',
+ 5.013005 => '2010-09-19',
+ 5.013006 => '2010-10-20',
+ 5.013007 => '2010-11-20',
+ 5.013008 => '2010-12-20',
+ 5.012003 => '2011-01-15',
+ );
+
+for my $version ( sort { $a <=> $b } keys %released ) {
+ my $family = int ($version * 1000) / 1000;
+ push @{ $families{ $family }} , $version;
+}
+
+
+%version = (
+ 5.000 => {
+ 'AnyDBM_File' => undef, # lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, # lib/AutoLoader.pm
+ 'AutoSplit' => undef, # lib/AutoSplit.pm
+ 'Benchmark' => undef, # lib/Benchmark.pm
+ 'Carp' => undef, # lib/Carp.pm
+ 'Cwd' => undef, # lib/Cwd.pm
+ 'DB_File' => undef, # ext/DB_File/DB_File.pm
+ 'DynaLoader' => undef, # ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, # lib/English.pm
+ 'Env' => undef, # lib/Env.pm
+ 'Exporter' => undef, # lib/Exporter.pm
+ 'ExtUtils::MakeMaker' => undef, # lib/ExtUtils/MakeMaker.pm
+ 'Fcntl' => undef, # ext/Fcntl/Fcntl.pm
+ 'File::Basename' => undef, # lib/File/Basename.pm
+ 'File::CheckTree' => undef, # lib/File/CheckTree.pm
+ 'File::Find' => undef, # lib/File/Find.pm
+ 'FileHandle' => undef, # lib/FileHandle.pm
+ 'GDBM_File' => undef, # ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => undef, # lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, # lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, # lib/I18N/Collate.pm
+ 'IPC::Open2' => undef, # lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, # lib/IPC/Open3.pm
+ 'Math::BigFloat' => undef, # lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, # lib/Math/BigInt.pm
+ 'Math::Complex' => undef, # lib/Math/Complex.pm
+ 'NDBM_File' => undef, # ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => undef, # lib/Net/Ping.pm
+ 'ODBM_File' => undef, # ext/ODBM_File/ODBM_File.pm
+ 'POSIX' => undef, # ext/POSIX/POSIX.pm
+ 'SDBM_File' => undef, # ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, # lib/Search/Dict.pm
+ 'Shell' => undef, # lib/Shell.pm
+ 'Socket' => undef, # ext/Socket/Socket.pm
+ 'Sys::Hostname' => undef, # lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, # lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, # lib/Term/Cap.pm
+ 'Term::Complete' => undef, # lib/Term/Complete.pm
+ 'Test::Harness' => undef, # lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, # lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, # lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, # lib/Text/Soundex.pm
+ 'Text::Tabs' => undef, # lib/Text/Tabs.pm
+ 'TieHash' => undef, # lib/TieHash.pm
+ 'Time::Local' => undef, # lib/Time/Local.pm
+ 'integer' => undef, # lib/integer.pm
+ 'less' => undef, # lib/less.pm
+ 'sigtrap' => undef, # lib/sigtrap.pm
+ 'strict' => undef, # lib/strict.pm
+ 'subs' => undef, # lib/subs.pm
+ },
+
+ 5.001 => {
+ 'AnyDBM_File' => undef, # lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, # lib/AutoLoader.pm
+ 'AutoSplit' => undef, # lib/AutoSplit.pm
+ 'Benchmark' => undef, # lib/Benchmark.pm
+ 'Carp' => undef, # lib/Carp.pm
+ 'Cwd' => undef, # lib/Cwd.pm
+ 'DB_File' => undef, # ext/DB_File/DB_File.pm
+ 'DynaLoader' => undef, # ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, # lib/English.pm
+ 'Env' => undef, # lib/Env.pm
+ 'Exporter' => undef, # lib/Exporter.pm
+ 'ExtUtils::Liblist' => undef, # lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => undef, # lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => undef, # lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => undef, # lib/ExtUtils/Mkbootstrap.pm
+ 'Fcntl' => undef, # ext/Fcntl/Fcntl.pm
+ 'File::Basename' => undef, # lib/File/Basename.pm
+ 'File::CheckTree' => undef, # lib/File/CheckTree.pm
+ 'File::Find' => undef, # lib/File/Find.pm
+ 'File::Path' => undef, # lib/File/Path.pm
+ 'FileHandle' => undef, # lib/FileHandle.pm
+ 'GDBM_File' => undef, # ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => undef, # lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, # lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, # lib/I18N/Collate.pm
+ 'IPC::Open2' => undef, # lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, # lib/IPC/Open3.pm
+ 'Math::BigFloat' => undef, # lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, # lib/Math/BigInt.pm
+ 'Math::Complex' => undef, # lib/Math/Complex.pm
+ 'NDBM_File' => undef, # ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => undef, # lib/Net/Ping.pm
+ 'ODBM_File' => undef, # ext/ODBM_File/ODBM_File.pm
+ 'POSIX' => undef, # ext/POSIX/POSIX.pm
+ 'SDBM_File' => undef, # ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, # lib/Search/Dict.pm
+ 'Shell' => undef, # lib/Shell.pm
+ 'Socket' => undef, # ext/Socket/Socket.pm
+ 'SubstrHash' => undef, # lib/SubstrHash.pm
+ 'Sys::Hostname' => undef, # lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, # lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, # lib/Term/Cap.pm
+ 'Term::Complete' => undef, # lib/Term/Complete.pm
+ 'Test::Harness' => undef, # lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, # lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, # lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, # lib/Text/Soundex.pm
+ 'Text::Tabs' => undef, # lib/Text/Tabs.pm
+ 'TieHash' => undef, # lib/TieHash.pm
+ 'Time::Local' => undef, # lib/Time/Local.pm
+ 'integer' => undef, # lib/integer.pm
+ 'less' => undef, # lib/less.pm
+ 'lib' => undef, # lib/lib.pm
+ 'sigtrap' => undef, # lib/sigtrap.pm
+ 'strict' => undef, # lib/strict.pm
+ 'subs' => undef, # lib/subs.pm
+ },
+
+ 5.002 => {
+ 'AnyDBM_File' => undef, # lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, # lib/AutoLoader.pm
+ 'AutoSplit' => undef, # lib/AutoSplit.pm
+ 'Benchmark' => undef, # lib/Benchmark.pm
+ 'Carp' => undef, # lib/Carp.pm
+ 'Cwd' => undef, # lib/Cwd.pm
+ 'DB_File' => '1.01', # ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', # lib/Devel/SelfStubber.pm
+ 'DirHandle' => undef, # lib/DirHandle.pm
+ 'DynaLoader' => '1.00', # ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, # lib/English.pm
+ 'Env' => undef, # lib/Env.pm
+ 'Exporter' => undef, # lib/Exporter.pm
+ 'ExtUtils::Install' => undef, # lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => undef, # lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MM_OS2' => undef, # lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => undef, # lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, # lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MakeMaker' => '5.21', # lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.22', # lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => undef, # lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.00', # lib/ExtUtils/Mksymlists.pm
+ 'Fcntl' => '1.00', # ext/Fcntl/Fcntl.pm
+ 'File::Basename' => undef, # lib/File/Basename.pm
+ 'File::CheckTree' => undef, # lib/File/CheckTree.pm
+ 'File::Copy' => '1.5', # lib/File/Copy.pm
+ 'File::Find' => undef, # lib/File/Find.pm
+ 'File::Path' => '1.01', # lib/File/Path.pm
+ 'FileCache' => undef, # lib/FileCache.pm
+ 'FileHandle' => '1.00', # ext/FileHandle/FileHandle.pm
+ 'GDBM_File' => '1.00', # ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.01', # lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, # lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, # lib/I18N/Collate.pm
+ 'IPC::Open2' => undef, # lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, # lib/IPC/Open3.pm
+ 'Math::BigFloat' => undef, # lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, # lib/Math/BigInt.pm
+ 'Math::Complex' => undef, # lib/Math/Complex.pm
+ 'NDBM_File' => '1.00', # ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => '1', # lib/Net/Ping.pm
+ 'ODBM_File' => '1.00', # ext/ODBM_File/ODBM_File.pm
+ 'POSIX' => '1.00', # ext/POSIX/POSIX.pm
+ 'Pod::Functions' => undef, # lib/Pod/Functions.pm
+ 'Pod::Text' => undef, # lib/Pod/Text.pm
+ 'SDBM_File' => '1.00', # ext/SDBM_File/SDBM_File.pm
+ 'Safe' => '1.00', # ext/Safe/Safe.pm
+ 'Search::Dict' => undef, # lib/Search/Dict.pm
+ 'SelectSaver' => undef, # lib/SelectSaver.pm
+ 'SelfLoader' => '1.06', # lib/SelfLoader.pm
+ 'Shell' => undef, # lib/Shell.pm
+ 'Socket' => '1.5', # ext/Socket/Socket.pm
+ 'Symbol' => undef, # lib/Symbol.pm
+ 'Sys::Hostname' => undef, # lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, # lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, # lib/Term/Cap.pm
+ 'Term::Complete' => undef, # lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, # lib/Term/ReadLine.pm
+ 'Test::Harness' => '1.07', # lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, # lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, # lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, # lib/Text/Soundex.pm
+ 'Text::Tabs' => undef, # lib/Text/Tabs.pm
+ 'Text::Wrap' => undef, # lib/Text/Wrap.pm
+ 'Tie::Hash' => undef, # lib/Tie/Hash.pm
+ 'Tie::Scalar' => undef, # lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, # lib/Tie/SubstrHash.pm
+ 'Time::Local' => undef, # lib/Time/Local.pm
+ 'diagnostics' => undef, # lib/diagnostics.pm
+ 'integer' => undef, # lib/integer.pm
+ 'less' => undef, # lib/less.pm
+ 'lib' => undef, # lib/lib.pm
+ 'overload' => undef, # lib/overload.pm
+ 'sigtrap' => undef, # lib/sigtrap.pm
+ 'strict' => undef, # lib/strict.pm
+ 'subs' => undef, # lib/subs.pm
+ 'vars' => undef, # lib/vars.pm
+ },
+
+ 5.00307 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, #./lib/AutoLoader.pm
+ 'AutoSplit' => undef, #./lib/AutoSplit.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'Config' => undef,
+ 'Cwd' => undef, #./lib/Cwd.pm
+ 'DB_File' => '1.03', #./lib/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'DynaLoader' => '1.00', #./ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Embed' => '1.18', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.15 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.20 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.38', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.27', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.12 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.107 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'Fatal' => undef, #./lib/Fatal.pm
+ 'Fcntl' => '1.00', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.4', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Copy' => '1.5', #./lib/File/Copy.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.01', #./lib/File/Path.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '1.00', #./ext/FileHandle/FileHandle.pm
+ 'FindBin' => '1.04', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.04', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.05', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.12', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.07', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.05', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.09', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.13', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => undef, #./lib/IPC/Open2.pm
+ 'IPC::Open3' => undef, #./lib/IPC/Open3.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => undef, #./lib/Math/Complex.pm
+ 'NDBM_File' => '1.00', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => '1.01', #./lib/Net/Ping.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.01', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => undef, #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Text' => undef, #./lib/Pod/Text.pm
+ 'POSIX' => '1.00', #./ext/POSIX/POSIX.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.06', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.01', #./lib/sigtrap.pm
+ 'Socket' => '1.5', #./ext/Socket/Socket.pm
+ 'strict' => undef, #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => undef, #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test::Harness' => '1.13', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.051501', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '96.041801', #./lib/Text/Wrap.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.0', #./vms/ext/Stdio/Stdio.pm
+ },
+
+ 5.004 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'AutoLoader' => undef, #./lib/AutoLoader.pm
+ 'AutoSplit' => undef, #./lib/AutoSplit.pm
+ 'autouse' => '1.01', #./lib/autouse.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'blib' => undef, #./lib/blib.pm
+ 'Bundle::CPAN' => '0.02', #./lib/Bundle/CPAN.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'CGI' => '2.36', #./lib/CGI.pm
+ 'CGI::Apache' => '1.01', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.06', #./lib/CGI/Carp.pm
+ 'CGI::Fast' => '1.00a', #./lib/CGI/Fast.pm
+ 'CGI::Push' => '1.00', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '0.05', #./lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'constant' => '1.00', #./lib/constant.pm
+ 'CPAN' => '1.2401', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.18 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => undef, #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.00', #./lib/Cwd.pm
+ 'DB_File' => '1.14', #./ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'DynaLoader' => '1.02', #./ext/DynaLoader/DynaLoader.pm
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Command' => '1.00', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2501', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.16 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.2201 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.4002', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.13 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.114 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.5', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1001', #./lib/File/Compare.pm
+ 'File::Copy' => '2.02', #./lib/File/Copy.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.04', #./lib/File/Path.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.04', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.10', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.0602', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.1504', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.1602', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0101', #./lib/IPC/Open3.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.01', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.00', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => undef, #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => undef, #./lib/Pod/Html.pm
+ 'Pod::Text' => '1.0203', #./lib/Pod/Text.pm
+ 'POSIX' => '1.02', #./ext/POSIX/POSIX.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.07', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.6', #./ext/Socket/Socket.pm
+ 'strict' => undef, #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test::Harness' => '1.1502', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => undef, #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '97.011701', #./lib/Text/Wrap.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.02', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ },
+
+ 5.005 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'attrs' => '1.0', #./ext/attrs/attrs.pm
+ 'AutoLoader' => undef, #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0302', #./lib/AutoSplit.pm
+ 'autouse' => '1.01', #./lib/autouse.pm
+ 'B' => undef, #./ext/B/B.pm
+ 'B::Asmdata' => undef, #./ext/B/B/Asmdata.pm
+ 'B::Assembler' => undef, #./ext/B/B/Assembler.pm
+ 'B::Bblock' => undef, #./ext/B/B/Bblock.pm
+ 'B::Bytecode' => undef, #./ext/B/B/Bytecode.pm
+ 'B::C' => undef, #./ext/B/B/C.pm
+ 'B::CC' => undef, #./ext/B/B/CC.pm
+ 'B::Debug' => undef, #./ext/B/B/Debug.pm
+ 'B::Deparse' => '0.56', #./ext/B/B/Deparse.pm
+ 'B::Disassembler' => undef, #./ext/B/B/Disassembler.pm
+ 'B::Lint' => undef, #./ext/B/B/Lint.pm
+ 'B::Showlex' => undef, #./ext/B/B/Showlex.pm
+ 'B::Stackobj' => undef, #./ext/B/B/Stackobj.pm
+ 'B::Terse' => undef, #./ext/B/B/Terse.pm
+ 'B::Xref' => undef, #./ext/B/B/Xref.pm
+ 'base' => undef, #./lib/base.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'blib' => '1.00', #./lib/blib.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'CGI' => '2.42', #./lib/CGI.pm
+ 'CGI::Apache' => '1.1', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.101', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.06', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.00a', #./lib/CGI/Fast.pm
+ 'CGI::Push' => '1.01', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '0.06', #./lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'constant' => '1.00', #./lib/constant.pm
+ 'CPAN' => '1.3901', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.29 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => undef, #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.01', #./lib/Cwd.pm
+ 'Data::Dumper' => '2.09', #./ext/Data/Dumper/Dumper.pm
+ 'DB_File' => '1.60', #./ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'DynaLoader' => '1.03',
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Command' => '1.01', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.02', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.25 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.4301', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.17 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.12601 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::Packlist' => '0.03', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fatal' => '1.02', #./lib/Fatal.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'fields' => '0.02', #./lib/fields.pm
+ 'File::Basename' => '2.6', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1001', #./lib/File/Compare.pm
+ 'File::Copy' => '2.02', #./lib/File/Copy.pm
+ 'File::DosGlob' => undef, #./lib/File/DosGlob.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.0401', #./lib/File/Path.pm
+ 'File::Spec' => '0.6', #./lib/File/Spec.pm
+ 'File::Spec::Mac' => '1.0', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #./lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.41', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.17', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.06021', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.1505', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.1603', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0102', #./lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.00', #./ext/IPC/SysV/Msg.pm
+ 'IPC::Semaphore' => '1.00', #./ext/IPC/SysV/Semaphore.pm
+ 'IPC::SysV' => '1.03', #./ext/IPC/SysV/SysV.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.25', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.01', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'O' => undef, #./ext/B/O.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.01', #./lib/Pod/Html.pm
+ 'Pod::Text' => '1.0203', #./lib/Pod/Text.pm
+ 'POSIX' => '1.02', #./ext/POSIX/POSIX.pm
+ 're' => '0.02', #./ext/re/re.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.08', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.7', #./ext/Socket/Socket.pm
+ 'strict' => '1.01', #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test' => '1.04', #./lib/Test.pm
+ 'Test::Harness' => '1.1602', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.1', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '97.02', #./lib/Text/Wrap.pm
+ 'Thread' => '1.0', #./ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #./ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #./ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #./ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.00', #./lib/Tie/Array.pm
+ 'Tie::Handle' => undef, #./lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.1', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ },
+
+ 5.00503 => {
+ 'AnyDBM_File' => undef,
+ 'attrs' => '1.0',
+ 'AutoLoader' => undef,
+ 'AutoSplit' => 1.0303,
+ 'autouse' => 1.01,
+ 'B::Asmdata' => undef,
+ 'B::Assembler' => undef,
+ 'B::Bblock' => undef,
+ 'B::Bytecode' => undef,
+ 'B::C' => undef,
+ 'B::CC' => undef,
+ 'B::Debug' => undef,
+ 'B::Deparse' => 0.56,
+ 'B::Disassembler' => undef,
+ 'B::Lint' => undef,
+ 'B' => undef,
+ 'B::Showlex' => undef,
+ 'B::Stackobj' => undef,
+ 'B::Terse' => undef,
+ 'B::Xref' => undef,
+ 'base' => undef,
+ 'Benchmark' => undef,
+ 'blib' => '1.00',
+ 'Carp' => undef,
+ 'CGI' => 2.46,
+ 'CGI::Apache' => 1.1,
+ 'CGI::Carp' => 1.13,
+ 'CGI::Cookie' => 1.06,
+ 'CGI::Fast' => 1.01,
+ 'CGI::Push' => 1.01,
+ 'CGI::Switch' => 0.06,
+ 'Class::Struct' => undef,
+ 'Config' => undef,
+ 'constant' => '1.00',
+ 'CPAN::FirstTime' => 1.36 ,
+ 'CPAN' => 1.48,
+ 'CPAN::Nox' => '1.00',
+ 'Cwd' => 2.01,
+ 'Data::Dumper' => 2.101,
+ 'DB_File' => 1.65,
+ 'Devel::SelfStubber' => 1.01,
+ 'diagnostics' => undef,
+ 'DirHandle' => undef,
+ 'Dumpvalue' => undef,
+ 'DynaLoader' => 1.03,
+ 'English' => undef,
+ 'Env' => undef,
+ 'Exporter' => undef,
+ 'ExtUtils::Command' => 1.01,
+ 'ExtUtils::Embed' => 1.2505,
+ 'ExtUtils::Install' => 1.28 ,
+ 'ExtUtils::Installed' => 0.02,
+ 'ExtUtils::Liblist' => 1.25 ,
+ 'ExtUtils::MakeMaker' => 5.4302,
+ 'ExtUtils::Manifest' => 1.33 ,
+ 'ExtUtils::Mkbootstrap' => 1.14 ,
+ 'ExtUtils::Mksymlists' => 1.17 ,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_Unix' => 1.12602 ,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::Packlist' => 0.03,
+ 'ExtUtils::testlib' => 1.11 ,
+ 'ExtUtils::XSSymSet' => '1.0',
+ 'Fatal' => 1.02,
+ 'Fcntl' => 1.03,
+ 'fields' => 0.02,
+ 'File::Basename' => 2.6,
+ 'File::CheckTree' => undef,
+ 'File::Compare' => 1.1001,
+ 'File::Copy' => 2.02,
+ 'File::DosGlob' => undef,
+ 'File::Find' => undef,
+ 'File::Path' => 1.0401,
+ 'File::Spec' => 0.6,
+ 'File::Spec::Mac' => '1.0',
+ 'File::Spec::OS2' => undef,
+ 'File::Spec::Unix' => undef,
+ 'File::Spec::VMS' => undef,
+ 'File::Spec::Win32' => undef,
+ 'File::stat' => undef,
+ 'FileCache' => undef,
+ 'FileHandle' => '2.00',
+ 'FindBin' => 1.42,
+ 'GDBM_File' => '1.00',
+ 'Getopt::Long' => 2.19,
+ 'Getopt::Std' => 1.01,
+ 'I18N::Collate' => undef,
+ 'integer' => undef,
+ 'IO' => undef,
+ 'IO::File' => 1.06021,
+ 'IO::Handle' => 1.1505,
+ 'IO::Pipe' => 1.0902,
+ 'IO::Seekable' => 1.06,
+ 'IO::Select' => '1.10',
+ 'IO::Socket' => 1.1603,
+ 'IPC::Msg' => '1.00',
+ 'IPC::Open2' => 1.01,
+ 'IPC::Open3' => 1.0103,
+ 'IPC::Semaphore' => '1.00',
+ 'IPC::SysV' => 1.03,
+ 'less' => undef,
+ 'lib' => undef,
+ 'locale' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::Complex' => 1.26,
+ 'Math::Trig' => 1,
+ 'NDBM_File' => 1.01,
+ 'Net::hostent' => undef,
+ 'Net::netent' => undef,
+ 'Net::Ping' => 2.02,
+ 'Net::protoent' => undef,
+ 'Net::servent' => undef,
+ 'O' => undef,
+ 'ODBM_File' => '1.00',
+ 'Opcode' => 1.04,
+ 'ops' => undef,
+ 'OS2::ExtAttr' => 0.01,
+ 'OS2::PrfDB' => 0.02,
+ 'OS2::Process' => 0.2,
+ 'OS2::REXX' => undef,
+ 'overload' => undef,
+ 'Pod::Functions' => undef,
+ 'Pod::Html' => 1.01,
+ 'Pod::Text' => 1.0203,
+ 'POSIX' => 1.02,
+ 're' => 0.02,
+ 'Safe' => 2.06,
+ 'SDBM_File' => '1.00',
+ 'Search::Dict' => undef,
+ 'SelectSaver' => undef,
+ 'SelfLoader' => 1.08,
+ 'Shell' => undef,
+ 'sigtrap' => 1.02,
+ 'Socket' => 1.7,
+ 'strict' => 1.01,
+ 'subs' => undef,
+ 'Symbol' => 1.02,
+ 'Sys::Hostname' => undef,
+ 'Sys::Syslog' => undef,
+ 'Term::Cap' => undef,
+ 'Term::Complete' => undef,
+ 'Term::ReadLine' => undef,
+ 'Test' => 1.122,
+ 'Test::Harness' => 1.1602,
+ 'Text::Abbrev' => undef,
+ 'Text::ParseWords' => 3.1,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => 96.121201,
+ 'Text::Wrap' => 98.112902,
+ 'Thread' => '1.0',
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Thread::Specific' => undef,
+ 'Thread::Signal' => undef,
+ 'Tie::Array' => '1.00',
+ 'Tie::Handle' => undef,
+ 'Tie::Hash' => undef,
+ 'Tie::RefHash' => undef,
+ 'Tie::Scalar' => undef,
+ 'Tie::SubstrHash' => undef,
+ 'Time::gmtime' => 1.01,
+ 'Time::Local' => undef,
+ 'Time::localtime' => 1.01,
+ 'Time::tm' => undef,
+ 'UNIVERSAL' => undef,
+ 'User::grent' => undef,
+ 'User::pwent' => undef,
+ 'vars' => undef,
+ 'VMS::DCLsym' => 1.01,
+ 'VMS::Filespec' => undef,
+ 'VMS::Stdio' => 2.1,
+ 'vmsish' => undef,
+ },
+
+ 5.00405 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'attrs' => '0.1', #./lib/attrs.pm
+ 'AutoLoader' => '5.56', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0303', #./lib/AutoSplit.pm
+ 'autouse' => '1.01', #./lib/autouse.pm
+ 'base' => undef, #./lib/base.pm
+ 'Benchmark' => undef, #./lib/Benchmark.pm
+ 'blib' => '1.00', #./lib/blib.pm
+ 'Bundle::CPAN' => '0.03', #./lib/Bundle/CPAN.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'CGI' => '2.42', #./lib/CGI.pm
+ 'CGI::Apache' => '1.1', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.10', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.06', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.00a', #./lib/CGI/Fast.pm
+ 'CGI::Push' => '1.01', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '0.06', #./lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'constant' => '1.00', #./lib/constant.pm
+ 'CPAN' => '1.40', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.30 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => undef, #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.01', #./lib/Cwd.pm
+ 'DB_File' => '1.15', #./ext/DB_File/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #./lib/diagnostics.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'DynaLoader' => '1.03',
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => undef, #./lib/Exporter.pm
+ 'ExtUtils::Command' => '1.01', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.25 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.42', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.14 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.16 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.118 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.6', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1001', #./lib/File/Compare.pm
+ 'File::Copy' => '2.02', #./lib/File/Copy.pm
+ 'File::DosGlob' => undef, #./lib/File/DosGlob.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Path' => '1.0402', #./lib/File/Path.pm
+ 'File::Spec' => '0.6', #./lib/File/Spec.pm
+ 'File::Spec::Mac' => '1.0', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #./lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.41', #./lib/FindBin.pm
+ 'GDBM_File' => '1.00', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.19', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => undef, #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'IO' => undef, #./ext/IO/IO.pm
+ 'IO::File' => '1.06021', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.1504', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.1603', #./ext/IO/lib/IO/Socket.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #./lib/IPC/Open3.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => undef, #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.25', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.01', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'ODBM_File' => '1.00', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => undef, #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #./lib/overload.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0101', #./lib/Pod/Html.pm
+ 'Pod::Text' => '1.0204', #./lib/Pod/Text.pm
+ 'POSIX' => '1.02', #./ext/POSIX/POSIX.pm
+ 're' => undef, #./lib/re.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'SDBM_File' => '1.00', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.08', #./lib/SelfLoader.pm
+ 'Shell' => undef, #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.7', #./ext/Socket/Socket.pm
+ 'strict' => '1.01', #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => undef, #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #./lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test' => '1.04', #./lib/Test.pm
+ 'Test::Harness' => '1.1602', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.1001', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '98.112902', #./lib/Text/Wrap.pm
+ 'Tie::Handle' => undef, #./lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.02', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ },
+
+ 5.00504 => {
+ 'AnyDBM_File' => undef, #lib/AnyDBM_File.pm
+ 'attrs' => '1.0', #lib/attrs.pm
+ 'AutoLoader' => undef, #lib/AutoLoader.pm
+ 'AutoSplit' => '1.0303', #lib/AutoSplit.pm
+ 'autouse' => '1.01', #lib/autouse.pm
+ 'base' => undef, #lib/base.pm
+ 'B::Asmdata' => undef, #lib/B/Asmdata.pm
+ 'B::Assembler' => undef, #lib/B/Assembler.pm
+ 'B::Bblock' => undef, #lib/B/Bblock.pm
+ 'B::Bytecode' => undef, #lib/B/Bytecode.pm
+ 'B::CC' => undef, #lib/B/CC.pm
+ 'B::C' => undef, #lib/B/C.pm
+ 'B::Debug' => undef, #lib/B/Debug.pm
+ 'B::Deparse' => '0.56', #lib/B/Deparse.pm
+ 'B::Disassembler' => undef, #lib/B/Disassembler.pm
+ 'Benchmark' => undef, #lib/Benchmark.pm
+ 'blib' => '1.00', #lib/blib.pm
+ 'B::Lint' => undef, #lib/B/Lint.pm
+ 'B::Showlex' => undef, #lib/B/Showlex.pm
+ 'B::Stackobj' => undef, #lib/B/Stackobj.pm
+ 'B::Terse' => undef, #lib/B/Terse.pm
+ 'B' => undef, #lib/B.pm
+ 'B::Xref' => undef, #lib/B/Xref.pm
+ 'Carp' => undef, #lib/Carp.pm
+ 'CGI' => '2.46', #lib/CGI.pm
+ 'CGI::Apache' => '1.1', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.13', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.06', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.01', #lib/CGI/Fast.pm
+ 'CGI::Push' => '1.01', #lib/CGI/Push.pm
+ 'CGI::Switch' => '0.06', #lib/CGI/Switch.pm
+ 'Class::Struct' => undef, #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.00', #lib/constant.pm
+ 'CPAN' => '1.48', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.36 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.00', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.01', #lib/Cwd.pm
+ 'Data::Dumper' => '2.101', #lib/Data/Dumper.pm
+ 'DB_File' => '1.807', #lib/DB_File.pm
+ 'Devel::SelfStubber' => '1.01', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => undef, #lib/diagnostics.pm
+ 'DirHandle' => undef, #lib/DirHandle.pm
+ 'Dumpvalue' => undef, #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.03', #lib/DynaLoader.pm
+ 'English' => undef, #lib/English.pm
+ 'Env' => undef, #lib/Env.pm
+ 'Errno' => '1.111', #lib/Errno.pm
+ 'Exporter' => undef, #lib/Exporter.pm
+ 'ExtUtils::Command' => '1.01', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.02', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.25 ', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '5.4302', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.14 ', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.17 ', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_OS2' => undef, #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.12602 ', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::Packlist' => '0.03', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.11 ', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.02', #lib/Fatal.pm
+ 'Fcntl' => '1.03', #lib/Fcntl.pm
+ 'fields' => '0.02', #lib/fields.pm
+ 'File::Basename' => '2.6', #lib/File/Basename.pm
+ 'FileCache' => undef, #lib/FileCache.pm
+ 'File::CheckTree' => undef, #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1002', #lib/File/Compare.pm
+ 'File::Copy' => '2.02', #lib/File/Copy.pm
+ 'File::DosGlob' => undef, #lib/File/DosGlob.pm
+ 'File::Find' => undef, #lib/File/Find.pm
+ 'FileHandle' => '2.00', #lib/FileHandle.pm
+ 'File::Path' => '1.0401', #lib/File/Path.pm
+ 'File::Spec' => '0.8', #lib/File/Spec.pm
+ 'File::Spec::Functions' => undef, #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => undef, #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #lib/File/stat.pm
+ 'FindBin' => '1.42', #lib/FindBin.pm
+ 'GDBM_File' => '1.00', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.20', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.01', #lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #lib/I18N/Collate.pm
+ 'integer' => undef, #lib/integer.pm
+ 'IO::File' => '1.06021', #lib/IO/File.pm
+ 'IO::Handle' => '1.1505', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.0902', #lib/IO/Pipe.pm
+ 'IO::Seekable' => '1.06', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.10', #lib/IO/Select.pm
+ 'IO::Socket' => '1.1603', #lib/IO/Socket.pm
+ 'IO' => undef, #lib/IO.pm
+ 'IPC::Msg' => '1.00', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.00', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.03', #lib/IPC/SysV.pm
+ 'less' => undef, #lib/less.pm
+ 'lib' => undef, #lib/lib.pm
+ 'locale' => undef, #lib/locale.pm
+ 'Math::BigFloat' => undef, #lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #lib/Math/BigInt.pm
+ 'Math::Complex' => '1.26', #lib/Math/Complex.pm
+ 'Math::Trig' => '1', #lib/Math/Trig.pm
+ 'NDBM_File' => '1.01', #ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #lib/Net/hostent.pm
+ 'Net::netent' => undef, #lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #lib/Net/Ping.pm
+ 'Net::protoent' => undef, #lib/Net/protoent.pm
+ 'Net::servent' => undef, #lib/Net/servent.pm
+ 'ODBM_File' => '1.00', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #lib/Opcode.pm
+ 'ops' => undef, #lib/ops.pm
+ 'O' => undef, #lib/O.pm
+ 'OS2::ExtAttr' => '0.01', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #lib/overload.pm
+ 'Pod::Functions' => undef, #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.02', #lib/Pod/Html.pm
+ 'Pod::Text' => '1.0203', #lib/Pod/Text.pm
+ 'POSIX' => '1.02', #lib/POSIX.pm
+ 're' => '0.02', #lib/re.pm
+ 'Safe' => '2.06', #lib/Safe.pm
+ 'SDBM_File' => '1.00', #lib/SDBM_File.pm
+ 'Search::Dict' => undef, #lib/Search/Dict.pm
+ 'SelectSaver' => undef, #lib/SelectSaver.pm
+ 'SelfLoader' => '1.08', #lib/SelfLoader.pm
+ 'Shell' => undef, #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.7', #lib/Socket.pm
+ 'strict' => '1.01', #lib/strict.pm
+ 'subs' => undef, #lib/subs.pm
+ 'Symbol' => '1.02', #lib/Symbol.pm
+ 'Sys::Hostname' => undef, #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => undef, #lib/Sys/Syslog.pm
+ 'Term::Cap' => undef, #lib/Term/Cap.pm
+ 'Term::Complete' => undef, #lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #lib/Term/ReadLine.pm
+ 'Test' => '1.122', #lib/Test.pm
+ 'Test::Harness' => '1.1602', #lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.1', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => undef, #lib/Text/Soundex.pm
+ 'Text::Tabs' => '96.121201', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '98.112902', #lib/Text/Wrap.pm
+ 'Thread' => '1.0', #ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.00', #lib/Tie/Array.pm
+ 'Tie::Handle' => undef, #lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #lib/Time/gmtime.pm
+ 'Time::localtime' => '1.01', #lib/Time/localtime.pm
+ 'Time::Local' => undef, #lib/Time/Local.pm
+ 'Time::tm' => undef, #lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #lib/UNIVERSAL.pm
+ 'User::grent' => undef, #lib/User/grent.pm
+ 'User::pwent' => undef, #lib/User/pwent.pm
+ 'vars' => undef, #lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.1', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #vms/ext/vmsish.pm
+ },
+
+ 5.006 => {
+ 'AnyDBM_File' => undef, #./lib/AnyDBM_File.pm
+ 'AutoLoader' => '5.57', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0305', #./lib/AutoSplit.pm
+ 'B' => undef, #./ext/B/B.pm
+ 'B::Asmdata' => undef, #./ext/B/B/Asmdata.pm
+ 'B::Assembler' => undef, #./ext/B/B/Assembler.pm
+ 'B::Bblock' => undef, #./ext/B/B/Bblock.pm
+ 'B::Bytecode' => undef, #./ext/B/B/Bytecode.pm
+ 'B::C' => undef, #./ext/B/B/C.pm
+ 'B::CC' => undef, #./ext/B/B/CC.pm
+ 'B::Debug' => undef, #./ext/B/B/Debug.pm
+ 'B::Deparse' => '0.59', #./ext/B/B/Deparse.pm
+ 'B::Disassembler' => undef, #./ext/B/B/Disassembler.pm
+ 'B::Lint' => undef, #./ext/B/B/Lint.pm
+ 'B::Showlex' => undef, #./ext/B/B/Showlex.pm
+ 'B::Stackobj' => undef, #./ext/B/B/Stackobj.pm
+ 'B::Stash' => undef, #./ext/B/B/Stash.pm
+ 'B::Terse' => undef, #./ext/B/B/Terse.pm
+ 'B::Xref' => undef, #./ext/B/B/Xref.pm
+ 'Benchmark' => '1', #./lib/Benchmark.pm
+ 'ByteLoader' => '0.03', #./ext/ByteLoader/ByteLoader.pm
+ 'CGI' => '2.56', #./lib/CGI.pm
+ 'CGI::Apache' => undef, #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.14', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.12', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.02', #./lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.03', #./lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.01', #./lib/CGI/Push.pm
+ 'CGI::Switch' => undef, #./lib/CGI/Switch.pm
+ 'CPAN' => '1.52', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.38 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.00', #./lib/CPAN/Nox.pm
+ 'Carp' => undef, #./lib/Carp.pm
+ 'Carp::Heavy' => undef, #./lib/Carp/Heavy.pm
+ 'Class::Struct' => '0.58', #./lib/Class/Struct.pm
+ 'Config' => undef,
+ 'Cwd' => '2.02', #./lib/Cwd.pm
+ 'DB' => '1.0', #./lib/DB.pm
+ 'DB_File' => '1.72', #./ext/DB_File/DB_File.pm
+ 'Data::Dumper' => '2.101', #./ext/Data/Dumper/Dumper.pm
+ 'Devel::DProf' => '20000000.00_00', #./ext/Devel/DProf/DProf.pm
+ 'Devel::Peek' => '1.00_01', #./ext/Devel/Peek/Peek.pm
+ 'Devel::SelfStubber' => '1.01', #./lib/Devel/SelfStubber.pm
+ 'DirHandle' => undef, #./lib/DirHandle.pm
+ 'Dumpvalue' => undef, #./lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04',
+ 'English' => undef, #./lib/English.pm
+ 'Env' => undef, #./lib/Env.pm
+ 'Exporter' => '5.562', #./lib/Exporter.pm
+ 'Exporter::Heavy' => undef, #./lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.01', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Embed' => '1.2505', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.28 ', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.02', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.25 ', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MM_Cygwin' => undef, #./lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_OS2' => undef, #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.12603 ', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_VMS' => undef, #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => undef, #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MakeMaker' => '5.45', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.33 ', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.14 ', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.17 ', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::Packlist' => '0.03', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'ExtUtils::testlib' => '1.11 ', #./lib/ExtUtils/testlib.pm
+ 'Fatal' => '1.02', #./lib/Fatal.pm
+ 'Fcntl' => '1.03', #./ext/Fcntl/Fcntl.pm
+ 'File::Basename' => '2.6', #./lib/File/Basename.pm
+ 'File::CheckTree' => undef, #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1002', #./lib/File/Compare.pm
+ 'File::Copy' => '2.03', #./lib/File/Copy.pm
+ 'File::DosGlob' => undef, #./lib/File/DosGlob.pm
+ 'File::Find' => undef, #./lib/File/Find.pm
+ 'File::Glob' => '0.991', #./ext/File/Glob/Glob.pm
+ 'File::Path' => '1.0403', #./lib/File/Path.pm
+ 'File::Spec' => '0.8', #./lib/File/Spec.pm
+ 'File::Spec::Functions' => undef, #./lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => undef, #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => undef, #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => undef, #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => undef, #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => undef, #./lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #./lib/File/stat.pm
+ 'FileCache' => undef, #./lib/FileCache.pm
+ 'FileHandle' => '2.00', #./lib/FileHandle.pm
+ 'FindBin' => '1.42', #./lib/FindBin.pm
+ 'GDBM_File' => '1.03', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.23', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.02', #./lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #./lib/I18N/Collate.pm
+ 'IO' => '1.20', #./ext/IO/IO.pm
+ 'IO::Dir' => '1.03', #./ext/IO/lib/IO/Dir.pm
+ 'IO::File' => '1.08', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.21', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.121', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Poll' => '0.01', #./ext/IO/lib/IO/Poll.pm
+ 'IO::Seekable' => '1.08', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.14', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.26', #./ext/IO/lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.25', #./ext/IO/lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.20', #./ext/IO/lib/IO/Socket/UNIX.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #./lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.00', #./ext/IPC/SysV/Msg.pm
+ 'IPC::Semaphore' => '1.00', #./ext/IPC/SysV/Semaphore.pm
+ 'IPC::SysV' => '1.03', #./ext/IPC/SysV/SysV.pm
+ 'JNI' => '0.01', #./jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #./jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #./jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #./jpl/JPL/Compile.pm
+ 'Math::BigFloat' => undef, #./lib/Math/BigFloat.pm
+ 'Math::BigInt' => undef, #./lib/Math/BigInt.pm
+ 'Math::Complex' => '1.26', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1', #./lib/Math/Trig.pm
+ 'NDBM_File' => '1.03', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Ping' => '2.02', #./lib/Net/Ping.pm
+ 'Net::hostent' => undef, #./lib/Net/hostent.pm
+ 'Net::netent' => undef, #./lib/Net/netent.pm
+ 'Net::protoent' => undef, #./lib/Net/protoent.pm
+ 'Net::servent' => undef, #./lib/Net/servent.pm
+ 'O' => undef, #./ext/B/O.pm
+ 'ODBM_File' => '1.02', #./ext/ODBM_File/ODBM_File.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => undef, #./os2/OS2/REXX/REXX.pm
+ 'OS2::DLL' => undef, #./os2/OS2/REXX/DLL/DLL.pm
+ 'Opcode' => '1.04', #./ext/Opcode/Opcode.pm
+ 'POSIX' => '1.03', #./ext/POSIX/POSIX.pm
+ 'Pod::Checker' => '1.098', #./lib/Pod/Checker.pm
+ 'Pod::Find' => '0.12', #./lib/Pod/Find.pm
+ 'Pod::Functions' => undef, #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.03', #./lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.12', #./lib/Pod/InputObjects.pm
+ 'Pod::Man' => '1.02', #./lib/Pod/Man.pm
+ 'Pod::ParseUtils' => '0.2', #./lib/Pod/ParseUtils.pm
+ 'Pod::Parser' => '1.12', #./lib/Pod/Parser.pm
+ 'Pod::Plainer' => '0.01', #./lib/Pod/Plainer.pm
+ 'Pod::Select' => '1.12', #./lib/Pod/Select.pm
+ 'Pod::Text' => '2.03', #./lib/Pod/Text.pm
+ 'Pod::Text::Color' => '0.05', #./lib/Pod/Text/Color.pm
+ 'Pod::Text::Termcap' => '0.04', #./lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.12', #./lib/Pod/Usage.pm
+ 'SDBM_File' => '1.02', #./ext/SDBM_File/SDBM_File.pm
+ 'Safe' => '2.06', #./ext/Opcode/Safe.pm
+ 'Search::Dict' => undef, #./lib/Search/Dict.pm
+ 'SelectSaver' => undef, #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.0901', #./lib/SelfLoader.pm
+ 'Shell' => '0.2', #./lib/Shell.pm
+ 'Socket' => '1.72', #./ext/Socket/Socket.pm
+ 'Symbol' => '1.02', #./lib/Symbol.pm
+ 'Sys::Hostname' => '1.1', #./ext/Sys/Hostname/Hostname.pm
+ 'Sys::Syslog' => '0.01', #./ext/Sys/Syslog/Syslog.pm
+ 'Term::ANSIColor' => '1.01', #./lib/Term/ANSIColor.pm
+ 'Term::Cap' => undef, #./lib/Term/Cap.pm
+ 'Term::Complete' => undef, #./lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #./lib/Term/ReadLine.pm
+ 'Test' => '1.13', #./lib/Test.pm
+ 'Test::Harness' => '1.1604', #./lib/Test/Harness.pm
+ 'Text::Abbrev' => undef, #./lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.2', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.0', #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '98.112902', #./lib/Text/Wrap.pm
+ 'Thread' => '1.0', #./ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #./ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #./ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #./ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.01', #./lib/Tie/Array.pm
+ 'Tie::Handle' => '1.0', #./lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #./lib/Tie/Hash.pm
+ 'Tie::RefHash' => undef, #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #./lib/Tie/SubstrHash.pm
+ 'Time::Local' => undef, #./lib/Time/Local.pm
+ 'Time::gmtime' => '1.01', #./lib/Time/gmtime.pm
+ 'Time::localtime' => '1.01', #./lib/Time/localtime.pm
+ 'Time::tm' => undef, #./lib/Time/tm.pm
+ 'UNIVERSAL' => undef, #./lib/UNIVERSAL.pm
+ 'User::grent' => undef, #./lib/User/grent.pm
+ 'User::pwent' => undef, #./lib/User/pwent.pm
+ 'VMS::DCLsym' => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.2', #./vms/ext/Stdio/Stdio.pm
+ 'XSLoader' => '0.01',
+ 'attributes' => '0.03', #./lib/attributes.pm
+ 'attrs' => '1.0', #./ext/attrs/attrs.pm
+ 'autouse' => '1.02', #./lib/autouse.pm
+ 'base' => '1.01', #./lib/base.pm
+ 'blib' => '1.00', #./lib/blib.pm
+ 'bytes' => undef, #./lib/bytes.pm
+ 'charnames' => undef, #./lib/charnames.pm
+ 'constant' => '1.02', #./lib/constant.pm
+ 'diagnostics' => '1.0', #./lib/diagnostics.pm
+ 'fields' => '1.01', #./lib/fields.pm
+ 'filetest' => undef, #./lib/filetest.pm
+ 'integer' => undef, #./lib/integer.pm
+ 'less' => undef, #./lib/less.pm
+ 'lib' => '0.5564', #./lib/lib.pm
+ 'locale' => undef, #./lib/locale.pm
+ 'open' => undef, #./lib/open.pm
+ 'ops' => undef, #./ext/Opcode/ops.pm
+ 'overload' => undef, #./lib/overload.pm
+ 're' => '0.02', #./ext/re/re.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'strict' => '1.01', #./lib/strict.pm
+ 'subs' => undef, #./lib/subs.pm
+ 'utf8' => undef, #./lib/utf8.pm
+ 'vars' => undef, #./lib/vars.pm
+ 'vmsish' => undef, #./vms/ext/vmsish.pm
+ 'warnings' => undef, #./lib/warnings.pm
+ 'warnings::register' => undef, #./lib/warnings/register.pm
+ },
+
+ 5.006001 => {
+ 'AnyDBM_File' => undef,
+ 'attributes' => 0.03,
+ 'attrs' => '1.0',
+ 'AutoLoader' => 5.58,
+ 'AutoSplit' => 1.0305,
+ 'autouse' => 1.02,
+ 'B::Asmdata' => undef,
+ 'B::Assembler' => 0.02,
+ 'B::Bblock' => undef,
+ 'B::Bytecode' => undef,
+ 'B::C' => undef,
+ 'B::CC' => undef,
+ 'B::Concise' => 0.51,
+ 'B::Debug' => undef,
+ 'B::Deparse' => 0.6,
+ 'B::Disassembler' => undef,
+ 'B::Lint' => undef,
+ 'B' => undef,
+ 'B::Showlex' => undef,
+ 'B::Stackobj' => undef,
+ 'B::Stash' => undef,
+ 'B::Terse' => undef,
+ 'B::Xref' => undef,
+ 'base' => 1.01,
+ 'Benchmark' => 1,
+ 'blib' => '1.00',
+ 'ByteLoader' => 0.04,
+ 'bytes' => undef,
+ 'Carp' => undef,
+ 'Carp::Heavy' => undef,
+ 'CGI' => 2.752,
+ 'CGI::Apache' => undef,
+ 'CGI::Carp' => '1.20',
+ 'CGI::Cookie' => 1.18,
+ 'CGI::Fast' => 1.02,
+ 'CGI::Pretty' => 1.05,
+ 'CGI::Push' => 1.04,
+ 'CGI::Switch' => undef,
+ 'CGI::Util' => 1.1,
+ 'charnames' => undef,
+ 'Class::Struct' => 0.59,
+ 'Config' => undef,
+ 'constant' => 1.02,
+ 'CPAN::FirstTime' => 1.53 ,
+ 'CPAN' => '1.59_54',
+ 'CPAN::Nox' => '1.00',
+ 'Cwd' => 2.04,
+ 'Data::Dumper' => 2.102,
+ 'DB' => '1.0',
+ 'DB_File' => 1.75,
+ 'Devel::DProf' => '20000000.00_00',
+ 'Devel::Peek' => '1.00_01',
+ 'Devel::SelfStubber' => 1.01,
+ 'diagnostics' => '1.0', # really v1.0, but that causes breakage
+ 'DirHandle' => undef,
+ 'Dumpvalue' => undef,
+ 'DynaLoader' => 1.04,
+ 'English' => undef,
+ 'Env' => undef,
+ 'Exporter' => 5.562,
+ 'Exporter::Heavy' => undef,
+ 'ExtUtils::Command' => 1.01,
+ 'ExtUtils::Embed' => 1.2505,
+ 'ExtUtils::Install' => 1.28 ,
+ 'ExtUtils::Installed' => 0.02,
+ 'ExtUtils::Liblist' => 1.26 ,
+ 'ExtUtils::MakeMaker' => 5.45,
+ 'ExtUtils::Manifest' => 1.33 ,
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => 1.14 ,
+ 'ExtUtils::Mksymlists' => 1.17 ,
+ 'ExtUtils::MM_Cygwin' => undef,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_Unix' => 1.12603 ,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::Packlist' => 0.03,
+ 'ExtUtils::testlib' => 1.11 ,
+ 'ExtUtils::XSSymSet' => '1.0',
+ 'Fatal' => 1.02,
+ 'Fcntl' => 1.03,
+ 'fields' => 1.01,
+ 'File::Basename' => 2.6,
+ 'File::CheckTree' => undef,
+ 'File::Compare' => 1.1002,
+ 'File::Copy' => 2.03,
+ 'File::DosGlob' => undef,
+ 'File::Find' => undef,
+ 'File::Glob' => 0.991,
+ 'File::Path' => 1.0404,
+ 'File::Spec' => 0.82,
+ 'File::Spec::Epoc' => undef,
+ 'File::Spec::Functions' => 1.1,
+ 'File::Spec::Mac' => 1.2,
+ 'File::Spec::OS2' => 1.1,
+ 'File::Spec::Unix' => 1.2,
+ 'File::Spec::VMS' => 1.1,
+ 'File::Spec::Win32' => 1.2,
+ 'File::stat' => undef,
+ 'File::Temp' => 0.12,
+ 'FileCache' => undef,
+ 'FileHandle' => '2.00',
+ 'filetest' => undef,
+ 'FindBin' => 1.42,
+ 'GDBM_File' => 1.05,
+ 'Getopt::Long' => 2.25,
+ 'Getopt::Std' => 1.02,
+ 'I18N::Collate' => undef,
+ 'integer' => undef,
+ 'IO' => '1.20',
+ 'IO::Dir' => 1.03,
+ 'IO::File' => 1.08,
+ 'IO::Handle' => 1.21,
+ 'IO::Pipe' => 1.121,
+ 'IO::Poll' => 0.05,
+ 'IO::Seekable' => 1.08,
+ 'IO::Select' => 1.14,
+ 'IO::Socket' => 1.26,
+ 'IO::Socket::INET' => 1.25,
+ 'IO::Socket::UNIX' => '1.20',
+ 'IPC::Msg' => '1.00',
+ 'IPC::Open2' => 1.01,
+ 'IPC::Open3' => 1.0103,
+ 'IPC::Semaphore' => '1.00',
+ 'IPC::SysV' => 1.03,
+ 'JNI' => 0.1,
+ 'JPL::AutoLoader' => undef,
+ 'JPL::Class' => undef,
+ 'JPL::Compile' => undef,
+ 'less' => undef,
+ 'lib' => 0.5564,
+ 'locale' => undef,
+ 'Math::BigFloat' => 0.02,
+ 'Math::BigInt' => 0.01,
+ 'Math::Complex' => 1.31,
+ 'Math::Trig' => 1,
+ 'NDBM_File' => 1.04,
+ 'Net::hostent' => undef,
+ 'Net::netent' => undef,
+ 'Net::Ping' => 2.02,
+ 'Net::protoent' => undef,
+ 'Net::servent' => undef,
+ 'O' => undef,
+ 'ODBM_File' => 1.03,
+ 'Opcode' => 1.04,
+ 'open' => undef,
+ 'ops' => undef,
+ 'OS2::DLL' => undef,
+ 'OS2::ExtAttr' => 0.01,
+ 'OS2::PrfDB' => 0.02,
+ 'OS2::Process' => 0.2,
+ 'OS2::REXX' => '1.00',
+ 'overload' => undef,
+ 'Pod::Checker' => 1.2,
+ 'Pod::Find' => 0.21,
+ 'Pod::Functions' => undef,
+ 'Pod::Html' => 1.03,
+ 'Pod::LaTeX' => 0.53,
+ 'Pod::Man' => 1.15,
+ 'Pod::InputObjects' => 1.13,
+ 'Pod::Parser' => 1.13,
+ 'Pod::ParseUtils' => 0.22,
+ 'Pod::Plainer' => 0.01,
+ 'Pod::Select' => 1.13,
+ 'Pod::Text' => 2.08,
+ 'Pod::Text::Color' => 0.06,
+ 'Pod::Text::Overstrike' => 1.01,
+ 'Pod::Text::Termcap' => 1,
+ 'Pod::Usage' => 1.14,
+ 'POSIX' => 1.03,
+ 're' => 0.02,
+ 'Safe' => 2.06,
+ 'SDBM_File' => 1.03,
+ 'Search::Dict' => undef,
+ 'SelectSaver' => undef,
+ 'SelfLoader' => 1.0902,
+ 'Shell' => 0.3,
+ 'sigtrap' => 1.02,
+ 'Socket' => 1.72,
+ 'strict' => 1.01,
+ 'subs' => undef,
+ 'Symbol' => 1.02,
+ 'Sys::Hostname' => 1.1,
+ 'Sys::Syslog' => 0.01,
+ 'Term::ANSIColor' => 1.03,
+ 'Term::Cap' => undef,
+ 'Term::Complete' => undef,
+ 'Term::ReadLine' => undef,
+ 'Test' => 1.15,
+ 'Test::Harness' => 1.1604,
+ 'Text::Abbrev' => undef,
+ 'Text::ParseWords' => 3.2,
+ 'Text::Soundex' => '1.0',
+ 'Text::Tabs' => 98.112801,
+ 'Text::Wrap' => 2001.0131,
+ 'Thread' => '1.0',
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Thread::Signal' => undef,
+ 'Thread::Specific' => undef,
+ 'Tie::Array' => 1.01,
+ 'Tie::Handle' => '4.0',
+ 'Tie::Hash' => undef,
+ 'Tie::RefHash' => 1.3,
+ 'Tie::Scalar' => undef,
+ 'Tie::SubstrHash' => undef,
+ 'Time::gmtime' => 1.01,
+ 'Time::Local' => undef,
+ 'Time::localtime' => 1.01,
+ 'Time::tm' => undef,
+ 'UNIVERSAL' => undef,
+ 'User::grent' => undef,
+ 'User::pwent' => undef,
+ 'utf8' => undef,
+ 'vars' => undef,
+ 'VMS::DCLsym' => 1.01,
+ 'VMS::Filespec' => undef,
+ 'VMS::Stdio' => 2.2,
+ 'vmsish' => undef,
+ 'warnings' => undef,
+ 'warnings::register' => undef,
+ 'XSLoader' => '0.01',
+ },
+
+ 5.006002 => {
+ 'AnyDBM_File' => undef, #lib/AnyDBM_File.pm
+ 'attributes' => '0.03', #lib/attributes.pm
+ 'attrs' => '1.0', #lib/attrs.pm
+ 'AutoLoader' => '5.58', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.0305', #lib/AutoSplit.pm
+ 'autouse' => '1.02', #lib/autouse.pm
+ 'B' => undef, #lib/B.pm
+ 'B::Asmdata' => undef, #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.02', #lib/B/Assembler.pm
+ 'B::Bblock' => undef, #lib/B/Bblock.pm
+ 'B::Bytecode' => undef, #lib/B/Bytecode.pm
+ 'B::C' => undef, #lib/B/C.pm
+ 'B::CC' => undef, #lib/B/CC.pm
+ 'B::Concise' => '0.51', #lib/B/Concise.pm
+ 'B::Debug' => undef, #lib/B/Debug.pm
+ 'B::Deparse' => '0.6', #lib/B/Deparse.pm
+ 'B::Disassembler' => undef, #lib/B/Disassembler.pm
+ 'B::Lint' => undef, #lib/B/Lint.pm
+ 'B::Showlex' => undef, #lib/B/Showlex.pm
+ 'B::Stackobj' => undef, #lib/B/Stackobj.pm
+ 'B::Stash' => undef, #lib/B/Stash.pm
+ 'B::Terse' => undef, #lib/B/Terse.pm
+ 'B::Xref' => undef, #lib/B/Xref.pm
+ 'base' => '1.01', #lib/base.pm
+ 'Benchmark' => '1', #lib/Benchmark.pm
+ 'blib' => '1.00', #lib/blib.pm
+ 'ByteLoader' => '0.04', #lib/ByteLoader.pm
+ 'bytes' => undef, #lib/bytes.pm
+ 'Carp' => undef, #lib/Carp.pm
+ 'Carp::Heavy' => undef, #lib/Carp/Heavy.pm
+ 'CGI' => '2.752', #lib/CGI.pm
+ 'CGI::Apache' => undef, #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.20', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.18', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.02', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.05', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => undef, #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.1', #lib/CGI/Util.pm
+ 'charnames' => undef, #lib/charnames.pm
+ 'Class::Struct' => '0.59', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.02', #lib/constant.pm
+ 'CPAN' => '1.59_54', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.53 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.00', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.04', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.806', #lib/DB_File.pm
+ 'Devel::DProf' => '20000000.00_00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.00_01', #lib/Devel/Peek.pm
+ 'Devel::SelfStubber' => '1.01', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.0', #lib/diagnostics.pm
+ 'DirHandle' => undef, #lib/DirHandle.pm
+ 'Dumpvalue' => undef, #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'English' => undef, #lib/English.pm
+ 'Env' => undef, #lib/Env.pm
+ 'Errno' => '1.111', #lib/Errno.pm
+ 'Exporter' => '5.562', #lib/Exporter.pm
+ 'Exporter::Heavy' => undef, #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Embed' => '1.2505', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.02', #lib/Fatal.pm
+ 'Fcntl' => '1.03', #lib/Fcntl.pm
+ 'fields' => '1.01', #lib/fields.pm
+ 'File::Basename' => '2.6', #lib/File/Basename.pm
+ 'File::CheckTree' => undef, #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1002', #lib/File/Compare.pm
+ 'File::Copy' => '2.03', #lib/File/Copy.pm
+ 'File::DosGlob' => undef, #lib/File/DosGlob.pm
+ 'File::Find' => undef, #lib/File/Find.pm
+ 'File::Glob' => '0.991', #lib/File/Glob.pm
+ 'File::Path' => '1.0404', #lib/File/Path.pm
+ 'File::Spec' => '0.86', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => undef, #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'FileCache' => undef, #lib/FileCache.pm
+ 'FileHandle' => '2.00', #lib/FileHandle.pm
+ 'filetest' => undef, #lib/filetest.pm
+ 'FindBin' => '1.42', #lib/FindBin.pm
+ 'GDBM_File' => '1.05', #ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.25', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.02', #lib/Getopt/Std.pm
+ 'I18N::Collate' => undef, #lib/I18N/Collate.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => undef, #lib/integer.pm
+ 'IO' => '1.20', #lib/IO.pm
+ 'IO::Dir' => '1.03', #lib/IO/Dir.pm
+ 'IO::File' => '1.08', #lib/IO/File.pm
+ 'IO::Handle' => '1.21', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.121', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.05', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.08', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.14', #lib/IO/Select.pm
+ 'IO::Socket' => '1.26', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.25', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.20', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.00', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0103', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.00', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.03', #lib/IPC/SysV.pm
+ 'JNI' => '0.1', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => undef, #lib/less.pm
+ 'lib' => '0.5564', #lib/lib.pm
+ 'locale' => undef, #lib/locale.pm
+ 'Math::BigFloat' => '0.02', #lib/Math/BigFloat.pm
+ 'Math::BigInt' => '0.01', #lib/Math/BigInt.pm
+ 'Math::Complex' => '1.31', #lib/Math/Complex.pm
+ 'Math::Trig' => '1', #lib/Math/Trig.pm
+ 'NDBM_File' => '1.04', #ext/NDBM_File/NDBM_File.pm
+ 'Net::hostent' => undef, #lib/Net/hostent.pm
+ 'Net::netent' => undef, #lib/Net/netent.pm
+ 'Net::Ping' => '2.02', #lib/Net/Ping.pm
+ 'Net::protoent' => undef, #lib/Net/protoent.pm
+ 'Net::servent' => undef, #lib/Net/servent.pm
+ 'O' => undef, #lib/O.pm
+ 'ODBM_File' => '1.03', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.04', #lib/Opcode.pm
+ 'open' => undef, #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => undef, #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.01', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '0.2', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.00', #os2/OS2/REXX/REXX.pm
+ 'overload' => undef, #lib/overload.pm
+ 'Pod::Checker' => '1.2', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.21', #lib/Pod/Find.pm
+ 'Pod::Functions' => undef, #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.03', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.13', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.53', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.15', #lib/Pod/Man.pm
+ 'Pod::Parser' => '1.13', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.22', #lib/Pod/ParseUtils.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.08', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '0.06', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.01', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.14', #lib/Pod/Usage.pm
+ 'POSIX' => '1.03', #lib/POSIX.pm
+ 're' => '0.02', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'SDBM_File' => '1.03', #lib/SDBM_File.pm
+ 'Search::Dict' => undef, #lib/Search/Dict.pm
+ 'SelectSaver' => undef, #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0902', #lib/SelfLoader.pm
+ 'Shell' => '0.3', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.72', #lib/Socket.pm
+ 'strict' => '1.01', #lib/strict.pm
+ 'subs' => undef, #lib/subs.pm
+ 'Symbol' => '1.02', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.1', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.01', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.03', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => undef, #lib/Term/Cap.pm
+ 'Term::Complete' => undef, #lib/Term/Complete.pm
+ 'Term::ReadLine' => undef, #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.30', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.15', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => undef, #lib/Text/Abbrev.pm
+ 'Text::ParseWords' => '3.2', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.0', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.0131', #lib/Text/Wrap.pm
+ 'Thread' => '1.0', #ext/Thread/Thread.pm
+ 'Thread::Queue' => undef, #ext/Thread/Thread/Queue.pm
+ 'Thread::Semaphore' => undef, #ext/Thread/Thread/Semaphore.pm
+ 'Thread::Signal' => undef, #ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => undef, #ext/Thread/Thread/Specific.pm
+ 'Tie::Array' => '1.01', #lib/Tie/Array.pm
+ 'Tie::Handle' => '4.0', #lib/Tie/Handle.pm
+ 'Tie::Hash' => undef, #lib/Tie/Hash.pm
+ 'Tie::RefHash' => '1.3', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => undef, #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => undef, #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.01', #lib/Time/gmtime.pm
+ 'Time::Local' => undef, #lib/Time/Local.pm
+ 'Time::localtime' => '1.01', #lib/Time/localtime.pm
+ 'Time::tm' => undef, #lib/Time/tm.pm
+ 'Unicode' => '3.0.1', # lib/unicore/version
+ 'UNIVERSAL' => undef, #lib/UNIVERSAL.pm
+ 'User::grent' => undef, #lib/User/grent.pm
+ 'User::pwent' => undef, #lib/User/pwent.pm
+ 'utf8' => undef, #lib/utf8.pm
+ 'vars' => undef, #lib/vars.pm
+ 'VMS::DCLsym' => '1.01', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => undef, #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.2', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => undef, #vms/ext/vmsish.pm
+ 'warnings' => undef, #lib/warnings.pm
+ 'warnings::register' => undef, #lib/warnings/register.pm
+ 'XSLoader' => '0.01', #lib/XSLoader.pm
+ },
+
+ 5.007003 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.76',
+ 'attributes' => '0.04_01',
+ 'attrs' => '1.01',
+ 'AutoLoader' => '5.59',
+ 'AutoSplit' => '1.0307',
+ 'autouse' => '1.03',
+ 'B::Asmdata' => '1.00',
+ 'B::Assembler' => '0.04',
+ 'B::Bblock' => '1.00',
+ 'B::Bytecode' => '1.00',
+ 'B::C' => '1.01',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.52',
+ 'B::Debug' => '1.00',
+ 'B::Deparse' => '0.63',
+ 'B::Disassembler' => '1.01',
+ 'B::Lint' => '1.00',
+ 'B' => '1.00',
+ 'B::Showlex' => '1.00',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.00',
+ 'B::Xref' => '1.00',
+ 'base' => '1.02',
+ 'Benchmark' => '1.04',
+ 'blib' => '1.01',
+ 'ByteLoader' => '0.04',
+ 'bytes' => '1.00',
+ 'Carp' => '1.01',
+ 'Carp::Heavy' => undef,
+ 'CGI' => '2.80',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.22',
+ 'CGI::Cookie' => '1.20',
+ 'CGI::Fast' => '1.04',
+ 'CGI::Pretty' => '1.05_00',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.3',
+ 'charnames' => '1.01',
+ 'Class::ISA' => '0.32',
+ 'Class::Struct' => '0.61',
+ 'Config' => undef,
+ 'constant' => '1.04',
+ 'CPAN::FirstTime' => '1.54 ',
+ 'CPAN' => '1.59_56',
+ 'CPAN::Nox' => '1.00_01',
+ 'Cwd' => '2.06',
+ 'Data::Dumper' => '2.12',
+ 'DB' => '1.0',
+ 'DB_File' => '1.804',
+ 'Devel::DProf' => '20000000.00_01',
+ 'Devel::Peek' => '1.00_03',
+ 'Devel::PPPort' => '2.0002',
+ 'Devel::SelfStubber' => '1.03',
+ 'diagnostics' => '1.1',
+ 'Digest' => '1.00',
+ 'Digest::MD5' => '2.16',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.10',
+ 'DynaLoader' => 1.04,
+ 'Encode' => '0.40',
+ 'Encode::CN' => '0.02',
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Encoding' => '0.02',
+ 'Encode::Internal' => '0.30',
+ 'Encode::iso10646_1' => '0.30',
+ 'Encode::JP' => '0.02',
+ 'Encode::JP::Constants' => '1.02',
+ 'Encode::JP::H2Z' => '0.77',
+ 'Encode::JP::ISO_2022_JP' => undef,
+ 'Encode::JP::JIS' => undef,
+ 'Encode::JP::Tr' => '0.77',
+ 'Encode::KR' => '0.02',
+ 'Encode::Tcl' => '1.01',
+ 'Encode::Tcl::Escape' => '1.01',
+ 'Encode::Tcl::Extended' => '1.01',
+ 'Encode::Tcl::HanZi' => '1.01',
+ 'Encode::Tcl::Table' => '1.01',
+ 'Encode::TW' => '0.02',
+ 'Encode::Unicode' => '0.30',
+ 'Encode::usc2_le' => '0.30',
+ 'Encode::utf8' => '0.30',
+ 'Encode::XS' => '0.40',
+ 'encoding' => '1.00',
+ 'English' => '1.00',
+ 'Env' => '1.00',
+ 'Exporter' => '5.566',
+ 'Exporter::Heavy' => '5.562',
+ 'ExtUtils::Command' => '1.02',
+ 'ExtUtils::Constant' => '0.11',
+ 'ExtUtils::Embed' => '1.250601',
+ 'ExtUtils::Install' => '1.29',
+ 'ExtUtils::Installed' => '0.04',
+ 'ExtUtils::Liblist' => '1.2701',
+ 'ExtUtils::MakeMaker' => '5.48_03',
+ 'ExtUtils::Manifest' => '1.35',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.1401',
+ 'ExtUtils::Mksymlists' => '1.18',
+ 'ExtUtils::MM_BeOS' => '1.00',
+ 'ExtUtils::MM_Cygwin' => '1.00',
+ 'ExtUtils::MM_OS2' => '1.00',
+ 'ExtUtils::MM_Unix' => '1.12607',
+ 'ExtUtils::MM_VMS' => '5.56',
+ 'ExtUtils::MM_Win32' => '1.00_02',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.1201',
+ 'ExtUtils::XSSymSet' => '1.0',
+ 'Fatal' => '1.03',
+ 'Fcntl' => '1.04',
+ 'fields' => '1.02',
+ 'File::Basename' => '2.71',
+ 'File::CheckTree' => '4.1',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.05',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.04',
+ 'File::Glob' => '1.01',
+ 'File::Path' => '1.05',
+ 'File::Spec' => '0.83',
+ 'File::Spec::Cygwin' => '1.0',
+ 'File::Spec::Epoc' => '1.00',
+ 'File::Spec::Functions' => '1.2',
+ 'File::Spec::Mac' => '1.3',
+ 'File::Spec::OS2' => '1.1',
+ 'File::Spec::Unix' => '1.4',
+ 'File::Spec::VMS' => '1.2',
+ 'File::Spec::Win32' => '1.3',
+ 'File::stat' => '1.00',
+ 'File::Temp' => '0.13',
+ 'FileCache' => '1.00',
+ 'FileHandle' => '2.01',
+ 'filetest' => '1.00',
+ 'Filter::Simple' => '0.77',
+ 'Filter::Util::Call' => '1.06',
+ 'FindBin' => '1.43',
+ 'GDBM_File' => '1.06',
+ 'Getopt::Long' => '2.28',
+ 'Getopt::Std' => '1.03',
+ 'I18N::Collate' => '1.00',
+ 'I18N::Langinfo' => '0.01',
+ 'I18N::LangTags' => '0.27',
+ 'I18N::LangTags::List' => '0.25',
+ 'if' => '0.01',
+ 'integer' => '1.00',
+ 'IO' => '1.20',
+ 'IO::Dir' => '1.03_00',
+ 'IO::File' => '1.09',
+ 'IO::Handle' => '1.21_00',
+ 'IO::Pipe' => '1.122',
+ 'IO::Poll' => '0.06',
+ 'IO::Seekable' => '1.08_00',
+ 'IO::Select' => '1.15',
+ 'IO::Socket' => '1.27',
+ 'IO::Socket::INET' => '1.26',
+ 'IO::Socket::UNIX' => '1.20_00',
+ 'IPC::Msg' => '1.00_00',
+ 'IPC::Open2' => '1.01',
+ 'IPC::Open3' => '1.0104',
+ 'IPC::Semaphore' => '1.00_00',
+ 'IPC::SysV' => '1.03_00',
+ 'JNI' => '0.1',
+ 'JPL::AutoLoader' => undef,
+ 'JPL::Class' => undef,
+ 'JPL::Compile' => undef,
+ 'less' => '0.01',
+ 'lib' => '0.5564',
+ 'List::Util' => '1.06_00',
+ 'locale' => '1.00',
+ 'Locale::Constants' => '2.01',
+ 'Locale::Country' => '2.01',
+ 'Locale::Currency' => '2.01',
+ 'Locale::Language' => '2.01',
+ 'Locale::Maketext' => '1.03',
+ 'Locale::Script' => '2.01',
+ 'Math::BigFloat' => '1.30',
+ 'Math::BigInt' => '1.54',
+ 'Math::BigInt::Calc' => '0.25',
+ 'Math::Complex' => '1.34',
+ 'Math::Trig' => '1.01',
+ 'Memoize' => '0.66',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '0.66',
+ 'Memoize::ExpireFile' => '0.65',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'MIME::Base64' => '2.12',
+ 'MIME::QuotedPrint' => '2.03',
+ 'NDBM_File' => '1.04',
+ 'Net::Cmd' => '2.21',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.17',
+ 'Net::FTP' => '2.64',
+ 'Net::FTP::A' => '1.15',
+ 'Net::FTP::dataconn' => '0.10',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::hostent' => '1.00',
+ 'Net::netent' => '1.00',
+ 'Net::Netrc' => '2.12',
+ 'Net::NNTP' => '2.21',
+ 'Net::Ping' => '2.12',
+ 'Net::POP3' => '2.23',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.00',
+ 'Net::SMTP' => '2.21',
+ 'Net::Time' => '2.09',
+ 'NEXT' => '0.50',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.03',
+ 'Opcode' => '1.05',
+ 'open' => '1.01',
+ 'ops' => '1.00',
+ 'OS2::DLL' => '1.00',
+ 'OS2::ExtAttr' => '0.01',
+ 'OS2::PrfDB' => '0.02',
+ 'OS2::Process' => '1.0',
+ 'OS2::REXX' => '1.01',
+ 'overload' => '1.00',
+ 'PerlIO' => '1.00',
+ 'PerlIO::Scalar' => '0.01',
+ 'PerlIO::Via' => '0.01',
+ 'Pod::Checker' => '1.3',
+ 'Pod::Find' => '0.22',
+ 'Pod::Functions' => '1.01',
+ 'Pod::Html' => '1.04',
+ 'Pod::LaTeX' => '0.54',
+ 'Pod::Man' => '1.32',
+ 'Pod::InputObjects' => '1.13',
+ 'Pod::ParseLink' => '1.05',
+ 'Pod::Parser' => '1.13',
+ 'Pod::ParseUtils' => '0.22',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.13',
+ 'Pod::Text' => '2.18',
+ 'Pod::Text::Color' => '1.03',
+ 'Pod::Text::Overstrike' => '1.08',
+ 'Pod::Text::Termcap' => '1.09',
+ 'Pod::Usage' => '1.14',
+ 'POSIX' => '1.05',
+ 're' => '0.03',
+ 'Safe' => '2.07',
+ 'Scalar::Util' => undef,
+ 'SDBM_File' => '1.03',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.00',
+ 'SelfLoader' => '1.0903',
+ 'Shell' => '0.4',
+ 'sigtrap' => '1.02',
+ 'Socket' => '1.75',
+ 'sort' => '1.00',
+ 'Storable' => '1.015',
+ 'strict' => '1.02',
+ 'subs' => '1.00',
+ 'Switch' => '2.06',
+ 'Symbol' => '1.04',
+ 'Sys::Hostname' => '1.1',
+ 'Sys::Syslog' => '0.02',
+ 'Term::ANSIColor' => '1.04',
+ 'Term::Cap' => '1.07',
+ 'Term::Complete' => '1.4',
+ 'Term::ReadLine' => '1.00',
+ 'Test' => '1.18',
+ 'Test::Builder' => '0.11',
+ 'Test::Harness' => '2.01',
+ 'Test::Harness::Assert' => '0.01',
+ 'Test::Harness::Iterator'=> '0.01',
+ 'Test::Harness::Straps' => '0.08',
+ 'Test::More' => '0.41',
+ 'Test::Simple' => '0.41',
+ 'Text::Abbrev' => '1.00',
+ 'Text::Balanced' => '1.89',
+ 'Text::ParseWords' => '3.21',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '98.112801',
+ 'Text::Wrap' => '2001.0929',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '1.00',
+ 'Thread::Semaphore' => '1.00',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'threads' => '0.05',
+ 'threads::shared' => '0.90',
+ 'Tie::Array' => '1.02',
+ 'Tie::File' => '0.17',
+ 'Tie::Hash' => '1.00',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.3_00',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::gmtime' => '1.02',
+ 'Time::HiRes' => '1.20_00',
+ 'Time::Local' => '1.04',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'Unicode::Collate' => '0.10',
+ 'Unicode::Normalize' => '0.14',
+ 'Unicode::UCD' => '0.2',
+ 'UNIVERSAL' => '1.00',
+ 'User::grent' => '1.00',
+ 'User::pwent' => '1.00',
+ 'utf8' => '1.00',
+ 'vars' => '1.01',
+ 'VMS::DCLsym' => '1.02',
+ 'VMS::Filespec' => '1.1',
+ 'VMS::Stdio' => '2.3',
+ 'vmsish' => '1.00',
+ 'warnings' => '1.00',
+ 'warnings::register' => '1.00',
+ 'XS::Typemap' => '0.01',
+ 'XSLoader' => '0.01',
+ },
+
+ 5.008 => {
+ 'AnyDBM_File' => '1.00', #./lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.77', #./lib/Attribute/Handlers.pm
+ 'attributes' => '0.05', #./lib/attributes.pm
+ 'attrs' => '1.01', #./ext/attrs/attrs.pm
+ 'AutoLoader' => '5.59', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.0307', #./lib/AutoSplit.pm
+ 'autouse' => '1.03', #./lib/autouse.pm
+ 'B' => '1.01', #./ext/B/B.pm
+ 'B::Asmdata' => '1.00', #./ext/B/B/Asmdata.pm
+ 'B::Assembler' => '0.04', #./ext/B/B/Assembler.pm
+ 'B::Bblock' => '1.00', #./ext/B/B/Bblock.pm
+ 'B::Bytecode' => '1.00', #./ext/B/B/Bytecode.pm
+ 'B::C' => '1.01', #./ext/B/B/C.pm
+ 'B::CC' => '1.00', #./ext/B/B/CC.pm
+ 'B::Concise' => '0.52', #./ext/B/B/Concise.pm
+ 'B::Debug' => '1.00', #./ext/B/B/Debug.pm
+ 'B::Deparse' => '0.63', #./ext/B/B/Deparse.pm
+ 'B::Disassembler' => '1.01', #./ext/B/B/Disassembler.pm
+ 'B::Lint' => '1.01', #./ext/B/B/Lint.pm
+ 'B::Showlex' => '1.00', #./ext/B/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #./ext/B/B/Stackobj.pm
+ 'B::Stash' => '1.00', #./ext/B/B/Stash.pm
+ 'B::Terse' => '1.00', #./ext/B/B/Terse.pm
+ 'B::Xref' => '1.01', #./ext/B/B/Xref.pm
+ 'base' => '1.03', #./lib/base.pm
+ 'Benchmark' => '1.04', #./lib/Benchmark.pm
+ 'bigint' => '0.02', #./lib/bigint.pm
+ 'bignum' => '0.11', #./lib/bignum.pm
+ 'bigrat' => '0.04', #./lib/bigrat.pm
+ 'blib' => '1.02', #./lib/blib.pm
+ 'ByteLoader' => '0.04', #./ext/ByteLoader/ByteLoader.pm
+ 'bytes' => '1.00', #./lib/bytes.pm
+ 'Carp' => '1.01', #./lib/Carp.pm
+ 'Carp::Heavy' => 'undef', #./lib/Carp/Heavy.pm
+ 'CGI' => '2.81', #./lib/CGI.pm
+ 'CGI::Apache' => '1.00', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.23', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.20', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.04', #./lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.05_00', #./lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #./lib/CGI/Switch.pm
+ 'CGI::Util' => '1.3', #./lib/CGI/Util.pm
+ 'charnames' => '1.01', #./lib/charnames.pm
+ 'Class::ISA' => '0.32', #./lib/Class/ISA.pm
+ 'Class::Struct' => '0.61', #./lib/Class/Struct.pm
+ 'constant' => '1.04', #./lib/constant.pm
+ 'Config' => undef,
+ 'CPAN' => '1.61', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.56 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.02', #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.06', #./lib/Cwd.pm
+ 'Data::Dumper' => '2.12', #./ext/Data/Dumper/Dumper.pm
+ 'DB' => '1.0', #./lib/DB.pm
+ 'DB_File' => '1.804', #./ext/DB_File/DB_File.pm
+ 'Devel::DProf' => '20000000.00_01', #./ext/Devel/DProf/DProf.pm
+ 'Devel::Peek' => '1.00_03', #./ext/Devel/Peek/Peek.pm
+ 'Devel::PPPort' => '2.0002', #./ext/Devel/PPPort/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.1', #./lib/diagnostics.pm
+ 'Digest' => '1.00', #./lib/Digest.pm
+ 'Digest::MD5' => '2.20', #./ext/Digest/MD5/MD5.pm
+ 'DirHandle' => '1.00', #./lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #./lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04',
+ 'Encode' => '1.75', #./ext/Encode/Encode.pm
+ 'Encode::Alias' => '1.32', #./ext/Encode/lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.22', #./ext/Encode/Byte/Byte.pm
+ 'Encode::CJKConstants' => '1.00', #./ext/Encode/lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #./ext/Encode/CN/CN.pm
+ 'Encode::CN::HZ' => '1.04', #./ext/Encode/lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.06', #./ext/Encode/lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #./ext/Encode/EBCDIC/EBCDIC.pm
+ 'Encode::Encoder' => '0.05', #./ext/Encode/lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.30', #./ext/Encode/lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.06', #./ext/Encode/lib/Encode/Guess.pm
+ 'Encode::JP::H2Z' => '1.02', #./ext/Encode/lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.08', #./ext/Encode/lib/Encode/JP/JIS7.pm
+ 'Encode::JP' => '1.25', #./ext/Encode/JP/JP.pm
+ 'Encode::KR' => '1.22', #./ext/Encode/KR/KR.pm
+ 'Encode::KR::2022_KR' => '1.05', #./ext/Encode/lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.05', #./ext/Encode/lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #./ext/Encode/Symbol/Symbol.pm
+ 'Encode::TW' => '1.26', #./ext/Encode/TW/TW.pm
+ 'Encode::Unicode' => '1.37', #./ext/Encode/Unicode/Unicode.pm
+ 'encoding' => '1.35', #./ext/Encode/encoding.pm
+ 'English' => '1.00', #./lib/English.pm
+ 'Env' => '1.00', #./lib/Env.pm
+ 'Exporter' => '5.566', #./lib/Exporter.pm
+ 'Exporter::Heavy' => '5.566', #./lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.04', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.01', #./lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.12', #./lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.29', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.06', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.00', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.29', #./lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.03', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.38', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #./lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.04', #./lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.03', #./lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.04', #./lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.01', #./lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.03', #./lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.05', #./lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.03', #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.33', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.01', #./lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.65', #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.05', #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.02', #./lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #./lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #./lib/Fatal.pm
+ 'Fcntl' => '1.04', #./ext/Fcntl/Fcntl.pm
+ 'fields' => '1.02', #./lib/fields.pm
+ 'File::Basename' => '2.71', #./lib/File/Basename.pm
+ 'File::CheckTree' => '4.2', #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #./lib/File/Compare.pm
+ 'File::Copy' => '2.05', #./lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #./lib/File/DosGlob.pm
+ 'File::Find' => '1.04', #./lib/File/Find.pm
+ 'File::Glob' => '1.01', #./ext/File/Glob/Glob.pm
+ 'File::Path' => '1.05', #./lib/File/Path.pm
+ 'File::Spec' => '0.83', #./lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.0', #./lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.00', #./lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.2', #./lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.3', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.1', #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.4', #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.2', #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.3', #./lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #./lib/File/stat.pm
+ 'File::Temp' => '0.13', #./lib/File/Temp.pm
+ 'FileCache' => '1.021', #./lib/FileCache.pm
+ 'FileHandle' => '2.01', #./lib/FileHandle.pm
+ 'filetest' => '1.00', #./lib/filetest.pm
+ 'Filter::Simple' => '0.78', #./lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.06', #./ext/Filter/Util/Call/Call.pm
+ 'FindBin' => '1.43', #./lib/FindBin.pm
+ 'GDBM_File' => '1.06', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.32', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.03', #./lib/Getopt/Std.pm
+ 'Hash::Util' => '0.04', #./lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #./lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.01', #./ext/I18N/Langinfo/Langinfo.pm
+ 'I18N::LangTags' => '0.27', #./lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.25', #./lib/I18N/LangTags/List.pm
+ 'if' => '0.01', #./lib/if.pm
+ 'integer' => '1.00', #./lib/integer.pm
+ 'IO' => '1.20', #./ext/IO/IO.pm
+ 'IO::Dir' => '1.03_00', #./ext/IO/lib/IO/Dir.pm
+ 'IO::File' => '1.09', #./ext/IO/lib/IO/File.pm
+ 'IO::Handle' => '1.21_00', #./ext/IO/lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #./ext/IO/lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #./ext/IO/lib/IO/Poll.pm
+ 'IO::Seekable' => '1.08_00', #./ext/IO/lib/IO/Seekable.pm
+ 'IO::Select' => '1.15', #./ext/IO/lib/IO/Select.pm
+ 'IO::Socket' => '1.27', #./ext/IO/lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.26', #./ext/IO/lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.20_00', #./ext/IO/lib/IO/Socket/UNIX.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0104', #./lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.00_00', #./ext/IPC/SysV/Msg.pm
+ 'IPC::Semaphore' => '1.00_00', #./ext/IPC/SysV/Semaphore.pm
+ 'IPC::SysV' => '1.03_00', #./ext/IPC/SysV/SysV.pm
+ 'JNI' => '0.1', #./jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #./jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #./jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #./jpl/JPL/Compile.pm
+ 'less' => '0.01', #./lib/less.pm
+ 'lib' => '0.5564',
+ 'List::Util' => '1.07_00', #./ext/List/Util/lib/List/Util.pm
+ 'locale' => '1.00', #./lib/locale.pm
+ 'Locale::Constants' => '2.01', #./lib/Locale/Constants.pm
+ 'Locale::Country' => '2.04', #./lib/Locale/Country.pm
+ 'Locale::Currency' => '2.01', #./lib/Locale/Currency.pm
+ 'Locale::Language' => '2.01', #./lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.03', #./lib/Locale/Maketext.pm
+ 'Locale::Script' => '2.01', #./lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.35', #./lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #./lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.60', #./lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.30', #./lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Trace' => '0.01', #./lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.07', #./lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1.01', #./lib/Math/Trig.pm
+ 'Memoize' => '1.01', #./lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #./lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #./lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #./lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #./lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #./lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #./lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #./lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.12', #./ext/MIME/Base64/Base64.pm
+ 'MIME::QuotedPrint' => '2.03', #./ext/MIME/Base64/QuotedPrint.pm
+ 'NDBM_File' => '1.04', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Cmd' => '2.21', #./lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #./lib/Net/Config.pm
+ 'Net::Domain' => '2.17', #./lib/Net/Domain.pm
+ 'Net::FTP' => '2.65', #./lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.15', #./lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #./lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #./lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #./lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #./lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.00', #./lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #./lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #./lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.21', #./lib/Net/NNTP.pm
+ 'Net::Ping' => '2.19', #./lib/Net/Ping.pm
+ 'Net::POP3' => '2.23', #./lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #./lib/Net/protoent.pm
+ 'Net::servent' => '1.00', #./lib/Net/servent.pm
+ 'Net::SMTP' => '2.24', #./lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #./lib/Net/Time.pm
+ 'NEXT' => '0.50', #./lib/NEXT.pm
+ 'O' => '1.00', #./ext/B/O.pm
+ 'ODBM_File' => '1.03', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #./ext/Opcode/Opcode.pm
+ 'open' => '1.01', #./lib/open.pm
+ 'ops' => '1.00', #./ext/Opcode/ops.pm
+ 'OS2::DLL' => '1.00', #./os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.0', #./os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.01', #./os2/OS2/REXX/REXX.pm
+ 'overload' => '1.00', #./lib/overload.pm
+ 'PerlIO' => '1.01', #./lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.06', #./ext/PerlIO/encoding/encoding.pm
+ 'PerlIO::scalar' => '0.01', #./ext/PerlIO/scalar/scalar.pm
+ 'PerlIO::via' => '0.01', #./ext/PerlIO/via/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.04', #./lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.3', #./lib/Pod/Checker.pm
+ 'Pod::Find' => '0.22', #./lib/Pod/Find.pm
+ 'Pod::Functions' => '1.01', #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.04', #./lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.13', #./lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.54', #./lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.33', #./lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.05', #./lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.13', #./lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.22', #./lib/Pod/ParseUtils.pm
+ 'Pod::Plainer' => '0.01', #./lib/Pod/Plainer.pm
+ 'Pod::Select' => '1.13', #./lib/Pod/Select.pm
+ 'Pod::Text' => '2.19', #./lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.03', #./lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.08', #./lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.09', #./lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.14', #./lib/Pod/Usage.pm
+ 'POSIX' => '1.05', #./ext/POSIX/POSIX.pm
+ 're' => '0.03', #./ext/re/re.pm
+ 'Safe' => '2.07', #./ext/Opcode/Safe.pm
+ 'Scalar::Util' => 'undef', #./ext/List/Util/lib/Scalar/Util.pm
+ 'SDBM_File' => '1.03', #./ext/SDBM_File/SDBM_File.pm
+ 'Search::Dict' => '1.02', #./lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.0903', #./lib/SelfLoader.pm
+ 'Shell' => '0.4', #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.75', #./ext/Socket/Socket.pm
+ 'sort' => '1.01', #./lib/sort.pm
+ 'Storable' => '2.04', #./ext/Storable/Storable.pm
+ 'strict' => '1.02', #./lib/strict.pm
+ 'subs' => '1.00', #./lib/subs.pm
+ 'Switch' => '2.09', #./lib/Switch.pm
+ 'Symbol' => '1.04', #./lib/Symbol.pm
+ 'Sys::Hostname' => '1.1', #./ext/Sys/Hostname/Hostname.pm
+ 'Sys::Syslog' => '0.03', #./ext/Sys/Syslog/Syslog.pm
+ 'Term::ANSIColor' => '1.04', #./lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.07', #./lib/Term/Cap.pm
+ 'Term::Complete' => '1.4', #./lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.00', #./lib/Term/ReadLine.pm
+ 'Test' => '1.20', #./lib/Test.pm
+ 'Test::Builder' => '0.15', #./lib/Test/Builder.pm
+ 'Test::Harness' => '2.26', #./lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #./lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #./lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.14', #./lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.45', #./lib/Test/More.pm
+ 'Test::Simple' => '0.45', #./lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.00', #./lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.89', #./lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.0929', #./lib/Text/Wrap.pm
+ 'Thread' => '2.00', #./lib/Thread.pm
+ 'Thread::Queue' => '2.00', #./lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.00', #./lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads' => '0.99', #./ext/threads/threads.pm
+ 'threads::shared' => '0.90', #./ext/threads/shared/shared.pm
+ 'Tie::Array' => '1.02', #./lib/Tie/Array.pm
+ 'Tie::File' => '0.93', #./lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #./lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.00', #./lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #./lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.30', #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #./lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.20_00', #./ext/Time/HiRes/HiRes.pm
+ 'Time::Local' => '1.04', #./lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #./lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #./lib/Time/tm.pm
+ 'Unicode' => '3.2.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.12', #./lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.17', #./ext/Unicode/Normalize/Normalize.pm
+ 'Unicode::UCD' => '0.2', #./lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.00', #./lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #./lib/User/grent.pm
+ 'User::pwent' => '1.00', #./lib/User/pwent.pm
+ 'utf8' => '1.00', #./lib/utf8.pm
+ 'vars' => '1.01', #./lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.1', #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.00', #./lib/vmsish.pm
+ 'warnings' => '1.00', #./lib/warnings.pm
+ 'warnings::register' => '1.00', #./lib/warnings/register.pm
+ 'XS::APItest' => '0.01', #./ext/XS/APItest/APItest.pm
+ 'XS::Typemap' => '0.01', #./ext/XS/Typemap/Typemap.pm
+ 'XSLoader' => '0.01',
+ },
+
+ 5.008001 => {
+ 'AnyDBM_File' => '1.00', #./lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.78', #./lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #./lib/attributes.pm
+ 'attrs' => '1.01', #./lib/attrs.pm
+ 'AutoLoader' => '5.60', #./lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #./lib/AutoSplit.pm
+ 'autouse' => '1.03', #./lib/autouse.pm
+ 'B' => '1.02', #./lib/B.pm
+ 'B::Asmdata' => '1.01', #./lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #./lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #./lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #./lib/B/Bytecode.pm
+ 'B::C' => '1.02', #./lib/B/C.pm
+ 'B::CC' => '1.00', #./lib/B/CC.pm
+ 'B::Concise' => '0.56', #./lib/B/Concise.pm
+ 'B::Debug' => '1.01', #./lib/B/Debug.pm
+ 'B::Deparse' => '0.64', #./lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #./lib/B/Disassembler.pm
+ 'B::Lint' => '1.02', #./lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #./lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #./lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #./lib/B/Stash.pm
+ 'B::Terse' => '1.02', #./lib/B/Terse.pm
+ 'B::Xref' => '1.01', #./lib/B/Xref.pm
+ 'base' => '2.03', #./lib/base.pm
+ 'Benchmark' => '1.051', #./lib/Benchmark.pm
+ 'bigint' => '0.04', #./lib/bigint.pm
+ 'bignum' => '0.14', #./lib/bignum.pm
+ 'bigrat' => '0.06', #./lib/bigrat.pm
+ 'blib' => '1.02', #./lib/blib.pm
+ 'ByteLoader' => '0.05', #./lib/ByteLoader.pm
+ 'bytes' => '1.01', #./lib/bytes.pm
+ 'Carp' => '1.01', #./lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #./lib/Carp/Heavy.pm
+ 'CGI' => '3.00', #./lib/CGI.pm
+ 'CGI::Apache' => '1.00', #./lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.26', #./lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #./lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.041', #./lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.07_00', #./lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #./lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #./lib/CGI/Switch.pm
+ 'CGI::Util' => '1.31', #./lib/CGI/Util.pm
+ 'charnames' => '1.02', #./lib/charnames.pm
+ 'Class::ISA' => '0.32', #./lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #./lib/Class/Struct.pm
+ 'Config' => undef, #./lib/Config.pm
+ 'constant' => '1.04', #./lib/constant.pm
+ 'CPAN' => '1.76_01', #./lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #./lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #./lib/CPAN/Nox.pm
+ 'Cwd' => '2.08', #./lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #./lib/Data/Dumper.pm
+ 'DB' => '1.0', #./lib/DB.pm
+ 'DB_File' => '1.806', #./lib/DB_File.pm
+ 'Devel::DProf' => '20030813.00', #./lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #./lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.007', #./lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #./lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.11', #./lib/diagnostics.pm
+ 'Digest' => '1.02', #./lib/Digest.pm
+ 'Digest::MD5' => '2.27', #./lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #./lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #./lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #./lib/DynaLoader.pm
+ 'Encode' => '1.9801', #./lib/Encode.pm
+ 'Encode::Alias' => '1.38', #./lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #./lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #./lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #./lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.05', #./lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #./lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #./lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #./lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #./lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #./lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #./lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #./lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #./lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #./lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #./lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #./lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #./lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #./lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #./lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #./lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.47', #./lib/encoding.pm
+ 'English' => '1.01', #./lib/English.pm
+ 'Env' => '1.00', #./lib/Env.pm
+ 'Errno' => '1.09_00', #./lib/Errno.pm
+ 'Exporter' => '5.567', #./lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #./lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #./lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #./lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #./lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #./lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #./lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #./lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #./lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #./lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #./lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #./lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #./lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #./lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #./lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #./lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #./lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #./lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #./lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #./lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #./lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #./lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #./lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #./lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #./lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #./lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #./lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #./lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #./lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #./lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #./lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #./lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #./lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #./vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #./lib/Fatal.pm
+ 'Fcntl' => '1.05', #./lib/Fcntl.pm
+ 'fields' => '2.03', #./lib/fields.pm
+ 'File::Basename' => '2.72', #./lib/File/Basename.pm
+ 'File::CheckTree' => '4.2', #./lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #./lib/File/Compare.pm
+ 'File::Copy' => '2.06', #./lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #./lib/File/DosGlob.pm
+ 'File::Find' => '1.05', #./lib/File/Find.pm
+ 'File::Glob' => '1.02', #./lib/File/Glob.pm
+ 'File::Path' => '1.06', #./lib/File/Path.pm
+ 'File::Spec' => '0.86', #./lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #./lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #./lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #./lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #./lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #./lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #./lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #./lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #./lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #./lib/File/stat.pm
+ 'File::Temp' => '0.14', #./lib/File/Temp.pm
+ 'FileCache' => '1.03', #./lib/FileCache.pm
+ 'FileHandle' => '2.01', #./lib/FileHandle.pm
+ 'filetest' => '1.01', #./lib/filetest.pm
+ 'Filter::Simple' => '0.78', #./lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #./lib/Filter/Util/Call.pm
+ 'FindBin' => '1.43', #./lib/FindBin.pm
+ 'GDBM_File' => '1.07', #./ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #./lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.04', #./lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #./lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #./lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #./lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.28', #./lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.26', #./lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #./lib/if.pm
+ 'integer' => '1.00', #./lib/integer.pm
+ 'IO' => '1.21', #./lib/IO.pm
+ 'IO::Dir' => '1.04', #./lib/IO/Dir.pm
+ 'IO::File' => '1.10', #./lib/IO/File.pm
+ 'IO::Handle' => '1.23', #./lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #./lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #./lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #./lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #./lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #./lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #./lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #./lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #./lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #./lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #./lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #./lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #./lib/IPC/SysV.pm
+ 'JNI' => '0.2', #./jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #./jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #./jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #./jpl/JPL/Compile.pm
+ 'less' => '0.01', #./lib/less.pm
+ 'lib' => '0.5565', #./lib/lib.pm
+ 'List::Util' => '1.13', #./lib/List/Util.pm
+ 'locale' => '1.00', #./lib/locale.pm
+ 'Locale::Constants' => '2.01', #./lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #./lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #./lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #./lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.06', #./lib/Locale/Maketext.pm
+ 'Locale::Maketext::Guts'=> undef, #./lib/Locale/Maketext/Guts.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #./lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Script' => '2.21', #./lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.40', #./lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #./lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.66', #./lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.36', #./lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Scalar' => '0.11', #./lib/Math/BigInt/Scalar.pm
+ 'Math::BigInt::Trace' => '0.01', #./lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.10', #./lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #./lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #./lib/Math/Trig.pm
+ 'Memoize' => '1.01', #./lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #./lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #./lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #./lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #./lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #./lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #./lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #./lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.20', #./lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '2.20', #./lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #./ext/NDBM_File/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #./lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #./lib/Net/Config.pm
+ 'Net::Domain' => '2.18', #./lib/Net/Domain.pm
+ 'Net::FTP' => '2.71', #./lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #./lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #./lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #./lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #./lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #./lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #./lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #./lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #./lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #./lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #./lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #./lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #./lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #./lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #./lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #./lib/Net/Time.pm
+ 'NEXT' => '0.60', #./lib/NEXT.pm
+ 'O' => '1.00', #./lib/O.pm
+ 'ODBM_File' => '1.04', #./ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #./lib/Opcode.pm
+ 'open' => '1.02', #./lib/open.pm
+ 'ops' => '1.00', #./lib/ops.pm
+ 'OS2::ExtAttr' => '0.02', #./os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #./os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #./os2/OS2/Process/Process.pm
+ 'OS2::DLL' => '1.01', #./os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::REXX' => '1.02', #./os2/OS2/REXX/REXX.pm
+ 'overload' => '1.01', #./lib/overload.pm
+ 'PerlIO' => '1.02', #./lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #./lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #./lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #./lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.05', #./lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #./lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #./lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #./lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0501', #./lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #./lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #./lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #./lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #./lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.13', #./lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #./lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.10', #./lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #./lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #./lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #./lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #./lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #./lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #./lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #./lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #./lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #./lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #./lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #./lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.01', #./lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #./lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #./lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #./lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #./lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #./lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #./lib/Pod/Usage.pm
+ 'POSIX' => '1.06', #./lib/POSIX.pm
+ 're' => '0.04', #./lib/re.pm
+ 'Safe' => '2.10', #./lib/Safe.pm
+ 'Scalar::Util' => '1.13', #./lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #./lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #./lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #./lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #./lib/SelfLoader.pm
+ 'Shell' => '0.5', #./lib/Shell.pm
+ 'sigtrap' => '1.02', #./lib/sigtrap.pm
+ 'Socket' => '1.76', #./lib/Socket.pm
+ 'sort' => '1.02', #./lib/sort.pm
+ 'Storable' => '2.08', #./lib/Storable.pm
+ 'strict' => '1.03', #./lib/strict.pm
+ 'subs' => '1.00', #./lib/subs.pm
+ 'Switch' => '2.10', #./lib/Switch.pm
+ 'Symbol' => '1.05', #./lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #./lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.04', #./lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.07', #./lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #./lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #./lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #./lib/Term/ReadLine.pm
+ 'Test' => '1.24', #./lib/Test.pm
+ 'Test::Builder' => '0.17', #./lib/Test/Builder.pm
+ 'Test::Harness' => '2.30', #./lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #./lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #./lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.15', #./lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #./lib/Test/More.pm
+ 'Test::Simple' => '0.47', #./lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #./lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #./lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #./lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #./lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #./lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #./lib/Text/Wrap.pm
+ 'Thread' => '2.00', #./lib/Thread.pm
+ 'Thread::Queue' => '2.00', #./lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #./lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads' => '1.00', #./lib/threads.pm
+ 'threads::shared' => '0.91', #./lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #./lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #./lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #./lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.00', #./lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #./lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #./lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #./lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #./lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #./lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.51', #./lib/Time/HiRes.pm
+ 'Time::Local' => '1.07', #./lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #./lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #./lib/Time/tm.pm
+ 'Unicode' => '4.0.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.28', #./lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.23', #./lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #./lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #./lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #./lib/User/grent.pm
+ 'User::pwent' => '1.00', #./lib/User/pwent.pm
+ 'utf8' => '1.02', #./lib/utf8.pm
+ 'vars' => '1.01', #./lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #./vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #./vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #./vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #./lib/vmsish.pm
+ 'warnings' => '1.03', #./lib/warnings.pm
+ 'warnings::register' => '1.00', #./lib/warnings/register.pm
+ 'XS::APItest' => '0.02', #./lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #./lib/XS/Typemap.pm
+ 'XSLoader' => '0.02', #./lib/XSLoader.pm
+ },
+
+ 5.008002 => {
+ 'AnyDBM_File' => '1.00', #AnyDBM_File.pm
+ 'Attribute::Handlers' => 0.78, #Attribute\Handlers.pm
+ 'attributes' => 0.06, #attributes.pm
+ 'attrs' => 1.01, #attrs.pm
+ 'AutoLoader' => '5.60', #AutoLoader.pm
+ 'AutoSplit' => 1.04, #AutoSplit.pm
+ 'autouse' => 1.03, #autouse.pm
+ 'B' => 1.02, #B.pm
+ 'B::Asmdata' => 1.01, #B\Asmdata.pm
+ 'B::Assembler' => 0.06, #B\Assembler.pm
+ 'B::Bblock' => 1.02, #B\Bblock.pm
+ 'B::Bytecode' => 1.01, #B\Bytecode.pm
+ 'B::C' => 1.02, #B\C.pm
+ 'B::CC' => '1.00', #B\CC.pm
+ 'B::Concise' => 0.56, #B\Concise.pm
+ 'B::Debug' => 1.01, #B\Debug.pm
+ 'B::Deparse' => 0.64, #B\Deparse.pm
+ 'B::Disassembler' => 1.03, #B\Disassembler.pm
+ 'B::Lint' => 1.02, #B\Lint.pm
+ 'B::Showlex' => '1.00', #B\Showlex.pm
+ 'B::Stackobj' => '1.00', #B\Stackobj.pm
+ 'B::Stash' => '1.00', #B\Stash.pm
+ 'B::Terse' => 1.02, #B\Terse.pm
+ 'B::Xref' => 1.01, #B\Xref.pm
+ 'base' => 2.03, #base.pm
+ 'Benchmark' => 1.051, #Benchmark.pm
+ 'bigint' => 0.04, #bigint.pm
+ 'bignum' => 0.14, #bignum.pm
+ 'bigrat' => 0.06, #bigrat.pm
+ 'blib' => 1.02, #blib.pm
+ 'ByteLoader' => 0.05, #ByteLoader.pm
+ 'bytes' => 1.01, #bytes.pm
+ 'Carp' => 1.01, #Carp.pm
+ 'Carp::Heavy' => 1.01, #Carp\Heavy.pm
+ 'CGI' => '3.00', #CGI.pm
+ 'CGI::Apache' => '1.00', #CGI\Apache.pm
+ 'CGI::Carp' => 1.26, #CGI\Carp.pm
+ 'CGI::Cookie' => 1.24, #CGI\Cookie.pm
+ 'CGI::Fast' => 1.041, #CGI\Fast.pm
+ 'CGI::Pretty' => '1.07_00', #CGI\Pretty.pm
+ 'CGI::Push' => 1.04, #CGI\Push.pm
+ 'CGI::Switch' => '1.00', #CGI\Switch.pm
+ 'CGI::Util' => 1.31, #CGI\Util.pm
+ 'charnames' => 1.02, #charnames.pm
+ 'Class::ISA' => 0.32, #Class\ISA.pm
+ 'Class::Struct' => 0.63, #Class\Struct.pm
+ 'Config' => undef, #Config.pm
+ 'constant' => 1.04, #constant.pm
+ 'CPAN' => '1.76_01', #CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #CPAN\FirstTime.pm
+ 'CPAN::Nox' => 1.03, #CPAN\Nox.pm
+ 'Cwd' => 2.08, #Cwd.pm
+ 'Data::Dumper' => 2.121, #Data\Dumper.pm
+ 'DB' => '1.0', #DB.pm
+ 'Devel::DProf' => '20030813.00', #Devel\DProf.pm
+ 'Devel::Peek' => 1.01, #Devel\Peek.pm
+ 'Devel::PPPort' => 2.009, #Devel\PPPort.pm
+ 'Devel::SelfStubber' => 1.03, #Devel\SelfStubber.pm
+ 'diagnostics' => 1.11, #diagnostics.pm
+ 'Digest' => 1.02, #Digest.pm
+ 'Digest::MD5' => '2.30', #Digest\MD5.pm
+ 'DirHandle' => '1.00', #DirHandle.pm
+ 'Dumpvalue' => 1.11, #Dumpvalue.pm
+ 'DynaLoader' => 1.04, #DynaLoader.pm
+ 'Encode' => 1.9801, #Encode.pm
+ 'Encode::Alias' => 1.38, #Encode\Alias.pm
+ 'Encode::Byte' => 1.23, #Encode\Byte.pm
+ 'Encode::CJKConstants' => 1.02, #Encode\CJKConstants.pm
+ 'Encode::CN' => 1.24, #Encode\CN.pm
+ 'Encode::CN::HZ' => 1.05, #Encode\CN\HZ.pm
+ 'Encode::Config' => 1.07, #Encode\Config.pm
+ 'Encode::EBCDIC' => 1.21, #Encode\EBCDIC.pm
+ 'Encode::Encoder' => 0.07, #Encode\Encoder.pm
+ 'Encode::Encoding' => 1.33, #Encode\Encoding.pm
+ 'Encode::Guess' => 1.09, #Encode\Guess.pm
+ 'Encode::JP' => 1.25, #Encode\JP.pm
+ 'Encode::JP::H2Z' => 1.02, #Encode\JP\H2Z.pm
+ 'Encode::JP::JIS7' => 1.12, #Encode\JP\JIS7.pm
+ 'Encode::KR' => 1.23, #Encode\KR.pm
+ 'Encode::KR::2022_KR' => 1.06, #Encode\KR\2022_KR.pm
+ 'Encode::MIME::Header' => 1.09, #Encode\MIME\Header.pm
+ 'Encode::Symbol' => 1.22, #Encode\Symbol.pm
+ 'Encode::TW' => 1.26, #Encode\TW.pm
+ 'Encode::Unicode' => '1.40', #Encode\Unicode.pm
+ 'Encode::Unicode::UTF7' => 0.02, #Encode\Unicode\UTF7.pm
+ 'encoding' => 1.47, #encoding.pm
+ 'English' => 1.01, #English.pm
+ 'Env' => '1.00', #Env.pm
+ 'Errno' => '1.09_00', #Errno.pm
+ 'Exporter' => 5.567, #Exporter.pm
+ 'Exporter::Heavy' => 5.567, #Exporter\Heavy.pm
+ 'ExtUtils::Command' => 1.05, #ExtUtils\Command.pm
+ 'ExtUtils::Command::MM' => 0.03, #ExtUtils\Command\MM.pm
+ 'ExtUtils::Constant' => 0.14, #ExtUtils\Constant.pm
+ 'ExtUtils::Embed' => 1.250601, #ExtUtils\Embed.pm
+ 'ExtUtils::Install' => 1.32, #ExtUtils\Install.pm
+ 'ExtUtils::Installed' => 0.08, #ExtUtils\Installed.pm
+ 'ExtUtils::Liblist' => 1.01, #ExtUtils\Liblist.pm
+ 'ExtUtils::Liblist::Kid' => 1.3, #ExtUtils\Liblist\Kid.pm
+ 'ExtUtils::MakeMaker' => 6.17, #ExtUtils\MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes' => 0.01, #ExtUtils\MakeMaker\bytes.pm
+ 'ExtUtils::MakeMaker::vmsish' => 0.01, #ExtUtils\MakeMaker\vmsish.pm
+ 'ExtUtils::Manifest' => 1.42, #ExtUtils\Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #ExtUtils\Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => 1.15, #ExtUtils\Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => 1.19, #ExtUtils\Mksymlists.pm
+ 'ExtUtils::MM' => 0.04, #ExtUtils\MM.pm
+ 'ExtUtils::MM_Any' => 0.07, #ExtUtils\MM_Any.pm
+ 'ExtUtils::MM_BeOS' => 1.04, #ExtUtils\MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => 1.06, #ExtUtils\MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => 0.02, #ExtUtils\MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => 1.07, #ExtUtils\MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => 2.06, #ExtUtils\MM_NW5.pm
+ 'ExtUtils::MM_OS2' => 1.04, #ExtUtils\MM_OS2.pm
+ 'ExtUtils::MM_Unix' => 1.42, #ExtUtils\MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => 0.02, #ExtUtils\MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #ExtUtils\MM_VMS.pm
+ 'ExtUtils::MM_Win32' => 1.09, #ExtUtils\MM_Win32.pm
+ 'ExtUtils::MM_Win95' => 0.03, #ExtUtils\MM_Win95.pm
+ 'ExtUtils::MY' => 0.01, #ExtUtils\MY.pm
+ 'ExtUtils::Packlist' => 0.04, #ExtUtils\Packlist.pm
+ 'ExtUtils::testlib' => 1.15, #ExtUtils\testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms\ext\XSSymSet.pm
+ 'Fatal' => 1.03, #Fatal.pm
+ 'Fcntl' => 1.05, #Fcntl.pm
+ 'fields' => 2.03, #fields.pm
+ 'File::Basename' => 2.72, #File\Basename.pm
+ 'File::CheckTree' => 4.2, #File\CheckTree.pm
+ 'File::Compare' => 1.1003, #File\Compare.pm
+ 'File::Copy' => 2.06, #File\Copy.pm
+ 'File::DosGlob' => '1.00', #File\DosGlob.pm
+ 'File::Find' => 1.05, #File\Find.pm
+ 'File::Glob' => 1.02, #File\Glob.pm
+ 'File::Path' => 1.06, #File\Path.pm
+ 'File::Spec' => 0.86, #File\Spec.pm
+ 'File::Spec::Cygwin' => 1.1, #File\Spec\Cygwin.pm
+ 'File::Spec::Epoc' => 1.1, #File\Spec\Epoc.pm
+ 'File::Spec::Functions' => 1.3, #File\Spec\Functions.pm
+ 'File::Spec::Mac' => 1.4, #File\Spec\Mac.pm
+ 'File::Spec::OS2' => 1.2, #File\Spec\OS2.pm
+ 'File::Spec::Unix' => 1.5, #File\Spec\Unix.pm
+ 'File::Spec::VMS' => 1.4, #File\Spec\VMS.pm
+ 'File::Spec::Win32' => 1.4, #File\Spec\Win32.pm
+ 'File::stat' => '1.00', #File\stat.pm
+ 'File::Temp' => 0.14, #File\Temp.pm
+ 'FileCache' => 1.03, #FileCache.pm
+ 'FileHandle' => 2.01, #FileHandle.pm
+ 'filetest' => 1.01, #filetest.pm
+ 'Filter::Simple' => 0.78, #Filter\Simple.pm
+ 'Filter::Util::Call' => 1.0601, #Filter\Util\Call.pm
+ 'FindBin' => 1.43, #FindBin.pm
+ 'GDBM_File' => '1.07', #ext\GDBM_File\GDBM_File.pm
+ 'Getopt::Long' => 2.34, #Getopt\Long.pm
+ 'Getopt::Std' => 1.04, #Getopt\Std.pm
+ 'Hash::Util' => 0.05, #Hash\Util.pm
+ 'I18N::Collate' => '1.00', #I18N\Collate.pm
+ 'I18N::Langinfo' => '0.02', #I18N\Langinfo.pm
+ 'I18N::LangTags' => 0.29, #I18N\LangTags.pm
+ 'I18N::LangTags::List' => 0.29, #I18N\LangTags\List.pm
+ 'if' => 0.03, #if.pm
+ 'integer' => '1.00', #integer.pm
+ 'IO' => 1.21, #IO.pm
+ 'IO::Dir' => 1.04, #IO\Dir.pm
+ 'IO::File' => '1.10', #IO\File.pm
+ 'IO::Handle' => 1.23, #IO\Handle.pm
+ 'IO::Pipe' => 1.122, #IO\Pipe.pm
+ 'IO::Poll' => 0.06, #IO\Poll.pm
+ 'IO::Seekable' => 1.09, #IO\Seekable.pm
+ 'IO::Select' => 1.16, #IO\Select.pm
+ 'IO::Socket' => 1.28, #IO\Socket.pm
+ 'IO::Socket::INET' => 1.27, #IO\Socket\INET.pm
+ 'IO::Socket::UNIX' => 1.21, #IO\Socket\UNIX.pm
+ 'IPC::Msg' => 1.02, #IPC\Msg.pm
+ 'IPC::Open2' => 1.01, #IPC\Open2.pm
+ 'IPC::Open3' => 1.0105, #IPC\Open3.pm
+ 'IPC::Semaphore' => 1.02, #IPC\Semaphore.pm
+ 'IPC::SysV' => 1.04, #IPC\SysV.pm
+ 'JNI' => '0.2', #jpl\JNI\JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl\JPL\AutoLoader.pm
+ 'JPL::Class' => undef, #jpl\JPL\Class.pm
+ 'JPL::Compile' => undef, #jpl\JPL\Compile.pm
+ 'less' => 0.01, #less.pm
+ 'lib' => 0.5565, #lib.pm
+ 'List::Util' => 1.13, #List\Util.pm
+ 'locale' => '1.00', #locale.pm
+ 'Locale::Constants' => 2.01, #Locale\Constants.pm
+ 'Locale::Country' => 2.61, #Locale\Country.pm
+ 'Locale::Currency' => 2.21, #Locale\Currency.pm
+ 'Locale::Language' => 2.21, #Locale\Language.pm
+ 'Locale::Maketext' => 1.06, #Locale\Maketext.pm
+ 'Locale::Maketext::Guts' => undef, #Locale\Maketext\Guts.pm
+ 'Locale::Maketext::GutsLoader' => undef, #Locale\Maketext\GutsLoader.pm
+ 'Locale::Script' => 2.21, #Locale\Script.pm
+ 'Math::BigFloat' => '1.40', #Math\BigFloat.pm
+ 'Math::BigFloat::Trace' => 0.01, #Math\BigFloat\Trace.pm
+ 'Math::BigInt' => 1.66, #Math\BigInt.pm
+ 'Math::BigInt::Calc' => 0.36, #Math\BigInt\Calc.pm
+ 'Math::BigInt::Scalar' => 0.11, #Math\BigInt\Scalar.pm
+ 'Math::BigInt::Trace' => 0.01, #Math\BigInt\Trace.pm
+ 'Math::BigRat' => '0.10', #Math\BigRat.pm
+ 'Math::Complex' => 1.34, #Math\Complex.pm
+ 'Math::Trig' => 1.02, #Math\Trig.pm
+ 'Memoize' => 1.01, #Memoize.pm
+ 'Memoize::AnyDBM_File' => 0.65, #Memoize\AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #Memoize\Expire.pm
+ 'Memoize::ExpireFile' => 1.01, #Memoize\ExpireFile.pm
+ 'Memoize::ExpireTest' => 0.65, #Memoize\ExpireTest.pm
+ 'Memoize::NDBM_File' => 0.65, #Memoize\NDBM_File.pm
+ 'Memoize::SDBM_File' => 0.65, #Memoize\SDBM_File.pm
+ 'Memoize::Storable' => 0.65, #Memoize\Storable.pm
+ 'MIME::Base64' => 2.21, #MIME\Base64.pm
+ 'MIME::QuotedPrint' => 2.21, #MIME\QuotedPrint.pm
+ 'NDBM_File' => '1.05', #ext\NDBM_File\NDBM_File.pm
+ 'Net::Cmd' => 2.24, #Net\Cmd.pm
+ 'Net::Config' => '1.10', #Net\Config.pm
+ 'Net::Domain' => 2.19, #Net\Domain.pm
+ 'Net::FTP' => 2.72, #Net\FTP.pm
+ 'Net::FTP::A' => 1.16, #Net\FTP\A.pm
+ 'Net::FTP::dataconn' => 0.11, #Net\FTP\dataconn.pm
+ 'Net::FTP::E' => 0.01, #Net\FTP\E.pm
+ 'Net::FTP::I' => 1.12, #Net\FTP\I.pm
+ 'Net::FTP::L' => 0.01, #Net\FTP\L.pm
+ 'Net::hostent' => 1.01, #Net\hostent.pm
+ 'Net::netent' => '1.00', #Net\netent.pm
+ 'Net::Netrc' => 2.12, #Net\Netrc.pm
+ 'Net::NNTP' => 2.22, #Net\NNTP.pm
+ 'Net::Ping' => 2.31, #Net\Ping.pm
+ 'Net::POP3' => 2.24, #Net\POP3.pm
+ 'Net::protoent' => '1.00', #Net\protoent.pm
+ 'Net::servent' => 1.01, #Net\servent.pm
+ 'Net::SMTP' => 2.26, #Net\SMTP.pm
+ 'Net::Time' => 2.09, #Net\Time.pm
+ 'NEXT' => '0.60', #NEXT.pm
+ 'O' => '1.00', #O.pm
+ 'ODBM_File' => '1.04', #ext\ODBM_File\ODBM_File.pm
+ 'Opcode' => 1.05, #Opcode.pm
+ 'open' => 1.02, #open.pm
+ 'ops' => '1.00', #ops.pm
+ 'OS2::DLL' => '1.01', #os2\OS2\REXX\DLL\DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2\OS2\ExtAttr\ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2\OS2\PrfDB\PrfDB.pm
+ 'OS2::Process' => '1.01', #os2\OS2\Process\Process.pm
+ 'OS2::REXX' => '1.02', #os2\OS2\REXX\REXX.pm
+ 'overload' => 1.01, #overload.pm
+ 'PerlIO' => 1.02, #PerlIO.pm
+ 'PerlIO::encoding' => 0.07, #PerlIO\encoding.pm
+ 'PerlIO::scalar' => 0.02, #PerlIO\scalar.pm
+ 'PerlIO::via' => 0.02, #PerlIO\via.pm
+ 'PerlIO::via::QuotedPrint' => 0.05, #PerlIO\via\QuotedPrint.pm
+ 'Pod::Checker' => 1.41, #Pod\Checker.pm
+ 'Pod::Find' => 0.24, #Pod\Find.pm
+ 'Pod::Functions' => 1.02, #Pod\Functions.pm
+ 'Pod::Html' => 1.0501, #Pod\Html.pm
+ 'Pod::InputObjects' => 1.14, #Pod\InputObjects.pm
+ 'Pod::LaTeX' => 0.55, #Pod\LaTeX.pm
+ 'Pod::Man' => 1.37, #Pod\Man.pm
+ 'Pod::ParseLink' => 1.06, #Pod\ParseLink.pm
+ 'Pod::Parser' => 1.13, #Pod\Parser.pm
+ 'Pod::ParseUtils' => 0.3, #Pod\ParseUtils.pm
+ 'Pod::Perldoc' => 3.11, #Pod\Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #Pod\Perldoc\BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO' => undef, #Pod\Perldoc\GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker' => undef, #Pod\Perldoc\ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #Pod\Perldoc\ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #Pod\Perldoc\ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #Pod\Perldoc\ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #Pod\Perldoc\ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #Pod\Perldoc\ToText.pm
+ 'Pod::Perldoc::ToTk' => undef, #Pod\Perldoc\ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #Pod\Perldoc\ToXml.pm
+ 'Pod::Plainer' => 0.01, #Pod\Plainer.pm
+ 'Pod::PlainText' => 2.01, #Pod\PlainText.pm
+ 'Pod::Select' => 1.13, #Pod\Select.pm
+ 'Pod::Text' => 2.21, #Pod\Text.pm
+ 'Pod::Text::Color' => 1.04, #Pod\Text\Color.pm
+ 'Pod::Text::Overstrike' => 1.1, #Pod\Text\Overstrike.pm
+ 'Pod::Text::Termcap' => 1.11, #Pod\Text\Termcap.pm
+ 'Pod::Usage' => 1.16, #Pod\Usage.pm
+ 'POSIX' => 1.06, #POSIX.pm
+ 're' => 0.04, #re.pm
+ 'Safe' => '2.10', #Safe.pm
+ 'Scalar::Util' => 1.13, #Scalar\Util.pm
+ 'SDBM_File' => 1.04, #SDBM_File.pm
+ 'Search::Dict' => 1.02, #Search\Dict.pm
+ 'SelectSaver' => '1.00', #SelectSaver.pm
+ 'SelfLoader' => 1.0904, #SelfLoader.pm
+ 'Shell' => 0.5, #Shell.pm
+ 'sigtrap' => 1.02, #sigtrap.pm
+ 'Socket' => 1.76, #Socket.pm
+ 'sort' => 1.02, #sort.pm
+ 'Storable' => 2.08, #Storable.pm
+ 'strict' => 1.03, #strict.pm
+ 'subs' => '1.00', #subs.pm
+ 'Switch' => '2.10', #Switch.pm
+ 'Symbol' => 1.05, #Symbol.pm
+ 'Sys::Hostname' => 1.11, #Sys\Hostname.pm
+ 'Sys::Syslog' => '0.04', #ext\Sys\Syslog\Syslog.pm
+ 'Term::ANSIColor' => 1.07, #Term\ANSIColor.pm
+ 'Term::Cap' => 1.08, #Term\Cap.pm
+ 'Term::Complete' => 1.401, #Term\Complete.pm
+ 'Term::ReadLine' => 1.01, #Term\ReadLine.pm
+ 'Test' => 1.24, #Test.pm
+ 'Test::Builder' => 0.17, #Test\Builder.pm
+ 'Test::Harness' => '2.30', #Test\Harness.pm
+ 'Test::Harness::Assert' => 0.01, #Test\Harness\Assert.pm
+ 'Test::Harness::Iterator' => 0.01, #Test\Harness\Iterator.pm
+ 'Test::Harness::Straps' => 0.15, #Test\Harness\Straps.pm
+ 'Test::More' => 0.47, #Test\More.pm
+ 'Test::Simple' => 0.47, #Test\Simple.pm
+ 'Text::Abbrev' => 1.01, #Text\Abbrev.pm
+ 'Text::Balanced' => 1.95, #Text\Balanced.pm
+ 'Text::ParseWords' => 3.21, #Text\ParseWords.pm
+ 'Text::Soundex' => 1.01, #Text\Soundex.pm
+ 'Text::Tabs' => 98.112801, #Text\Tabs.pm
+ 'Text::Wrap' => 2001.09291, #Text\Wrap.pm
+ 'Thread' => '2.00', #Thread.pm
+ 'Thread::Queue' => '2.00', #Thread\Queue.pm
+ 'Thread::Semaphore' => 2.01, #Thread\Semaphore.pm
+ 'Thread::Signal' => '1.00', #Thread\Signal.pm
+ 'Thread::Specific' => '1.00', #Thread\Specific.pm
+ 'threads' => '1.00', #threads.pm
+ 'threads::shared' => 0.91, #threads\shared.pm
+ 'Tie::Array' => 1.03, #Tie\Array.pm
+ 'Tie::File' => 0.97, #Tie\File.pm
+ 'Tie::Handle' => 4.1, #Tie\Handle.pm
+ 'Tie::Hash' => '1.00', #Tie\Hash.pm
+ 'Tie::Memoize' => '1.0', #Tie\Memoize.pm
+ 'Tie::RefHash' => 1.31, #Tie\RefHash.pm
+ 'Tie::Scalar' => '1.00', #Tie\Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #Tie\SubstrHash.pm
+ 'Time::gmtime' => 1.02, #Time\gmtime.pm
+ 'Time::HiRes' => 1.52, #Time\HiRes.pm
+ 'Time::Local' => 1.07, #Time\Local.pm
+ 'Time::localtime' => 1.02, #Time\localtime.pm
+ 'Time::tm' => '1.00', #Time\tm.pm
+ 'Unicode' => '4.0.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.30', #Unicode\Collate.pm
+ 'Unicode::Normalize' => 0.25, #Unicode\Normalize.pm
+ 'Unicode::UCD' => 0.21, #Unicode\UCD.pm
+ 'UNIVERSAL' => 1.01, #UNIVERSAL.pm
+ 'User::grent' => '1.00', #User\grent.pm
+ 'User::pwent' => '1.00', #User\pwent.pm
+ 'utf8' => 1.02, #utf8.pm
+ 'vars' => 1.01, #vars.pm
+ 'VMS::DCLsym' => '1.02', #vms\ext\DCLsym\DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms\ext\Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms\ext\Stdio\Stdio.pm
+ 'vmsish' => 1.01, #vmsish.pm
+ 'warnings' => 1.03, #warnings.pm
+ 'warnings::register' => '1.00', #warnings\register.pm
+ 'XS::APItest' => 0.02, #XS\APItest.pm
+ 'XS::Typemap' => 0.01, #XS\Typemap.pm
+ 'XSLoader' => 0.02, #XSLoader.pm
+ },
+
+ 5.008003 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.78', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'B' => '1.02', #lib/B.pm
+ 'base' => '2.04', #lib/base.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.02', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.56', #lib/B/Concise.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Deparse' => '0.64', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'Benchmark' => '1.052', #lib/Benchmark.pm
+ 'bigint' => '0.04', #lib/bigint.pm
+ 'bignum' => '0.14', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.01', #lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI' => '3.01', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.27', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.4', #lib/CGI/Util.pm
+ 'charnames' => '1.02', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.12', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.808', #lib/DB_File.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.12', #lib/diagnostics.pm
+ 'Digest' => '1.05', #lib/Digest.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'Encode' => '1.99', #lib/Encode.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.05', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.48', #lib/encoding.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.57', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.07', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.06', #lib/File/Find.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.23', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.06', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.42', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.68', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.38', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::CalcEmu' => '0.02', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.10', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.21', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '2.21', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.04', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'open' => '1.02', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.01', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.12', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.07', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.76', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.09', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.04', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.07', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.40', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'threads' => '1.01', #lib/threads.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.52', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.07', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode' => '4.0.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.33', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.28', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.02', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.03', #lib/XS/APItest.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ },
+
+ 5.009 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'assertions' => '0.01', #lib/assertions.pm
+ 'assertions::activate' => '0.01', #lib/assertions/activate.pm
+ 'Attribute::Handlers' => '0.78', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'B' => '1.03', #lib/B.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.03', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.57', #lib/B/Concise.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Deparse' => '0.65', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'base' => '2.03', #lib/base.pm
+ 'Benchmark' => '1.051', #lib/Benchmark.pm
+ 'bigint' => '0.04', #lib/bigint.pm
+ 'bignum' => '0.14', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.01', #lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI' => '3.00', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.26', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.041', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.07_00', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.31', #lib/CGI/Util.pm
+ 'charnames' => '1.02', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.08', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.806', #lib/DB_File.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.008', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.11', #lib/diagnostics.pm
+ 'Digest' => '1.02', #lib/Digest.pm
+ 'Digest::MD5' => '2.30', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'Encode' => '1.9801', #lib/Encode.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.05', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.47', #lib/encoding.pm
+ 'English' => '1.02', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.567', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.06', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.04', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'File::CheckTree' => '4.2', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.06', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.05', #lib/File/Find.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.86', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.43', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #ext/GDBM_File/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.04', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.23', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.06', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.40', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.66', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.36', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Scalar' => '0.11', #lib/Math/BigInt/Scalar.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.10', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '2.21', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '2.21', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #ext/NDBM_File/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.04', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.06', #lib/Opcode.pm
+ 'open' => '1.02', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.02', #lib/overload.pm
+ 'PerlIO' => '1.02', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.05', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0501', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.13', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.11', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.01', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.06', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.76', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.08', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.04', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.07', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.30', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.01', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.01', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.15', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads' => '1.00', #lib/threads.pm
+ 'threads::shared' => '0.91', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.00', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.51', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.07', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode' => '4.0.0', #lib/unicore/version
+ 'Unicode::Collate' => '0.28', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.23', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.02', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'version' => '0.29', #lib/version.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.02', #lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ 'XSLoader' => '0.03', #lib/XSLoader.pm
+ },
+
+ 5.009001 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'assertions' => '0.01', #lib/assertions.pm
+ 'assertions::activate' => '0.01', #lib/assertions/activate.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'B' => '1.05', #lib/B.pm
+ 'base' => '2.04', #lib/base.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.06', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.04', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.59', #lib/B/Concise.pm
+ 'B::Debug' => '1.02', #lib/B/Debug.pm
+ 'B::Deparse' => '0.65', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.02', #lib/Carp.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI' => '3.04', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.27', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.4', #lib/CGI/Util.pm
+ 'charnames' => '1.03', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '2.17', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.808_01', #lib/DB_File.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011_01', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.12', #lib/diagnostics.pm
+ 'Digest' => '1.05', #lib/Digest.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.04', #lib/DynaLoader.pm
+ 'Encode' => '1.99_01', #lib/Encode.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '1.0501', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '1.48', #lib/encoding.pm
+ 'English' => '1.02', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.567', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.07', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.21_02', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.43', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.0901', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.07', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_01', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.45_01', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.71_01', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.10_01', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.03', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.04', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.07', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.3401', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'if' => '0.0401', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.23', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.122', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0105', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.08', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.44', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.70', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.40', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.12', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01_01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '3.00_01', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '3.00', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.04', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.06', #lib/Opcode.pm
+ 'open' => '1.02', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.02', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.12', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.07', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5.2', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.11', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.40', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'threads' => '1.02', #lib/threads.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.56', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.07_94', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode' => '4.0.0', #lib/unicore/version
+ 'Unicode::Collate' => '0.33', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.28', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.21', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.02', #lib/UNIVERSAL.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.02', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'version' => '0.36', #lib/version.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.03', #lib/XS/APItest.pm
+ 'XSLoader' => '0.03', #lib/XSLoader.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ },
+
+ 5.008004 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.03', #lib/autouse.pm
+ 'base' => '2.05', #lib/base.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.02', #lib/Carp.pm
+ 'CGI' => '3.04', #lib/CGI.pm
+ 'charnames' => '1.03', #lib/charnames.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'Cwd' => '2.17', #lib/Cwd.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'diagnostics' => '1.12', #lib/diagnostics.pm
+ 'Digest' => '1.06', #lib/Digest.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'FileCache' => '1.03', #lib/FileCache.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'less' => '0.01', #lib/less.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'open' => '1.03', #lib/open.pm
+ 'overload' => '1.01', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.5.2', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Test' => '1.24', #lib/Test.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Unicode' => '4.0.1', # lib/unicore/version
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'utf8' => '1.03', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'Config' => undef, #lib/Config.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 're' => '0.04', #lib/re.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'DynaLoader' => '1.05', #lib/DynaLoader.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'B' => '1.02', #lib/B.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'DB_File' => '1.808', #lib/DB_File.pm
+ 'Encode' => '1.99_01', #lib/Encode.pm
+ 'encoding' => '1.48', #lib/encoding.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Safe' => '2.10', #lib/Safe.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'POSIX' => '1.08', #lib/POSIX.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'Storable' => '2.12', #lib/Storable.pm
+ 'threads' => '1.03', #lib/threads.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.27', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.4', #lib/CGI/Util.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011', #lib/Devel/PPPort.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'Exporter::Heavy' => '5.57', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_02', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.0301', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3001', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'File::Basename' => '2.72', #lib/File/Basename.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.07', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'File::Glob' => '1.02', #lib/File/Glob.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::LangTags' => '0.29', #lib/I18N/LangTags.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0106', #lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'Locale::Constants' => '2.01', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.61', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.21', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.21', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.08', #lib/Locale/Maketext.pm
+ 'Locale::Script' => '2.21', #lib/Locale/Script.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Math::BigFloat' => '1.44', #lib/Math/BigFloat.pm
+ 'Math::BigInt' => '1.70', #lib/Math/BigInt.pm
+ 'Math::BigRat' => '0.12', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Calc' => '0.40', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'Net::Cmd' => '2.24', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.72', #lib/Net/FTP.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.22', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.24', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.26', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.09', #lib/Net/Time.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.41', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.24', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.55', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '0.3', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.12', #lib/Pod/Perldoc.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.08', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.40', #lib/Test/Harness.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.21', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09291', #lib/Text/Wrap.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::Local' => '1.07', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Time::HiRes' => '1.59', #lib/Time/HiRes.pm
+ 'Unicode::Collate' => '0.33', #lib/Unicode/Collate.pm
+ 'Unicode::UCD' => '0.22', #lib/Unicode/UCD.pm
+ 'Unicode::Normalize' => '0.28', #lib/Unicode/Normalize.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::C' => '1.02', #lib/B/C.pm
+ 'B::Deparse' => '0.66', #lib/B/Deparse.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Assembler' => '0.07', #lib/B/Assembler.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.60', #lib/B/Concise.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'Encode::Alias' => '1.38', #lib/Encode/Alias.pm
+ 'Encode::Encoding' => '1.33', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '1.09', #lib/Encode/Guess.pm
+ 'Encode::Config' => '1.07', #lib/Encode/Config.pm
+ 'Encode::Encoder' => '0.07', #lib/Encode/Encoder.pm
+ 'Encode::CJKConstants' => '1.02', #lib/Encode/CJKConstants.pm
+ 'Encode::Byte' => '1.23', #lib/Encode/Byte.pm
+ 'Encode::CN' => '1.24', #lib/Encode/CN.pm
+ 'Encode::EBCDIC' => '1.21', #lib/Encode/EBCDIC.pm
+ 'Encode::JP' => '1.25', #lib/Encode/JP.pm
+ 'Encode::KR' => '1.23', #lib/Encode/KR.pm
+ 'Encode::Symbol' => '1.22', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '1.26', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '1.40', #lib/Encode/Unicode.pm
+ 'Encode::JP::H2Z' => '1.02', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '1.12', #lib/Encode/JP/JIS7.pm
+ 'Encode::Unicode::UTF7' => '0.02', #lib/Encode/Unicode/UTF7.pm
+ 'Encode::KR::2022_KR' => '1.06', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '1.09', #lib/Encode/MIME/Header.pm
+ 'Encode::CN::HZ' => '1.0501', #lib/Encode/CN/HZ.pm
+ 'IO::Pipe' => '1.123', #lib/IO/Pipe.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::Handle' => '1.24', #lib/IO/Handle.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'List::Util' => '1.13', #lib/List/Util.pm
+ 'Scalar::Util' => '1.13', #lib/Scalar/Util.pm
+ 'MIME::QuotedPrint' => '3.01', #lib/MIME/QuotedPrint.pm
+ 'MIME::Base64' => '3.01', #lib/MIME/Base64.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'XS::APItest' => '0.03', #lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'ODBM_File' => '1.05', #ext/ODBM_File/ODBM_File.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ },
+
+ 5.008005 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.04', #lib/autouse.pm
+ 'base' => '2.06', #lib/base.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.03', #lib/Carp.pm
+ 'CGI' => '3.05', #lib/CGI.pm
+ 'charnames' => '1.04', #lib/charnames.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'Cwd' => '2.19', #lib/Cwd.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'diagnostics' => '1.13', #lib/diagnostics.pm
+ 'Digest' => '1.08', #lib/Digest.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'FileCache' => '1.04_01', #lib/FileCache.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'less' => '0.01', #lib/less.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'open' => '1.03', #lib/open.pm
+ 'overload' => '1.01', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.6', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Test' => '1.25', #lib/Test.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'utf8' => '1.04', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'Config' => undef, #lib/Config.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 're' => '0.04', #lib/re.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'DynaLoader' => '1.05', #lib/DynaLoader.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'B' => '1.02', #lib/B.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'DB_File' => '1.809', #lib/DB_File.pm
+ 'Encode' => '2.01', #lib/Encode.pm
+ 'encoding' => '2.00', #lib/encoding.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Safe' => '2.11', #lib/Safe.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'POSIX' => '1.08', #lib/POSIX.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'Storable' => '2.13', #lib/Storable.pm
+ 'threads' => '1.05', #lib/threads.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'Carp::Heavy' => '1.01', #lib/Carp/Heavy.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.28', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.5', #lib/CGI/Util.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.01', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '2.011', #lib/Devel/PPPort.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'Exporter::Heavy' => '5.57', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Constant' => '0.14', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_02', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.0301', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3001', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'File::Basename' => '2.73', #lib/File/Basename.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.08', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '0.87', #lib/File/Spec.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'File::Glob' => '1.03', #lib/File/Glob.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.4', #lib/File/Spec/Win32.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::LangTags' => '0.33', #lib/I18N/LangTags.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags::Detect'=> '1.03', #lib/I18N/LangTags/Detect.pm
+ 'I18N::LangTags::List' => '0.29', #lib/I18N/LangTags/List.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0106', #lib/IPC/Open3.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'Locale::Constants' => '2.07', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.07', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.07', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.07', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.09', #lib/Locale/Maketext.pm
+ 'Locale::Script' => '2.07', #lib/Locale/Script.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Math::BigFloat' => '1.44', #lib/Math/BigFloat.pm
+ 'Math::BigInt' => '1.70', #lib/Math/BigInt.pm
+ 'Math::BigRat' => '0.12', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Calc' => '0.40', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'Net::Cmd' => '2.26', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.75', #lib/Net/FTP.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.23', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.28', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.29', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.10', #lib/Net/Time.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.42', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.2401', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.56', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '1.2', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.13', #lib/Pod/Perldoc.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.09', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.42', #lib/Test/Harness.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.22', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09292', #lib/Text/Wrap.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::Local' => '1.10', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Time::HiRes' => '1.59', #lib/Time/HiRes.pm
+ 'Unicode' => '4.0.1', # lib/unicore/version
+ 'Unicode::Collate' => '0.40', #lib/Unicode/Collate.pm
+ 'Unicode::UCD' => '0.22', #lib/Unicode/UCD.pm
+ 'Unicode::Normalize' => '0.30', #lib/Unicode/Normalize.pm
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::C' => '1.02', #lib/B/C.pm
+ 'B::Deparse' => '0.67', #lib/B/Deparse.pm
+ 'B::Debug' => '1.01', #lib/B/Debug.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Assembler' => '0.07', #lib/B/Assembler.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.61', #lib/B/Concise.pm
+ 'B::Lint' => '1.02', #lib/B/Lint.pm
+ 'B::Showlex' => '1.00', #lib/B/Showlex.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'Data::Dumper' => '2.121', #lib/Data/Dumper.pm
+ 'Encode::Alias' => '2.00', #lib/Encode/Alias.pm
+ 'Encode::Encoding' => '2.00', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '2.00', #lib/Encode/Guess.pm
+ 'Encode::Config' => '2.00', #lib/Encode/Config.pm
+ 'Encode::Encoder' => '2.00', #lib/Encode/Encoder.pm
+ 'Encode::CJKConstants' => '2.00', #lib/Encode/CJKConstants.pm
+ 'Encode::Byte' => '2.00', #lib/Encode/Byte.pm
+ 'Encode::CN' => '2.00', #lib/Encode/CN.pm
+ 'Encode::EBCDIC' => '2.00', #lib/Encode/EBCDIC.pm
+ 'Encode::JP' => '2.00', #lib/Encode/JP.pm
+ 'Encode::KR' => '2.00', #lib/Encode/KR.pm
+ 'Encode::Symbol' => '2.00', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '2.00', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '2.00', #lib/Encode/Unicode.pm
+ 'Encode::JP::H2Z' => '2.00', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '2.00', #lib/Encode/JP/JIS7.pm
+ 'Encode::Unicode::UTF7' => '2.01', #lib/Encode/Unicode/UTF7.pm
+ 'Encode::KR::2022_KR' => '2.00', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '2.00', #lib/Encode/MIME/Header.pm
+ 'Encode::CN::HZ' => '2.01', #lib/Encode/CN/HZ.pm
+ 'IO::Pipe' => '1.123', #lib/IO/Pipe.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::Handle' => '1.24', #lib/IO/Handle.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'List::Util' => '1.14', #lib/List/Util.pm
+ 'Scalar::Util' => '1.14', #lib/Scalar/Util.pm
+ 'MIME::QuotedPrint' => '3.01', #lib/MIME/QuotedPrint.pm
+ 'MIME::Base64' => '3.01', #lib/MIME/Base64.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'XS::APItest' => '0.04', #lib/XS/APItest.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'ODBM_File' => '1.05', #ext/ODBM_File/ODBM_File.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'Thread::Signal' => '1.00', #./ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #./ext/Thread/Thread/Specific.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ },
+
+ 5.008006 => {
+ 'AnyDBM_File' => '1.00', #lib/AnyDBM_File.pm
+ 'Attribute::Handlers' => '0.78_01', #lib/Attribute/Handlers.pm
+ 'attributes' => '0.06', #lib/attributes.pm
+ 'attrs' => '1.01', #lib/attrs.pm
+ 'AutoLoader' => '5.60', #lib/AutoLoader.pm
+ 'AutoSplit' => '1.04', #lib/AutoSplit.pm
+ 'autouse' => '1.04', #lib/autouse.pm
+ 'B' => '1.07', #lib/B.pm
+ 'base' => '2.06', #lib/base.pm
+ 'B::Asmdata' => '1.01', #lib/B/Asmdata.pm
+ 'B::Assembler' => '0.07', #lib/B/Assembler.pm
+ 'B::Bblock' => '1.02', #lib/B/Bblock.pm
+ 'B::Bytecode' => '1.01', #lib/B/Bytecode.pm
+ 'B::C' => '1.04', #lib/B/C.pm
+ 'B::CC' => '1.00', #lib/B/CC.pm
+ 'B::Concise' => '0.64', #lib/B/Concise.pm
+ 'B::Debug' => '1.02', #lib/B/Debug.pm
+ 'B::Deparse' => '0.69', #lib/B/Deparse.pm
+ 'B::Disassembler' => '1.03', #lib/B/Disassembler.pm
+ 'Benchmark' => '1.06', #lib/Benchmark.pm
+ 'bigint' => '0.05', #lib/bigint.pm
+ 'bignum' => '0.15', #lib/bignum.pm
+ 'bigrat' => '0.06', #lib/bigrat.pm
+ 'blib' => '1.02', #lib/blib.pm
+ 'B::Lint' => '1.03', #lib/B/Lint.pm
+ 'B::Showlex' => '1.02', #lib/B/Showlex.pm
+ 'B::Stackobj' => '1.00', #lib/B/Stackobj.pm
+ 'B::Stash' => '1.00', #lib/B/Stash.pm
+ 'B::Terse' => '1.02', #lib/B/Terse.pm
+ 'B::Xref' => '1.01', #lib/B/Xref.pm
+ 'ByteLoader' => '0.05', #lib/ByteLoader.pm
+ 'bytes' => '1.01', #lib/bytes.pm
+ 'Carp' => '1.03', #lib/Carp.pm
+ 'Carp::Heavy' => '1.03', #lib/Carp/Heavy.pm
+ 'CGI' => '3.05', #lib/CGI.pm
+ 'CGI::Apache' => '1.00', #lib/CGI/Apache.pm
+ 'CGI::Carp' => '1.28', #lib/CGI/Carp.pm
+ 'CGI::Cookie' => '1.24', #lib/CGI/Cookie.pm
+ 'CGI::Fast' => '1.05', #lib/CGI/Fast.pm
+ 'CGI::Pretty' => '1.08', #lib/CGI/Pretty.pm
+ 'CGI::Push' => '1.04', #lib/CGI/Push.pm
+ 'CGI::Switch' => '1.00', #lib/CGI/Switch.pm
+ 'CGI::Util' => '1.5', #lib/CGI/Util.pm
+ 'charnames' => '1.04', #lib/charnames.pm
+ 'Class::ISA' => '0.32', #lib/Class/ISA.pm
+ 'Class::Struct' => '0.63', #lib/Class/Struct.pm
+ 'Config' => undef, #lib/Config.pm
+ 'constant' => '1.04', #lib/constant.pm
+ 'CPAN' => '1.76_01', #lib/CPAN.pm
+ 'CPAN::FirstTime' => '1.60 ', #lib/CPAN/FirstTime.pm
+ 'CPAN::Nox' => '1.03', #lib/CPAN/Nox.pm
+ 'Cwd' => '3.01', #lib/Cwd.pm
+ 'Data::Dumper' => '2.121_02', #lib/Data/Dumper.pm
+ 'DB' => '1.0', #lib/DB.pm
+ 'DB_File' => '1.810', #lib/DB_File.pm
+ 'DBM_Filter' => '0.01', #lib/DBM_Filter.pm
+ 'DBM_Filter::compress' => '0.01', #lib/DBM_Filter/compress.pm
+ 'DBM_Filter::encode' => '0.01', #lib/DBM_Filter/encode.pm
+ 'DBM_Filter::int32' => '0.01', #lib/DBM_Filter/int32.pm
+ 'DBM_Filter::null' => '0.01', #lib/DBM_Filter/null.pm
+ 'DBM_Filter::utf8' => '0.01', #lib/DBM_Filter/utf8.pm
+ 'Devel::DProf' => '20030813.00', #lib/Devel/DProf.pm
+ 'Devel::Peek' => '1.02', #lib/Devel/Peek.pm
+ 'Devel::PPPort' => '3.03', #lib/Devel/PPPort.pm
+ 'Devel::SelfStubber' => '1.03', #lib/Devel/SelfStubber.pm
+ 'diagnostics' => '1.14', #lib/diagnostics.pm
+ 'Digest' => '1.08', #lib/Digest.pm
+ 'Digest::base' => '1.00', #lib/Digest/base.pm
+ 'Digest::MD5' => '2.33', #lib/Digest/MD5.pm
+ 'DirHandle' => '1.00', #lib/DirHandle.pm
+ 'Dumpvalue' => '1.11', #lib/Dumpvalue.pm
+ 'DynaLoader' => '1.05', #lib/DynaLoader.pm
+ 'Encode' => '2.08', #lib/Encode.pm
+ 'Encode::Alias' => '2.02', #lib/Encode/Alias.pm
+ 'Encode::Byte' => '2.00', #lib/Encode/Byte.pm
+ 'Encode::CJKConstants' => '2.00', #lib/Encode/CJKConstants.pm
+ 'Encode::CN' => '2.00', #lib/Encode/CN.pm
+ 'Encode::CN::HZ' => '2.01', #lib/Encode/CN/HZ.pm
+ 'Encode::Config' => '2.00', #lib/Encode/Config.pm
+ 'Encode::EBCDIC' => '2.00', #lib/Encode/EBCDIC.pm
+ 'Encode::Encoder' => '2.00', #lib/Encode/Encoder.pm
+ 'Encode::Encoding' => '2.02', #lib/Encode/Encoding.pm
+ 'Encode::Guess' => '2.00', #lib/Encode/Guess.pm
+ 'Encode::JP' => '2.01', #lib/Encode/JP.pm
+ 'Encode::JP::H2Z' => '2.00', #lib/Encode/JP/H2Z.pm
+ 'Encode::JP::JIS7' => '2.00', #lib/Encode/JP/JIS7.pm
+ 'Encode::KR' => '2.00', #lib/Encode/KR.pm
+ 'Encode::KR::2022_KR' => '2.00', #lib/Encode/KR/2022_KR.pm
+ 'Encode::MIME::Header' => '2.00', #lib/Encode/MIME/Header.pm
+ 'Encode::Symbol' => '2.00', #lib/Encode/Symbol.pm
+ 'Encode::TW' => '2.00', #lib/Encode/TW.pm
+ 'Encode::Unicode' => '2.02', #lib/Encode/Unicode.pm
+ 'Encode::Unicode::UTF7' => '2.01', #lib/Encode/Unicode/UTF7.pm
+ 'encoding' => '2.01', #lib/encoding.pm
+ 'English' => '1.01', #lib/English.pm
+ 'Env' => '1.00', #lib/Env.pm
+ 'Errno' => '1.09_00', #lib/Errno.pm
+ 'Exporter' => '5.58', #lib/Exporter.pm
+ 'Exporter::Heavy' => '5.58', #lib/Exporter/Heavy.pm
+ 'ExtUtils::Command' => '1.05', #lib/ExtUtils/Command.pm
+ 'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+ 'ExtUtils::Constant' => '0.1401', #lib/ExtUtils/Constant.pm
+ 'ExtUtils::Embed' => '1.250601', #lib/ExtUtils/Embed.pm
+ 'ExtUtils::Install' => '1.32', #lib/ExtUtils/Install.pm
+ 'ExtUtils::Installed' => '0.08', #lib/ExtUtils/Installed.pm
+ 'ExtUtils::Liblist' => '1.01', #lib/ExtUtils/Liblist.pm
+ 'ExtUtils::Liblist::Kid'=> '1.3001', #lib/ExtUtils/Liblist/Kid.pm
+ 'ExtUtils::MakeMaker' => '6.17', #lib/ExtUtils/MakeMaker.pm
+ 'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+ 'ExtUtils::Manifest' => '1.42', #lib/ExtUtils/Manifest.pm
+ 'ExtUtils::Miniperl' => undef, #lib/ExtUtils/Miniperl.pm
+ 'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+ 'ExtUtils::Mksymlists' => '1.19', #lib/ExtUtils/Mksymlists.pm
+ 'ExtUtils::MM' => '0.04', #lib/ExtUtils/MM.pm
+ 'ExtUtils::MM_Any' => '0.07', #lib/ExtUtils/MM_Any.pm
+ 'ExtUtils::MM_BeOS' => '1.04', #lib/ExtUtils/MM_BeOS.pm
+ 'ExtUtils::MM_Cygwin' => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+ 'ExtUtils::MM_DOS' => '0.02', #lib/ExtUtils/MM_DOS.pm
+ 'ExtUtils::MM_MacOS' => '1.07', #lib/ExtUtils/MM_MacOS.pm
+ 'ExtUtils::MM_NW5' => '2.07_02', #lib/ExtUtils/MM_NW5.pm
+ 'ExtUtils::MM_OS2' => '1.04', #lib/ExtUtils/MM_OS2.pm
+ 'ExtUtils::MM_Unix' => '1.42', #lib/ExtUtils/MM_Unix.pm
+ 'ExtUtils::MM_UWIN' => '0.02', #lib/ExtUtils/MM_UWIN.pm
+ 'ExtUtils::MM_VMS' => '5.70', #lib/ExtUtils/MM_VMS.pm
+ 'ExtUtils::MM_Win32' => '1.09', #lib/ExtUtils/MM_Win32.pm
+ 'ExtUtils::MM_Win95' => '0.0301', #lib/ExtUtils/MM_Win95.pm
+ 'ExtUtils::MY' => '0.01', #lib/ExtUtils/MY.pm
+ 'ExtUtils::Packlist' => '0.04', #lib/ExtUtils/Packlist.pm
+ 'ExtUtils::testlib' => '1.15', #lib/ExtUtils/testlib.pm
+ 'ExtUtils::XSSymSet' => '1.0', #vms/ext/XSSymSet.pm
+ 'Fatal' => '1.03', #lib/Fatal.pm
+ 'Fcntl' => '1.05', #lib/Fcntl.pm
+ 'fields' => '2.03', #lib/fields.pm
+ 'File::Basename' => '2.73', #lib/File/Basename.pm
+ 'FileCache' => '1.04_01', #lib/FileCache.pm
+ 'File::CheckTree' => '4.3', #lib/File/CheckTree.pm
+ 'File::Compare' => '1.1003', #lib/File/Compare.pm
+ 'File::Copy' => '2.08', #lib/File/Copy.pm
+ 'File::DosGlob' => '1.00', #lib/File/DosGlob.pm
+ 'File::Find' => '1.07', #lib/File/Find.pm
+ 'File::Glob' => '1.03', #lib/File/Glob.pm
+ 'FileHandle' => '2.01', #lib/FileHandle.pm
+ 'File::Path' => '1.06', #lib/File/Path.pm
+ 'File::Spec' => '3.01', #lib/File/Spec.pm
+ 'File::Spec::Cygwin' => '1.1', #lib/File/Spec/Cygwin.pm
+ 'File::Spec::Epoc' => '1.1', #lib/File/Spec/Epoc.pm
+ 'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+ 'File::Spec::Mac' => '1.4', #lib/File/Spec/Mac.pm
+ 'File::Spec::OS2' => '1.2', #lib/File/Spec/OS2.pm
+ 'File::Spec::Unix' => '1.5', #lib/File/Spec/Unix.pm
+ 'File::Spec::VMS' => '1.4', #lib/File/Spec/VMS.pm
+ 'File::Spec::Win32' => '1.5', #lib/File/Spec/Win32.pm
+ 'File::stat' => '1.00', #lib/File/stat.pm
+ 'File::Temp' => '0.14', #lib/File/Temp.pm
+ 'filetest' => '1.01', #lib/filetest.pm
+ 'Filter::Simple' => '0.78', #lib/Filter/Simple.pm
+ 'Filter::Util::Call' => '1.0601', #lib/Filter/Util/Call.pm
+ 'FindBin' => '1.44', #lib/FindBin.pm
+ 'GDBM_File' => '1.07', #lib/GDBM_File.pm
+ 'Getopt::Long' => '2.34', #lib/Getopt/Long.pm
+ 'Getopt::Std' => '1.05', #lib/Getopt/Std.pm
+ 'Hash::Util' => '0.05', #lib/Hash/Util.pm
+ 'I18N::Collate' => '1.00', #lib/I18N/Collate.pm
+ 'I18N::Langinfo' => '0.02', #lib/I18N/Langinfo.pm
+ 'I18N::LangTags' => '0.35', #lib/I18N/LangTags.pm
+ 'I18N::LangTags::Detect'=> '1.03', #lib/I18N/LangTags/Detect.pm
+ 'I18N::LangTags::List' => '0.35', #lib/I18N/LangTags/List.pm
+ 'if' => '0.03', #lib/if.pm
+ 'integer' => '1.00', #lib/integer.pm
+ 'IO' => '1.21', #lib/IO.pm
+ 'IO::Dir' => '1.04', #lib/IO/Dir.pm
+ 'IO::File' => '1.10', #lib/IO/File.pm
+ 'IO::Handle' => '1.24', #lib/IO/Handle.pm
+ 'IO::Pipe' => '1.123', #lib/IO/Pipe.pm
+ 'IO::Poll' => '0.06', #lib/IO/Poll.pm
+ 'IO::Seekable' => '1.09', #lib/IO/Seekable.pm
+ 'IO::Select' => '1.16', #lib/IO/Select.pm
+ 'IO::Socket' => '1.28', #lib/IO/Socket.pm
+ 'IO::Socket::INET' => '1.27', #lib/IO/Socket/INET.pm
+ 'IO::Socket::UNIX' => '1.21', #lib/IO/Socket/UNIX.pm
+ 'IPC::Msg' => '1.02', #lib/IPC/Msg.pm
+ 'IPC::Open2' => '1.01', #lib/IPC/Open2.pm
+ 'IPC::Open3' => '1.0106', #lib/IPC/Open3.pm
+ 'IPC::Semaphore' => '1.02', #lib/IPC/Semaphore.pm
+ 'IPC::SysV' => '1.04', #lib/IPC/SysV.pm
+ 'JNI' => '0.2', #jpl/JNI/JNI.pm
+ 'JPL::AutoLoader' => undef, #jpl/JPL/AutoLoader.pm
+ 'JPL::Class' => undef, #jpl/JPL/Class.pm
+ 'JPL::Compile' => undef, #jpl/JPL/Compile.pm
+ 'less' => '0.01', #lib/less.pm
+ 'lib' => '0.5565', #lib/lib.pm
+ 'List::Util' => '1.14', #lib/List/Util.pm
+ 'locale' => '1.00', #lib/locale.pm
+ 'Locale::Constants' => '2.07', #lib/Locale/Constants.pm
+ 'Locale::Country' => '2.07', #lib/Locale/Country.pm
+ 'Locale::Currency' => '2.07', #lib/Locale/Currency.pm
+ 'Locale::Language' => '2.07', #lib/Locale/Language.pm
+ 'Locale::Maketext' => '1.09', #lib/Locale/Maketext.pm
+ 'Locale::Maketext::GutsLoader'=> undef, #lib/Locale/Maketext/GutsLoader.pm
+ 'Locale::Maketext::Guts'=> undef, #lib/Locale/Maketext/Guts.pm
+ 'Locale::Script' => '2.07', #lib/Locale/Script.pm
+ 'Math::BigFloat' => '1.47', #lib/Math/BigFloat.pm
+ 'Math::BigFloat::Trace' => '0.01', #lib/Math/BigFloat/Trace.pm
+ 'Math::BigInt' => '1.73', #lib/Math/BigInt.pm
+ 'Math::BigInt::Calc' => '0.43', #lib/Math/BigInt/Calc.pm
+ 'Math::BigInt::CalcEmu' => '0.04', #lib/Math/BigInt/CalcEmu.pm
+ 'Math::BigInt::Trace' => '0.01', #lib/Math/BigInt/Trace.pm
+ 'Math::BigRat' => '0.13', #lib/Math/BigRat.pm
+ 'Math::Complex' => '1.34', #lib/Math/Complex.pm
+ 'Math::Trig' => '1.02', #lib/Math/Trig.pm
+ 'Memoize' => '1.01', #lib/Memoize.pm
+ 'Memoize::AnyDBM_File' => '0.65', #lib/Memoize/AnyDBM_File.pm
+ 'Memoize::Expire' => '1.00', #lib/Memoize/Expire.pm
+ 'Memoize::ExpireFile' => '1.01', #lib/Memoize/ExpireFile.pm
+ 'Memoize::ExpireTest' => '0.65', #lib/Memoize/ExpireTest.pm
+ 'Memoize::NDBM_File' => '0.65', #lib/Memoize/NDBM_File.pm
+ 'Memoize::SDBM_File' => '0.65', #lib/Memoize/SDBM_File.pm
+ 'Memoize::Storable' => '0.65', #lib/Memoize/Storable.pm
+ 'MIME::Base64' => '3.05', #lib/MIME/Base64.pm
+ 'MIME::QuotedPrint' => '3.03', #lib/MIME/QuotedPrint.pm
+ 'NDBM_File' => '1.05', #lib/NDBM_File.pm
+ 'Net::Cmd' => '2.26', #lib/Net/Cmd.pm
+ 'Net::Config' => '1.10', #lib/Net/Config.pm
+ 'Net::Domain' => '2.19', #lib/Net/Domain.pm
+ 'Net::FTP' => '2.75', #lib/Net/FTP.pm
+ 'Net::FTP::A' => '1.16', #lib/Net/FTP/A.pm
+ 'Net::FTP::dataconn' => '0.11', #lib/Net/FTP/dataconn.pm
+ 'Net::FTP::E' => '0.01', #lib/Net/FTP/E.pm
+ 'Net::FTP::I' => '1.12', #lib/Net/FTP/I.pm
+ 'Net::FTP::L' => '0.01', #lib/Net/FTP/L.pm
+ 'Net::hostent' => '1.01', #lib/Net/hostent.pm
+ 'Net::netent' => '1.00', #lib/Net/netent.pm
+ 'Net::Netrc' => '2.12', #lib/Net/Netrc.pm
+ 'Net::NNTP' => '2.23', #lib/Net/NNTP.pm
+ 'Net::Ping' => '2.31', #lib/Net/Ping.pm
+ 'Net::POP3' => '2.28', #lib/Net/POP3.pm
+ 'Net::protoent' => '1.00', #lib/Net/protoent.pm
+ 'Net::servent' => '1.01', #lib/Net/servent.pm
+ 'Net::SMTP' => '2.29', #lib/Net/SMTP.pm
+ 'Net::Time' => '2.10', #lib/Net/Time.pm
+ 'NEXT' => '0.60', #lib/NEXT.pm
+ 'O' => '1.00', #lib/O.pm
+ 'ODBM_File' => '1.05', #ext/ODBM_File/ODBM_File.pm
+ 'Opcode' => '1.05', #lib/Opcode.pm
+ 'open' => '1.04', #lib/open.pm
+ 'ops' => '1.00', #lib/ops.pm
+ 'OS2::DLL' => '1.02', #os2/OS2/REXX/DLL/DLL.pm
+ 'OS2::ExtAttr' => '0.02', #os2/OS2/ExtAttr/ExtAttr.pm
+ 'OS2::PrfDB' => '0.03', #os2/OS2/PrfDB/PrfDB.pm
+ 'OS2::Process' => '1.01', #os2/OS2/Process/Process.pm
+ 'OS2::REXX' => '1.02', #os2/OS2/REXX/REXX.pm
+ 'overload' => '1.02', #lib/overload.pm
+ 'PerlIO' => '1.03', #lib/PerlIO.pm
+ 'PerlIO::encoding' => '0.07', #lib/PerlIO/encoding.pm
+ 'PerlIO::scalar' => '0.02', #lib/PerlIO/scalar.pm
+ 'PerlIO::via' => '0.02', #lib/PerlIO/via.pm
+ 'PerlIO::via::QuotedPrint'=> '0.06', #lib/PerlIO/via/QuotedPrint.pm
+ 'Pod::Checker' => '1.42', #lib/Pod/Checker.pm
+ 'Pod::Find' => '0.2401', #lib/Pod/Find.pm
+ 'Pod::Functions' => '1.02', #lib/Pod/Functions.pm
+ 'Pod::Html' => '1.0502', #lib/Pod/Html.pm
+ 'Pod::InputObjects' => '1.14', #lib/Pod/InputObjects.pm
+ 'Pod::LaTeX' => '0.56', #lib/Pod/LaTeX.pm
+ 'Pod::Man' => '1.37', #lib/Pod/Man.pm
+ 'Pod::ParseLink' => '1.06', #lib/Pod/ParseLink.pm
+ 'Pod::Parser' => '1.14', #lib/Pod/Parser.pm
+ 'Pod::ParseUtils' => '1.2', #lib/Pod/ParseUtils.pm
+ 'Pod::Perldoc' => '3.13', #lib/Pod/Perldoc.pm
+ 'Pod::Perldoc::BaseTo' => undef, #lib/Pod/Perldoc/BaseTo.pm
+ 'Pod::Perldoc::GetOptsOO'=> undef, #lib/Pod/Perldoc/GetOptsOO.pm
+ 'Pod::Perldoc::ToChecker'=> undef, #lib/Pod/Perldoc/ToChecker.pm
+ 'Pod::Perldoc::ToMan' => undef, #lib/Pod/Perldoc/ToMan.pm
+ 'Pod::Perldoc::ToNroff' => undef, #lib/Pod/Perldoc/ToNroff.pm
+ 'Pod::Perldoc::ToPod' => undef, #lib/Pod/Perldoc/ToPod.pm
+ 'Pod::Perldoc::ToRtf' => undef, #lib/Pod/Perldoc/ToRtf.pm
+ 'Pod::Perldoc::ToText' => undef, #lib/Pod/Perldoc/ToText.pm
+ 'Pod::Perldoc::ToTk' => 'undef', #lib/Pod/Perldoc/ToTk.pm
+ 'Pod::Perldoc::ToXml' => undef, #lib/Pod/Perldoc/ToXml.pm
+ 'Pod::Plainer' => '0.01', #lib/Pod/Plainer.pm
+ 'Pod::PlainText' => '2.02', #lib/Pod/PlainText.pm
+ 'Pod::Select' => '1.13', #lib/Pod/Select.pm
+ 'Pod::Text' => '2.21', #lib/Pod/Text.pm
+ 'Pod::Text::Color' => '1.04', #lib/Pod/Text/Color.pm
+ 'Pod::Text::Overstrike' => '1.1', #lib/Pod/Text/Overstrike.pm
+ 'Pod::Text::Termcap' => '1.11', #lib/Pod/Text/Termcap.pm
+ 'Pod::Usage' => '1.16', #lib/Pod/Usage.pm
+ 'POSIX' => '1.08', #lib/POSIX.pm
+ 're' => '0.04', #lib/re.pm
+ 'Safe' => '2.11', #lib/Safe.pm
+ 'Scalar::Util' => '1.14', #lib/Scalar/Util.pm
+ 'SDBM_File' => '1.04', #lib/SDBM_File.pm
+ 'Search::Dict' => '1.02', #lib/Search/Dict.pm
+ 'SelectSaver' => '1.00', #lib/SelectSaver.pm
+ 'SelfLoader' => '1.0904', #lib/SelfLoader.pm
+ 'Shell' => '0.6', #lib/Shell.pm
+ 'sigtrap' => '1.02', #lib/sigtrap.pm
+ 'Socket' => '1.77', #lib/Socket.pm
+ 'sort' => '1.02', #lib/sort.pm
+ 'Storable' => '2.13', #lib/Storable.pm
+ 'strict' => '1.03', #lib/strict.pm
+ 'subs' => '1.00', #lib/subs.pm
+ 'Switch' => '2.10', #lib/Switch.pm
+ 'Symbol' => '1.05', #lib/Symbol.pm
+ 'Sys::Hostname' => '1.11', #lib/Sys/Hostname.pm
+ 'Sys::Syslog' => '0.05', #lib/Sys/Syslog.pm
+ 'Term::ANSIColor' => '1.08', #lib/Term/ANSIColor.pm
+ 'Term::Cap' => '1.09', #lib/Term/Cap.pm
+ 'Term::Complete' => '1.401', #lib/Term/Complete.pm
+ 'Term::ReadLine' => '1.01', #lib/Term/ReadLine.pm
+ 'Test' => '1.25', #lib/Test.pm
+ 'Test::Builder' => '0.17', #lib/Test/Builder.pm
+ 'Test::Harness' => '2.42', #lib/Test/Harness.pm
+ 'Test::Harness::Assert' => '0.02', #lib/Test/Harness/Assert.pm
+ 'Test::Harness::Iterator'=> '0.02', #lib/Test/Harness/Iterator.pm
+ 'Test::Harness::Straps' => '0.19', #lib/Test/Harness/Straps.pm
+ 'Test::More' => '0.47', #lib/Test/More.pm
+ 'Test::Simple' => '0.47', #lib/Test/Simple.pm
+ 'Text::Abbrev' => '1.01', #lib/Text/Abbrev.pm
+ 'Text::Balanced' => '1.95', #lib/Text/Balanced.pm
+ 'Text::ParseWords' => '3.23', #lib/Text/ParseWords.pm
+ 'Text::Soundex' => '1.01', #lib/Text/Soundex.pm
+ 'Text::Tabs' => '98.112801', #lib/Text/Tabs.pm
+ 'Text::Wrap' => '2001.09292', #lib/Text/Wrap.pm
+ 'Thread' => '2.00', #lib/Thread.pm
+ 'Thread::Queue' => '2.00', #lib/Thread/Queue.pm
+ 'threads' => '1.05', #lib/threads.pm
+ 'Thread::Semaphore' => '2.01', #lib/Thread/Semaphore.pm
+ 'Thread::Signal' => '1.00', #ext/Thread/Thread/Signal.pm
+ 'Thread::Specific' => '1.00', #ext/Thread/Thread/Specific.pm
+ 'threads::shared' => '0.92', #lib/threads/shared.pm
+ 'Tie::Array' => '1.03', #lib/Tie/Array.pm
+ 'Tie::File' => '0.97', #lib/Tie/File.pm
+ 'Tie::Handle' => '4.1', #lib/Tie/Handle.pm
+ 'Tie::Hash' => '1.01', #lib/Tie/Hash.pm
+ 'Tie::Memoize' => '1.0', #lib/Tie/Memoize.pm
+ 'Tie::RefHash' => '1.31', #lib/Tie/RefHash.pm
+ 'Tie::Scalar' => '1.00', #lib/Tie/Scalar.pm
+ 'Tie::SubstrHash' => '1.00', #lib/Tie/SubstrHash.pm
+ 'Time::gmtime' => '1.02', #lib/Time/gmtime.pm
+ 'Time::HiRes' => '1.65', #lib/Time/HiRes.pm
+ 'Time::Local' => '1.10', #lib/Time/Local.pm
+ 'Time::localtime' => '1.02', #lib/Time/localtime.pm
+ 'Time::tm' => '1.00', #lib/Time/tm.pm
+ 'Unicode::Collate' => '0.40', #lib/Unicode/Collate.pm
+ 'Unicode::Normalize' => '0.30', #lib/Unicode/Normalize.pm
+ 'Unicode::UCD' => '0.22', #lib/Unicode/UCD.pm
+ 'UNIVERSAL' => '1.01', #lib/UNIVERSAL.pm
+ 'Unicode' => '4.0.1', # lib/unicore/version
+ 'User::grent' => '1.00', #lib/User/grent.pm
+ 'User::pwent' => '1.00', #lib/User/pwent.pm
+ 'utf8' => '1.04', #lib/utf8.pm
+ 'vars' => '1.01', #lib/vars.pm
+ 'VMS::DCLsym' => '1.02', #vms/ext/DCLsym/DCLsym.pm
+ 'VMS::Filespec' => '1.11', #vms/ext/Filespec.pm
+ 'vmsish' => '1.01', #lib/vmsish.pm
+ 'VMS::Stdio' => '2.3', #vms/ext/Stdio/Stdio.pm
+ 'warnings' => '1.03', #lib/warnings.pm
+ 'warnings::register' => '1.00', #lib/warnings/register.pm
+ 'XS::APItest' => '0.05', #lib/XS/APItest.pm
+ 'XSLoader' => '0.02', #lib/XSLoader.pm
+ 'XS::Typemap' => '0.01', #lib/XS/Typemap.pm
+ },
+
+ 5.009002 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_01',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04',
+ 'B' => '1.07',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.01',
+ 'B::C' => '1.04',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.64',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.69',
+ 'B::Disassembler' => '1.03',
+ 'B::Lint' => '1.03',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.02',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.05',
+ 'CGI' => '3.07',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.25',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.76_01',
+ 'CPAN::FirstTime' => '1.60 ',
+ 'CPAN::Nox' => '1.03',
+ 'Carp' => '1.04',
+ 'Carp::Heavy' => '1.04',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.05',
+ 'DB' => '1.0',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.811',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_04',
+ 'Devel::DProf' => '20030813.00',
+ 'Devel::PPPort' => '3.06',
+ 'Devel::Peek' => '1.02',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.10',
+ 'Digest::MD5' => '2.33',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '0.01',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.11',
+ 'DynaLoader' => '1.07',
+ 'Encode' => '2.09',
+ 'Encode::Alias' => '2.02',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.01',
+ 'Encode::Config' => '2.00',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.00',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.03',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.59',
+ 'Exporter::Heavy' => '5.59',
+ 'ExtUtils::Command' => '1.07',
+ 'ExtUtils::Command::MM' => '0.03_01',
+ 'ExtUtils::Constant' => '0.16',
+ 'ExtUtils::Constant::Base'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.01',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.32',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.04',
+ 'ExtUtils::MM_Any' => '0.10',
+ 'ExtUtils::MM_BeOS' => '1.04',
+ 'ExtUtils::MM_Cygwin' => '1.07',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.07',
+ 'ExtUtils::MM_OS2' => '1.04',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.46_01',
+ 'ExtUtils::MM_VMS' => '5.71',
+ 'ExtUtils::MM_Win32' => '1.10',
+ 'ExtUtils::MM_Win95' => '0.03',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.25',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.44',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.04',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.73',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.08',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.09',
+ 'File::Glob' => '1.04',
+ 'File::Path' => '1.06',
+ 'File::Spec' => '3.05',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.5',
+ 'File::Temp' => '0.16',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.04_01',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.78',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.44',
+ 'GDBM_File' => '1.07',
+ 'Getopt::Long' => '2.3401',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.21',
+ 'IO::Dir' => '1.04',
+ 'IO::File' => '1.10',
+ 'IO::Handle' => '1.24',
+ 'IO::Pipe' => '1.123',
+ 'IO::Poll' => '0.06',
+ 'IO::Seekable' => '1.09',
+ 'IO::Select' => '1.16',
+ 'IO::Socket' => '1.28',
+ 'IO::Socket::INET' => '1.27',
+ 'IO::Socket::UNIX' => '1.21',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.01',
+ 'IPC::Open3' => '1.0106',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.14',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.09',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.05',
+ 'MIME::QuotedPrint' => '3.03',
+ 'Math::BigFloat' => '1.49',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.75',
+ 'Math::BigInt::Calc' => '0.45',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.14',
+ 'Math::Complex' => '1.34',
+ 'Math::Trig' => '1.02',
+ 'Memoize' => '1.01_01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::CoreList' => '1.99',
+ 'NDBM_File' => '1.05',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.26',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.05',
+ 'Opcode' => '1.06',
+ 'POSIX' => '1.08',
+ 'PerlIO' => '1.03',
+ 'PerlIO::encoding' => '0.07',
+ 'PerlIO::scalar' => '0.02',
+ 'PerlIO::via' => '0.02',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.42',
+ 'Pod::Find' => '1.3',
+ 'Pod::Functions' => '1.02',
+ 'Pod::Html' => '1.0502',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.3',
+ 'Pod::Parser' => '1.3',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.3',
+ 'SDBM_File' => '1.04',
+ 'Safe' => '2.11',
+ 'Scalar::Util' => '1.14_1',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0904',
+ 'Shell' => '0.6',
+ 'Socket' => '1.77',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.14',
+ 'Switch' => '2.10',
+ 'Symbol' => '1.05',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.06',
+ 'Term::ANSIColor' => '1.09',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.01',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.22',
+ 'Test::Harness' => '2.46',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Straps' => '0.20_01',
+ 'Test::More' => '0.54',
+ 'Test::Simple' => '0.54',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95_01',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '98.112801',
+ 'Text::Wrap' => '2001.09292',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.01',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.66',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.02',
+ 'Unicode' => '4.0.1',
+ 'Unicode::Collate' => '0.40',
+ 'Unicode::Normalize' => '0.30',
+ 'Unicode::UCD' => '0.22',
+ 'User::grent' => '1.00',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.23',
+ 'XS::APItest' => '0.05',
+ 'XS::Typemap' => '0.01',
+ 'XSLoader' => '0.03',
+ 'XSSymSet' => '1.0',
+ 'assertions' => '0.01',
+ 'assertions::activate' => '0.01',
+ 'attributes' => '0.06',
+ 'attrs' => '1.01',
+ 'autouse' => '1.04',
+ 'base' => '2.06',
+ 'bigint' => '0.06',
+ 'bignum' => '0.16',
+ 'bigrat' => '0.07',
+ 'blib' => '1.02',
+ 'bytes' => '1.01',
+ 'charnames' => '1.04',
+ 'constant' => '1.05',
+ 'diagnostics' => '1.14',
+ 'encoding' => '2.01',
+ 'encoding::warnings' => '0.05',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.0401',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.04',
+ 'ops' => '1.00',
+ 'overload' => '1.03',
+ 're' => '0.05',
+ 'sigtrap' => '1.02',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.05',
+ 'threads::shared' => '0.92',
+ 'utf8' => '1.04',
+ 'vars' => '1.01',
+ 'version' => '0.42',
+ 'vmsish' => '1.01',
+ 'warnings' => '1.04',
+ 'warnings::register' => '1.00',
+ },
+
+ 5.008007 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_01',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04',
+ 'B' => '1.09',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.01',
+ 'B::C' => '1.04',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.65',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.7',
+ 'B::Disassembler' => '1.04',
+ 'B::Lint' => '1.03',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.05',
+ 'CGI' => '3.10',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.25',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.76_01',
+ 'CPAN::FirstTime' => '1.60 ',
+ 'CPAN::Nox' => '1.03',
+ 'Carp' => '1.04',
+ 'Carp::Heavy' => '1.04',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Cwd' => '3.05',
+ 'DB' => '1.0',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.811',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_04',
+ 'Devel::DProf' => '20050310.00',
+ 'Devel::PPPort' => '3.06',
+ 'Devel::Peek' => '1.02',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.10',
+ 'Digest::MD5' => '2.33',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '0.01',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.11',
+ 'DynaLoader' => '1.05',
+ 'Encode' => '2.10',
+ 'Encode::Alias' => '2.03',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.01',
+ 'Encode::Config' => '2.00',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.00',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.01',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.58',
+ 'Exporter::Heavy' => '5.58',
+ 'ExtUtils::Command' => '1.05',
+ 'ExtUtils::Command::MM' => '0.03',
+ 'ExtUtils::Constant' => '0.16',
+ 'ExtUtils::Constant::Base'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.01',
+ 'ExtUtils::Embed' => '1.250601',
+ 'ExtUtils::Install' => '1.32',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3001',
+ 'ExtUtils::MM' => '0.04',
+ 'ExtUtils::MM_Any' => '0.07',
+ 'ExtUtils::MM_BeOS' => '1.04',
+ 'ExtUtils::MM_Cygwin' => '1.06',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.07',
+ 'ExtUtils::MM_NW5' => '2.07_02',
+ 'ExtUtils::MM_OS2' => '1.04',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.42',
+ 'ExtUtils::MM_VMS' => '5.70',
+ 'ExtUtils::MM_Win32' => '1.09',
+ 'ExtUtils::MM_Win95' => '0.0301',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.17',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.42',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.03',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.73',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.08',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.09',
+ 'File::Glob' => '1.04',
+ 'File::Path' => '1.07',
+ 'File::Spec' => '3.05',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.5',
+ 'File::Temp' => '0.16',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.05',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.78',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.44',
+ 'GDBM_File' => '1.07',
+ 'Getopt::Long' => '2.34',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.21',
+ 'IO::Dir' => '1.04',
+ 'IO::File' => '1.11',
+ 'IO::Handle' => '1.24',
+ 'IO::Pipe' => '1.123',
+ 'IO::Poll' => '0.06',
+ 'IO::Seekable' => '1.09',
+ 'IO::Select' => '1.16',
+ 'IO::Socket' => '1.28',
+ 'IO::Socket::INET' => '1.28',
+ 'IO::Socket::UNIX' => '1.21',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.01',
+ 'IPC::Open3' => '1.0106',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.14',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.09',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.05',
+ 'MIME::QuotedPrint' => '3.03',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.34',
+ 'Math::Trig' => '1.02',
+ 'Memoize' => '1.01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'NDBM_File' => '1.05',
+ 'NEXT' => '0.60',
+ 'Net::Cmd' => '2.26',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.05',
+ 'Opcode' => '1.05',
+ 'POSIX' => '1.08',
+ 'PerlIO' => '1.03',
+ 'PerlIO::encoding' => '0.07',
+ 'PerlIO::scalar' => '0.02',
+ 'PerlIO::via' => '0.02',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.42',
+ 'Pod::Find' => '1.3',
+ 'Pod::Functions' => '1.02',
+ 'Pod::Html' => '1.0503',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.3',
+ 'Pod::Parser' => '1.3',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.3',
+ 'SDBM_File' => '1.04',
+ 'Safe' => '2.11',
+ 'Scalar::Util' => '1.14',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0904',
+ 'Shell' => '0.6',
+ 'Socket' => '1.77',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.13',
+ 'Switch' => '2.10',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.06',
+ 'Term::ANSIColor' => '1.09',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.01',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.22',
+ 'Test::Harness' => '2.48',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.23',
+ 'Test::More' => '0.54',
+ 'Test::Simple' => '0.54',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '98.112801',
+ 'Text::Wrap' => '2001.09293',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.01',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.66',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.01',
+ 'Unicode' => '4.1.0', # lib/unicore/version
+ 'Unicode::Collate' => '0.40',
+ 'Unicode::Normalize' => '0.32',
+ 'Unicode::UCD' => '0.23',
+ 'User::grent' => '1.00',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.24',
+ 'XS::APItest' => '0.06',
+ 'XS::Typemap' => '0.01',
+ 'XSLoader' => '0.02',
+ 'XSSymSet' => '1.0',
+ 'attributes' => '0.06',
+ 'attrs' => '1.01',
+ 'autouse' => '1.04',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.02',
+ 'bytes' => '1.02',
+ 'charnames' => '1.04',
+ 'constant' => '1.05',
+ 'diagnostics' => '1.14',
+ 'encoding' => '2.01',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.03',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.04',
+ 'ops' => '1.00',
+ 'overload' => '1.03',
+ 're' => '0.04',
+ 'sigtrap' => '1.02',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.05',
+ 'threads::shared' => '0.93',
+ 'utf8' => '1.05',
+ 'vars' => '1.01',
+ 'vmsish' => '1.01',
+ 'warnings' => '1.03',
+ 'warnings::register' => '1.00',
+ },
+
+ 5.009003 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Tar' => '1.26_01',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.78_02',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04_01',
+ 'B' => '1.10',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.01',
+ 'B::C' => '1.04',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.67',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.73',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.04',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.15_01',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.26',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.83_58',
+ 'CPAN::Debug' => '4.44',
+ 'CPAN::FirstTime' => '4.50',
+ 'CPAN::HandleConfig' => '4.31',
+ 'CPAN::Nox' => '2.31',
+ 'CPAN::Tarzip' => '3.36',
+ 'CPAN::Version' => '2.55',
+ 'Carp' => '1.05',
+ 'Carp::Heavy' => '1.05',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Zlib' => '2.000_07',
+ 'Compress::Zlib::Common'=> '2.000_07',
+ 'Compress::Zlib::Compress::Gzip::Constants'=> '2.000_07',
+ 'Compress::Zlib::Compress::Zip::Constants'=> '1.00',
+ 'Compress::Zlib::CompressPlugin::Deflate'=> '2.000_05',
+ 'Compress::Zlib::CompressPlugin::Identity'=> '2.000_05',
+ 'Compress::Zlib::File::GlobMapper'=> '0.000_02',
+ 'Compress::Zlib::FileConstants'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::Base'=> '2.000_05',
+ 'Compress::Zlib::IO::Compress::Deflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::Gzip'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::RawDeflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Compress::Zip'=> '2.000_04',
+ 'Compress::Zlib::IO::Uncompress::AnyInflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::AnyUncompress'=> '2.000_05',
+ 'Compress::Zlib::IO::Uncompress::Base'=> '2.000_05',
+ 'Compress::Zlib::IO::Uncompress::Gunzip'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::Inflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::RawInflate'=> '2.000_07',
+ 'Compress::Zlib::IO::Uncompress::Unzip'=> '2.000_05',
+ 'Compress::Zlib::ParseParameters'=> '2.000_07',
+ 'Compress::Zlib::UncompressPlugin::Identity'=> '2.000_05',
+ 'Compress::Zlib::UncompressPlugin::Inflate'=> '2.000_05',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.15',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.814',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_08',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::PPPort' => '3.08',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.14',
+ 'Digest::MD5' => '2.36',
+ 'Digest::SHA' => '5.32',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.07',
+ 'Encode' => '2.14',
+ 'Encode::Alias' => '2.04',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.02',
+ 'Encode::Config' => '2.01',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.02',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.01',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.59',
+ 'Exporter::Heavy' => '5.59',
+ 'ExtUtils::CBuilder' => '0.15',
+ 'ExtUtils::CBuilder::Base'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+ 'ExtUtils::Command' => '1.09',
+ 'ExtUtils::Command::MM' => '0.05_01',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.02',
+ 'ExtUtils::Constant::ProxySubs'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.33',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.05',
+ 'ExtUtils::MM_AIX' => '0.03',
+ 'ExtUtils::MM_Any' => '0.13_01',
+ 'ExtUtils::MM_BeOS' => '1.05',
+ 'ExtUtils::MM_Cygwin' => '1.08',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.08',
+ 'ExtUtils::MM_OS2' => '1.05',
+ 'ExtUtils::MM_QNX' => '0.02',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.50_01',
+ 'ExtUtils::MM_VMS' => '5.73',
+ 'ExtUtils::MM_VOS' => '0.02',
+ 'ExtUtils::MM_Win32' => '1.12',
+ 'ExtUtils::MM_Win95' => '0.04',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.30_01',
+ 'ExtUtils::MakeMaker::Config'=> '0.02',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.46',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::ParseXS' => '2.15_02',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.04',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.74',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.09',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.10',
+ 'File::Glob' => '1.05',
+ 'File::Path' => '1.08',
+ 'File::Spec' => '3.15',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.16_01',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.06',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.47',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.35',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.22',
+ 'IO::Dir' => '1.05',
+ 'IO::File' => '1.13_01',
+ 'IO::Handle' => '1.26',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.29_01',
+ 'IO::Socket::INET' => '1.29_02',
+ 'IO::Socket::UNIX' => '1.22_01',
+ 'IO::Zlib' => '1.04_02',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.18',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.10_01',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.10',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.35',
+ 'Math::Trig' => '1.03',
+ 'Memoize' => '1.01_01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::CoreList' => '2.02',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.06',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.26_01',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19_01',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31_04',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.06',
+ 'Opcode' => '1.08',
+ 'POSIX' => '1.10',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.09',
+ 'PerlIO::scalar' => '0.04',
+ 'PerlIO::via' => '0.03',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.0504',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.04',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.33',
+ 'Pod::Parser' => '1.32',
+ 'Pod::Perldoc' => '3.14_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Simple' => '3.04',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.01',
+ 'Pod::Text::Color' => '2.01',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.01',
+ 'Pod::Usage' => '1.33_01',
+ 'SDBM_File' => '1.05',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.18',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0905',
+ 'Shell' => '0.6',
+ 'Socket' => '1.78',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.15_02',
+ 'Switch' => '2.10_01',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.13',
+ 'Term::ANSIColor' => '1.10',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.32',
+ 'Test::Builder::Module' => '0.03',
+ 'Test::Builder::Tester' => '1.02',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.56',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::More' => '0.62',
+ 'Test::Simple' => '0.62',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95_01',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '2005.0824',
+ 'Text::Wrap' => '2005.082401',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_01',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.86',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.03',
+ 'Unicode' => '4.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '0.32',
+ 'Unicode::UCD' => '0.24',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.2601',
+ 'XS::APItest' => '0.09',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.06',
+ 'XSSymSet' => '1.0',
+ 'assertions' => '0.02',
+ 'assertions::activate' => '0.02',
+ 'assertions::compat' => undef,
+ 'attributes' => '0.06',
+ 'attrs' => '1.02',
+ 'autouse' => '1.05',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.03',
+ 'bytes' => '1.02',
+ 'charnames' => '1.05',
+ 'constant' => '1.07',
+ 'diagnostics' => '1.15',
+ 'encoding' => '2.02',
+ 'encoding::warnings' => '0.05',
+ 'feature' => '1.00',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.04',
+ 're' => '0.06',
+ 'sigtrap' => '1.02',
+ 'sort' => '2.00',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.07',
+ 'threads::shared' => '0.94',
+ 'utf8' => '1.06',
+ 'vars' => '1.01',
+ 'version' => '0.53',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.008008 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_02',
+ 'AutoLoader' => '5.60',
+ 'AutoSplit' => '1.04',
+ 'B' => '1.09_01',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02_01',
+ 'B::Bytecode' => '1.01_01',
+ 'B::C' => '1.04_01',
+ 'B::CC' => '1.00_01',
+ 'B::Concise' => '0.66',
+ 'B::Debug' => '1.02_01',
+ 'B::Deparse' => '0.71',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.03',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03_01',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.07',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.15',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.26',
+ 'CGI::Fast' => '1.05',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.76_02',
+ 'CPAN::FirstTime' => '1.60 ',
+ 'CPAN::Nox' => '1.03',
+ 'Carp' => '1.04',
+ 'Carp::Heavy' => '1.04',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Cwd' => '3.12',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.814',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_08',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::PPPort' => '3.06_01',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.14',
+ 'Digest::MD5' => '2.36',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.00',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.05',
+ 'Encode' => '2.12',
+ 'Encode::Alias' => '2.04',
+ 'Encode::Byte' => '2.00',
+ 'Encode::CJKConstants' => '2.00',
+ 'Encode::CN' => '2.00',
+ 'Encode::CN::HZ' => '2.01',
+ 'Encode::Config' => '2.01',
+ 'Encode::EBCDIC' => '2.00',
+ 'Encode::Encoder' => '2.00',
+ 'Encode::Encoding' => '2.02',
+ 'Encode::Guess' => '2.00',
+ 'Encode::JP' => '2.01',
+ 'Encode::JP::H2Z' => '2.00',
+ 'Encode::JP::JIS7' => '2.00',
+ 'Encode::KR' => '2.00',
+ 'Encode::KR::2022_KR' => '2.00',
+ 'Encode::MIME::Header' => '2.01',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.01',
+ 'Encode::Symbol' => '2.00',
+ 'Encode::TW' => '2.00',
+ 'Encode::Unicode' => '2.02',
+ 'Encode::Unicode::UTF7' => '2.01',
+ 'English' => '1.02',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.58',
+ 'Exporter::Heavy' => '5.58',
+ 'ExtUtils::Command' => '1.09',
+ 'ExtUtils::Command::MM' => '0.05',
+ 'ExtUtils::Constant' => '0.17',
+ 'ExtUtils::Constant::Base'=> '0.01',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.01',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.33',
+ 'ExtUtils::Installed' => '0.08',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.05',
+ 'ExtUtils::MM_AIX' => '0.03',
+ 'ExtUtils::MM_Any' => '0.13',
+ 'ExtUtils::MM_BeOS' => '1.05',
+ 'ExtUtils::MM_Cygwin' => '1.08',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.08',
+ 'ExtUtils::MM_OS2' => '1.05',
+ 'ExtUtils::MM_QNX' => '0.02',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.50',
+ 'ExtUtils::MM_VMS' => '5.73',
+ 'ExtUtils::MM_VOS' => '0.02',
+ 'ExtUtils::MM_Win32' => '1.12',
+ 'ExtUtils::MM_Win95' => '0.04',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.30',
+ 'ExtUtils::MakeMaker::Config'=> '0.02',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.46',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15',
+ 'ExtUtils::Mksymlists' => '1.19',
+ 'ExtUtils::Packlist' => '0.04',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.03',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.74',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1003',
+ 'File::Copy' => '2.09',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.10',
+ 'File::Glob' => '1.05',
+ 'File::Path' => '1.08',
+ 'File::Spec' => '3.12',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.16',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.06',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.47',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.35',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.05',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.22',
+ 'IO::Dir' => '1.05',
+ 'IO::File' => '1.13',
+ 'IO::Handle' => '1.25',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.29',
+ 'IO::Socket::INET' => '1.29',
+ 'IO::Socket::UNIX' => '1.22',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.18',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.09',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.35',
+ 'Math::Trig' => '1.03',
+ 'Memoize' => '1.01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'NDBM_File' => '1.06',
+ 'NEXT' => '0.60',
+ 'Net::Cmd' => '2.26',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.06',
+ 'Opcode' => '1.06',
+ 'POSIX' => '1.09',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.09',
+ 'PerlIO::scalar' => '0.04',
+ 'PerlIO::via' => '0.03',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.0504',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.33',
+ 'Pod::Parser' => '1.32',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.33',
+ 'SDBM_File' => '1.05',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.18',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0904',
+ 'Shell' => '0.6',
+ 'Socket' => '1.78',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.15',
+ 'Switch' => '2.10_01',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.13',
+ 'Term::ANSIColor' => '1.10',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.32',
+ 'Test::Builder::Module' => '0.02',
+ 'Test::Builder::Tester' => '1.02',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.56',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::More' => '0.62',
+ 'Test::Simple' => '0.62',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.95',
+ 'Text::ParseWords' => '3.24',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '2005.0824',
+ 'Text::Wrap' => '2005.082401',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.32',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.86',
+ 'Time::Local' => '1.11',
+ 'Time::gmtime' => '1.02',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.01',
+ 'Unicode' => '4.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '0.32',
+ 'Unicode::UCD' => '0.24',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.2601',
+ 'XS::APItest' => '0.08',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.06',
+ 'XSSymSet' => '1.0',
+ 'attributes' => '0.06',
+ 'attrs' => '1.02',
+ 'autouse' => '1.05',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.03',
+ 'bytes' => '1.02',
+ 'charnames' => '1.05',
+ 'constant' => '1.05',
+ 'diagnostics' => '1.15',
+ 'encoding' => '2.02',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.04',
+ 're' => '0.05',
+ 'sigtrap' => '1.02',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.07',
+ 'threads::shared' => '0.94',
+ 'utf8' => '1.06',
+ 'vars' => '1.01',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.009004 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Tar' => '1.30_01',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.78_02',
+ 'AutoLoader' => '5.61',
+ 'AutoSplit' => '1.04_01',
+ 'B' => '1.11',
+ 'B::Asmdata' => '1.01',
+ 'B::Assembler' => '0.07',
+ 'B::Bblock' => '1.02',
+ 'B::Bytecode' => '1.02',
+ 'B::C' => '1.05',
+ 'B::CC' => '1.00',
+ 'B::Concise' => '0.69',
+ 'B::Debug' => '1.02',
+ 'B::Deparse' => '0.76',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.08',
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.03',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.08',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.20',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.27',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5',
+ 'CPAN' => '1.87_55',
+ 'CPAN::Debug' => '5.400561',
+ 'CPAN::FirstTime' => '5.400742',
+ 'CPAN::HandleConfig' => '5.400740',
+ 'CPAN::Nox' => '5.400561',
+ 'CPAN::Tarzip' => '5.400714',
+ 'CPAN::Version' => '5.400561',
+ 'Carp' => '1.05',
+ 'Carp::Heavy' => '1.05',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Zlib' => '2.000_13',
+ 'Compress::Zlib' => '2.000_13',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.19',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.01',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.814',
+ 'DCLsym' => '1.02',
+ 'Data::Dumper' => '2.121_08',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::PPPort' => '3.10',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.36',
+ 'Digest::SHA' => '5.43',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.07',
+ 'Encode' => '2.18_01',
+ 'Encode::Alias' => '2.06',
+ 'Encode::Byte' => '2.02',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.04',
+ 'Encode::Config' => '2.03',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.04',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.02',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.04',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.03',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.09_01',
+ 'Exporter' => '5.59',
+ 'Exporter::Heavy' => '5.59',
+ 'ExtUtils::CBuilder' => '0.18',
+ 'ExtUtils::CBuilder::Base'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.12_01',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+ 'ExtUtils::Command' => '1.09',
+ 'ExtUtils::Command::MM' => '0.05_01',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.03',
+ 'ExtUtils::Constant::ProxySubs'=> '0.03',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.41',
+ 'ExtUtils::Installed' => '1.41',
+ 'ExtUtils::Liblist' => '1.01',
+ 'ExtUtils::Liblist::Kid'=> '1.3',
+ 'ExtUtils::MM' => '0.05',
+ 'ExtUtils::MM_AIX' => '0.03',
+ 'ExtUtils::MM_Any' => '0.13_02',
+ 'ExtUtils::MM_BeOS' => '1.05',
+ 'ExtUtils::MM_Cygwin' => '1.08',
+ 'ExtUtils::MM_DOS' => '0.02',
+ 'ExtUtils::MM_MacOS' => '1.08',
+ 'ExtUtils::MM_NW5' => '2.08_01',
+ 'ExtUtils::MM_OS2' => '1.05',
+ 'ExtUtils::MM_QNX' => '0.02',
+ 'ExtUtils::MM_UWIN' => '0.02',
+ 'ExtUtils::MM_Unix' => '1.5003',
+ 'ExtUtils::MM_VMS' => '5.73_03',
+ 'ExtUtils::MM_VOS' => '0.02',
+ 'ExtUtils::MM_Win32' => '1.12_02',
+ 'ExtUtils::MM_Win95' => '0.04_01',
+ 'ExtUtils::MY' => '0.01',
+ 'ExtUtils::MakeMaker' => '6.30_02',
+ 'ExtUtils::MakeMaker::Config'=> '0.02',
+ 'ExtUtils::MakeMaker::bytes'=> '0.01',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.01',
+ 'ExtUtils::Manifest' => '1.46_01',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.15_01',
+ 'ExtUtils::Mksymlists' => '1.19_01',
+ 'ExtUtils::Packlist' => '1.41',
+ 'ExtUtils::ParseXS' => '2.15_02',
+ 'ExtUtils::testlib' => '1.15',
+ 'Fatal' => '1.04',
+ 'Fcntl' => '1.05',
+ 'File::Basename' => '2.75',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.09',
+ 'File::DosGlob' => '1.00',
+ 'File::Find' => '1.11',
+ 'File::Glob' => '1.05',
+ 'File::GlobMapper' => '0.000_02',
+ 'File::Path' => '1.08',
+ 'File::Spec' => '3.19',
+ 'File::Spec::Cygwin' => '1.1',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.16_01',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0601',
+ 'FindBin' => '1.47',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.3501',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '0.01',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23_01',
+ 'IO::Compress::Adapter::Deflate'=> '2.000_13',
+ 'IO::Compress::Adapter::Identity'=> '2.000_13',
+ 'IO::Compress::Base' => '2.000_13',
+ 'IO::Compress::Base::Common'=> '2.000_13',
+ 'IO::Compress::Deflate' => '2.000_13',
+ 'IO::Compress::Gzip' => '2.000_13',
+ 'IO::Compress::Gzip::Constants'=> '2.000_13',
+ 'IO::Compress::RawDeflate'=> '2.000_13',
+ 'IO::Compress::Zip' => '2.000_13',
+ 'IO::Compress::Zip::Constants'=> '2.000_13',
+ 'IO::Compress::Zlib::Constants'=> '2.000_13',
+ 'IO::Compress::Zlib::Extra'=> '2.000_13',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30_01',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Identity'=> '2.000_13',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.000_13',
+ 'IO::Uncompress::AnyInflate'=> '2.000_13',
+ 'IO::Uncompress::AnyUncompress'=> '2.000_13',
+ 'IO::Uncompress::Base' => '2.000_13',
+ 'IO::Uncompress::Gunzip'=> '2.000_13',
+ 'IO::Uncompress::Inflate'=> '2.000_13',
+ 'IO::Uncompress::RawInflate'=> '2.000_13',
+ 'IO::Uncompress::Unzip' => '2.000_13',
+ 'IO::Zlib' => '1.04_02',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.18',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.10_01',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07_01',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.51',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.77',
+ 'Math::BigInt::Calc' => '0.47',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.10',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.15',
+ 'Math::Complex' => '1.36',
+ 'Math::Trig' => '1.04',
+ 'Memoize' => '1.01_01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.2805',
+ 'Module::Build::Base' => undef,
+ 'Module::Build::Compat' => '0.03',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::ModuleInfo'=> undef,
+ 'Module::Build::Notes' => undef,
+ 'Module::Build::PPMMaker'=> undef,
+ 'Module::Build::Platform::Amiga'=> undef,
+ 'Module::Build::Platform::Default'=> undef,
+ 'Module::Build::Platform::EBCDIC'=> undef,
+ 'Module::Build::Platform::MPEiX'=> undef,
+ 'Module::Build::Platform::MacOS'=> undef,
+ 'Module::Build::Platform::RiscOS'=> undef,
+ 'Module::Build::Platform::Unix'=> undef,
+ 'Module::Build::Platform::VMS'=> undef,
+ 'Module::Build::Platform::VOS'=> undef,
+ 'Module::Build::Platform::Windows'=> undef,
+ 'Module::Build::Platform::aix'=> undef,
+ 'Module::Build::Platform::cygwin'=> undef,
+ 'Module::Build::Platform::darwin'=> undef,
+ 'Module::Build::Platform::os2'=> undef,
+ 'Module::Build::PodParser'=> undef,
+ 'Module::Build::Version'=> '0',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.08',
+ 'Module::Load' => '0.10',
+ 'Module::Loaded' => '0.01',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.06',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.26_01',
+ 'Net::Config' => '1.10',
+ 'Net::Domain' => '2.19_01',
+ 'Net::FTP' => '2.75',
+ 'Net::FTP::A' => '1.16',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.23',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.28',
+ 'Net::Ping' => '2.31_04',
+ 'Net::SMTP' => '2.29',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.06',
+ 'Opcode' => '1.08',
+ 'POSIX' => '1.10',
+ 'Package::Constants' => '0.01',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.09',
+ 'PerlIO::scalar' => '0.04',
+ 'PerlIO::via' => '0.03',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.07',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.09',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.33',
+ 'Pod::Parser' => '1.32',
+ 'Pod::Perldoc' => '3.14_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.3',
+ 'Pod::Simple' => '3.04',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.07',
+ 'Pod::Text::Color' => '2.03',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.03',
+ 'Pod::Usage' => '1.33_01',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.18',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.0905',
+ 'Shell' => '0.7',
+ 'Socket' => '1.78',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.15_02',
+ 'Switch' => '2.10_01',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.17',
+ 'Term::ANSIColor' => '1.11',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.33',
+ 'Test::Builder::Module' => '0.03',
+ 'Test::Builder::Tester' => '1.04',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.62',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.64',
+ 'Test::Simple' => '0.64',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.98_01',
+ 'Text::ParseWords' => '3.25',
+ 'Text::Soundex' => '1.01',
+ 'Text::Tabs' => '2007.071101',
+ 'Text::Wrap' => '2006.0711',
+ 'Thread' => '2.00',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_01',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Memoize' => '1.0',
+ 'Tie::RefHash' => '1.34_01',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.87',
+ 'Time::Local' => '1.13',
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.04',
+ 'Unicode' => '4.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.01',
+ 'Unicode::UCD' => '0.24',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.2601',
+ 'Win32API::File' => '0.1001',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'XS::APItest' => '0.09',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.06',
+ 'XSSymSet' => '1.0',
+ 'assertions' => '0.03',
+ 'assertions::activate' => '0.02',
+ 'assertions::compat' => '0.02',
+ 'attributes' => '0.06',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.07',
+ 'bigint' => '0.07',
+ 'bignum' => '0.17',
+ 'bigrat' => '0.08',
+ 'blib' => '1.03',
+ 'bytes' => '1.02',
+ 'charnames' => '1.05',
+ 'constant' => '1.07',
+ 'diagnostics' => '1.16',
+ 'encoding' => '2.04',
+ 'encoding::warnings' => '0.10',
+ 'feature' => '1.01',
+ 'fields' => '2.03',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.04',
+ 're' => '0.0601',
+ 'sigtrap' => '1.02',
+ 'sort' => '2.00',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.38',
+ 'threads::shared' => '0.94_01',
+ 'utf8' => '1.06',
+ 'vars' => '1.01',
+ 'version' => '0.67',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.009005 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Extract' => '0.22_01',
+ 'Archive::Tar' => '1.32',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.78_06',
+ 'AutoLoader' => '5.63',
+ 'AutoSplit' => '1.05',
+ 'B' => '1.16',
+ 'B::Concise' => '0.72',
+ 'B::Debug' => '1.05',
+ 'B::Deparse' => '0.82',
+ 'B::Lint' => '1.09',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.1',
+ 'CGI' => '3.29',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.28',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9102',
+ 'CPAN::Debug' => '5.400955',
+ 'CPAN::FirstTime' => '5.401669',
+ 'CPAN::HandleConfig' => '5.401744',
+ 'CPAN::Kwalify' => '5.401418',
+ 'CPAN::Nox' => '5.400844',
+ 'CPAN::Queue' => '5.401704',
+ 'CPAN::Tarzip' => '5.401717',
+ 'CPAN::Version' => '5.401387',
+ 'CPANPLUS' => '0.81_01',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Base' => '0.01',
+ 'CPANPLUS::Dist::Build' => '0.06_01',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.01',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.81_01',
+ 'CPANPLUS::Internals::Constants'=> '0.01',
+ 'CPANPLUS::Internals::Constants::Report'=> '0.01',
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.81_01',
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'CPANPLUS::inc' => undef,
+ 'Carp' => '1.07',
+ 'Carp::Heavy' => '1.07',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Zlib' => '2.005',
+ 'Compress::Zlib' => '2.005',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.25',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.815',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.121_13',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.11_01',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.36_01',
+ 'Digest::SHA' => '5.44',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.08',
+ 'Encode' => '2.23',
+ 'Encode::Alias' => '2.07',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.04',
+ 'Encode::Config' => '2.04',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.00',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.03',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.05',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.05',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.10',
+ 'Exporter' => '5.60',
+ 'Exporter::Heavy' => '5.60',
+ 'ExtUtils::CBuilder' => '0.19',
+ 'ExtUtils::CBuilder::Base'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.13',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+ 'ExtUtils::Command' => '1.13',
+ 'ExtUtils::Command::MM' => '0.07',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.03',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.26',
+ 'ExtUtils::Install' => '1.41_01',
+ 'ExtUtils::Installed' => '1.41',
+ 'ExtUtils::Liblist' => '1.03',
+ 'ExtUtils::Liblist::Kid'=> '1.33',
+ 'ExtUtils::MM' => '0.07',
+ 'ExtUtils::MM_AIX' => '0.05',
+ 'ExtUtils::MM_Any' => '0.15',
+ 'ExtUtils::MM_BeOS' => '1.07',
+ 'ExtUtils::MM_Cygwin' => '1.1',
+ 'ExtUtils::MM_DOS' => '0.04',
+ 'ExtUtils::MM_MacOS' => '1.1',
+ 'ExtUtils::MM_NW5' => '2.1',
+ 'ExtUtils::MM_OS2' => '1.07',
+ 'ExtUtils::MM_QNX' => '0.04',
+ 'ExtUtils::MM_UWIN' => '0.04',
+ 'ExtUtils::MM_Unix' => '1.54_01',
+ 'ExtUtils::MM_VMS' => '5.76',
+ 'ExtUtils::MM_VOS' => '0.04',
+ 'ExtUtils::MM_Win32' => '1.15',
+ 'ExtUtils::MM_Win95' => '0.06',
+ 'ExtUtils::MY' => '0.03',
+ 'ExtUtils::MakeMaker' => '6.36',
+ 'ExtUtils::MakeMaker::Config'=> '0.04',
+ 'ExtUtils::MakeMaker::bytes'=> '0.03',
+ 'ExtUtils::MakeMaker::vmsish'=> '0.03',
+ 'ExtUtils::Manifest' => '1.51_01',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '1.17',
+ 'ExtUtils::Mksymlists' => '1.21',
+ 'ExtUtils::Packlist' => '1.41',
+ 'ExtUtils::ParseXS' => '2.18',
+ 'ExtUtils::testlib' => '1.17',
+ 'Fatal' => '1.05',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.76',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.10',
+ 'File::DosGlob' => '1.00',
+ 'File::Fetch' => '0.10',
+ 'File::Find' => '1.11',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '0.000_02',
+ 'File::Path' => '2.01',
+ 'File::Spec' => '3.25',
+ 'File::Spec::Cygwin' => '1.1_01',
+ 'File::Spec::Epoc' => '1.1',
+ 'File::Spec::Functions' => '1.3',
+ 'File::Spec::Mac' => '1.4',
+ 'File::Spec::OS2' => '1.2',
+ 'File::Spec::Unix' => '1.5',
+ 'File::Spec::VMS' => '1.4_01',
+ 'File::Spec::Win32' => '1.6',
+ 'File::Temp' => '0.18',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.0602',
+ 'FindBin' => '1.49',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.36',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.01',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23_01',
+ 'IO::Compress::Adapter::Deflate'=> '2.005',
+ 'IO::Compress::Adapter::Identity'=> '2.005',
+ 'IO::Compress::Base' => '2.005',
+ 'IO::Compress::Base::Common'=> '2.005',
+ 'IO::Compress::Deflate' => '2.005',
+ 'IO::Compress::Gzip' => '2.005',
+ 'IO::Compress::Gzip::Constants'=> '2.005',
+ 'IO::Compress::RawDeflate'=> '2.005',
+ 'IO::Compress::Zip' => '2.005',
+ 'IO::Compress::Zip::Constants'=> '2.005',
+ 'IO::Compress::Zlib::Constants'=> '2.005',
+ 'IO::Compress::Zlib::Extra'=> '2.005',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30_01',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Identity'=> '2.005',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.005',
+ 'IO::Uncompress::AnyInflate'=> '2.005',
+ 'IO::Uncompress::AnyUncompress'=> '2.005',
+ 'IO::Uncompress::Base' => '2.005',
+ 'IO::Uncompress::Gunzip'=> '2.005',
+ 'IO::Uncompress::Inflate'=> '2.005',
+ 'IO::Uncompress::RawInflate'=> '2.005',
+ 'IO::Uncompress::Unzip' => '2.005',
+ 'IO::Zlib' => '1.05_01',
+ 'IPC::Cmd' => '0.36_01',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.04',
+ 'List::Util' => '1.19',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.10_01',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.18',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.01',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.0201',
+ 'MIME::Base64' => '3.07_01',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.58',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.87',
+ 'Math::BigInt::Calc' => '0.51',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.15_01',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.19',
+ 'Math::Complex' => '1.37',
+ 'Math::Trig' => '1.04',
+ 'Memoize' => '1.01_02',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.2808',
+ 'Module::Build::Base' => undef,
+ 'Module::Build::Compat' => '0.03',
+ 'Module::Build::Config' => undef,
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::ModuleInfo'=> undef,
+ 'Module::Build::Notes' => undef,
+ 'Module::Build::PPMMaker'=> undef,
+ 'Module::Build::Platform::Amiga'=> undef,
+ 'Module::Build::Platform::Default'=> undef,
+ 'Module::Build::Platform::EBCDIC'=> undef,
+ 'Module::Build::Platform::MPEiX'=> undef,
+ 'Module::Build::Platform::MacOS'=> undef,
+ 'Module::Build::Platform::RiscOS'=> undef,
+ 'Module::Build::Platform::Unix'=> undef,
+ 'Module::Build::Platform::VMS'=> undef,
+ 'Module::Build::Platform::VOS'=> undef,
+ 'Module::Build::Platform::Windows'=> undef,
+ 'Module::Build::Platform::aix'=> undef,
+ 'Module::Build::Platform::cygwin'=> undef,
+ 'Module::Build::Platform::darwin'=> undef,
+ 'Module::Build::Platform::os2'=> undef,
+ 'Module::Build::PodParser'=> undef,
+ 'Module::Build::Version'=> '0.7203',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.12',
+ 'Module::Load' => '0.10',
+ 'Module::Load::Conditional'=> '0.16',
+ 'Module::Loaded' => '0.01',
+ 'Module::Pluggable' => '3.6',
+ 'Module::Pluggable::Object'=> '3.6',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.07',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.28',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.31_04',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.32',
+ 'Opcode' => '1.09',
+ 'POSIX' => '1.13',
+ 'Package::Constants' => '0.01',
+ 'Params::Check' => '0.26',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.10',
+ 'PerlIO::scalar' => '0.05',
+ 'PerlIO::via' => '0.04',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.08',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.12',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.35',
+ 'Pod::Parser' => '1.35',
+ 'Pod::Perldoc' => '3.14_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.35',
+ 'Pod::Simple' => '3.05',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.08',
+ 'Pod::Text::Color' => '2.03',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.03',
+ 'Pod::Usage' => '1.35',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.19',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.11',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.79',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.16',
+ 'Switch' => '2.13',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.18_01',
+ 'Term::ANSIColor' => '1.12',
+ 'Term::Cap' => '1.09',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.02',
+ 'Term::UI' => '0.14_01',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.70',
+ 'Test::Builder::Module' => '0.68',
+ 'Test::Builder::Tester' => '1.07',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.64',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Results'=> '0.01',
+ 'Test::Harness::Straps' => '0.26',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.70',
+ 'Test::Simple' => '0.70',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.0.0',
+ 'Text::ParseWords' => '3.25',
+ 'Text::Soundex' => '3.02',
+ 'Text::Tabs' => '2007.1117',
+ 'Text::Wrap' => '2006.1117',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.37',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9707',
+ 'Time::Local' => '1.17',
+ 'Time::Piece' => '1.11_02',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.04',
+ 'Unicode' => '5.0.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.02',
+ 'Unicode::UCD' => '0.25',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.30',
+ 'Win32API::File' => '0.1001_01',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.12',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.08',
+ 'XSSymSet' => '1.1',
+ 'attributes' => '0.08',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.12',
+ 'bigint' => '0.22',
+ 'bignum' => '0.22',
+ 'bigrat' => '0.22',
+ 'blib' => '1.03',
+ 'bytes' => '1.03',
+ 'charnames' => '1.06',
+ 'constant' => '1.10',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.06',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.10',
+ 'fields' => '2.12',
+ 'filetest' => '1.01',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'mro' => '1.00',
+ 'open' => '1.05',
+ 'ops' => '1.01',
+ 'overload' => '1.06',
+ 're' => '0.08',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.63',
+ 'threads::shared' => '1.12',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.7203',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.06',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.010000 => {
+ 'AnyDBM_File' => '1.00',
+ 'Archive::Extract' => '0.24',
+ 'Archive::Tar' => '1.38',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.79',
+ 'AutoLoader' => '5.63',
+ 'AutoSplit' => '1.05',
+ 'B' => '1.17',
+ 'B::Concise' => '0.74',
+ 'B::Debug' => '1.05',
+ 'B::Deparse' => '0.83',
+ 'B::Lint' => '1.09',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.1',
+ 'CGI' => '3.29',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.29',
+ 'CGI::Cookie' => '1.28',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9205',
+ 'CPAN::API::HOWTO' => undef,
+ 'CPAN::Debug' => '5.402212',
+ 'CPAN::DeferedCode' => '5.50',
+ 'CPAN::FirstTime' => '5.402229',
+ 'CPAN::HandleConfig' => '5.402212',
+ 'CPAN::Kwalify' => '5.401418',
+ 'CPAN::Nox' => '5.402411',
+ 'CPAN::Queue' => '5.402212',
+ 'CPAN::Tarzip' => '5.402213',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.84',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Base' => '0.01',
+ 'CPANPLUS::Dist::Build' => '0.06_02',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.01',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.84',
+ 'CPANPLUS::Internals::Constants'=> '0.01',
+ 'CPANPLUS::Internals::Constants::Report'=> '0.01',
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.84',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'CPANPLUS::inc' => undef,
+ 'Carp' => '1.08',
+ 'Carp::Heavy' => '1.08',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Zlib' => '2.008',
+ 'Compress::Zlib' => '2.008',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.2501',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.01',
+ 'DBM_Filter::encode' => '0.01',
+ 'DBM_Filter::int32' => '0.01',
+ 'DBM_Filter::null' => '0.01',
+ 'DBM_Filter::utf8' => '0.01',
+ 'DB_File' => '1.816_1',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.121_14',
+ 'Devel::DProf' => '20050603.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.13',
+ 'Devel::Peek' => '1.03',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.36_01',
+ 'Digest::SHA' => '5.45',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.01',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.08',
+ 'Encode' => '2.23',
+ 'Encode::Alias' => '2.07',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.04',
+ 'Encode::Config' => '2.04',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.00',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.03',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.05',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.05',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.10',
+ 'Exporter' => '5.62',
+ 'Exporter::Heavy' => '5.62',
+ 'ExtUtils::CBuilder' => '0.21',
+ 'ExtUtils::CBuilder::Base'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.22',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.21',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.21',
+ 'ExtUtils::Command' => '1.13',
+ 'ExtUtils::Command::MM' => '6.42',
+ 'ExtUtils::Constant' => '0.2',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.05',
+ 'ExtUtils::Constant::Utils'=> '0.01',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.27',
+ 'ExtUtils::Install' => '1.44',
+ 'ExtUtils::Installed' => '1.43',
+ 'ExtUtils::Liblist' => '6.42',
+ 'ExtUtils::Liblist::Kid'=> '6.42',
+ 'ExtUtils::MM' => '6.42',
+ 'ExtUtils::MM_AIX' => '6.42',
+ 'ExtUtils::MM_Any' => '6.42',
+ 'ExtUtils::MM_BeOS' => '6.42',
+ 'ExtUtils::MM_Cygwin' => '6.42',
+ 'ExtUtils::MM_DOS' => '6.42',
+ 'ExtUtils::MM_MacOS' => '6.42',
+ 'ExtUtils::MM_NW5' => '6.42',
+ 'ExtUtils::MM_OS2' => '6.42',
+ 'ExtUtils::MM_QNX' => '6.42',
+ 'ExtUtils::MM_UWIN' => '6.42',
+ 'ExtUtils::MM_Unix' => '6.42',
+ 'ExtUtils::MM_VMS' => '6.42',
+ 'ExtUtils::MM_VOS' => '6.42',
+ 'ExtUtils::MM_Win32' => '6.42',
+ 'ExtUtils::MM_Win95' => '6.42',
+ 'ExtUtils::MY' => '6.42',
+ 'ExtUtils::MakeMaker' => '6.42',
+ 'ExtUtils::MakeMaker::Config'=> '6.42',
+ 'ExtUtils::MakeMaker::bytes'=> '6.42',
+ 'ExtUtils::MakeMaker::vmsish'=> '6.42',
+ 'ExtUtils::Manifest' => '1.51_01',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.42',
+ 'ExtUtils::Mksymlists' => '6.42',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.18_02',
+ 'ExtUtils::testlib' => '6.42',
+ 'Fatal' => '1.05',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.76',
+ 'File::CheckTree' => '4.3',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.11',
+ 'File::DosGlob' => '1.00',
+ 'File::Fetch' => '0.14',
+ 'File::Find' => '1.12',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '0.000_02',
+ 'File::Path' => '2.04',
+ 'File::Spec' => '3.2501',
+ 'File::Spec::Cygwin' => '3.2501',
+ 'File::Spec::Epoc' => '3.2501',
+ 'File::Spec::Functions' => '3.2501',
+ 'File::Spec::Mac' => '3.2501',
+ 'File::Spec::OS2' => '3.2501',
+ 'File::Spec::Unix' => '3.2501',
+ 'File::Spec::VMS' => '3.2501',
+ 'File::Spec::Win32' => '3.2501',
+ 'File::Temp' => '0.18',
+ 'File::stat' => '1.00',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.82',
+ 'Filter::Util::Call' => '1.07',
+ 'FindBin' => '1.49',
+ 'GDBM_File' => '1.08',
+ 'Getopt::Long' => '2.37',
+ 'Getopt::Std' => '1.05',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.03',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23_01',
+ 'IO::Compress::Adapter::Deflate'=> '2.008',
+ 'IO::Compress::Adapter::Identity'=> '2.008',
+ 'IO::Compress::Base' => '2.008',
+ 'IO::Compress::Base::Common'=> '2.008',
+ 'IO::Compress::Deflate' => '2.008',
+ 'IO::Compress::Gzip' => '2.008',
+ 'IO::Compress::Gzip::Constants'=> '2.008',
+ 'IO::Compress::RawDeflate'=> '2.008',
+ 'IO::Compress::Zip' => '2.008',
+ 'IO::Compress::Zip::Constants'=> '2.008',
+ 'IO::Compress::Zlib::Constants'=> '2.008',
+ 'IO::Compress::Zlib::Extra'=> '2.008',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30_01',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Identity'=> '2.008',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.008',
+ 'IO::Uncompress::AnyInflate'=> '2.008',
+ 'IO::Uncompress::AnyUncompress'=> '2.008',
+ 'IO::Uncompress::Base' => '2.008',
+ 'IO::Uncompress::Gunzip'=> '2.008',
+ 'IO::Uncompress::Inflate'=> '2.008',
+ 'IO::Uncompress::RawInflate'=> '2.008',
+ 'IO::Uncompress::Unzip' => '2.008',
+ 'IO::Zlib' => '1.07',
+ 'IPC::Cmd' => '0.40_1',
+ 'IPC::Msg' => '1.02',
+ 'IPC::Open2' => '1.02',
+ 'IPC::Open3' => '1.02',
+ 'IPC::Semaphore' => '1.02',
+ 'IPC::SysV' => '1.05',
+ 'List::Util' => '1.19',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.12',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.18',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.01',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.04',
+ 'MIME::Base64' => '3.07_01',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.59',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.88',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.16',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.21',
+ 'Math::Complex' => '1.37',
+ 'Math::Trig' => '1.04',
+ 'Memoize' => '1.01_02',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.2808_01',
+ 'Module::Build::Base' => '0.2808_01',
+ 'Module::Build::Compat' => '0.2808_01',
+ 'Module::Build::Config' => '0.2808_01',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::Dumper' => undef,
+ 'Module::Build::ModuleInfo'=> '0.2808_01',
+ 'Module::Build::Notes' => '0.2808_01',
+ 'Module::Build::PPMMaker'=> '0.2808_01',
+ 'Module::Build::Platform::Amiga'=> '0.2808_01',
+ 'Module::Build::Platform::Default'=> '0.2808_01',
+ 'Module::Build::Platform::EBCDIC'=> '0.2808_01',
+ 'Module::Build::Platform::MPEiX'=> '0.2808_01',
+ 'Module::Build::Platform::MacOS'=> '0.2808_01',
+ 'Module::Build::Platform::RiscOS'=> '0.2808_01',
+ 'Module::Build::Platform::Unix'=> '0.2808_01',
+ 'Module::Build::Platform::VMS'=> '0.2808_01',
+ 'Module::Build::Platform::VOS'=> '0.2808_01',
+ 'Module::Build::Platform::Windows'=> '0.2808_01',
+ 'Module::Build::Platform::aix'=> '0.2808_01',
+ 'Module::Build::Platform::cygwin'=> '0.2808_01',
+ 'Module::Build::Platform::darwin'=> '0.2808_01',
+ 'Module::Build::Platform::os2'=> '0.2808_01',
+ 'Module::Build::PodParser'=> '0.2808_01',
+ 'Module::Build::Version'=> '0.7203',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.12',
+ 'Module::Load' => '0.12',
+ 'Module::Load::Conditional'=> '0.22',
+ 'Module::Loaded' => '0.01',
+ 'Module::Pluggable' => '3.6',
+ 'Module::Pluggable::Object'=> '3.6',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.07',
+ 'NEXT' => '0.60_01',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.33',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.00',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.32',
+ 'Opcode' => '1.11',
+ 'POSIX' => '1.13',
+ 'Package::Constants' => '0.01',
+ 'Params::Check' => '0.26',
+ 'PerlIO' => '1.04',
+ 'PerlIO::encoding' => '0.10',
+ 'PerlIO::scalar' => '0.05',
+ 'PerlIO::via' => '0.04',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43_01',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.08',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.16',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.35',
+ 'Pod::Parser' => '1.35',
+ 'Pod::Perldoc' => '3.14_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.35',
+ 'Pod::Simple' => '3.05',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.08',
+ 'Pod::Text::Color' => '2.03',
+ 'Pod::Text::Overstrike' => '2',
+ 'Pod::Text::Termcap' => '2.03',
+ 'Pod::Usage' => '1.35',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.12',
+ 'Scalar::Util' => '1.19',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.11',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.80',
+ 'Stdio' => '2.3',
+ 'Storable' => '2.18',
+ 'Switch' => '2.13',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.22',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'Term::ANSIColor' => '1.12',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.03',
+ 'Term::UI' => '0.18',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.72',
+ 'Test::Builder::Module' => '0.72',
+ 'Test::Builder::Tester' => '1.09',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.64',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Results'=> '0.01',
+ 'Test::Harness::Straps' => '0.26_01',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.72',
+ 'Test::Simple' => '0.72',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.0.0',
+ 'Text::ParseWords' => '3.26',
+ 'Text::Soundex' => '3.03',
+ 'Text::Tabs' => '2007.1117',
+ 'Text::Wrap' => '2006.1117',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.00',
+ 'Thread::Semaphore' => '2.01',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.1',
+ 'Tie::Hash' => '1.02',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.37',
+ 'Tie::Scalar' => '1.00',
+ 'Tie::StdHandle' => undef,
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9711',
+ 'Time::Local' => '1.18',
+ 'Time::Piece' => '1.12',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.04',
+ 'Unicode' => '5.0.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.02',
+ 'Unicode::UCD' => '0.25',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.34',
+ 'Win32API::File' => '0.1001_01',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.12',
+ 'XS::Typemap' => '0.02',
+ 'XSLoader' => '0.08',
+ 'XSSymSet' => '1.1',
+ 'attributes' => '0.08',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.13',
+ 'bigint' => '0.22',
+ 'bignum' => '0.22',
+ 'bigrat' => '0.22',
+ 'blib' => '1.03',
+ 'bytes' => '1.03',
+ 'charnames' => '1.06',
+ 'constant' => '1.13',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.06',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.11',
+ 'fields' => '2.13',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.5565',
+ 'locale' => '1.00',
+ 'mro' => '1.00',
+ 'open' => '1.06',
+ 'ops' => '1.01',
+ 'overload' => '1.06',
+ 're' => '0.08',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.67',
+ 'threads::shared' => '1.14',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.74',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.06',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.008009 => {
+ 'AnyDBM_File' => '1.00',
+ 'Attribute::Handlers' => '0.78_03',
+ 'AutoLoader' => '5.67',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.19',
+ 'B::Asmdata' => '1.02',
+ 'B::Assembler' => '0.08',
+ 'B::Bblock' => '1.02_01',
+ 'B::Bytecode' => '1.01_01',
+ 'B::C' => '1.05',
+ 'B::CC' => '1.00_01',
+ 'B::Concise' => '0.76',
+ 'B::Debug' => '1.05',
+ 'B::Deparse' => '0.87',
+ 'B::Disassembler' => '1.05',
+ 'B::Lint' => '1.11',
+ 'B::Lint::Debug' => undef,
+ 'B::Showlex' => '1.02',
+ 'B::Stackobj' => '1.00',
+ 'B::Stash' => '1.00',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.01',
+ 'Benchmark' => '1.1',
+ 'ByteLoader' => '0.06',
+ 'CGI' => '3.42',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.30_01',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9301',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferedCode' => '5.50',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::FirstTime' => '5.5_01',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Tarzip' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'Carp' => '1.10',
+ 'Carp::Heavy' => '1.10',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Config' => undef,
+ 'Cwd' => '3.29',
+ 'DB' => '1.01',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.817',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.121_17',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.14',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.15',
+ 'Digest::MD5' => '2.37',
+ 'Digest::base' => '1.00',
+ 'Digest::file' => '1.00',
+ 'DirHandle' => '1.02',
+ 'Dumpvalue' => '1.12',
+ 'DynaLoader' => '1.09',
+ 'Encode' => '2.26',
+ 'Encode::Alias' => '2.10',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.02',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.05',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.05',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.03',
+ 'Env' => '1.00',
+ 'Errno' => '1.10',
+ 'Exporter' => '5.63',
+ 'Exporter::Heavy' => '5.63',
+ 'ExtUtils::Command' => '1.15',
+ 'ExtUtils::Command::MM' => '6.48',
+ 'ExtUtils::Constant' => '0.21',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.02',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.50_01',
+ 'ExtUtils::Installed' => '1.43',
+ 'ExtUtils::Liblist' => '6.48',
+ 'ExtUtils::Liblist::Kid'=> '6.48',
+ 'ExtUtils::MM' => '6.48',
+ 'ExtUtils::MM_AIX' => '6.48',
+ 'ExtUtils::MM_Any' => '6.48',
+ 'ExtUtils::MM_BeOS' => '6.48',
+ 'ExtUtils::MM_Cygwin' => '6.48',
+ 'ExtUtils::MM_DOS' => '6.48',
+ 'ExtUtils::MM_Darwin' => '6.48',
+ 'ExtUtils::MM_MacOS' => '6.48',
+ 'ExtUtils::MM_NW5' => '6.48',
+ 'ExtUtils::MM_OS2' => '6.48',
+ 'ExtUtils::MM_QNX' => '6.48',
+ 'ExtUtils::MM_UWIN' => '6.48',
+ 'ExtUtils::MM_Unix' => '6.48',
+ 'ExtUtils::MM_VMS' => '6.48',
+ 'ExtUtils::MM_VOS' => '6.48',
+ 'ExtUtils::MM_Win32' => '6.48',
+ 'ExtUtils::MM_Win95' => '6.48',
+ 'ExtUtils::MY' => '6.48',
+ 'ExtUtils::MakeMaker' => '6.48',
+ 'ExtUtils::MakeMaker::Config'=> '6.48',
+ 'ExtUtils::MakeMaker::bytes'=> '6.48',
+ 'ExtUtils::MakeMaker::vmsish'=> '6.48',
+ 'ExtUtils::Manifest' => '1.55',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.48',
+ 'ExtUtils::Mksymlists' => '6.48',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.19',
+ 'ExtUtils::testlib' => '6.48',
+ 'Fatal' => '1.06',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.77',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1005',
+ 'File::Copy' => '2.13',
+ 'File::DosGlob' => '1.01',
+ 'File::Find' => '1.13',
+ 'File::Glob' => '1.06',
+ 'File::Path' => '2.07_02',
+ 'File::Spec' => '3.29',
+ 'File::Spec::Cygwin' => '3.29',
+ 'File::Spec::Epoc' => '3.29',
+ 'File::Spec::Functions' => '3.29',
+ 'File::Spec::Mac' => '3.29',
+ 'File::Spec::OS2' => '3.29',
+ 'File::Spec::Unix' => '3.29',
+ 'File::Spec::VMS' => '3.29',
+ 'File::Spec::Win32' => '3.29',
+ 'File::Temp' => '0.20',
+ 'File::stat' => '1.01',
+ 'FileCache' => '1.07',
+ 'FileHandle' => '2.01',
+ 'VMS::Filespec' => '1.11',
+ 'Filter::Simple' => '0.83',
+ 'Filter::Util::Call' => '1.07',
+ 'FindBin' => '1.49',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.37',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.06',
+ 'I18N::Collate' => '1.00',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.23',
+ 'IO::Dir' => '1.06',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.27',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.30',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IPC::Msg' => '2.00',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.03',
+ 'IPC::Semaphore' => '2.00',
+ 'IPC::SharedMem' => '2.00',
+ 'IPC::SysV' => '2.00',
+ 'IPC::lib::IPC::Msg' => '2.00',
+ 'IPC::lib::IPC::Semaphore'=> '2.00',
+ 'IPC::lib::IPC::SharedMem'=> '2.00',
+ 'List::Util' => '1.19',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Script' => '2.07',
+ 'MIME::Base64' => '3.07',
+ 'MIME::QuotedPrint' => '3.07',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.22',
+ 'Math::Complex' => '1.54',
+ 'Math::Trig' => '1.18',
+ 'Memoize' => '1.01',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::CoreList' => '2.17',
+ 'Module::Pluggable' => '3.8',
+ 'Module::Pluggable::Object'=> '3.6',
+ 'Module::Pluggable::lib::Devel::InnerPackage'=> '0.3',
+ 'NDBM_File' => '1.07',
+ 'NEXT' => '0.61',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.35',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Opcode' => '1.0601',
+ 'POSIX' => '1.15',
+ 'PerlIO' => '1.05',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.06',
+ 'PerlIO::via' => '0.05',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.43',
+ 'Pod::Find' => '1.34',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.3',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '1.37',
+ 'Pod::ParseLink' => '1.06',
+ 'Pod::ParseUtils' => '1.35',
+ 'Pod::Parser' => '1.35',
+ 'Pod::Perldoc' => '3.14',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.02',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.35',
+ 'Pod::Text' => '2.21',
+ 'Pod::Text::Color' => '1.04',
+ 'Pod::Text::Overstrike' => '1.1',
+ 'Pod::Text::Termcap' => '1.11',
+ 'Pod::Usage' => '1.35',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.16',
+ 'Scalar::Util' => '1.19',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.01',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72',
+ 'Socket' => '1.81',
+ 'Stdio' => '2.4',
+ 'Storable' => '2.19',
+ 'Switch' => '2.13',
+ 'Symbol' => '1.06',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'Term::ANSIColor' => '1.12',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.03',
+ 'Test' => '1.25',
+ 'Test::Builder' => '0.80',
+ 'Test::Builder::Module' => '0.80',
+ 'Test::Builder::Tester' => '1.13',
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => '2.64',
+ 'Test::Harness::Assert' => '0.02',
+ 'Test::Harness::Iterator'=> '0.02',
+ 'Test::Harness::Point' => '0.01',
+ 'Test::Harness::Results'=> '0.01_01',
+ 'Test::Harness::Straps' => '0.26_01',
+ 'Test::Harness::Util' => '0.01',
+ 'Test::More' => '0.80',
+ 'Test::Simple' => '0.80',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '1.98',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03',
+ 'Text::Tabs' => '2007.1117',
+ 'Text::Wrap' => '2006.1117',
+ 'Thread' => '2.01',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Thread::Signal' => '1.00',
+ 'Thread::Specific' => '1.00',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9715',
+ 'Time::Local' => '1.1901',
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.01',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.02',
+ 'Unicode::UCD' => '0.25',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.38',
+ 'Win32API::File' => '0.1001_01',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.15',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSSymSet' => '1.1',
+ 'attributes' => '0.09',
+ 'attrs' => '1.02',
+ 'autouse' => '1.06',
+ 'base' => '2.13',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.02',
+ 'charnames' => '1.06',
+ 'constant' => '1.17',
+ 'diagnostics' => '1.16',
+ 'encoding' => '2.6_01',
+ 'fields' => '2.12',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.01',
+ 'lib' => '0.61',
+ 'locale' => '1.00',
+ 'open' => '1.06',
+ 'ops' => '1.02',
+ 'overload' => '1.06',
+ 're' => '0.0601',
+ 'sigtrap' => '1.04',
+ 'sort' => '1.02',
+ 'strict' => '1.03',
+ 'subs' => '1.00',
+ 'threads' => '1.71',
+ 'threads::shared' => '1.27',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.05_01',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.010001 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.52',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.85',
+ 'AutoLoader' => '5.68',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.22',
+ 'B::Concise' => '0.76',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.89',
+ 'B::Lint' => '1.11',
+ 'B::Lint::Debug' => undef,
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.43',
+ 'CGI::Apache' => '1.00',
+ 'CGI::Carp' => '1.30_01',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '1.08',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.00',
+ 'CGI::Util' => '1.5_01',
+ 'CPAN' => '1.9402',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.93',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5001',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.93',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.00',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.88',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.36',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.36',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.88',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.88',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.11',
+ 'Carp::Heavy' => '1.11',
+ 'Class::ISA' => '0.33',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.020',
+ 'Compress::Raw::Zlib' => '2.020',
+ 'Compress::Zlib' => '2.020',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.30',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'DCLsym' => '1.03',
+ 'Data::Dumper' => '2.124',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.35',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.06',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.63',
+ 'Exporter::Heavy' => '5.63',
+ 'ExtUtils::CBuilder' => '0.2602',
+ 'ExtUtils::CBuilder::Base'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2602',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.54',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.56',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.2002',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.77',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.14',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.20',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.07_03',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.01',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.25',
+ 'IO::Compress::Adapter::Bzip2'=> '2.020',
+ 'IO::Compress::Adapter::Deflate'=> '2.020',
+ 'IO::Compress::Adapter::Identity'=> '2.020',
+ 'IO::Compress::Base' => '2.020',
+ 'IO::Compress::Base::Common'=> '2.020',
+ 'IO::Compress::Bzip2' => '2.020',
+ 'IO::Compress::Deflate' => '2.020',
+ 'IO::Compress::Gzip' => '2.020',
+ 'IO::Compress::Gzip::Constants'=> '2.020',
+ 'IO::Compress::RawDeflate'=> '2.020',
+ 'IO::Compress::Zip' => '2.020',
+ 'IO::Compress::Zip::Constants'=> '2.020',
+ 'IO::Compress::Zlib::Constants'=> '2.020',
+ 'IO::Compress::Zlib::Extra'=> '2.020',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.020',
+ 'IO::Uncompress::Adapter::Identity'=> '2.020',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.020',
+ 'IO::Uncompress::AnyInflate'=> '2.020',
+ 'IO::Uncompress::AnyUncompress'=> '2.020',
+ 'IO::Uncompress::Base' => '2.020',
+ 'IO::Uncompress::Bunzip2'=> '2.020',
+ 'IO::Uncompress::Gunzip'=> '2.020',
+ 'IO::Uncompress::Inflate'=> '2.020',
+ 'IO::Uncompress::RawInflate'=> '2.020',
+ 'IO::Uncompress::Unzip' => '2.020',
+ 'IO::Zlib' => '1.09',
+ 'IPC::Cmd' => '0.46',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.04',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.21',
+ 'List::Util::PP' => '1.21',
+ 'List::Util::XS' => '1.21',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.18',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.04',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.22',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.340201',
+ 'Module::Build::Base' => '0.340201',
+ 'Module::Build::Compat' => '0.340201',
+ 'Module::Build::Config' => '0.340201',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.340201',
+ 'Module::Build::Dumper' => '0.340201',
+ 'Module::Build::ModuleInfo'=> '0.340201',
+ 'Module::Build::Notes' => '0.340201',
+ 'Module::Build::PPMMaker'=> '0.340201',
+ 'Module::Build::Platform::Amiga'=> '0.340201',
+ 'Module::Build::Platform::Default'=> '0.340201',
+ 'Module::Build::Platform::EBCDIC'=> '0.340201',
+ 'Module::Build::Platform::MPEiX'=> '0.340201',
+ 'Module::Build::Platform::MacOS'=> '0.340201',
+ 'Module::Build::Platform::RiscOS'=> '0.340201',
+ 'Module::Build::Platform::Unix'=> '0.340201',
+ 'Module::Build::Platform::VMS'=> '0.340201',
+ 'Module::Build::Platform::VOS'=> '0.340201',
+ 'Module::Build::Platform::Windows'=> '0.340201',
+ 'Module::Build::Platform::aix'=> '0.340201',
+ 'Module::Build::Platform::cygwin'=> '0.340201',
+ 'Module::Build::Platform::darwin'=> '0.340201',
+ 'Module::Build::Platform::os2'=> '0.340201',
+ 'Module::Build::PodParser'=> '0.340201',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.18',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.30',
+ 'Module::Loaded' => '0.02',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.34',
+ 'Opcode' => '1.11',
+ 'POSIX' => '1.17',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.39',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.07',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.14_04',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '0.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.07',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.04',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.18',
+ 'Scalar::Util' => '1.21',
+ 'Scalar::Util::PP' => '1.21',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.82',
+ 'Stdio' => '2.4',
+ 'Storable' => '2.20',
+ 'Switch' => '2.14',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.04',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.92',
+ 'Test::Builder::Module' => '0.92',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.92',
+ 'Test::Simple' => '0.92',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.0.0',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.15',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'attributes' => '0.09',
+ 'attrs' => '1.03',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.14',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.17',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.14',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.01',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.07',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.221',
+ 're' => '0.09',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.72',
+ 'threads::shared' => '1.29',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.06',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.011000 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.22',
+ 'B::Concise' => '0.76',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.91',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.45',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.44',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.45',
+ 'CPAN' => '1.94_51',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5002',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.88',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.40',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.40',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.88',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.88',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.12',
+ 'Carp::Heavy' => '1.12',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.021',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.3002',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.37',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.06',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64',
+ 'Exporter::Heavy' => '5.64',
+ 'ExtUtils::CBuilder' => '0.2602',
+ 'ExtUtils::CBuilder::Base'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2602',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2602',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.54',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.56',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.43',
+ 'ExtUtils::ParseXS' => '2.200403',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.20',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.06',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.07_03',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.25_01',
+ 'IO::Compress::Adapter::Bzip2'=> '2.021',
+ 'IO::Compress::Adapter::Deflate'=> '2.021',
+ 'IO::Compress::Adapter::Identity'=> '2.021',
+ 'IO::Compress::Base' => '2.021',
+ 'IO::Compress::Base::Common'=> '2.021',
+ 'IO::Compress::Bzip2' => '2.021',
+ 'IO::Compress::Deflate' => '2.021',
+ 'IO::Compress::Gzip' => '2.021',
+ 'IO::Compress::Gzip::Constants'=> '2.021',
+ 'IO::Compress::RawDeflate'=> '2.021',
+ 'IO::Compress::Zip' => '2.021',
+ 'IO::Compress::Zip::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Extra'=> '2.021',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Adapter::Identity'=> '2.021',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.021',
+ 'IO::Uncompress::AnyInflate'=> '2.021',
+ 'IO::Uncompress::AnyUncompress'=> '2.021',
+ 'IO::Uncompress::Base' => '2.021',
+ 'IO::Uncompress::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Gunzip'=> '2.021',
+ 'IO::Uncompress::Inflate'=> '2.021',
+ 'IO::Uncompress::RawInflate'=> '2.021',
+ 'IO::Uncompress::Unzip' => '2.021',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.50',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.21',
+ 'List::Util::PP' => '1.21',
+ 'List::Util::XS' => '1.21',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.35',
+ 'Module::Build::Base' => '0.35',
+ 'Module::Build::Compat' => '0.35',
+ 'Module::Build::Config' => '0.35',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.35',
+ 'Module::Build::Dumper' => '0.35',
+ 'Module::Build::ModuleInfo'=> '0.35',
+ 'Module::Build::Notes' => '0.35',
+ 'Module::Build::PPMMaker'=> '0.35',
+ 'Module::Build::Platform::Amiga'=> '0.35',
+ 'Module::Build::Platform::Default'=> '0.35',
+ 'Module::Build::Platform::EBCDIC'=> '0.35',
+ 'Module::Build::Platform::MPEiX'=> '0.35',
+ 'Module::Build::Platform::MacOS'=> '0.35',
+ 'Module::Build::Platform::RiscOS'=> '0.35',
+ 'Module::Build::Platform::Unix'=> '0.35',
+ 'Module::Build::Platform::VMS'=> '0.35',
+ 'Module::Build::Platform::VOS'=> '0.35',
+ 'Module::Build::Platform::Windows'=> '0.35',
+ 'Module::Build::Platform::aix'=> '0.35',
+ 'Module::Build::Platform::cygwin'=> '0.35',
+ 'Module::Build::Platform::darwin'=> '0.35',
+ 'Module::Build::Platform::os2'=> '0.35',
+ 'Module::Build::PodParser'=> '0.35',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.19',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.30',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.34',
+ 'Opcode' => '1.13',
+ 'POSIX' => '1.17',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.39',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.08',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.07',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.04',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.19',
+ 'Scalar::Util' => '1.21',
+ 'Scalar::Util::PP' => '1.21',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.84',
+ 'Storable' => '2.20',
+ 'Switch' => '2.14_01',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.92',
+ 'Test::Builder::Module' => '0.92',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.92',
+ 'Test::Simple' => '0.92',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.15',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.14',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.19',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.14',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.01',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.08',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.74',
+ 'threads::shared' => '1.31',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.07',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.011001 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.77',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.92',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_51',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5002',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.89_03',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.40',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.40',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.89_03',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.89_03',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.13',
+ 'Carp::Heavy' => '1.13',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.021',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.3002',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.02',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.37',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.03',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.02',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.03',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.02',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.02',
+ 'Encode::Unicode' => '2.06',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.00',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64',
+ 'Exporter::Heavy' => '5.64',
+ 'ExtUtils::CBuilder' => '0.260301',
+ 'ExtUtils::CBuilder::Base'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.260301',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.260301',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.20',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.03',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.02',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.021',
+ 'IO::Compress::Adapter::Deflate'=> '2.021',
+ 'IO::Compress::Adapter::Identity'=> '2.021',
+ 'IO::Compress::Base' => '2.021',
+ 'IO::Compress::Base::Common'=> '2.021',
+ 'IO::Compress::Bzip2' => '2.021',
+ 'IO::Compress::Deflate' => '2.021',
+ 'IO::Compress::Gzip' => '2.021',
+ 'IO::Compress::Gzip::Constants'=> '2.021',
+ 'IO::Compress::RawDeflate'=> '2.021',
+ 'IO::Compress::Zip' => '2.021',
+ 'IO::Compress::Zip::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Constants'=> '2.021',
+ 'IO::Compress::Zlib::Extra'=> '2.021',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Adapter::Identity'=> '2.021',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.021',
+ 'IO::Uncompress::AnyInflate'=> '2.021',
+ 'IO::Uncompress::AnyUncompress'=> '2.021',
+ 'IO::Uncompress::Base' => '2.021',
+ 'IO::Uncompress::Bunzip2'=> '2.021',
+ 'IO::Uncompress::Gunzip'=> '2.021',
+ 'IO::Uncompress::Inflate'=> '2.021',
+ 'IO::Uncompress::RawInflate'=> '2.021',
+ 'IO::Uncompress::Unzip' => '2.021',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.50',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.21',
+ 'List::Util::PP' => '1.21',
+ 'List::Util::XS' => '1.21',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.13',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.35',
+ 'Module::Build::Base' => '0.35',
+ 'Module::Build::Compat' => '0.35',
+ 'Module::Build::Config' => '0.35',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.35',
+ 'Module::Build::Dumper' => '0.35',
+ 'Module::Build::ModuleInfo'=> '0.35',
+ 'Module::Build::Notes' => '0.35',
+ 'Module::Build::PPMMaker'=> '0.35',
+ 'Module::Build::Platform::Amiga'=> '0.35',
+ 'Module::Build::Platform::Default'=> '0.35',
+ 'Module::Build::Platform::EBCDIC'=> '0.35',
+ 'Module::Build::Platform::MPEiX'=> '0.35',
+ 'Module::Build::Platform::MacOS'=> '0.35',
+ 'Module::Build::Platform::RiscOS'=> '0.35',
+ 'Module::Build::Platform::Unix'=> '0.35',
+ 'Module::Build::Platform::VMS'=> '0.35',
+ 'Module::Build::Platform::VOS'=> '0.35',
+ 'Module::Build::Platform::Windows'=> '0.35',
+ 'Module::Build::Platform::aix'=> '0.35',
+ 'Module::Build::Platform::cygwin'=> '0.35',
+ 'Module::Build::Platform::darwin'=> '0.35',
+ 'Module::Build::Platform::os2'=> '0.35',
+ 'Module::Build::PodParser'=> '0.35',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '0.50',
+ 'Module::CoreList' => '2.21',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.30',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.18',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.08',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.04',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.19',
+ 'Scalar::Util' => '1.21',
+ 'Scalar::Util::PP' => '1.21',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.15',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.16',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.14',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.19',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.17',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.14',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.09',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.74',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.07',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.011002 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.34',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.93',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_51',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5002',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.89_09',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.44',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.44',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.89_09',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.89_09',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.14',
+ 'Carp::Heavy' => '1.14',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.022',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.3002',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.38',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.55_02',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.55_02',
+ 'ExtUtils::Liblist::Kid'=> '6.5502',
+ 'ExtUtils::MM' => '6.55_02',
+ 'ExtUtils::MM_AIX' => '6.55_02',
+ 'ExtUtils::MM_Any' => '6.55_02',
+ 'ExtUtils::MM_BeOS' => '6.55_02',
+ 'ExtUtils::MM_Cygwin' => '6.55_02',
+ 'ExtUtils::MM_DOS' => '6.5502',
+ 'ExtUtils::MM_Darwin' => '6.55_02',
+ 'ExtUtils::MM_MacOS' => '6.5502',
+ 'ExtUtils::MM_NW5' => '6.55_02',
+ 'ExtUtils::MM_OS2' => '6.55_02',
+ 'ExtUtils::MM_QNX' => '6.55_02',
+ 'ExtUtils::MM_UWIN' => '6.5502',
+ 'ExtUtils::MM_Unix' => '6.55_02',
+ 'ExtUtils::MM_VMS' => '6.55_02',
+ 'ExtUtils::MM_VOS' => '6.55_02',
+ 'ExtUtils::MM_Win32' => '6.55_02',
+ 'ExtUtils::MM_Win95' => '6.55_02',
+ 'ExtUtils::MY' => '6.5502',
+ 'ExtUtils::MakeMaker' => '6.55_02',
+ 'ExtUtils::MakeMaker::Config'=> '6.55_02',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.55_02',
+ 'ExtUtils::Mksymlists' => '6.55_02',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5502',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.22',
+ 'File::Find' => '1.14',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08',
+ 'File::Spec' => '3.30',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.022',
+ 'IO::Compress::Adapter::Deflate'=> '2.022',
+ 'IO::Compress::Adapter::Identity'=> '2.022',
+ 'IO::Compress::Base' => '2.022',
+ 'IO::Compress::Base::Common'=> '2.022',
+ 'IO::Compress::Bzip2' => '2.022',
+ 'IO::Compress::Deflate' => '2.022',
+ 'IO::Compress::Gzip' => '2.022',
+ 'IO::Compress::Gzip::Constants'=> '2.022',
+ 'IO::Compress::RawDeflate'=> '2.022',
+ 'IO::Compress::Zip' => '2.022',
+ 'IO::Compress::Zip::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Extra'=> '2.022',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Adapter::Identity'=> '2.022',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.022',
+ 'IO::Uncompress::AnyInflate'=> '2.022',
+ 'IO::Uncompress::AnyUncompress'=> '2.022',
+ 'IO::Uncompress::Base' => '2.022',
+ 'IO::Uncompress::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Gunzip'=> '2.022',
+ 'IO::Uncompress::Inflate'=> '2.022',
+ 'IO::Uncompress::RawInflate'=> '2.022',
+ 'IO::Uncompress::Unzip' => '2.022',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.35_09',
+ 'Module::Build::Base' => '0.35_09',
+ 'Module::Build::Compat' => '0.35_09',
+ 'Module::Build::Config' => '0.35_09',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.35_09',
+ 'Module::Build::Dumper' => '0.35_09',
+ 'Module::Build::ModuleInfo'=> '0.35_09',
+ 'Module::Build::Notes' => '0.35_09',
+ 'Module::Build::PPMMaker'=> '0.35_09',
+ 'Module::Build::Platform::Amiga'=> '0.35_09',
+ 'Module::Build::Platform::Default'=> '0.35_09',
+ 'Module::Build::Platform::EBCDIC'=> '0.35_09',
+ 'Module::Build::Platform::MPEiX'=> '0.35_09',
+ 'Module::Build::Platform::MacOS'=> '0.35_09',
+ 'Module::Build::Platform::RiscOS'=> '0.35_09',
+ 'Module::Build::Platform::Unix'=> '0.35_09',
+ 'Module::Build::Platform::VMS'=> '0.35_09',
+ 'Module::Build::Platform::VOS'=> '0.35_09',
+ 'Module::Build::Platform::Windows'=> '0.35_09',
+ 'Module::Build::Platform::aix'=> '0.35_09',
+ 'Module::Build::Platform::cygwin'=> '0.35_09',
+ 'Module::Build::Platform::darwin'=> '0.35_09',
+ 'Module::Build::Platform::os2'=> '0.35_09',
+ 'Module::Build::PodParser'=> '0.35_09',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.23',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.18',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.10',
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => '2.02',
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> '2.02',
+ 'Pod::Simple::DumpAsXML'=> '2.02',
+ 'Pod::Simple::HTML' => '3.03',
+ 'Pod::Simple::HTMLBatch'=> '3.02',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => '2.02',
+ 'Pod::Simple::Progress' => '1.01',
+ 'Pod::Simple::PullParser'=> '2.02',
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> '2.02',
+ 'Pod::Simple::RTF' => '2.02',
+ 'Pod::Simple::Search' => '3.04',
+ 'Pod::Simple::SimpleTree'=> '2.02',
+ 'Pod::Simple::Text' => '2.02',
+ 'Pod::Simple::TextContent'=> '2.02',
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> '2.02',
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => '3.10',
+ 'Pod::Simple::XMLOutStream'=> '2.02',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.19',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Simple' => '0.01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.1.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.19',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.18',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.13',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.35_09',
+ 'integer' => '1.00',
+ 'legacy' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.74',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.07',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.011003 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.570001',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.36',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.93',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_5301',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.530001',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.770001',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.44',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.44',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.14',
+ 'Carp::Heavy' => '1.14',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.021',
+ 'Compress::Raw::Zlib' => '2.021',
+ 'Compress::Zlib' => '2.022',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::V' => undef,
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.16',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.22',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.09',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.022',
+ 'IO::Compress::Adapter::Deflate'=> '2.022',
+ 'IO::Compress::Adapter::Identity'=> '2.022',
+ 'IO::Compress::Base' => '2.022',
+ 'IO::Compress::Base::Common'=> '2.022',
+ 'IO::Compress::Bzip2' => '2.022',
+ 'IO::Compress::Deflate' => '2.022',
+ 'IO::Compress::Gzip' => '2.022',
+ 'IO::Compress::Gzip::Constants'=> '2.022',
+ 'IO::Compress::RawDeflate'=> '2.022',
+ 'IO::Compress::Zip' => '2.022',
+ 'IO::Compress::Zip::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Constants'=> '2.022',
+ 'IO::Compress::Zlib::Extra'=> '2.022',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Adapter::Identity'=> '2.022',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.022',
+ 'IO::Uncompress::AnyInflate'=> '2.022',
+ 'IO::Uncompress::AnyUncompress'=> '2.022',
+ 'IO::Uncompress::Base' => '2.022',
+ 'IO::Uncompress::Bunzip2'=> '2.022',
+ 'IO::Uncompress::Gunzip'=> '2.022',
+ 'IO::Uncompress::Inflate'=> '2.022',
+ 'IO::Uncompress::RawInflate'=> '2.022',
+ 'IO::Uncompress::Unzip' => '2.022',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.36',
+ 'Module::Build::Base' => '0.36',
+ 'Module::Build::Compat' => '0.36',
+ 'Module::Build::Config' => '0.36',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.36',
+ 'Module::Build::Dumper' => '0.36',
+ 'Module::Build::ModuleInfo'=> '0.36',
+ 'Module::Build::Notes' => '0.36',
+ 'Module::Build::PPMMaker'=> '0.36',
+ 'Module::Build::Platform::Amiga'=> '0.36',
+ 'Module::Build::Platform::Default'=> '0.36',
+ 'Module::Build::Platform::EBCDIC'=> '0.36',
+ 'Module::Build::Platform::MPEiX'=> '0.36',
+ 'Module::Build::Platform::MacOS'=> '0.36',
+ 'Module::Build::Platform::RiscOS'=> '0.36',
+ 'Module::Build::Platform::Unix'=> '0.36',
+ 'Module::Build::Platform::VMS'=> '0.36',
+ 'Module::Build::Platform::VOS'=> '0.36',
+ 'Module::Build::Platform::Windows'=> '0.36',
+ 'Module::Build::Platform::aix'=> '0.36',
+ 'Module::Build::Platform::cygwin'=> '0.36',
+ 'Module::Build::Platform::darwin'=> '0.36',
+ 'Module::Build::Platform::os2'=> '0.36',
+ 'Module::Build::PodParser'=> '0.36',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.24',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.11',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.20',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.05',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.14',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.36',
+ 'integer' => '1.00',
+ 'less' => '0.02',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.10',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.77',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.08',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.011004 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.11',
+ 'B::Deparse' => '0.94',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_54',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.94',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.53',
+ 'CPAN::HandleConfig' => '5.5',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5',
+ 'CPAN::Tarzip' => '5.501',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.44',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.44',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.15',
+ 'Carp::Heavy' => '1.15',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.17',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.25',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.22',
+ 'Pod::ParseLink' => '1.09',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_01',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.01',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.13',
+ 'Pod::Text::Color' => '2.05',
+ 'Pod::Text::Overstrike' => '2.03',
+ 'Pod::Text::Termcap' => '2.05',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.21',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.85',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.15',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.81',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.011005 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.94',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.15',
+ 'Carp::Heavy' => '1.15',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::V' => undef,
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.17',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.26',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.02',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.22',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.86',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.01',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.03',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.15',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.07',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.012000 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.96',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.48',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.07',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456_01',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.15',
+ 'Carp::Heavy' => '1.15',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.17',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.29',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.03',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.02',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.25',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.87',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.16',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.013000 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.96',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456_01',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.15',
+ 'Carp::Heavy' => '1.15',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.126',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.5601',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.5601',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.18',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.06',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.31',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.02',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.13',
+ 'Pod::Simple::BlackBox' => '3.13',
+ 'Pod::Simple::Checker' => '3.13',
+ 'Pod::Simple::Debug' => '3.13',
+ 'Pod::Simple::DumpAsText'=> '3.13',
+ 'Pod::Simple::DumpAsXML'=> '3.13',
+ 'Pod::Simple::HTML' => '3.13',
+ 'Pod::Simple::HTMLBatch'=> '3.13',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.13',
+ 'Pod::Simple::Methody' => '3.13',
+ 'Pod::Simple::Progress' => '3.13',
+ 'Pod::Simple::PullParser'=> '3.13',
+ 'Pod::Simple::PullParserEndToken'=> '3.13',
+ 'Pod::Simple::PullParserStartToken'=> '3.13',
+ 'Pod::Simple::PullParserTextToken'=> '3.13',
+ 'Pod::Simple::PullParserToken'=> '3.13',
+ 'Pod::Simple::RTF' => '3.13',
+ 'Pod::Simple::Search' => '3.13',
+ 'Pod::Simple::SimpleTree'=> '3.13',
+ 'Pod::Simple::Text' => '3.13',
+ 'Pod::Simple::TextContent'=> '3.13',
+ 'Pod::Simple::TiedOutFH'=> '3.13',
+ 'Pod::Simple::Transcode'=> '3.13',
+ 'Pod::Simple::TranscodeDumb'=> '3.13',
+ 'Pod::Simple::TranscodeSmart'=> '3.13',
+ 'Pod::Simple::XHTML' => '3.13',
+ 'Pod::Simple::XMLOutStream'=> '3.13',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.25',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.87',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.18',
+ 'XS::APItest::KeywordRPN'=> '0.004',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.17',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.77_01',
+ 'threads::shared' => '1.33',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.012001 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.97',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456_01',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.16',
+ 'Carp::Heavy' => '1.16',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.18',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.32',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.34',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.07',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.02',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.87',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.16',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+
+ 5.013001 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.97',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456_01',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.16',
+ 'Carp::Heavy' => '1.16',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.126',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.12',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.5601',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.5601',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2205',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.18',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.16',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.58',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.06',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.12',
+ 'Locale::Codes::Country'=> '3.12',
+ 'Locale::Codes::Currency'=> '3.12',
+ 'Locale::Codes::Language'=> '3.12',
+ 'Locale::Codes::Script' => '3.12',
+ 'Locale::Constants' => '3.12',
+ 'Locale::Country' => '3.12',
+ 'Locale::Currency' => '3.12',
+ 'Locale::Language' => '3.12',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.12',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.360301',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.34',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.08',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.88',
+ 'Storable' => '2.22',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.06',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.28',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.19',
+ 'XS::APItest::KeywordRPN'=> '0.004',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.08',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.17',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.77_01',
+ 'threads::shared' => '1.33',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+ 5.013002 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.79',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.98',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_57',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.16',
+ 'Carp::Heavy' => '1.16',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.126',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.12',
+ 'Exporter' => '5.64_02',
+ 'Exporter::Heavy' => '5.64_02',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.5601',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.5601',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2205',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.19',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.16',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.08',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.58',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.06',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.13',
+ 'Locale::Codes::Country'=> '3.13',
+ 'Locale::Codes::Currency'=> '3.13',
+ 'Locale::Codes::Language'=> '3.13',
+ 'Locale::Codes::Script' => '3.13',
+ 'Locale::Constants' => '3.13',
+ 'Locale::Country' => '3.13',
+ 'Locale::Currency' => '3.13',
+ 'Locale::Language' => '3.13',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.13',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.360301',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.34',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.08',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.89',
+ 'Storable' => '2.22',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.06',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.28',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.19',
+ 'XS::APItest::KeywordRPN'=> '0.004',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.08',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.17',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.03',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.77_02',
+ 'threads::shared' => '1.33_01',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+ 5.013003 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.21',
+ 'App::Prove::State' => '3.21',
+ 'App::Prove::State::Result'=> '3.21',
+ 'App::Prove::State::Result::Test'=> '3.21',
+ 'Archive::Extract' => '0.42',
+ 'Archive::Tar' => '1.64',
+ 'Archive::Tar::Constant'=> '1.64',
+ 'Archive::Tar::File' => '1.64',
+ 'Attribute::Handlers' => '0.88',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.79',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.98',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_57',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.9007',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.9007',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.9007',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.16',
+ 'Carp::Heavy' => '1.16',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.027',
+ 'Compress::Raw::Zlib' => '2.027_01',
+ 'Compress::Zlib' => '2.027',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.03',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.126',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.40',
+ 'Digest::SHA' => '5.48',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.12',
+ 'Exporter' => '5.64_03',
+ 'Exporter::Heavy' => '5.64_03',
+ 'ExtUtils::CBuilder' => '0.2703',
+ 'ExtUtils::CBuilder::Base'=> '0.2703_01',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2703',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.5601',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.5601',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.58',
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2206',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.10',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.79',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.20',
+ 'File::DosGlob' => '1.02',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.17',
+ 'File::Glob' => '1.08',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.03',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'VMS::Filespec' => '1.12',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.08',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35_01',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35_01',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.027',
+ 'IO::Compress::Adapter::Deflate'=> '2.027',
+ 'IO::Compress::Adapter::Identity'=> '2.027',
+ 'IO::Compress::Base' => '2.027',
+ 'IO::Compress::Base::Common'=> '2.027',
+ 'IO::Compress::Bzip2' => '2.027',
+ 'IO::Compress::Deflate' => '2.027',
+ 'IO::Compress::Gzip' => '2.027',
+ 'IO::Compress::Gzip::Constants'=> '2.027',
+ 'IO::Compress::RawDeflate'=> '2.027',
+ 'IO::Compress::Zip' => '2.027',
+ 'IO::Compress::Zip::Constants'=> '2.027',
+ 'IO::Compress::Zlib::Constants'=> '2.027',
+ 'IO::Compress::Zlib::Extra'=> '2.027',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.027',
+ 'IO::Uncompress::Adapter::Identity'=> '2.027',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.027',
+ 'IO::Uncompress::AnyInflate'=> '2.027',
+ 'IO::Uncompress::AnyUncompress'=> '2.027',
+ 'IO::Uncompress::Base' => '2.027',
+ 'IO::Uncompress::Bunzip2'=> '2.027',
+ 'IO::Uncompress::Gunzip'=> '2.027',
+ 'IO::Uncompress::Inflate'=> '2.027',
+ 'IO::Uncompress::RawInflate'=> '2.027',
+ 'IO::Uncompress::Unzip' => '2.027',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.60',
+ 'IPC::Msg' => '2.03',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.06',
+ 'IPC::Semaphore' => '2.03',
+ 'IPC::SharedMem' => '2.03',
+ 'IPC::SysV' => '2.03',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.13',
+ 'Locale::Codes::Country'=> '3.13',
+ 'Locale::Codes::Currency'=> '3.13',
+ 'Locale::Codes::Language'=> '3.13',
+ 'Locale::Codes::Script' => '3.13',
+ 'Locale::Constants' => '3.13',
+ 'Locale::Country' => '3.13',
+ 'Locale::Currency' => '3.13',
+ 'Locale::Language' => '3.13',
+ 'Locale::Maketext' => '1.15',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.13',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3607',
+ 'Module::Build::Base' => '0.3607',
+ 'Module::Build::Compat' => '0.3607',
+ 'Module::Build::Config' => '0.3607',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3607',
+ 'Module::Build::Dumper' => '0.3607',
+ 'Module::Build::ModuleInfo'=> '0.3607',
+ 'Module::Build::Notes' => '0.3607',
+ 'Module::Build::PPMMaker'=> '0.3607',
+ 'Module::Build::Platform::Amiga'=> '0.3607',
+ 'Module::Build::Platform::Default'=> '0.3607',
+ 'Module::Build::Platform::EBCDIC'=> '0.3607',
+ 'Module::Build::Platform::MPEiX'=> '0.3607',
+ 'Module::Build::Platform::MacOS'=> '0.3607',
+ 'Module::Build::Platform::RiscOS'=> '0.3607',
+ 'Module::Build::Platform::Unix'=> '0.3607',
+ 'Module::Build::Platform::VMS'=> '0.3607',
+ 'Module::Build::Platform::VOS'=> '0.3607',
+ 'Module::Build::Platform::Windows'=> '0.3607',
+ 'Module::Build::Platform::aix'=> '0.3607',
+ 'Module::Build::Platform::cygwin'=> '0.3607',
+ 'Module::Build::Platform::darwin'=> '0.3607',
+ 'Module::Build::Platform::os2'=> '0.3607',
+ 'Module::Build::PodParser'=> '0.3607',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.36',
+ 'Module::Load' => '0.18',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.08',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.89',
+ 'Storable' => '2.22',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.21',
+ 'TAP::Formatter::Base' => '3.21',
+ 'TAP::Formatter::Color' => '3.21',
+ 'TAP::Formatter::Console'=> '3.21',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.21',
+ 'TAP::Formatter::Console::Session'=> '3.21',
+ 'TAP::Formatter::File' => '3.21',
+ 'TAP::Formatter::File::Session'=> '3.21',
+ 'TAP::Formatter::Session'=> '3.21',
+ 'TAP::Harness' => '3.21',
+ 'TAP::Object' => '3.21',
+ 'TAP::Parser' => '3.21',
+ 'TAP::Parser::Aggregator'=> '3.21',
+ 'TAP::Parser::Grammar' => '3.21',
+ 'TAP::Parser::Iterator' => '3.21',
+ 'TAP::Parser::Iterator::Array'=> '3.21',
+ 'TAP::Parser::Iterator::Process'=> '3.21',
+ 'TAP::Parser::Iterator::Stream'=> '3.21',
+ 'TAP::Parser::IteratorFactory'=> '3.21',
+ 'TAP::Parser::Multiplexer'=> '3.21',
+ 'TAP::Parser::Result' => '3.21',
+ 'TAP::Parser::Result::Bailout'=> '3.21',
+ 'TAP::Parser::Result::Comment'=> '3.21',
+ 'TAP::Parser::Result::Plan'=> '3.21',
+ 'TAP::Parser::Result::Pragma'=> '3.21',
+ 'TAP::Parser::Result::Test'=> '3.21',
+ 'TAP::Parser::Result::Unknown'=> '3.21',
+ 'TAP::Parser::Result::Version'=> '3.21',
+ 'TAP::Parser::Result::YAML'=> '3.21',
+ 'TAP::Parser::ResultFactory'=> '3.21',
+ 'TAP::Parser::Scheduler'=> '3.21',
+ 'TAP::Parser::Scheduler::Job'=> '3.21',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.21',
+ 'TAP::Parser::Source' => '3.21',
+ 'TAP::Parser::SourceHandler'=> '3.21',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.21',
+ 'TAP::Parser::SourceHandler::File'=> '3.21',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.21',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.21',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.21',
+ 'TAP::Parser::SourceHandler::pgTAP'=> '3.21',
+ 'TAP::Parser::Utils' => '3.21',
+ 'TAP::Parser::YAMLish::Reader'=> '3.21',
+ 'TAP::Parser::YAMLish::Writer'=> '3.21',
+ 'Term::ANSIColor' => '3.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.07',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.21',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.04',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9721',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.20_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.53',
+ 'Unicode::Normalize' => '1.06',
+ 'Unicode::UCD' => '0.29',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.19',
+ 'XS::APItest::KeywordRPN'=> '0.004',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.10',
+ 'autodie::exception' => '2.10',
+ 'autodie::exception::system'=> '2.10',
+ 'autodie::hints' => '2.10',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.05',
+ 'bytes' => '1.04',
+ 'charnames' => '1.11',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.20',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.17',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3607',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.63',
+ 'locale' => '1.00',
+ 'mro' => '1.03',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.12',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.77_03',
+ 'threads::shared' => '1.33_02',
+ 'utf8' => '1.08',
+ 'vars' => '1.02',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.10',
+ 'warnings::register' => '1.01',
+ },
+ 5.013004 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.22',
+ 'App::Prove::State' => '3.22',
+ 'App::Prove::State::Result'=> '3.22',
+ 'App::Prove::State::Result::Test'=> '3.22',
+ 'Archive::Extract' => '0.42',
+ 'Archive::Tar' => '1.68',
+ 'Archive::Tar::Constant'=> '1.68',
+ 'Archive::Tar::File' => '1.68',
+ 'Attribute::Handlers' => '0.88',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.79',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.98',
+ 'B::Lint' => '1.12',
+ 'B::Lint::Debug' => '1.12',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_57',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.9007',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.9007',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.9007',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.18',
+ 'Carp::Heavy' => '1.18',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.030',
+ 'Compress::Raw::Zlib' => '2.030',
+ 'Compress::Zlib' => '2.030',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.03',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.126',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.40',
+ 'Digest::SHA' => '5.48',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.12',
+ 'Exporter' => '5.64_03',
+ 'Exporter::Heavy' => '5.64_03',
+ 'ExtUtils::CBuilder' => '0.2703',
+ 'ExtUtils::CBuilder::Base'=> '0.2703_01',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2703',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.5601',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.5601',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.58',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2207',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.10',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.79',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.20',
+ 'File::DosGlob' => '1.02',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.17',
+ 'File::Glob' => '1.08',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31_01',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.03',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.08',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35_01',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35_01',
+ 'I18N::Langinfo' => '0.04',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.030',
+ 'IO::Compress::Adapter::Deflate'=> '2.030',
+ 'IO::Compress::Adapter::Identity'=> '2.030',
+ 'IO::Compress::Base' => '2.030',
+ 'IO::Compress::Base::Common'=> '2.030',
+ 'IO::Compress::Bzip2' => '2.030',
+ 'IO::Compress::Deflate' => '2.030',
+ 'IO::Compress::Gzip' => '2.030',
+ 'IO::Compress::Gzip::Constants'=> '2.030',
+ 'IO::Compress::RawDeflate'=> '2.030',
+ 'IO::Compress::Zip' => '2.030',
+ 'IO::Compress::Zip::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Extra'=> '2.030',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Adapter::Identity'=> '2.030',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.030',
+ 'IO::Uncompress::AnyInflate'=> '2.030',
+ 'IO::Uncompress::AnyUncompress'=> '2.030',
+ 'IO::Uncompress::Base' => '2.030',
+ 'IO::Uncompress::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Gunzip'=> '2.030',
+ 'IO::Uncompress::Inflate'=> '2.030',
+ 'IO::Uncompress::RawInflate'=> '2.030',
+ 'IO::Uncompress::Unzip' => '2.030',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.60',
+ 'IPC::Msg' => '2.03',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.06',
+ 'IPC::Semaphore' => '2.03',
+ 'IPC::SharedMem' => '2.03',
+ 'IPC::SysV' => '2.03',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.13',
+ 'Locale::Codes::Country'=> '3.13',
+ 'Locale::Codes::Currency'=> '3.13',
+ 'Locale::Codes::Language'=> '3.13',
+ 'Locale::Codes::Script' => '3.13',
+ 'Locale::Constants' => '3.13',
+ 'Locale::Country' => '3.13',
+ 'Locale::Currency' => '3.13',
+ 'Locale::Language' => '3.13',
+ 'Locale::Maketext' => '1.15',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.13',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3607',
+ 'Module::Build::Base' => '0.3607',
+ 'Module::Build::Compat' => '0.3607',
+ 'Module::Build::Config' => '0.3607',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3607',
+ 'Module::Build::Dumper' => '0.3607',
+ 'Module::Build::ModuleInfo'=> '0.3607',
+ 'Module::Build::Notes' => '0.3607',
+ 'Module::Build::PPMMaker'=> '0.3607',
+ 'Module::Build::Platform::Amiga'=> '0.3607',
+ 'Module::Build::Platform::Default'=> '0.3607',
+ 'Module::Build::Platform::EBCDIC'=> '0.3607',
+ 'Module::Build::Platform::MPEiX'=> '0.3607',
+ 'Module::Build::Platform::MacOS'=> '0.3607',
+ 'Module::Build::Platform::RiscOS'=> '0.3607',
+ 'Module::Build::Platform::Unix'=> '0.3607',
+ 'Module::Build::Platform::VMS'=> '0.3607',
+ 'Module::Build::Platform::VOS'=> '0.3607',
+ 'Module::Build::Platform::Windows'=> '0.3607',
+ 'Module::Build::Platform::aix'=> '0.3607',
+ 'Module::Build::Platform::cygwin'=> '0.3607',
+ 'Module::Build::Platform::darwin'=> '0.3607',
+ 'Module::Build::Platform::os2'=> '0.3607',
+ 'Module::Build::PodParser'=> '0.3607',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.37',
+ 'Module::Load' => '0.18',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.08',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.89',
+ 'Storable' => '2.22',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.22',
+ 'TAP::Formatter::Base' => '3.22',
+ 'TAP::Formatter::Color' => '3.22',
+ 'TAP::Formatter::Console'=> '3.22',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.22',
+ 'TAP::Formatter::Console::Session'=> '3.22',
+ 'TAP::Formatter::File' => '3.22',
+ 'TAP::Formatter::File::Session'=> '3.22',
+ 'TAP::Formatter::Session'=> '3.22',
+ 'TAP::Harness' => '3.22',
+ 'TAP::Object' => '3.22',
+ 'TAP::Parser' => '3.22',
+ 'TAP::Parser::Aggregator'=> '3.22',
+ 'TAP::Parser::Grammar' => '3.22',
+ 'TAP::Parser::Iterator' => '3.22',
+ 'TAP::Parser::Iterator::Array'=> '3.22',
+ 'TAP::Parser::Iterator::Process'=> '3.22',
+ 'TAP::Parser::Iterator::Stream'=> '3.22',
+ 'TAP::Parser::IteratorFactory'=> '3.22',
+ 'TAP::Parser::Multiplexer'=> '3.22',
+ 'TAP::Parser::Result' => '3.22',
+ 'TAP::Parser::Result::Bailout'=> '3.22',
+ 'TAP::Parser::Result::Comment'=> '3.22',
+ 'TAP::Parser::Result::Plan'=> '3.22',
+ 'TAP::Parser::Result::Pragma'=> '3.22',
+ 'TAP::Parser::Result::Test'=> '3.22',
+ 'TAP::Parser::Result::Unknown'=> '3.22',
+ 'TAP::Parser::Result::Version'=> '3.22',
+ 'TAP::Parser::Result::YAML'=> '3.22',
+ 'TAP::Parser::ResultFactory'=> '3.22',
+ 'TAP::Parser::Scheduler'=> '3.22',
+ 'TAP::Parser::Scheduler::Job'=> '3.22',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.22',
+ 'TAP::Parser::Source' => '3.22',
+ 'TAP::Parser::SourceHandler'=> '3.22',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.22',
+ 'TAP::Parser::SourceHandler::File'=> '3.22',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.22',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.22',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.22',
+ 'TAP::Parser::Utils' => '3.22',
+ 'TAP::Parser::YAMLish::Reader'=> '3.22',
+ 'TAP::Parser::YAMLish::Writer'=> '3.22',
+ 'Term::ANSIColor' => '3.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.07',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.96',
+ 'Test::Builder::Module' => '0.96',
+ 'Test::Builder::Tester' => '1.20',
+ 'Test::Builder::Tester::Color'=> '1.20',
+ 'Test::Harness' => '3.22',
+ 'Test::More' => '0.96',
+ 'Test::Simple' => '0.96',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.04',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9721',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.20_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.56',
+ 'Unicode::Collate::Locale'=> '0.56',
+ 'Unicode::Normalize' => '1.06',
+ 'Unicode::UCD' => '0.29',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Filespec' => '1.12',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.20',
+ 'XS::APItest::KeywordRPN'=> '0.004',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.10',
+ 'autodie::exception' => '2.10',
+ 'autodie::exception::system'=> '2.10',
+ 'autodie::hints' => '2.10',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.05',
+ 'bytes' => '1.04',
+ 'charnames' => '1.15',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.20',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.18',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3607',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.63',
+ 'locale' => '1.00',
+ 'mro' => '1.03',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.12',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.77_03',
+ 'threads::shared' => '1.33_02',
+ 'utf8' => '1.08',
+ 'vars' => '1.02',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.10',
+ 'warnings::register' => '1.01',
+ },
+ 5.012002 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.97',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456_01',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.17',
+ 'Carp::Heavy' => '1.17',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.18',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31_01',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.3603',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.38',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.08',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.02',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.87',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Filespec' => '1.12',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.16',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+ 5.013005 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.22',
+ 'App::Prove::State' => '3.22',
+ 'App::Prove::State::Result'=> '3.22',
+ 'App::Prove::State::Result::Test'=> '3.22',
+ 'Archive::Extract' => '0.42',
+ 'Archive::Tar' => '1.68',
+ 'Archive::Tar::Constant'=> '1.68',
+ 'Archive::Tar::File' => '1.68',
+ 'Attribute::Handlers' => '0.88',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.79',
+ 'B::Debug' => '1.16',
+ 'B::Deparse' => '0.98',
+ 'B::Lint' => '1.12',
+ 'B::Lint::Debug' => '1.12',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_57',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.9007',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.48',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.48',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.9007',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.9007',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.18',
+ 'Carp::Heavy' => '1.18',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.030',
+ 'Compress::Raw::Zlib' => '2.030',
+ 'Compress::Zlib' => '2.030',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.03',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.128',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::V' => undef,
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.40',
+ 'Digest::SHA' => '5.48',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.40',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.04',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.12',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.05',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.13',
+ 'Exporter' => '5.64_03',
+ 'Exporter::Heavy' => '5.64_03',
+ 'ExtUtils::CBuilder' => '0.2703',
+ 'ExtUtils::CBuilder::Base'=> '0.2703_01',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2703',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.57_05',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.57_05',
+ 'ExtUtils::Liblist::Kid'=> '6.5705',
+ 'ExtUtils::MM' => '6.57_05',
+ 'ExtUtils::MM_AIX' => '6.57_05',
+ 'ExtUtils::MM_Any' => '6.57_05',
+ 'ExtUtils::MM_BeOS' => '6.57_05',
+ 'ExtUtils::MM_Cygwin' => '6.57_05',
+ 'ExtUtils::MM_DOS' => '6.5705',
+ 'ExtUtils::MM_Darwin' => '6.57_05',
+ 'ExtUtils::MM_MacOS' => '6.5705',
+ 'ExtUtils::MM_NW5' => '6.57_05',
+ 'ExtUtils::MM_OS2' => '6.57_05',
+ 'ExtUtils::MM_QNX' => '6.57_05',
+ 'ExtUtils::MM_UWIN' => '6.5705',
+ 'ExtUtils::MM_Unix' => '6.57_05',
+ 'ExtUtils::MM_VMS' => '6.57_05',
+ 'ExtUtils::MM_VOS' => '6.57_05',
+ 'ExtUtils::MM_Win32' => '6.57_05',
+ 'ExtUtils::MM_Win95' => '6.57_05',
+ 'ExtUtils::MY' => '6.5705',
+ 'ExtUtils::MakeMaker' => '6.57_05',
+ 'ExtUtils::MakeMaker::Config'=> '6.57_05',
+ 'ExtUtils::MakeMaker::YAML'=> '1.44',
+ 'ExtUtils::Manifest' => '1.58',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.57_05',
+ 'ExtUtils::Mksymlists' => '6.57_05',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2207',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.5705',
+ 'Fatal' => '2.10',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.79',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.20',
+ 'File::DosGlob' => '1.02',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.17',
+ 'File::Glob' => '1.08',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31_01',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.03',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.85',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.09',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35_01',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35_01',
+ 'I18N::Langinfo' => '0.04',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.030',
+ 'IO::Compress::Adapter::Deflate'=> '2.030',
+ 'IO::Compress::Adapter::Identity'=> '2.030',
+ 'IO::Compress::Base' => '2.030',
+ 'IO::Compress::Base::Common'=> '2.030',
+ 'IO::Compress::Bzip2' => '2.030',
+ 'IO::Compress::Deflate' => '2.030',
+ 'IO::Compress::Gzip' => '2.030',
+ 'IO::Compress::Gzip::Constants'=> '2.030',
+ 'IO::Compress::RawDeflate'=> '2.030',
+ 'IO::Compress::Zip' => '2.030',
+ 'IO::Compress::Zip::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Extra'=> '2.030',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Adapter::Identity'=> '2.030',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.030',
+ 'IO::Uncompress::AnyInflate'=> '2.030',
+ 'IO::Uncompress::AnyUncompress'=> '2.030',
+ 'IO::Uncompress::Base' => '2.030',
+ 'IO::Uncompress::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Gunzip'=> '2.030',
+ 'IO::Uncompress::Inflate'=> '2.030',
+ 'IO::Uncompress::RawInflate'=> '2.030',
+ 'IO::Uncompress::Unzip' => '2.030',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.60',
+ 'IPC::Msg' => '2.03',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.06',
+ 'IPC::Semaphore' => '2.03',
+ 'IPC::SharedMem' => '2.03',
+ 'IPC::SysV' => '2.03',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.13',
+ 'Locale::Codes::Country'=> '3.13',
+ 'Locale::Codes::Currency'=> '3.13',
+ 'Locale::Codes::Language'=> '3.13',
+ 'Locale::Codes::Script' => '3.13',
+ 'Locale::Constants' => '3.13',
+ 'Locale::Country' => '3.13',
+ 'Locale::Currency' => '3.13',
+ 'Locale::Language' => '3.13',
+ 'Locale::Maketext' => '1.15',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.13',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.62',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.95',
+ 'Math::BigInt::Calc' => '0.54',
+ 'Math::BigInt::CalcEmu' => '0.06',
+ 'Math::BigInt::FastCalc'=> '0.22',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.26',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3607',
+ 'Module::Build::Base' => '0.3607',
+ 'Module::Build::Compat' => '0.3607',
+ 'Module::Build::Config' => '0.3607',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3607',
+ 'Module::Build::Dumper' => '0.3607',
+ 'Module::Build::ModuleInfo'=> '0.3607',
+ 'Module::Build::Notes' => '0.3607',
+ 'Module::Build::PPMMaker'=> '0.3607',
+ 'Module::Build::Platform::Amiga'=> '0.3607',
+ 'Module::Build::Platform::Default'=> '0.3607',
+ 'Module::Build::Platform::EBCDIC'=> '0.3607',
+ 'Module::Build::Platform::MPEiX'=> '0.3607',
+ 'Module::Build::Platform::MacOS'=> '0.3607',
+ 'Module::Build::Platform::RiscOS'=> '0.3607',
+ 'Module::Build::Platform::Unix'=> '0.3607',
+ 'Module::Build::Platform::VMS'=> '0.3607',
+ 'Module::Build::Platform::VOS'=> '0.3607',
+ 'Module::Build::Platform::Windows'=> '0.3607',
+ 'Module::Build::Platform::aix'=> '0.3607',
+ 'Module::Build::Platform::cygwin'=> '0.3607',
+ 'Module::Build::Platform::darwin'=> '0.3607',
+ 'Module::Build::Platform::os2'=> '0.3607',
+ 'Module::Build::PodParser'=> '0.3607',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.39',
+ 'Module::Load' => '0.18',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.20',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.09',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.28',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.89',
+ 'Storable' => '2.22',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.22',
+ 'TAP::Formatter::Base' => '3.22',
+ 'TAP::Formatter::Color' => '3.22',
+ 'TAP::Formatter::Console'=> '3.22',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.22',
+ 'TAP::Formatter::Console::Session'=> '3.22',
+ 'TAP::Formatter::File' => '3.22',
+ 'TAP::Formatter::File::Session'=> '3.22',
+ 'TAP::Formatter::Session'=> '3.22',
+ 'TAP::Harness' => '3.22',
+ 'TAP::Object' => '3.22',
+ 'TAP::Parser' => '3.22',
+ 'TAP::Parser::Aggregator'=> '3.22',
+ 'TAP::Parser::Grammar' => '3.22',
+ 'TAP::Parser::Iterator' => '3.22',
+ 'TAP::Parser::Iterator::Array'=> '3.22',
+ 'TAP::Parser::Iterator::Process'=> '3.22',
+ 'TAP::Parser::Iterator::Stream'=> '3.22',
+ 'TAP::Parser::IteratorFactory'=> '3.22',
+ 'TAP::Parser::Multiplexer'=> '3.22',
+ 'TAP::Parser::Result' => '3.22',
+ 'TAP::Parser::Result::Bailout'=> '3.22',
+ 'TAP::Parser::Result::Comment'=> '3.22',
+ 'TAP::Parser::Result::Plan'=> '3.22',
+ 'TAP::Parser::Result::Pragma'=> '3.22',
+ 'TAP::Parser::Result::Test'=> '3.22',
+ 'TAP::Parser::Result::Unknown'=> '3.22',
+ 'TAP::Parser::Result::Version'=> '3.22',
+ 'TAP::Parser::Result::YAML'=> '3.22',
+ 'TAP::Parser::ResultFactory'=> '3.22',
+ 'TAP::Parser::Scheduler'=> '3.22',
+ 'TAP::Parser::Scheduler::Job'=> '3.22',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.22',
+ 'TAP::Parser::Source' => '3.22',
+ 'TAP::Parser::SourceHandler'=> '3.22',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.22',
+ 'TAP::Parser::SourceHandler::File'=> '3.22',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.22',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.22',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.22',
+ 'TAP::Parser::Utils' => '3.22',
+ 'TAP::Parser::YAMLish::Reader'=> '3.22',
+ 'TAP::Parser::YAMLish::Writer'=> '3.22',
+ 'Term::ANSIColor' => '3.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.07',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.97_01',
+ 'Test::Builder::Module' => '0.97_01',
+ 'Test::Builder::Tester' => '1.21_01',
+ 'Test::Builder::Tester::Color'=> '1.21_01',
+ 'Test::Harness' => '3.22',
+ 'Test::More' => '0.97_01',
+ 'Test::Simple' => '0.97_01',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.04',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.04',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9721',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.20_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.59',
+ 'Unicode::Collate::Locale'=> '0.59',
+ 'Unicode::Normalize' => '1.06',
+ 'Unicode::UCD' => '0.29',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Filespec' => '1.12',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.21',
+ 'XS::APItest::KeywordRPN'=> '0.005',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.11',
+ 'XSLoader::XSLoader' => '0.11',
+ 'attributes' => '0.12',
+ 'autodie' => '2.10',
+ 'autodie::exception' => '2.10',
+ 'autodie::exception::system'=> '2.10',
+ 'autodie::hints' => '2.10',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.25',
+ 'bignum' => '0.25',
+ 'bigrat' => '0.25',
+ 'blib' => '1.06',
+ 'bytes' => '1.04',
+ 'charnames' => '1.15',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.20',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.18',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3607',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.63',
+ 'locale' => '1.00',
+ 'mro' => '1.03',
+ 'open' => '1.08',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.12',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.77_03',
+ 'threads::shared' => '1.33_03',
+ 'utf8' => '1.08',
+ 'vars' => '1.02',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.11',
+ 'warnings::register' => '1.02',
+ },
+ 5.013006 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.22',
+ 'App::Prove::State' => '3.22',
+ 'App::Prove::State::Result'=> '3.22',
+ 'App::Prove::State::Result::Test'=> '3.22',
+ 'Archive::Extract' => '0.44',
+ 'Archive::Tar' => '1.68',
+ 'Archive::Tar::Constant'=> '1.68',
+ 'Archive::Tar::File' => '1.68',
+ 'Attribute::Handlers' => '0.88',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.24',
+ 'B::Concise' => '0.79',
+ 'B::Debug' => '1.16',
+ 'B::Deparse' => '0.99',
+ 'B::Lint' => '1.12',
+ 'B::Lint::Debug' => '1.12',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_61',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5005',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5001',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5001',
+ 'CPANPLUS' => '0.9007',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.48',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.48',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.9007',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.9007',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.19',
+ 'Carp::Heavy' => '1.19',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.031',
+ 'Compress::Raw::Zlib' => '2.030',
+ 'Compress::Zlib' => '2.030',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.34',
+ 'DB' => '1.03',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.129',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::V' => undef,
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.05',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.51',
+ 'Digest::SHA' => '5.48',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.40',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.04',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.12',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.05',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.13',
+ 'Exporter' => '5.64_03',
+ 'Exporter::Heavy' => '5.64_03',
+ 'ExtUtils::CBuilder' => '0.2703',
+ 'ExtUtils::CBuilder::Base'=> '0.2703_01',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2703',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.57_05',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.05',
+ 'ExtUtils::Constant::ProxySubs'=> '0.07',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.29',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.57_05',
+ 'ExtUtils::Liblist::Kid'=> '6.5705',
+ 'ExtUtils::MM' => '6.57_05',
+ 'ExtUtils::MM_AIX' => '6.57_05',
+ 'ExtUtils::MM_Any' => '6.57_05',
+ 'ExtUtils::MM_BeOS' => '6.57_05',
+ 'ExtUtils::MM_Cygwin' => '6.57_05',
+ 'ExtUtils::MM_DOS' => '6.5705',
+ 'ExtUtils::MM_Darwin' => '6.57_05',
+ 'ExtUtils::MM_MacOS' => '6.5705',
+ 'ExtUtils::MM_NW5' => '6.57_05',
+ 'ExtUtils::MM_OS2' => '6.57_05',
+ 'ExtUtils::MM_QNX' => '6.57_05',
+ 'ExtUtils::MM_UWIN' => '6.5705',
+ 'ExtUtils::MM_Unix' => '6.57_05',
+ 'ExtUtils::MM_VMS' => '6.57_05',
+ 'ExtUtils::MM_VOS' => '6.57_05',
+ 'ExtUtils::MM_Win32' => '6.57_05',
+ 'ExtUtils::MM_Win95' => '6.57_05',
+ 'ExtUtils::MY' => '6.5705',
+ 'ExtUtils::MakeMaker' => '6.57_05',
+ 'ExtUtils::MakeMaker::Config'=> '6.57_05',
+ 'ExtUtils::MakeMaker::YAML'=> '1.44',
+ 'ExtUtils::Manifest' => '1.58',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.57_05',
+ 'ExtUtils::Mksymlists' => '6.57_05',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2207',
+ 'ExtUtils::XSSymSet' => '1.2',
+ 'ExtUtils::testlib' => '6.5705',
+ 'Fatal' => '2.10',
+ 'Fcntl' => '1.09',
+ 'File::Basename' => '2.79',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.20',
+ 'File::DosGlob' => '1.03',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.18',
+ 'File::Glob' => '1.09',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.33',
+ 'File::Spec::Cygwin' => '3.33',
+ 'File::Spec::Epoc' => '3.33',
+ 'File::Spec::Functions' => '3.33',
+ 'File::Spec::Mac' => '3.33',
+ 'File::Spec::OS2' => '3.33',
+ 'File::Spec::Unix' => '3.33',
+ 'File::Spec::VMS' => '3.33',
+ 'File::Spec::Win32' => '3.33',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.03',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.85',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.11',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.09',
+ 'Hash::Util::FieldHash' => '1.05',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35_01',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35_01',
+ 'I18N::Langinfo' => '0.06',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.030',
+ 'IO::Compress::Adapter::Deflate'=> '2.030',
+ 'IO::Compress::Adapter::Identity'=> '2.030',
+ 'IO::Compress::Base' => '2.030',
+ 'IO::Compress::Base::Common'=> '2.030',
+ 'IO::Compress::Bzip2' => '2.030',
+ 'IO::Compress::Deflate' => '2.030',
+ 'IO::Compress::Gzip' => '2.030',
+ 'IO::Compress::Gzip::Constants'=> '2.030',
+ 'IO::Compress::RawDeflate'=> '2.030',
+ 'IO::Compress::Zip' => '2.030',
+ 'IO::Compress::Zip::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Extra'=> '2.030',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Adapter::Identity'=> '2.030',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.030',
+ 'IO::Uncompress::AnyInflate'=> '2.030',
+ 'IO::Uncompress::AnyUncompress'=> '2.030',
+ 'IO::Uncompress::Base' => '2.030',
+ 'IO::Uncompress::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Gunzip'=> '2.030',
+ 'IO::Uncompress::Inflate'=> '2.030',
+ 'IO::Uncompress::RawInflate'=> '2.030',
+ 'IO::Uncompress::Unzip' => '2.030',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.64',
+ 'IPC::Msg' => '2.03',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.07',
+ 'IPC::Semaphore' => '2.03',
+ 'IPC::SharedMem' => '2.03',
+ 'IPC::SysV' => '2.03',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.14',
+ 'Locale::Codes::Country'=> '3.14',
+ 'Locale::Codes::Currency'=> '3.14',
+ 'Locale::Codes::Language'=> '3.14',
+ 'Locale::Codes::Script' => '3.14',
+ 'Locale::Constants' => '3.14',
+ 'Locale::Country' => '3.14',
+ 'Locale::Currency' => '3.14',
+ 'Locale::Language' => '3.14',
+ 'Locale::Maketext' => '1.16',
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.14',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.09',
+ 'MIME::QuotedPrint' => '3.09',
+ 'Math::BigFloat' => '1.63',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.97',
+ 'Math::BigInt::Calc' => '0.55',
+ 'Math::BigInt::CalcEmu' => '0.07',
+ 'Math::BigInt::FastCalc'=> '0.22',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.26',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3607',
+ 'Module::Build::Base' => '0.3607',
+ 'Module::Build::Compat' => '0.3607',
+ 'Module::Build::Config' => '0.3607',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3607',
+ 'Module::Build::Dumper' => '0.3607',
+ 'Module::Build::ModuleInfo'=> '0.3607',
+ 'Module::Build::Notes' => '0.3607',
+ 'Module::Build::PPMMaker'=> '0.3607',
+ 'Module::Build::Platform::Amiga'=> '0.3607',
+ 'Module::Build::Platform::Default'=> '0.3607',
+ 'Module::Build::Platform::EBCDIC'=> '0.3607',
+ 'Module::Build::Platform::MPEiX'=> '0.3607',
+ 'Module::Build::Platform::MacOS'=> '0.3607',
+ 'Module::Build::Platform::RiscOS'=> '0.3607',
+ 'Module::Build::Platform::Unix'=> '0.3607',
+ 'Module::Build::Platform::VMS'=> '0.3607',
+ 'Module::Build::Platform::VOS'=> '0.3607',
+ 'Module::Build::Platform::Windows'=> '0.3607',
+ 'Module::Build::Platform::aix'=> '0.3607',
+ 'Module::Build::Platform::cygwin'=> '0.3607',
+ 'Module::Build::Platform::darwin'=> '0.3607',
+ 'Module::Build::Platform::os2'=> '0.3607',
+ 'Module::Build::PodParser'=> '0.3607',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.40',
+ 'Module::Load' => '0.18',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.09',
+ 'NEXT' => '0.65',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.08',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.16',
+ 'POSIX' => '1.21',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.13',
+ 'PerlIO::scalar' => '0.10',
+ 'PerlIO::via' => '0.10',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.25',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.15',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.07',
+ 'Safe' => '2.28',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.90',
+ 'Storable' => '2.22',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.13',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.22',
+ 'TAP::Formatter::Base' => '3.22',
+ 'TAP::Formatter::Color' => '3.22',
+ 'TAP::Formatter::Console'=> '3.22',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.22',
+ 'TAP::Formatter::Console::Session'=> '3.22',
+ 'TAP::Formatter::File' => '3.22',
+ 'TAP::Formatter::File::Session'=> '3.22',
+ 'TAP::Formatter::Session'=> '3.22',
+ 'TAP::Harness' => '3.22',
+ 'TAP::Object' => '3.22',
+ 'TAP::Parser' => '3.22',
+ 'TAP::Parser::Aggregator'=> '3.22',
+ 'TAP::Parser::Grammar' => '3.22',
+ 'TAP::Parser::Iterator' => '3.22',
+ 'TAP::Parser::Iterator::Array'=> '3.22',
+ 'TAP::Parser::Iterator::Process'=> '3.22',
+ 'TAP::Parser::Iterator::Stream'=> '3.22',
+ 'TAP::Parser::IteratorFactory'=> '3.22',
+ 'TAP::Parser::Multiplexer'=> '3.22',
+ 'TAP::Parser::Result' => '3.22',
+ 'TAP::Parser::Result::Bailout'=> '3.22',
+ 'TAP::Parser::Result::Comment'=> '3.22',
+ 'TAP::Parser::Result::Plan'=> '3.22',
+ 'TAP::Parser::Result::Pragma'=> '3.22',
+ 'TAP::Parser::Result::Test'=> '3.22',
+ 'TAP::Parser::Result::Unknown'=> '3.22',
+ 'TAP::Parser::Result::Version'=> '3.22',
+ 'TAP::Parser::Result::YAML'=> '3.22',
+ 'TAP::Parser::ResultFactory'=> '3.22',
+ 'TAP::Parser::Scheduler'=> '3.22',
+ 'TAP::Parser::Scheduler::Job'=> '3.22',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.22',
+ 'TAP::Parser::Source' => '3.22',
+ 'TAP::Parser::SourceHandler'=> '3.22',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.22',
+ 'TAP::Parser::SourceHandler::File'=> '3.22',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.22',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.22',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.22',
+ 'TAP::Parser::Utils' => '3.22',
+ 'TAP::Parser::YAMLish::Reader'=> '3.22',
+ 'TAP::Parser::YAMLish::Writer'=> '3.22',
+ 'Term::ANSIColor' => '3.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.07',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.97_01',
+ 'Test::Builder::Module' => '0.97_01',
+ 'Test::Builder::Tester' => '1.21_01',
+ 'Test::Builder::Tester::Color'=> '1.21_01',
+ 'Test::Harness' => '3.22',
+ 'Test::More' => '0.97_01',
+ 'Test::Simple' => '0.97_01',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.04',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.04',
+ 'Tie::Hash::NamedCapture'=> '0.07',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9721',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.20_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.63',
+ 'Unicode::Collate::Locale'=> '0.63',
+ 'Unicode::Normalize' => '1.07',
+ 'Unicode::UCD' => '0.29',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Filespec' => '1.12',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.23',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.13',
+ 'XSLoader::XSLoader' => '0.13',
+ 'attributes' => '0.13',
+ 'autodie' => '2.10',
+ 'autodie::exception' => '2.10',
+ 'autodie::exception::system'=> '2.10',
+ 'autodie::hints' => '2.10',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.25',
+ 'bignum' => '0.25',
+ 'bigrat' => '0.25',
+ 'blib' => '1.06',
+ 'bytes' => '1.04',
+ 'charnames' => '1.16',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.20',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.18',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.06',
+ 'inc::latest' => '0.3607',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.63',
+ 'locale' => '1.00',
+ 'mro' => '1.04',
+ 'open' => '1.08',
+ 'ops' => '1.02',
+ 'overload' => '1.11',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.13',
+ 'sigtrap' => '1.05',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.81_01',
+ 'threads::shared' => '1.34',
+ 'utf8' => '1.08',
+ 'vars' => '1.02',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.11',
+ 'warnings::register' => '1.02',
+ },
+ 5.013007 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.22',
+ 'App::Prove::State' => '3.22',
+ 'App::Prove::State::Result'=> '3.22',
+ 'App::Prove::State::Result::Test'=> '3.22',
+ 'Archive::Extract' => '0.46',
+ 'Archive::Tar' => '1.72',
+ 'Archive::Tar::Constant'=> '1.72',
+ 'Archive::Tar::File' => '1.72',
+ 'Attribute::Handlers' => '0.88',
+ 'AutoLoader' => '5.71',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.26',
+ 'B::Concise' => '0.81',
+ 'B::Debug' => '1.16',
+ 'B::Deparse' => '1.01',
+ 'B::Lint' => '1.12',
+ 'B::Lint::Debug' => '1.12',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.50',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_62',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5005',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5001',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5001',
+ 'CPANPLUS' => '0.9010',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.50',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.50',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.9010',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.9010',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.19',
+ 'Carp::Heavy' => '1.19',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.031',
+ 'Compress::Raw::Zlib' => '2.030',
+ 'Compress::Zlib' => '2.030',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.34',
+ 'DB' => '1.03',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.130_01',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.05',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.51',
+ 'Digest::SHA' => '5.48',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.14',
+ 'DynaLoader' => '1.11',
+ 'Encode' => '2.40',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.04',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.12',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.05',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.13',
+ 'Exporter' => '5.64_03',
+ 'Exporter::Heavy' => '5.64_03',
+ 'ExtUtils::CBuilder' => '0.2703',
+ 'ExtUtils::CBuilder::Base'=> '0.2703_01',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2703',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.2703',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.57_05',
+ 'ExtUtils::Constant' => '0.23',
+ 'ExtUtils::Constant::Base'=> '0.05',
+ 'ExtUtils::Constant::ProxySubs'=> '0.08',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.29',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.57_05',
+ 'ExtUtils::Liblist::Kid'=> '6.5705',
+ 'ExtUtils::MM' => '6.57_05',
+ 'ExtUtils::MM_AIX' => '6.57_05',
+ 'ExtUtils::MM_Any' => '6.57_05',
+ 'ExtUtils::MM_BeOS' => '6.57_05',
+ 'ExtUtils::MM_Cygwin' => '6.57_05',
+ 'ExtUtils::MM_DOS' => '6.5705',
+ 'ExtUtils::MM_Darwin' => '6.57_05',
+ 'ExtUtils::MM_MacOS' => '6.5705',
+ 'ExtUtils::MM_NW5' => '6.57_05',
+ 'ExtUtils::MM_OS2' => '6.57_05',
+ 'ExtUtils::MM_QNX' => '6.57_05',
+ 'ExtUtils::MM_UWIN' => '6.5705',
+ 'ExtUtils::MM_Unix' => '6.57_05',
+ 'ExtUtils::MM_VMS' => '6.57_05',
+ 'ExtUtils::MM_VOS' => '6.57_05',
+ 'ExtUtils::MM_Win32' => '6.57_05',
+ 'ExtUtils::MM_Win95' => '6.57_05',
+ 'ExtUtils::MY' => '6.5705',
+ 'ExtUtils::MakeMaker' => '6.57_05',
+ 'ExtUtils::MakeMaker::Config'=> '6.57_05',
+ 'ExtUtils::MakeMaker::YAML'=> '1.44',
+ 'ExtUtils::Manifest' => '1.58',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.57_05',
+ 'ExtUtils::Mksymlists' => '6.57_05',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2207',
+ 'ExtUtils::XSSymSet' => '1.2',
+ 'ExtUtils::testlib' => '6.5705',
+ 'Fatal' => '2.10',
+ 'Fcntl' => '1.10',
+ 'File::Basename' => '2.79',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.20',
+ 'File::DosGlob' => '1.03',
+ 'File::Fetch' => '0.28',
+ 'File::Find' => '1.18',
+ 'File::Glob' => '1.10',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.33',
+ 'File::Spec::Cygwin' => '3.33',
+ 'File::Spec::Epoc' => '3.33',
+ 'File::Spec::Functions' => '3.33',
+ 'File::Spec::Mac' => '3.33',
+ 'File::Spec::OS2' => '3.33',
+ 'File::Spec::Unix' => '3.33',
+ 'File::Spec::VMS' => '3.33',
+ 'File::Spec::Win32' => '3.33',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.04',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.85',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.12',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.10',
+ 'Hash::Util::FieldHash' => '1.06',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35_01',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35_01',
+ 'I18N::Langinfo' => '0.07',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.030',
+ 'IO::Compress::Adapter::Deflate'=> '2.030',
+ 'IO::Compress::Adapter::Identity'=> '2.030',
+ 'IO::Compress::Base' => '2.030',
+ 'IO::Compress::Base::Common'=> '2.030',
+ 'IO::Compress::Bzip2' => '2.030',
+ 'IO::Compress::Deflate' => '2.030',
+ 'IO::Compress::Gzip' => '2.030',
+ 'IO::Compress::Gzip::Constants'=> '2.030',
+ 'IO::Compress::RawDeflate'=> '2.030',
+ 'IO::Compress::Zip' => '2.030',
+ 'IO::Compress::Zip::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Extra'=> '2.030',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Adapter::Identity'=> '2.030',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.030',
+ 'IO::Uncompress::AnyInflate'=> '2.030',
+ 'IO::Uncompress::AnyUncompress'=> '2.030',
+ 'IO::Uncompress::Base' => '2.030',
+ 'IO::Uncompress::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Gunzip'=> '2.030',
+ 'IO::Uncompress::Inflate'=> '2.030',
+ 'IO::Uncompress::RawInflate'=> '2.030',
+ 'IO::Uncompress::Unzip' => '2.030',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.64',
+ 'IPC::Msg' => '2.03',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.07',
+ 'IPC::Semaphore' => '2.03',
+ 'IPC::SharedMem' => '2.03',
+ 'IPC::SysV' => '2.03',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.14',
+ 'Locale::Codes::Country'=> '3.14',
+ 'Locale::Codes::Currency'=> '3.14',
+ 'Locale::Codes::Language'=> '3.14',
+ 'Locale::Codes::Script' => '3.14',
+ 'Locale::Constants' => '3.14',
+ 'Locale::Country' => '3.14',
+ 'Locale::Currency' => '3.14',
+ 'Locale::Language' => '3.14',
+ 'Locale::Maketext' => '1.17',
+ 'Locale::Maketext::Guts'=> '1.17',
+ 'Locale::Maketext::GutsLoader'=> '1.17',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.14',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.10',
+ 'MIME::QuotedPrint' => '3.10',
+ 'Math::BigFloat' => '1.99_01',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.99_01',
+ 'Math::BigInt::Calc' => '1.99_01',
+ 'Math::BigInt::CalcEmu' => '1.99_01',
+ 'Math::BigInt::FastCalc'=> '0.24_01',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.26_01',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3607',
+ 'Module::Build::Base' => '0.3607',
+ 'Module::Build::Compat' => '0.3607',
+ 'Module::Build::Config' => '0.3607',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3607',
+ 'Module::Build::Dumper' => '0.3607',
+ 'Module::Build::ModuleInfo'=> '0.3607',
+ 'Module::Build::Notes' => '0.3607',
+ 'Module::Build::PPMMaker'=> '0.3607',
+ 'Module::Build::Platform::Amiga'=> '0.3607',
+ 'Module::Build::Platform::Default'=> '0.3607',
+ 'Module::Build::Platform::EBCDIC'=> '0.3607',
+ 'Module::Build::Platform::MPEiX'=> '0.3607',
+ 'Module::Build::Platform::MacOS'=> '0.3607',
+ 'Module::Build::Platform::RiscOS'=> '0.3607',
+ 'Module::Build::Platform::Unix'=> '0.3607',
+ 'Module::Build::Platform::VMS'=> '0.3607',
+ 'Module::Build::Platform::VOS'=> '0.3607',
+ 'Module::Build::Platform::Windows'=> '0.3607',
+ 'Module::Build::Platform::aix'=> '0.3607',
+ 'Module::Build::Platform::cygwin'=> '0.3607',
+ 'Module::Build::Platform::darwin'=> '0.3607',
+ 'Module::Build::Platform::os2'=> '0.3607',
+ 'Module::Build::PodParser'=> '0.3607',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.41',
+ 'Module::Load' => '0.18',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.10',
+ 'NEXT' => '0.65',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.09',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.17',
+ 'POSIX' => '1.22',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.13',
+ 'PerlIO::scalar' => '0.10',
+ 'PerlIO::via' => '0.10',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.25',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.15',
+ 'Pod::Simple::BlackBox' => '3.15',
+ 'Pod::Simple::Checker' => '3.15',
+ 'Pod::Simple::Debug' => '3.15',
+ 'Pod::Simple::DumpAsText'=> '3.15',
+ 'Pod::Simple::DumpAsXML'=> '3.15',
+ 'Pod::Simple::HTML' => '3.15',
+ 'Pod::Simple::HTMLBatch'=> '3.15',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.15',
+ 'Pod::Simple::Methody' => '3.15',
+ 'Pod::Simple::Progress' => '3.15',
+ 'Pod::Simple::PullParser'=> '3.15',
+ 'Pod::Simple::PullParserEndToken'=> '3.15',
+ 'Pod::Simple::PullParserStartToken'=> '3.15',
+ 'Pod::Simple::PullParserTextToken'=> '3.15',
+ 'Pod::Simple::PullParserToken'=> '3.15',
+ 'Pod::Simple::RTF' => '3.15',
+ 'Pod::Simple::Search' => '3.15',
+ 'Pod::Simple::SimpleTree'=> '3.15',
+ 'Pod::Simple::Text' => '3.15',
+ 'Pod::Simple::TextContent'=> '3.15',
+ 'Pod::Simple::TiedOutFH'=> '3.15',
+ 'Pod::Simple::Transcode'=> '3.15',
+ 'Pod::Simple::TranscodeDumb'=> '3.15',
+ 'Pod::Simple::TranscodeSmart'=> '3.15',
+ 'Pod::Simple::XHTML' => '3.15',
+ 'Pod::Simple::XMLOutStream'=> '3.15',
+ 'Pod::Text' => '3.15',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.08',
+ 'Safe' => '2.29',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.18',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.91',
+ 'Storable' => '2.24',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.14',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.22',
+ 'TAP::Formatter::Base' => '3.22',
+ 'TAP::Formatter::Color' => '3.22',
+ 'TAP::Formatter::Console'=> '3.22',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.22',
+ 'TAP::Formatter::Console::Session'=> '3.22',
+ 'TAP::Formatter::File' => '3.22',
+ 'TAP::Formatter::File::Session'=> '3.22',
+ 'TAP::Formatter::Session'=> '3.22',
+ 'TAP::Harness' => '3.22',
+ 'TAP::Object' => '3.22',
+ 'TAP::Parser' => '3.22',
+ 'TAP::Parser::Aggregator'=> '3.22',
+ 'TAP::Parser::Grammar' => '3.22',
+ 'TAP::Parser::Iterator' => '3.22',
+ 'TAP::Parser::Iterator::Array'=> '3.22',
+ 'TAP::Parser::Iterator::Process'=> '3.22',
+ 'TAP::Parser::Iterator::Stream'=> '3.22',
+ 'TAP::Parser::IteratorFactory'=> '3.22',
+ 'TAP::Parser::Multiplexer'=> '3.22',
+ 'TAP::Parser::Result' => '3.22',
+ 'TAP::Parser::Result::Bailout'=> '3.22',
+ 'TAP::Parser::Result::Comment'=> '3.22',
+ 'TAP::Parser::Result::Plan'=> '3.22',
+ 'TAP::Parser::Result::Pragma'=> '3.22',
+ 'TAP::Parser::Result::Test'=> '3.22',
+ 'TAP::Parser::Result::Unknown'=> '3.22',
+ 'TAP::Parser::Result::Version'=> '3.22',
+ 'TAP::Parser::Result::YAML'=> '3.22',
+ 'TAP::Parser::ResultFactory'=> '3.22',
+ 'TAP::Parser::Scheduler'=> '3.22',
+ 'TAP::Parser::Scheduler::Job'=> '3.22',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.22',
+ 'TAP::Parser::Source' => '3.22',
+ 'TAP::Parser::SourceHandler'=> '3.22',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.22',
+ 'TAP::Parser::SourceHandler::File'=> '3.22',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.22',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.22',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.22',
+ 'TAP::Parser::Utils' => '3.22',
+ 'TAP::Parser::YAMLish::Reader'=> '3.22',
+ 'TAP::Parser::YAMLish::Writer'=> '3.22',
+ 'Term::ANSIColor' => '3.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.07',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.97_01',
+ 'Test::Builder::Module' => '0.97_01',
+ 'Test::Builder::Tester' => '1.21_01',
+ 'Test::Builder::Tester::Color'=> '1.21_01',
+ 'Test::Harness' => '3.22',
+ 'Test::More' => '0.97_01',
+ 'Test::Simple' => '0.97_01',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.04',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.04',
+ 'Tie::Hash::NamedCapture'=> '0.07',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9721',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.20_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '6.0.0',
+ 'Unicode::Collate' => '0.67',
+ 'Unicode::Collate::CJK::Big5'=> '0.65',
+ 'Unicode::Collate::CJK::GB2312'=> '0.65',
+ 'Unicode::Collate::CJK::JISX0208'=> '0.64',
+ 'Unicode::Collate::CJK::Korean'=> '0.66',
+ 'Unicode::Collate::CJK::Pinyin'=> '0.65',
+ 'Unicode::Collate::CJK::Stroke'=> '0.65',
+ 'Unicode::Collate::Locale'=> '0.67',
+ 'Unicode::Normalize' => '1.07',
+ 'Unicode::UCD' => '0.29',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Filespec' => '1.12',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.26',
+ 'XS::Typemap' => '0.04',
+ 'XSLoader' => '0.13',
+ 'XSLoader::XSLoader' => '0.13',
+ 'attributes' => '0.13',
+ 'autodie' => '2.10',
+ 'autodie::exception' => '2.10',
+ 'autodie::exception::system'=> '2.10',
+ 'autodie::hints' => '2.10',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.25',
+ 'bignum' => '0.25',
+ 'bigrat' => '0.25',
+ 'blib' => '1.06',
+ 'bytes' => '1.04',
+ 'charnames' => '1.17',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.20',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.18',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.06',
+ 'inc::latest' => '0.3607',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.63',
+ 'locale' => '1.00',
+ 'mro' => '1.05',
+ 'open' => '1.08',
+ 'ops' => '1.02',
+ 'overload' => '1.11',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.224',
+ 're' => '0.14',
+ 'sigtrap' => '1.05',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.81_02',
+ 'threads::shared' => '1.34',
+ 'utf8' => '1.08',
+ 'vars' => '1.02',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.11',
+ 'warnings::register' => '1.02',
+ },
+ 5.013008 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.22',
+ 'App::Prove::State' => '3.22',
+ 'App::Prove::State::Result'=> '3.22',
+ 'App::Prove::State::Result::Test'=> '3.22',
+ 'Archive::Extract' => '0.46',
+ 'Archive::Tar' => '1.74',
+ 'Archive::Tar::Constant'=> '1.74',
+ 'Archive::Tar::File' => '1.74',
+ 'Attribute::Handlers' => '0.88',
+ 'AutoLoader' => '5.71',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.27',
+ 'B::Concise' => '0.82',
+ 'B::Debug' => '1.16',
+ 'B::Deparse' => '1.02',
+ 'B::Lint' => '1.12',
+ 'B::Lint::Debug' => '1.12',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.50',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_62',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9600',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5005',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5001',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5001',
+ 'CPANPLUS' => '0.9010',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.50',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.50',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.9010',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.9010',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.19',
+ 'Carp::Heavy' => '1.17',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.031',
+ 'Compress::Raw::Zlib' => '2.030',
+ 'Compress::Zlib' => '2.030',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.35',
+ 'DB' => '1.03',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.130_02',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.06',
+ 'Devel::SelfStubber' => '1.05',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.51',
+ 'Digest::SHA' => '5.50',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.15',
+ 'DynaLoader' => '1.12',
+ 'Encode' => '2.40',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.04',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.12',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.05',
+ 'English' => '1.04',
+ 'Env' => '1.02',
+ 'Errno' => '1.13',
+ 'Exporter' => '5.64_03',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.280201',
+ 'ExtUtils::CBuilder::Base'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280201',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.280201',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.57_05',
+ 'ExtUtils::Constant' => '0.23',
+ 'ExtUtils::Constant::Base'=> '0.05',
+ 'ExtUtils::Constant::ProxySubs'=> '0.08',
+ 'ExtUtils::Constant::Utils'=> '0.03',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.30',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.57_05',
+ 'ExtUtils::Liblist::Kid'=> '6.5705',
+ 'ExtUtils::MM' => '6.57_05',
+ 'ExtUtils::MM_AIX' => '6.57_05',
+ 'ExtUtils::MM_Any' => '6.57_05',
+ 'ExtUtils::MM_BeOS' => '6.57_05',
+ 'ExtUtils::MM_Cygwin' => '6.57_05',
+ 'ExtUtils::MM_DOS' => '6.5705',
+ 'ExtUtils::MM_Darwin' => '6.57_05',
+ 'ExtUtils::MM_MacOS' => '6.5705',
+ 'ExtUtils::MM_NW5' => '6.57_05',
+ 'ExtUtils::MM_OS2' => '6.57_05',
+ 'ExtUtils::MM_QNX' => '6.57_05',
+ 'ExtUtils::MM_UWIN' => '6.5705',
+ 'ExtUtils::MM_Unix' => '6.57_05',
+ 'ExtUtils::MM_VMS' => '6.57_05',
+ 'ExtUtils::MM_VOS' => '6.57_05',
+ 'ExtUtils::MM_Win32' => '6.57_05',
+ 'ExtUtils::MM_Win95' => '6.57_05',
+ 'ExtUtils::MY' => '6.5705',
+ 'ExtUtils::MakeMaker' => '6.57_05',
+ 'ExtUtils::MakeMaker::Config'=> '6.57_05',
+ 'ExtUtils::MakeMaker::YAML'=> '1.44',
+ 'ExtUtils::Manifest' => '1.58',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.57_05',
+ 'ExtUtils::Mksymlists' => '6.57_05',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.2208',
+ 'ExtUtils::XSSymSet' => '1.2',
+ 'ExtUtils::testlib' => '6.5705',
+ 'Fatal' => '2.1001',
+ 'Fcntl' => '1.11',
+ 'File::Basename' => '2.79',
+ 'File::CheckTree' => '4.41',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.20',
+ 'File::DosGlob' => '1.03',
+ 'File::Fetch' => '0.28',
+ 'File::Find' => '1.18',
+ 'File::Glob' => '1.11',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.33',
+ 'File::Spec::Cygwin' => '3.33',
+ 'File::Spec::Epoc' => '3.33',
+ 'File::Spec::Functions' => '3.33',
+ 'File::Spec::Mac' => '3.33',
+ 'File::Spec::OS2' => '3.33',
+ 'File::Spec::Unix' => '3.33',
+ 'File::Spec::VMS' => '3.33',
+ 'File::Spec::Win32' => '3.33',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.04',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.85',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.13',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.10',
+ 'Hash::Util::FieldHash' => '1.07',
+ 'I18N::Collate' => '1.02',
+ 'I18N::LangTags' => '0.35_01',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35_01',
+ 'I18N::Langinfo' => '0.07',
+ 'IO' => '1.25_03',
+ 'IO::Compress::Adapter::Bzip2'=> '2.030',
+ 'IO::Compress::Adapter::Deflate'=> '2.030',
+ 'IO::Compress::Adapter::Identity'=> '2.030',
+ 'IO::Compress::Base' => '2.030',
+ 'IO::Compress::Base::Common'=> '2.030',
+ 'IO::Compress::Bzip2' => '2.030',
+ 'IO::Compress::Deflate' => '2.030',
+ 'IO::Compress::Gzip' => '2.030',
+ 'IO::Compress::Gzip::Constants'=> '2.030',
+ 'IO::Compress::RawDeflate'=> '2.030',
+ 'IO::Compress::Zip' => '2.030',
+ 'IO::Compress::Zip::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Constants'=> '2.030',
+ 'IO::Compress::Zlib::Extra'=> '2.030',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.32',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Adapter::Identity'=> '2.030',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.030',
+ 'IO::Uncompress::AnyInflate'=> '2.030',
+ 'IO::Uncompress::AnyUncompress'=> '2.030',
+ 'IO::Uncompress::Base' => '2.030',
+ 'IO::Uncompress::Bunzip2'=> '2.030',
+ 'IO::Uncompress::Gunzip'=> '2.030',
+ 'IO::Uncompress::Inflate'=> '2.030',
+ 'IO::Uncompress::RawInflate'=> '2.030',
+ 'IO::Uncompress::Unzip' => '2.030',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.66',
+ 'IPC::Msg' => '2.03',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.08',
+ 'IPC::Semaphore' => '2.03',
+ 'IPC::SharedMem' => '2.03',
+ 'IPC::SysV' => '2.03',
+ 'List::Util' => '1.23',
+ 'List::Util::PP' => '1.23',
+ 'List::Util::XS' => '1.23',
+ 'Locale::Codes' => '3.15',
+ 'Locale::Codes::Country'=> '3.15',
+ 'Locale::Codes::Currency'=> '3.15',
+ 'Locale::Codes::Language'=> '3.15',
+ 'Locale::Codes::Script' => '3.15',
+ 'Locale::Constants' => '3.15',
+ 'Locale::Country' => '3.15',
+ 'Locale::Currency' => '3.15',
+ 'Locale::Language' => '3.15',
+ 'Locale::Maketext' => '1.17',
+ 'Locale::Maketext::Guts'=> '1.17',
+ 'Locale::Maketext::GutsLoader'=> '1.17',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '3.15',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.13',
+ 'MIME::QuotedPrint' => '3.13',
+ 'Math::BigFloat' => '1.99_02',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.99_02',
+ 'Math::BigInt::Calc' => '1.99_02',
+ 'Math::BigInt::CalcEmu' => '1.99_02',
+ 'Math::BigInt::FastCalc'=> '0.24_01',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.26_01',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.02',
+ 'Memoize::AnyDBM_File' => '1.02',
+ 'Memoize::Expire' => '1.02',
+ 'Memoize::ExpireFile' => '1.02',
+ 'Memoize::ExpireTest' => '1.02',
+ 'Memoize::NDBM_File' => '1.02',
+ 'Memoize::SDBM_File' => '1.02',
+ 'Memoize::Storable' => '1.02',
+ 'Module::Build' => '0.3607',
+ 'Module::Build::Base' => '0.3607',
+ 'Module::Build::Compat' => '0.3607',
+ 'Module::Build::Config' => '0.3607',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3607',
+ 'Module::Build::Dumper' => '0.3607',
+ 'Module::Build::ModuleInfo'=> '0.3607',
+ 'Module::Build::Notes' => '0.3607',
+ 'Module::Build::PPMMaker'=> '0.3607',
+ 'Module::Build::Platform::Amiga'=> '0.3607',
+ 'Module::Build::Platform::Default'=> '0.3607',
+ 'Module::Build::Platform::EBCDIC'=> '0.3607',
+ 'Module::Build::Platform::MPEiX'=> '0.3607',
+ 'Module::Build::Platform::MacOS'=> '0.3607',
+ 'Module::Build::Platform::RiscOS'=> '0.3607',
+ 'Module::Build::Platform::Unix'=> '0.3607',
+ 'Module::Build::Platform::VMS'=> '0.3607',
+ 'Module::Build::Platform::VOS'=> '0.3607',
+ 'Module::Build::Platform::Windows'=> '0.3607',
+ 'Module::Build::Platform::aix'=> '0.3607',
+ 'Module::Build::Platform::cygwin'=> '0.3607',
+ 'Module::Build::Platform::darwin'=> '0.3607',
+ 'Module::Build::Platform::os2'=> '0.3607',
+ 'Module::Build::PodParser'=> '0.3607',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.43',
+ 'Module::Load' => '0.18',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.11',
+ 'NEXT' => '0.65',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.37',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.10',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.18',
+ 'POSIX' => '1.23',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.14',
+ 'PerlIO::scalar' => '0.11',
+ 'PerlIO::via' => '0.11',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.25',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.15',
+ 'Pod::Simple::BlackBox' => '3.15',
+ 'Pod::Simple::Checker' => '3.15',
+ 'Pod::Simple::Debug' => '3.15',
+ 'Pod::Simple::DumpAsText'=> '3.15',
+ 'Pod::Simple::DumpAsXML'=> '3.15',
+ 'Pod::Simple::HTML' => '3.15',
+ 'Pod::Simple::HTMLBatch'=> '3.15',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.15',
+ 'Pod::Simple::Methody' => '3.15',
+ 'Pod::Simple::Progress' => '3.15',
+ 'Pod::Simple::PullParser'=> '3.15',
+ 'Pod::Simple::PullParserEndToken'=> '3.15',
+ 'Pod::Simple::PullParserStartToken'=> '3.15',
+ 'Pod::Simple::PullParserTextToken'=> '3.15',
+ 'Pod::Simple::PullParserToken'=> '3.15',
+ 'Pod::Simple::RTF' => '3.15',
+ 'Pod::Simple::Search' => '3.15',
+ 'Pod::Simple::SimpleTree'=> '3.15',
+ 'Pod::Simple::Text' => '3.15',
+ 'Pod::Simple::TextContent'=> '3.15',
+ 'Pod::Simple::TiedOutFH'=> '3.15',
+ 'Pod::Simple::Transcode'=> '3.15',
+ 'Pod::Simple::TranscodeDumb'=> '3.15',
+ 'Pod::Simple::TranscodeSmart'=> '3.15',
+ 'Pod::Simple::XHTML' => '3.15',
+ 'Pod::Simple::XMLOutStream'=> '3.15',
+ 'Pod::Text' => '3.15',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.09',
+ 'Safe' => '2.29',
+ 'Scalar::Util' => '1.23',
+ 'Scalar::Util::PP' => '1.23',
+ 'Search::Dict' => '1.03',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.18',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.92',
+ 'Storable' => '2.25',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.14',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.22',
+ 'TAP::Formatter::Base' => '3.22',
+ 'TAP::Formatter::Color' => '3.22',
+ 'TAP::Formatter::Console'=> '3.22',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.22',
+ 'TAP::Formatter::Console::Session'=> '3.22',
+ 'TAP::Formatter::File' => '3.22',
+ 'TAP::Formatter::File::Session'=> '3.22',
+ 'TAP::Formatter::Session'=> '3.22',
+ 'TAP::Harness' => '3.22',
+ 'TAP::Object' => '3.22',
+ 'TAP::Parser' => '3.22',
+ 'TAP::Parser::Aggregator'=> '3.22',
+ 'TAP::Parser::Grammar' => '3.22',
+ 'TAP::Parser::Iterator' => '3.22',
+ 'TAP::Parser::Iterator::Array'=> '3.22',
+ 'TAP::Parser::Iterator::Process'=> '3.22',
+ 'TAP::Parser::Iterator::Stream'=> '3.22',
+ 'TAP::Parser::IteratorFactory'=> '3.22',
+ 'TAP::Parser::Multiplexer'=> '3.22',
+ 'TAP::Parser::Result' => '3.22',
+ 'TAP::Parser::Result::Bailout'=> '3.22',
+ 'TAP::Parser::Result::Comment'=> '3.22',
+ 'TAP::Parser::Result::Plan'=> '3.22',
+ 'TAP::Parser::Result::Pragma'=> '3.22',
+ 'TAP::Parser::Result::Test'=> '3.22',
+ 'TAP::Parser::Result::Unknown'=> '3.22',
+ 'TAP::Parser::Result::Version'=> '3.22',
+ 'TAP::Parser::Result::YAML'=> '3.22',
+ 'TAP::Parser::ResultFactory'=> '3.22',
+ 'TAP::Parser::Scheduler'=> '3.22',
+ 'TAP::Parser::Scheduler::Job'=> '3.22',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.22',
+ 'TAP::Parser::Source' => '3.22',
+ 'TAP::Parser::SourceHandler'=> '3.22',
+ 'TAP::Parser::SourceHandler::Executable'=> '3.22',
+ 'TAP::Parser::SourceHandler::File'=> '3.22',
+ 'TAP::Parser::SourceHandler::Handle'=> '3.22',
+ 'TAP::Parser::SourceHandler::Perl'=> '3.22',
+ 'TAP::Parser::SourceHandler::RawTAP'=> '3.22',
+ 'TAP::Parser::Utils' => '3.22',
+ 'TAP::Parser::YAMLish::Reader'=> '3.22',
+ 'TAP::Parser::YAMLish::Writer'=> '3.22',
+ 'Term::ANSIColor' => '3.00',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.07',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.97_01',
+ 'Test::Builder::Module' => '0.97_01',
+ 'Test::Builder::Tester' => '1.21_01',
+ 'Test::Builder::Tester::Color'=> '1.21_01',
+ 'Test::Harness' => '3.22',
+ 'Test::More' => '0.97_01',
+ 'Test::Simple' => '0.97_01',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.11',
+ 'Tie::Array' => '1.04',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.04',
+ 'Tie::Hash::NamedCapture'=> '0.07',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9721_01',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.20_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.07',
+ 'Unicode' => '6.0.0',
+ 'Unicode::Collate' => '0.6801',
+ 'Unicode::Collate::CJK::Big5'=> '0.65',
+ 'Unicode::Collate::CJK::GB2312'=> '0.65',
+ 'Unicode::Collate::CJK::JISX0208'=> '0.64',
+ 'Unicode::Collate::CJK::Korean'=> '0.66',
+ 'Unicode::Collate::CJK::Pinyin'=> '0.65',
+ 'Unicode::Collate::CJK::Stroke'=> '0.65',
+ 'Unicode::Collate::Locale'=> '0.68',
+ 'Unicode::Normalize' => '1.08',
+ 'Unicode::UCD' => '0.30',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.04',
+ 'VMS::Filespec' => '1.12',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.41',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.27',
+ 'XS::Typemap' => '0.04',
+ 'XSLoader' => '0.13',
+ 'XSLoader::XSLoader' => '0.13',
+ 'attributes' => '0.13',
+ 'autodie' => '2.1001',
+ 'autodie::exception' => '2.1001',
+ 'autodie::exception::system'=> '2.1001',
+ 'autodie::hints' => '2.1001',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.25',
+ 'bignum' => '0.25',
+ 'bigrat' => '0.25',
+ 'blib' => '1.06',
+ 'bytes' => '1.04',
+ 'charnames' => '1.17',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.20',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.19',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.0601',
+ 'inc::latest' => '0.3607',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.63',
+ 'locale' => '1.00',
+ 'mro' => '1.06',
+ 'open' => '1.08',
+ 'ops' => '1.02',
+ 'overload' => '1.12',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.224',
+ 're' => '0.15',
+ 'sigtrap' => '1.05',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.81_03',
+ 'threads::shared' => '1.35',
+ 'utf8' => '1.08',
+ 'vars' => '1.02',
+ 'version' => '0.86',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.11',
+ 'warnings::register' => '1.02',
+ },
+
+ 5.012003 => {
+ 'AnyDBM_File' => '1.00',
+ 'App::Cpan' => '1.5701',
+ 'App::Prove' => '3.17',
+ 'App::Prove::State' => '3.17',
+ 'App::Prove::State::Result'=> '3.17',
+ 'App::Prove::State::Result::Test'=> '3.17',
+ 'Archive::Extract' => '0.38',
+ 'Archive::Tar' => '1.54',
+ 'Archive::Tar::Constant'=> '0.02',
+ 'Archive::Tar::File' => '0.02',
+ 'Attribute::Handlers' => '0.87',
+ 'AutoLoader' => '5.70',
+ 'AutoSplit' => '1.06',
+ 'B' => '1.23',
+ 'B::Concise' => '0.78',
+ 'B::Debug' => '1.12',
+ 'B::Deparse' => '0.9701',
+ 'B::Lint' => '1.11_01',
+ 'B::Lint::Debug' => '0.01',
+ 'B::Showlex' => '1.02',
+ 'B::Terse' => '1.05',
+ 'B::Xref' => '1.02',
+ 'Benchmark' => '1.11',
+ 'CGI' => '3.49',
+ 'CGI::Apache' => '1.01',
+ 'CGI::Carp' => '3.45',
+ 'CGI::Cookie' => '1.29',
+ 'CGI::Fast' => '1.08',
+ 'CGI::Pretty' => '3.46',
+ 'CGI::Push' => '1.04',
+ 'CGI::Switch' => '1.01',
+ 'CGI::Util' => '3.48',
+ 'CPAN' => '1.94_56',
+ 'CPAN::Author' => '5.5',
+ 'CPAN::Bundle' => '5.5',
+ 'CPAN::CacheMgr' => '5.5',
+ 'CPAN::Complete' => '5.5',
+ 'CPAN::Debug' => '5.5001',
+ 'CPAN::DeferredCode' => '5.50',
+ 'CPAN::Distribution' => '1.9456_01',
+ 'CPAN::Distroprefs' => '6',
+ 'CPAN::Distrostatus' => '5.5',
+ 'CPAN::Exception::RecursiveDependency'=> '5.5',
+ 'CPAN::Exception::blocked_urllist'=> '1.0',
+ 'CPAN::Exception::yaml_not_installed'=> '5.5',
+ 'CPAN::FTP' => '5.5004',
+ 'CPAN::FTP::netrc' => '1.00',
+ 'CPAN::FirstTime' => '5.5301',
+ 'CPAN::HandleConfig' => '5.5001',
+ 'CPAN::Index' => '1.94',
+ 'CPAN::InfoObj' => '5.5',
+ 'CPAN::Kwalify' => '5.50',
+ 'CPAN::LWP::UserAgent' => '1.94',
+ 'CPAN::Mirrors' => '1.77',
+ 'CPAN::Module' => '5.5',
+ 'CPAN::Nox' => '5.50',
+ 'CPAN::Prompt' => '5.5',
+ 'CPAN::Queue' => '5.5',
+ 'CPAN::Shell' => '5.5001',
+ 'CPAN::Tarzip' => '5.5011',
+ 'CPAN::URL' => '5.5',
+ 'CPAN::Version' => '5.5',
+ 'CPANPLUS' => '0.90',
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => '0.46',
+ 'CPANPLUS::Dist::Build::Constants'=> '0.46',
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => '0.90',
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> '0.0562',
+ 'CPANPLUS::Shell::Default'=> '0.90',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Carp' => '1.17',
+ 'Carp::Heavy' => '1.17',
+ 'Class::ISA' => '0.36',
+ 'Class::Struct' => '0.63',
+ 'Compress::Raw::Bzip2' => '2.024',
+ 'Compress::Raw::Zlib' => '2.024',
+ 'Compress::Zlib' => '2.024',
+ 'Config' => undef,
+ 'Config::Extensions' => '0.01',
+ 'Cwd' => '3.31',
+ 'DB' => '1.02',
+ 'DBM_Filter' => '0.03',
+ 'DBM_Filter::compress' => '0.02',
+ 'DBM_Filter::encode' => '0.02',
+ 'DBM_Filter::int32' => '0.02',
+ 'DBM_Filter::null' => '0.02',
+ 'DBM_Filter::utf8' => '0.02',
+ 'DB_File' => '1.820',
+ 'Data::Dumper' => '2.125',
+ 'Devel::DProf' => '20080331.00',
+ 'Devel::DProf::V' => undef,
+ 'Devel::DProf::dprof::V'=> undef,
+ 'Devel::InnerPackage' => '0.3',
+ 'Devel::PPPort' => '3.19',
+ 'Devel::Peek' => '1.04',
+ 'Devel::SelfStubber' => '1.03',
+ 'Digest' => '1.16',
+ 'Digest::MD5' => '2.39',
+ 'Digest::SHA' => '5.47',
+ 'Digest::base' => '1.16',
+ 'Digest::file' => '1.16',
+ 'DirHandle' => '1.03',
+ 'Dumpvalue' => '1.13',
+ 'DynaLoader' => '1.10',
+ 'Encode' => '2.39',
+ 'Encode::Alias' => '2.12',
+ 'Encode::Byte' => '2.04',
+ 'Encode::CJKConstants' => '2.02',
+ 'Encode::CN' => '2.03',
+ 'Encode::CN::HZ' => '2.05',
+ 'Encode::Config' => '2.05',
+ 'Encode::EBCDIC' => '2.02',
+ 'Encode::Encoder' => '2.01',
+ 'Encode::Encoding' => '2.05',
+ 'Encode::GSM0338' => '2.01',
+ 'Encode::Guess' => '2.03',
+ 'Encode::JP' => '2.04',
+ 'Encode::JP::H2Z' => '2.02',
+ 'Encode::JP::JIS7' => '2.04',
+ 'Encode::KR' => '2.03',
+ 'Encode::KR::2022_KR' => '2.02',
+ 'Encode::MIME::Header' => '2.11',
+ 'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+ 'Encode::MIME::Name' => '1.01',
+ 'Encode::Symbol' => '2.02',
+ 'Encode::TW' => '2.03',
+ 'Encode::Unicode' => '2.07',
+ 'Encode::Unicode::UTF7' => '2.04',
+ 'English' => '1.04',
+ 'Env' => '1.01',
+ 'Errno' => '1.11',
+ 'Exporter' => '5.64_01',
+ 'Exporter::Heavy' => '5.64_01',
+ 'ExtUtils::CBuilder' => '0.27',
+ 'ExtUtils::CBuilder::Base'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Unix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::VMS'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::aix'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::darwin'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27',
+ 'ExtUtils::CBuilder::Platform::os2'=> '0.27',
+ 'ExtUtils::Command' => '1.16',
+ 'ExtUtils::Command::MM' => '6.56',
+ 'ExtUtils::Constant' => '0.22',
+ 'ExtUtils::Constant::Base'=> '0.04',
+ 'ExtUtils::Constant::ProxySubs'=> '0.06',
+ 'ExtUtils::Constant::Utils'=> '0.02',
+ 'ExtUtils::Constant::XS'=> '0.03',
+ 'ExtUtils::Embed' => '1.28',
+ 'ExtUtils::Install' => '1.55',
+ 'ExtUtils::Installed' => '1.999_001',
+ 'ExtUtils::Liblist' => '6.56',
+ 'ExtUtils::Liblist::Kid'=> '6.56',
+ 'ExtUtils::MM' => '6.56',
+ 'ExtUtils::MM_AIX' => '6.56',
+ 'ExtUtils::MM_Any' => '6.56',
+ 'ExtUtils::MM_BeOS' => '6.56',
+ 'ExtUtils::MM_Cygwin' => '6.56',
+ 'ExtUtils::MM_DOS' => '6.56',
+ 'ExtUtils::MM_Darwin' => '6.56',
+ 'ExtUtils::MM_MacOS' => '6.56',
+ 'ExtUtils::MM_NW5' => '6.56',
+ 'ExtUtils::MM_OS2' => '6.56',
+ 'ExtUtils::MM_QNX' => '6.56',
+ 'ExtUtils::MM_UWIN' => '6.56',
+ 'ExtUtils::MM_Unix' => '6.56',
+ 'ExtUtils::MM_VMS' => '6.56',
+ 'ExtUtils::MM_VOS' => '6.56',
+ 'ExtUtils::MM_Win32' => '6.56',
+ 'ExtUtils::MM_Win95' => '6.56',
+ 'ExtUtils::MY' => '6.56',
+ 'ExtUtils::MakeMaker' => '6.56',
+ 'ExtUtils::MakeMaker::Config'=> '6.56',
+ 'ExtUtils::Manifest' => '1.57',
+ 'ExtUtils::Miniperl' => undef,
+ 'ExtUtils::Mkbootstrap' => '6.56',
+ 'ExtUtils::Mksymlists' => '6.56',
+ 'ExtUtils::Packlist' => '1.44',
+ 'ExtUtils::ParseXS' => '2.21',
+ 'ExtUtils::XSSymSet' => '1.1',
+ 'ExtUtils::testlib' => '6.56',
+ 'Fatal' => '2.06_01',
+ 'Fcntl' => '1.06',
+ 'File::Basename' => '2.78',
+ 'File::CheckTree' => '4.4',
+ 'File::Compare' => '1.1006',
+ 'File::Copy' => '2.18',
+ 'File::DosGlob' => '1.01',
+ 'File::Fetch' => '0.24',
+ 'File::Find' => '1.15',
+ 'File::Glob' => '1.07',
+ 'File::GlobMapper' => '1.000',
+ 'File::Path' => '2.08_01',
+ 'File::Spec' => '3.31_01',
+ 'File::Spec::Cygwin' => '3.30',
+ 'File::Spec::Epoc' => '3.30',
+ 'File::Spec::Functions' => '3.30',
+ 'File::Spec::Mac' => '3.30',
+ 'File::Spec::OS2' => '3.30',
+ 'File::Spec::Unix' => '3.30',
+ 'File::Spec::VMS' => '3.30',
+ 'File::Spec::Win32' => '3.30',
+ 'File::Temp' => '0.22',
+ 'File::stat' => '1.02',
+ 'FileCache' => '1.08',
+ 'FileHandle' => '2.02',
+ 'Filter::Simple' => '0.84',
+ 'Filter::Util::Call' => '1.08',
+ 'FindBin' => '1.50',
+ 'GDBM_File' => '1.10',
+ 'Getopt::Long' => '2.38',
+ 'Getopt::Std' => '1.06',
+ 'Hash::Util' => '0.07',
+ 'Hash::Util::FieldHash' => '1.04',
+ 'I18N::Collate' => '1.01',
+ 'I18N::LangTags' => '0.35',
+ 'I18N::LangTags::Detect'=> '1.04',
+ 'I18N::LangTags::List' => '0.35',
+ 'I18N::Langinfo' => '0.03',
+ 'IO' => '1.25_02',
+ 'IO::Compress::Adapter::Bzip2'=> '2.024',
+ 'IO::Compress::Adapter::Deflate'=> '2.024',
+ 'IO::Compress::Adapter::Identity'=> '2.024',
+ 'IO::Compress::Base' => '2.024',
+ 'IO::Compress::Base::Common'=> '2.024',
+ 'IO::Compress::Bzip2' => '2.024',
+ 'IO::Compress::Deflate' => '2.024',
+ 'IO::Compress::Gzip' => '2.024',
+ 'IO::Compress::Gzip::Constants'=> '2.024',
+ 'IO::Compress::RawDeflate'=> '2.024',
+ 'IO::Compress::Zip' => '2.024',
+ 'IO::Compress::Zip::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Constants'=> '2.024',
+ 'IO::Compress::Zlib::Extra'=> '2.024',
+ 'IO::Dir' => '1.07',
+ 'IO::File' => '1.14',
+ 'IO::Handle' => '1.28',
+ 'IO::Pipe' => '1.13',
+ 'IO::Poll' => '0.07',
+ 'IO::Seekable' => '1.10',
+ 'IO::Select' => '1.17',
+ 'IO::Socket' => '1.31',
+ 'IO::Socket::INET' => '1.31',
+ 'IO::Socket::UNIX' => '1.23',
+ 'IO::Uncompress::Adapter::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Adapter::Identity'=> '2.024',
+ 'IO::Uncompress::Adapter::Inflate'=> '2.024',
+ 'IO::Uncompress::AnyInflate'=> '2.024',
+ 'IO::Uncompress::AnyUncompress'=> '2.024',
+ 'IO::Uncompress::Base' => '2.024',
+ 'IO::Uncompress::Bunzip2'=> '2.024',
+ 'IO::Uncompress::Gunzip'=> '2.024',
+ 'IO::Uncompress::Inflate'=> '2.024',
+ 'IO::Uncompress::RawInflate'=> '2.024',
+ 'IO::Uncompress::Unzip' => '2.024',
+ 'IO::Zlib' => '1.10',
+ 'IPC::Cmd' => '0.54',
+ 'IPC::Msg' => '2.01',
+ 'IPC::Open2' => '1.03',
+ 'IPC::Open3' => '1.05',
+ 'IPC::Semaphore' => '2.01',
+ 'IPC::SharedMem' => '2.01',
+ 'IPC::SysV' => '2.01',
+ 'List::Util' => '1.22',
+ 'List::Util::PP' => '1.22',
+ 'List::Util::XS' => '1.22',
+ 'Locale::Constants' => '2.07',
+ 'Locale::Country' => '2.07',
+ 'Locale::Currency' => '2.07',
+ 'Locale::Language' => '2.07',
+ 'Locale::Maketext' => '1.14',
+ 'Locale::Maketext::Guts'=> '1.13',
+ 'Locale::Maketext::GutsLoader'=> '1.13',
+ 'Locale::Maketext::Simple'=> '0.21',
+ 'Locale::Script' => '2.07',
+ 'Log::Message' => '0.02',
+ 'Log::Message::Config' => '0.01',
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => '0.06',
+ 'MIME::Base64' => '3.08',
+ 'MIME::QuotedPrint' => '3.08',
+ 'Math::BigFloat' => '1.60',
+ 'Math::BigFloat::Trace' => '0.01',
+ 'Math::BigInt' => '1.89_01',
+ 'Math::BigInt::Calc' => '0.52',
+ 'Math::BigInt::CalcEmu' => '0.05',
+ 'Math::BigInt::FastCalc'=> '0.19',
+ 'Math::BigInt::Trace' => '0.01',
+ 'Math::BigRat' => '0.24',
+ 'Math::Complex' => '1.56',
+ 'Math::Trig' => '1.2',
+ 'Memoize' => '1.01_03',
+ 'Memoize::AnyDBM_File' => '0.65',
+ 'Memoize::Expire' => '1.00',
+ 'Memoize::ExpireFile' => '1.01',
+ 'Memoize::ExpireTest' => '0.65',
+ 'Memoize::NDBM_File' => '0.65',
+ 'Memoize::SDBM_File' => '0.65',
+ 'Memoize::Storable' => '0.65',
+ 'Module::Build' => '0.3603',
+ 'Module::Build::Base' => '0.3603',
+ 'Module::Build::Compat' => '0.3603',
+ 'Module::Build::Config' => '0.3603',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> '0.3603',
+ 'Module::Build::Dumper' => '0.3603',
+ 'Module::Build::ModuleInfo'=> '0.3603',
+ 'Module::Build::Notes' => '0.3603',
+ 'Module::Build::PPMMaker'=> '0.3603',
+ 'Module::Build::Platform::Amiga'=> '0.3603',
+ 'Module::Build::Platform::Default'=> '0.3603',
+ 'Module::Build::Platform::EBCDIC'=> '0.3603',
+ 'Module::Build::Platform::MPEiX'=> '0.3603',
+ 'Module::Build::Platform::MacOS'=> '0.3603',
+ 'Module::Build::Platform::RiscOS'=> '0.3603',
+ 'Module::Build::Platform::Unix'=> '0.3603',
+ 'Module::Build::Platform::VMS'=> '0.3603',
+ 'Module::Build::Platform::VOS'=> '0.3603',
+ 'Module::Build::Platform::Windows'=> '0.3603',
+ 'Module::Build::Platform::aix'=> '0.3603',
+ 'Module::Build::Platform::cygwin'=> '0.360301',
+ 'Module::Build::Platform::darwin'=> '0.3603',
+ 'Module::Build::Platform::os2'=> '0.3603',
+ 'Module::Build::PodParser'=> '0.3603',
+ 'Module::Build::Version'=> '0.77',
+ 'Module::Build::YAML' => '1.40',
+ 'Module::CoreList' => '2.38',
+ 'Module::Load' => '0.16',
+ 'Module::Load::Conditional'=> '0.38',
+ 'Module::Loaded' => '0.06',
+ 'Module::Pluggable' => '3.9',
+ 'Module::Pluggable::Object'=> '3.9',
+ 'Moped::Msg' => '0.01',
+ 'NDBM_File' => '1.08',
+ 'NEXT' => '0.64',
+ 'Net::Cmd' => '2.29',
+ 'Net::Config' => '1.11',
+ 'Net::Domain' => '2.20',
+ 'Net::FTP' => '2.77',
+ 'Net::FTP::A' => '1.18',
+ 'Net::FTP::E' => '0.01',
+ 'Net::FTP::I' => '1.12',
+ 'Net::FTP::L' => '0.01',
+ 'Net::FTP::dataconn' => '0.11',
+ 'Net::NNTP' => '2.24',
+ 'Net::Netrc' => '2.12',
+ 'Net::POP3' => '2.29',
+ 'Net::Ping' => '2.36',
+ 'Net::SMTP' => '2.31',
+ 'Net::Time' => '2.10',
+ 'Net::hostent' => '1.01',
+ 'Net::netent' => '1.00',
+ 'Net::protoent' => '1.00',
+ 'Net::servent' => '1.01',
+ 'O' => '1.01',
+ 'ODBM_File' => '1.07',
+ 'Object::Accessor' => '0.36',
+ 'Opcode' => '1.15',
+ 'POSIX' => '1.19',
+ 'Package::Constants' => '0.02',
+ 'Params::Check' => '0.26',
+ 'Parse::CPAN::Meta' => '1.40',
+ 'PerlIO' => '1.06',
+ 'PerlIO::encoding' => '0.12',
+ 'PerlIO::scalar' => '0.08',
+ 'PerlIO::via' => '0.09',
+ 'PerlIO::via::QuotedPrint'=> '0.06',
+ 'Pod::Checker' => '1.45',
+ 'Pod::Escapes' => '1.04',
+ 'Pod::Find' => '1.35',
+ 'Pod::Functions' => '1.04',
+ 'Pod::Html' => '1.09',
+ 'Pod::InputObjects' => '1.31',
+ 'Pod::LaTeX' => '0.58',
+ 'Pod::Man' => '2.23',
+ 'Pod::ParseLink' => '1.10',
+ 'Pod::ParseUtils' => '1.36',
+ 'Pod::Parser' => '1.37',
+ 'Pod::Perldoc' => '3.15_02',
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => '2.04',
+ 'Pod::Plainer' => '1.02',
+ 'Pod::Select' => '1.36',
+ 'Pod::Simple' => '3.14',
+ 'Pod::Simple::BlackBox' => '3.14',
+ 'Pod::Simple::Checker' => '3.14',
+ 'Pod::Simple::Debug' => '3.14',
+ 'Pod::Simple::DumpAsText'=> '3.14',
+ 'Pod::Simple::DumpAsXML'=> '3.14',
+ 'Pod::Simple::HTML' => '3.14',
+ 'Pod::Simple::HTMLBatch'=> '3.14',
+ 'Pod::Simple::HTMLLegacy'=> '5.01',
+ 'Pod::Simple::LinkSection'=> '3.14',
+ 'Pod::Simple::Methody' => '3.14',
+ 'Pod::Simple::Progress' => '3.14',
+ 'Pod::Simple::PullParser'=> '3.14',
+ 'Pod::Simple::PullParserEndToken'=> '3.14',
+ 'Pod::Simple::PullParserStartToken'=> '3.14',
+ 'Pod::Simple::PullParserTextToken'=> '3.14',
+ 'Pod::Simple::PullParserToken'=> '3.14',
+ 'Pod::Simple::RTF' => '3.14',
+ 'Pod::Simple::Search' => '3.14',
+ 'Pod::Simple::SimpleTree'=> '3.14',
+ 'Pod::Simple::Text' => '3.14',
+ 'Pod::Simple::TextContent'=> '3.14',
+ 'Pod::Simple::TiedOutFH'=> '3.14',
+ 'Pod::Simple::Transcode'=> '3.14',
+ 'Pod::Simple::TranscodeDumb'=> '3.14',
+ 'Pod::Simple::TranscodeSmart'=> '3.14',
+ 'Pod::Simple::XHTML' => '3.14',
+ 'Pod::Simple::XMLOutStream'=> '3.14',
+ 'Pod::Text' => '3.14',
+ 'Pod::Text::Color' => '2.06',
+ 'Pod::Text::Overstrike' => '2.04',
+ 'Pod::Text::Termcap' => '2.06',
+ 'Pod::Usage' => '1.36',
+ 'SDBM_File' => '1.06',
+ 'Safe' => '2.27',
+ 'Scalar::Util' => '1.22',
+ 'Scalar::Util::PP' => '1.22',
+ 'Search::Dict' => '1.02',
+ 'SelectSaver' => '1.02',
+ 'SelfLoader' => '1.17',
+ 'Shell' => '0.72_01',
+ 'Socket' => '1.87_01',
+ 'Storable' => '2.22',
+ 'Switch' => '2.16',
+ 'Symbol' => '1.07',
+ 'Sys::Hostname' => '1.11',
+ 'Sys::Syslog' => '0.27',
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => '3.17',
+ 'TAP::Formatter::Base' => '3.17',
+ 'TAP::Formatter::Color' => '3.17',
+ 'TAP::Formatter::Console'=> '3.17',
+ 'TAP::Formatter::Console::ParallelSession'=> '3.17',
+ 'TAP::Formatter::Console::Session'=> '3.17',
+ 'TAP::Formatter::File' => '3.17',
+ 'TAP::Formatter::File::Session'=> '3.17',
+ 'TAP::Formatter::Session'=> '3.17',
+ 'TAP::Harness' => '3.17',
+ 'TAP::Object' => '3.17',
+ 'TAP::Parser' => '3.17',
+ 'TAP::Parser::Aggregator'=> '3.17',
+ 'TAP::Parser::Grammar' => '3.17',
+ 'TAP::Parser::Iterator' => '3.17',
+ 'TAP::Parser::Iterator::Array'=> '3.17',
+ 'TAP::Parser::Iterator::Process'=> '3.17',
+ 'TAP::Parser::Iterator::Stream'=> '3.17',
+ 'TAP::Parser::IteratorFactory'=> '3.17',
+ 'TAP::Parser::Multiplexer'=> '3.17',
+ 'TAP::Parser::Result' => '3.17',
+ 'TAP::Parser::Result::Bailout'=> '3.17',
+ 'TAP::Parser::Result::Comment'=> '3.17',
+ 'TAP::Parser::Result::Plan'=> '3.17',
+ 'TAP::Parser::Result::Pragma'=> '3.17',
+ 'TAP::Parser::Result::Test'=> '3.17',
+ 'TAP::Parser::Result::Unknown'=> '3.17',
+ 'TAP::Parser::Result::Version'=> '3.17',
+ 'TAP::Parser::Result::YAML'=> '3.17',
+ 'TAP::Parser::ResultFactory'=> '3.17',
+ 'TAP::Parser::Scheduler'=> '3.17',
+ 'TAP::Parser::Scheduler::Job'=> '3.17',
+ 'TAP::Parser::Scheduler::Spinner'=> '3.17',
+ 'TAP::Parser::Source' => '3.17',
+ 'TAP::Parser::Source::Perl'=> '3.17',
+ 'TAP::Parser::Utils' => '3.17',
+ 'TAP::Parser::YAMLish::Reader'=> '3.17',
+ 'TAP::Parser::YAMLish::Writer'=> '3.17',
+ 'Term::ANSIColor' => '2.02',
+ 'Term::Cap' => '1.12',
+ 'Term::Complete' => '1.402',
+ 'Term::ReadLine' => '1.05',
+ 'Term::UI' => '0.20',
+ 'Term::UI::History' => undef,
+ 'Test' => '1.25_02',
+ 'Test::Builder' => '0.94',
+ 'Test::Builder::Module' => '0.94',
+ 'Test::Builder::Tester' => '1.18',
+ 'Test::Builder::Tester::Color'=> '1.18',
+ 'Test::Harness' => '3.17',
+ 'Test::More' => '0.94',
+ 'Test::Simple' => '0.94',
+ 'Text::Abbrev' => '1.01',
+ 'Text::Balanced' => '2.02',
+ 'Text::ParseWords' => '3.27',
+ 'Text::Soundex' => '3.03_01',
+ 'Text::Tabs' => '2009.0305',
+ 'Text::Wrap' => '2009.0305',
+ 'Thread' => '3.02',
+ 'Thread::Queue' => '2.11',
+ 'Thread::Semaphore' => '2.09',
+ 'Tie::Array' => '1.03',
+ 'Tie::File' => '0.97_02',
+ 'Tie::Handle' => '4.2',
+ 'Tie::Hash' => '1.03',
+ 'Tie::Hash::NamedCapture'=> '0.06',
+ 'Tie::Memoize' => '1.1',
+ 'Tie::RefHash' => '1.38',
+ 'Tie::Scalar' => '1.02',
+ 'Tie::StdHandle' => '4.2',
+ 'Tie::SubstrHash' => '1.00',
+ 'Time::HiRes' => '1.9719',
+ 'Time::Local' => '1.1901_01',
+ 'Time::Piece' => '1.15_01',
+ 'Time::Piece::Seconds' => undef,
+ 'Time::Seconds' => undef,
+ 'Time::gmtime' => '1.03',
+ 'Time::localtime' => '1.02',
+ 'Time::tm' => '1.00',
+ 'UNIVERSAL' => '1.06',
+ 'Unicode' => '5.2.0',
+ 'Unicode::Collate' => '0.52_01',
+ 'Unicode::Normalize' => '1.03',
+ 'Unicode::UCD' => '0.27',
+ 'User::grent' => '1.01',
+ 'User::pwent' => '1.00',
+ 'VMS::DCLsym' => '1.03',
+ 'VMS::Stdio' => '2.4',
+ 'Win32' => '0.39',
+ 'Win32API::File' => '0.1101',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+ 'Win32CORE' => '0.02',
+ 'XS::APItest' => '0.17',
+ 'XS::APItest::KeywordRPN'=> '0.003',
+ 'XS::Typemap' => '0.03',
+ 'XSLoader' => '0.10',
+ 'XSLoader::XSLoader' => '0.10',
+ 'attributes' => '0.12',
+ 'autodie' => '2.06_01',
+ 'autodie::exception' => '2.06_01',
+ 'autodie::exception::system'=> '2.06_01',
+ 'autodie::hints' => '2.06_01',
+ 'autouse' => '1.06',
+ 'base' => '2.15',
+ 'bigint' => '0.23',
+ 'bignum' => '0.23',
+ 'bigrat' => '0.23',
+ 'blib' => '1.04',
+ 'bytes' => '1.04',
+ 'charnames' => '1.07',
+ 'constant' => '1.20',
+ 'deprecate' => '0.01',
+ 'diagnostics' => '1.19',
+ 'encoding' => '2.6_01',
+ 'encoding::warnings' => '0.11',
+ 'feature' => '1.16',
+ 'fields' => '2.15',
+ 'filetest' => '1.02',
+ 'if' => '0.05',
+ 'inc::latest' => '0.3603',
+ 'integer' => '1.00',
+ 'less' => '0.03',
+ 'lib' => '0.62',
+ 'locale' => '1.00',
+ 'mro' => '1.02',
+ 'open' => '1.07',
+ 'ops' => '1.02',
+ 'overload' => '1.10',
+ 'overload::numbers' => undef,
+ 'overloading' => '0.01',
+ 'parent' => '0.223',
+ 're' => '0.11',
+ 'sigtrap' => '1.04',
+ 'sort' => '2.01',
+ 'strict' => '1.04',
+ 'subs' => '1.00',
+ 'threads' => '1.75',
+ 'threads::shared' => '1.32',
+ 'utf8' => '1.08',
+ 'vars' => '1.01',
+ 'version' => '0.82',
+ 'vmsish' => '1.02',
+ 'warnings' => '1.09',
+ 'warnings::register' => '1.01',
+ },
+);
+
+%deprecated = (
+ 5.011 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011001 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011002 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011003 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011004 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.011005 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.012000 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.013000 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.012001 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.013001 => {
+ 'Shell' => '1',
+ },
+ 5.013002 => {
+ 'Shell' => '1',
+ },
+ 5.013003 => {
+ 'Shell' => '1',
+ },
+ 5.013004 => {
+ 'Shell' => '1',
+ },
+ 5.012002 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+ 5.013005 => {
+ 'Shell' => '1',
+ },
+ 5.013006 => {
+ 'Shell' => '1',
+ },
+ 5.013007 => {
+ 'Shell' => '1',
+ },
+ 5.013008 => {
+ 'Shell' => '1',
+ },
+ 5.012003 => {
+ 'Class::ISA' => '1',
+ 'Pod::Plainer' => '1',
+ 'Shell' => '1',
+ 'Switch' => '1',
+ },
+);
+
+%upstream = (
+ 'App::Cpan' => 'cpan',
+ 'App::Prove' => 'cpan',
+ 'App::Prove::State' => 'cpan',
+ 'App::Prove::State::Result'=> 'cpan',
+ 'App::Prove::State::Result::Test'=> 'cpan',
+ 'Archive::Extract' => 'cpan',
+ 'Archive::Tar' => 'cpan',
+ 'Archive::Tar::Constant'=> 'cpan',
+ 'Archive::Tar::File' => 'cpan',
+ 'Attribute::Handlers' => 'blead',
+ 'AutoLoader' => 'cpan',
+ 'AutoSplit' => 'cpan',
+ 'B::Concise' => undef,
+ 'B::Debug' => 'cpan',
+ 'B::Deparse' => 'blead',
+ 'B::Lint' => 'blead',
+ 'B::Lint::Debug' => 'blead',
+ 'CGI' => 'cpan',
+ 'CGI::Apache' => 'cpan',
+ 'CGI::Carp' => 'cpan',
+ 'CGI::Cookie' => 'cpan',
+ 'CGI::Fast' => 'cpan',
+ 'CGI::Pretty' => 'cpan',
+ 'CGI::Push' => 'cpan',
+ 'CGI::Switch' => 'cpan',
+ 'CGI::Util' => 'cpan',
+ 'CPAN' => 'cpan',
+ 'CPAN::Author' => 'cpan',
+ 'CPAN::Bundle' => 'cpan',
+ 'CPAN::CacheMgr' => 'cpan',
+ 'CPAN::Complete' => 'cpan',
+ 'CPAN::Debug' => 'cpan',
+ 'CPAN::DeferredCode' => 'cpan',
+ 'CPAN::Distribution' => 'cpan',
+ 'CPAN::Distroprefs' => 'cpan',
+ 'CPAN::Distrostatus' => 'cpan',
+ 'CPAN::Exception::RecursiveDependency'=> 'cpan',
+ 'CPAN::Exception::blocked_urllist'=> 'cpan',
+ 'CPAN::Exception::yaml_not_installed'=> 'cpan',
+ 'CPAN::FTP' => 'cpan',
+ 'CPAN::FTP::netrc' => 'cpan',
+ 'CPAN::FirstTime' => 'cpan',
+ 'CPAN::HandleConfig' => 'cpan',
+ 'CPAN::Index' => 'cpan',
+ 'CPAN::InfoObj' => 'cpan',
+ 'CPAN::Kwalify' => 'cpan',
+ 'CPAN::LWP::UserAgent' => 'cpan',
+ 'CPAN::Mirrors' => 'cpan',
+ 'CPAN::Module' => 'cpan',
+ 'CPAN::Nox' => 'cpan',
+ 'CPAN::Prompt' => 'cpan',
+ 'CPAN::Queue' => 'cpan',
+ 'CPAN::Shell' => 'cpan',
+ 'CPAN::Tarzip' => 'cpan',
+ 'CPAN::URL' => 'cpan',
+ 'CPAN::Version' => 'cpan',
+ 'CPANPLUS' => 'cpan',
+ 'CPANPLUS::Backend' => 'cpan',
+ 'CPANPLUS::Backend::RV' => 'cpan',
+ 'CPANPLUS::Config' => 'cpan',
+ 'CPANPLUS::Configure' => 'cpan',
+ 'CPANPLUS::Configure::Setup'=> 'cpan',
+ 'CPANPLUS::Dist' => 'cpan',
+ 'CPANPLUS::Dist::Autobundle'=> 'cpan',
+ 'CPANPLUS::Dist::Base' => 'cpan',
+ 'CPANPLUS::Dist::Build' => 'cpan',
+ 'CPANPLUS::Dist::Build::Constants'=> 'cpan',
+ 'CPANPLUS::Dist::MM' => 'cpan',
+ 'CPANPLUS::Dist::Sample'=> 'cpan',
+ 'CPANPLUS::Error' => 'cpan',
+ 'CPANPLUS::Internals' => 'cpan',
+ 'CPANPLUS::Internals::Constants'=> 'cpan',
+ 'CPANPLUS::Internals::Constants::Report'=> 'cpan',
+ 'CPANPLUS::Internals::Extract'=> 'cpan',
+ 'CPANPLUS::Internals::Fetch'=> 'cpan',
+ 'CPANPLUS::Internals::Report'=> 'cpan',
+ 'CPANPLUS::Internals::Search'=> 'cpan',
+ 'CPANPLUS::Internals::Source'=> 'cpan',
+ 'CPANPLUS::Internals::Source::Memory'=> 'cpan',
+ 'CPANPLUS::Internals::Source::SQLite'=> 'cpan',
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> 'cpan',
+ 'CPANPLUS::Internals::Utils'=> 'cpan',
+ 'CPANPLUS::Internals::Utils::Autoflush'=> 'cpan',
+ 'CPANPLUS::Module' => 'cpan',
+ 'CPANPLUS::Module::Author'=> 'cpan',
+ 'CPANPLUS::Module::Author::Fake'=> 'cpan',
+ 'CPANPLUS::Module::Checksums'=> 'cpan',
+ 'CPANPLUS::Module::Fake'=> 'cpan',
+ 'CPANPLUS::Module::Signature'=> 'cpan',
+ 'CPANPLUS::Selfupdate' => 'cpan',
+ 'CPANPLUS::Shell' => 'cpan',
+ 'CPANPLUS::Shell::Classic'=> 'cpan',
+ 'CPANPLUS::Shell::Default'=> 'cpan',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> 'cpan',
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> 'cpan',
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> 'cpan',
+ 'Compress::Raw::Bzip2' => 'cpan',
+ 'Compress::Raw::Zlib' => 'cpan',
+ 'Compress::Zlib' => 'cpan',
+ 'Cwd' => 'blead',
+ 'DB_File' => undef,
+ 'Devel::InnerPackage' => 'cpan',
+ 'Devel::PPPort' => 'cpan',
+ 'Digest' => 'cpan',
+ 'Digest::MD5' => 'cpan',
+ 'Digest::SHA' => 'cpan',
+ 'Digest::base' => 'cpan',
+ 'Digest::file' => 'cpan',
+ 'Encode' => 'cpan',
+ 'Encode::Alias' => 'cpan',
+ 'Encode::Byte' => 'cpan',
+ 'Encode::CJKConstants' => 'cpan',
+ 'Encode::CN' => 'cpan',
+ 'Encode::CN::HZ' => 'cpan',
+ 'Encode::Config' => 'cpan',
+ 'Encode::EBCDIC' => 'cpan',
+ 'Encode::Encoder' => 'cpan',
+ 'Encode::Encoding' => 'cpan',
+ 'Encode::GSM0338' => 'cpan',
+ 'Encode::Guess' => 'cpan',
+ 'Encode::JP' => 'cpan',
+ 'Encode::JP::H2Z' => 'cpan',
+ 'Encode::JP::JIS7' => 'cpan',
+ 'Encode::KR' => 'cpan',
+ 'Encode::KR::2022_KR' => 'cpan',
+ 'Encode::MIME::Header' => 'cpan',
+ 'Encode::MIME::Header::ISO_2022_JP'=> 'cpan',
+ 'Encode::MIME::Name' => 'cpan',
+ 'Encode::Symbol' => 'cpan',
+ 'Encode::TW' => 'cpan',
+ 'Encode::Unicode' => 'cpan',
+ 'Encode::Unicode::UTF7' => 'cpan',
+ 'Exporter' => 'blead',
+ 'Exporter::Heavy' => 'blead',
+ 'ExtUtils::CBuilder' => 'blead',
+ 'ExtUtils::CBuilder::Base'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::Unix'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::VMS'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::Windows'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::aix'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::cygwin'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::darwin'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> 'blead',
+ 'ExtUtils::CBuilder::Platform::os2'=> 'blead',
+ 'ExtUtils::Command::MM' => 'first-come',
+ 'ExtUtils::Constant' => undef,
+ 'ExtUtils::Constant::Base'=> undef,
+ 'ExtUtils::Constant::ProxySubs'=> undef,
+ 'ExtUtils::Constant::Utils'=> undef,
+ 'ExtUtils::Constant::XS'=> undef,
+ 'ExtUtils::Install' => 'blead',
+ 'ExtUtils::Installed' => 'blead',
+ 'ExtUtils::Liblist' => 'first-come',
+ 'ExtUtils::Liblist::Kid'=> 'first-come',
+ 'ExtUtils::MM' => 'first-come',
+ 'ExtUtils::MM_AIX' => 'first-come',
+ 'ExtUtils::MM_Any' => 'first-come',
+ 'ExtUtils::MM_BeOS' => 'first-come',
+ 'ExtUtils::MM_Cygwin' => 'first-come',
+ 'ExtUtils::MM_DOS' => 'first-come',
+ 'ExtUtils::MM_Darwin' => 'first-come',
+ 'ExtUtils::MM_MacOS' => 'first-come',
+ 'ExtUtils::MM_NW5' => 'first-come',
+ 'ExtUtils::MM_OS2' => 'first-come',
+ 'ExtUtils::MM_QNX' => 'first-come',
+ 'ExtUtils::MM_UWIN' => 'first-come',
+ 'ExtUtils::MM_Unix' => 'first-come',
+ 'ExtUtils::MM_VMS' => 'first-come',
+ 'ExtUtils::MM_VOS' => 'first-come',
+ 'ExtUtils::MM_Win32' => 'first-come',
+ 'ExtUtils::MM_Win95' => 'first-come',
+ 'ExtUtils::MY' => 'first-come',
+ 'ExtUtils::MakeMaker' => 'first-come',
+ 'ExtUtils::MakeMaker::Config'=> 'first-come',
+ 'ExtUtils::MakeMaker::YAML'=> 'first-come',
+ 'ExtUtils::Mkbootstrap' => 'first-come',
+ 'ExtUtils::Mksymlists' => 'first-come',
+ 'ExtUtils::Packlist' => 'blead',
+ 'ExtUtils::ParseXS' => 'blead',
+ 'ExtUtils::testlib' => 'first-come',
+ 'Fatal' => 'cpan',
+ 'File::Fetch' => 'cpan',
+ 'File::GlobMapper' => 'cpan',
+ 'File::Path' => undef,
+ 'File::Spec' => 'blead',
+ 'File::Spec::Cygwin' => 'blead',
+ 'File::Spec::Epoc' => 'blead',
+ 'File::Spec::Functions' => 'blead',
+ 'File::Spec::Mac' => 'blead',
+ 'File::Spec::OS2' => 'blead',
+ 'File::Spec::Unix' => 'blead',
+ 'File::Spec::VMS' => 'blead',
+ 'File::Spec::Win32' => 'blead',
+ 'File::Temp' => undef,
+ 'Filter::Simple' => 'blead',
+ 'Filter::Util::Call' => undef,
+ 'Getopt::Long' => 'cpan',
+ 'IO::Compress::Adapter::Bzip2'=> 'cpan',
+ 'IO::Compress::Adapter::Deflate'=> 'cpan',
+ 'IO::Compress::Adapter::Identity'=> 'cpan',
+ 'IO::Compress::Base' => 'cpan',
+ 'IO::Compress::Base::Common'=> 'cpan',
+ 'IO::Compress::Bzip2' => 'cpan',
+ 'IO::Compress::Deflate' => 'cpan',
+ 'IO::Compress::Gzip' => 'cpan',
+ 'IO::Compress::Gzip::Constants'=> 'cpan',
+ 'IO::Compress::RawDeflate'=> 'cpan',
+ 'IO::Compress::Zip' => 'cpan',
+ 'IO::Compress::Zip::Constants'=> 'cpan',
+ 'IO::Compress::Zlib::Constants'=> 'cpan',
+ 'IO::Compress::Zlib::Extra'=> 'cpan',
+ 'IO::Uncompress::Adapter::Bunzip2'=> 'cpan',
+ 'IO::Uncompress::Adapter::Identity'=> 'cpan',
+ 'IO::Uncompress::Adapter::Inflate'=> 'cpan',
+ 'IO::Uncompress::AnyInflate'=> 'cpan',
+ 'IO::Uncompress::AnyUncompress'=> 'cpan',
+ 'IO::Uncompress::Base' => 'cpan',
+ 'IO::Uncompress::Bunzip2'=> 'cpan',
+ 'IO::Uncompress::Gunzip'=> 'cpan',
+ 'IO::Uncompress::Inflate'=> 'cpan',
+ 'IO::Uncompress::RawInflate'=> 'cpan',
+ 'IO::Uncompress::Unzip' => 'cpan',
+ 'IO::Zlib' => undef,
+ 'IPC::Cmd' => 'cpan',
+ 'IPC::Msg' => 'cpan',
+ 'IPC::Semaphore' => 'cpan',
+ 'IPC::SharedMem' => 'cpan',
+ 'IPC::SysV' => 'cpan',
+ 'List::Util' => undef,
+ 'List::Util::PP' => undef,
+ 'List::Util::XS' => undef,
+ 'Locale::Codes' => 'cpan',
+ 'Locale::Codes::Country'=> 'cpan',
+ 'Locale::Codes::Currency'=> 'cpan',
+ 'Locale::Codes::Language'=> 'cpan',
+ 'Locale::Codes::Script' => 'cpan',
+ 'Locale::Constants' => 'cpan',
+ 'Locale::Country' => 'cpan',
+ 'Locale::Currency' => 'cpan',
+ 'Locale::Language' => 'cpan',
+ 'Locale::Maketext' => 'blead',
+ 'Locale::Maketext::Guts'=> 'blead',
+ 'Locale::Maketext::GutsLoader'=> 'blead',
+ 'Locale::Maketext::Simple'=> 'cpan',
+ 'Locale::Script' => 'cpan',
+ 'Log::Message' => 'cpan',
+ 'Log::Message::Config' => 'cpan',
+ 'Log::Message::Handlers'=> 'cpan',
+ 'Log::Message::Item' => 'cpan',
+ 'Log::Message::Simple' => 'cpan',
+ 'MIME::Base64' => 'cpan',
+ 'MIME::QuotedPrint' => 'cpan',
+ 'Math::BigFloat' => 'blead',
+ 'Math::BigFloat::Trace' => 'blead',
+ 'Math::BigInt' => 'blead',
+ 'Math::BigInt::Calc' => 'blead',
+ 'Math::BigInt::CalcEmu' => 'blead',
+ 'Math::BigInt::FastCalc'=> 'blead',
+ 'Math::BigInt::Trace' => 'blead',
+ 'Math::BigRat' => 'blead',
+ 'Math::Complex' => 'cpan',
+ 'Math::Trig' => 'cpan',
+ 'Memoize' => 'cpan',
+ 'Memoize::AnyDBM_File' => 'cpan',
+ 'Memoize::Expire' => 'cpan',
+ 'Memoize::ExpireFile' => 'cpan',
+ 'Memoize::ExpireTest' => 'cpan',
+ 'Memoize::NDBM_File' => 'cpan',
+ 'Memoize::SDBM_File' => 'cpan',
+ 'Memoize::Storable' => 'cpan',
+ 'Module::Build' => 'cpan',
+ 'Module::Build::Base' => 'cpan',
+ 'Module::Build::Compat' => 'cpan',
+ 'Module::Build::Config' => 'cpan',
+ 'Module::Build::ConfigData'=> 'cpan',
+ 'Module::Build::Cookbook'=> 'cpan',
+ 'Module::Build::Dumper' => 'cpan',
+ 'Module::Build::ModuleInfo'=> 'cpan',
+ 'Module::Build::Notes' => 'cpan',
+ 'Module::Build::PPMMaker'=> 'cpan',
+ 'Module::Build::Platform::Amiga'=> 'cpan',
+ 'Module::Build::Platform::Default'=> 'cpan',
+ 'Module::Build::Platform::EBCDIC'=> 'cpan',
+ 'Module::Build::Platform::MPEiX'=> 'cpan',
+ 'Module::Build::Platform::MacOS'=> 'cpan',
+ 'Module::Build::Platform::RiscOS'=> 'cpan',
+ 'Module::Build::Platform::Unix'=> 'cpan',
+ 'Module::Build::Platform::VMS'=> 'cpan',
+ 'Module::Build::Platform::VOS'=> 'cpan',
+ 'Module::Build::Platform::Windows'=> 'cpan',
+ 'Module::Build::Platform::aix'=> 'cpan',
+ 'Module::Build::Platform::cygwin'=> 'cpan',
+ 'Module::Build::Platform::darwin'=> 'cpan',
+ 'Module::Build::Platform::os2'=> 'cpan',
+ 'Module::Build::PodParser'=> 'cpan',
+ 'Module::Build::Version'=> 'cpan',
+ 'Module::Build::YAML' => 'cpan',
+ 'Module::CoreList' => 'blead',
+ 'Module::Load' => 'cpan',
+ 'Module::Load::Conditional'=> 'cpan',
+ 'Module::Loaded' => 'cpan',
+ 'Module::Pluggable' => 'cpan',
+ 'Module::Pluggable::Object'=> 'cpan',
+ 'NEXT' => 'cpan',
+ 'Net::Cmd' => undef,
+ 'Net::Config' => undef,
+ 'Net::Domain' => undef,
+ 'Net::FTP' => undef,
+ 'Net::FTP::A' => undef,
+ 'Net::FTP::E' => undef,
+ 'Net::FTP::I' => undef,
+ 'Net::FTP::L' => undef,
+ 'Net::FTP::dataconn' => undef,
+ 'Net::NNTP' => undef,
+ 'Net::Netrc' => undef,
+ 'Net::POP3' => undef,
+ 'Net::Ping' => 'blead',
+ 'Net::SMTP' => undef,
+ 'Net::Time' => undef,
+ 'Object::Accessor' => 'cpan',
+ 'Package::Constants' => 'cpan',
+ 'Params::Check' => 'cpan',
+ 'Parse::CPAN::Meta' => 'cpan',
+ 'PerlIO::via::QuotedPrint'=> undef,
+ 'Pod::Checker' => undef,
+ 'Pod::Escapes' => undef,
+ 'Pod::Find' => undef,
+ 'Pod::InputObjects' => undef,
+ 'Pod::LaTeX' => undef,
+ 'Pod::Man' => 'cpan',
+ 'Pod::ParseLink' => 'cpan',
+ 'Pod::ParseUtils' => undef,
+ 'Pod::Parser' => undef,
+ 'Pod::Perldoc' => 'blead',
+ 'Pod::Perldoc::BaseTo' => 'blead',
+ 'Pod::Perldoc::GetOptsOO'=> 'blead',
+ 'Pod::Perldoc::ToChecker'=> 'blead',
+ 'Pod::Perldoc::ToMan' => 'blead',
+ 'Pod::Perldoc::ToNroff' => 'blead',
+ 'Pod::Perldoc::ToPod' => 'blead',
+ 'Pod::Perldoc::ToRtf' => 'blead',
+ 'Pod::Perldoc::ToText' => 'blead',
+ 'Pod::Perldoc::ToTk' => 'blead',
+ 'Pod::Perldoc::ToXml' => 'blead',
+ 'Pod::PlainText' => undef,
+ 'Pod::Select' => undef,
+ 'Pod::Simple' => 'cpan',
+ 'Pod::Simple::BlackBox' => 'cpan',
+ 'Pod::Simple::Checker' => 'cpan',
+ 'Pod::Simple::Debug' => 'cpan',
+ 'Pod::Simple::DumpAsText'=> 'cpan',
+ 'Pod::Simple::DumpAsXML'=> 'cpan',
+ 'Pod::Simple::HTML' => 'cpan',
+ 'Pod::Simple::HTMLBatch'=> 'cpan',
+ 'Pod::Simple::HTMLLegacy'=> 'cpan',
+ 'Pod::Simple::LinkSection'=> 'cpan',
+ 'Pod::Simple::Methody' => 'cpan',
+ 'Pod::Simple::Progress' => 'cpan',
+ 'Pod::Simple::PullParser'=> 'cpan',
+ 'Pod::Simple::PullParserEndToken'=> 'cpan',
+ 'Pod::Simple::PullParserStartToken'=> 'cpan',
+ 'Pod::Simple::PullParserTextToken'=> 'cpan',
+ 'Pod::Simple::PullParserToken'=> 'cpan',
+ 'Pod::Simple::RTF' => 'cpan',
+ 'Pod::Simple::Search' => 'cpan',
+ 'Pod::Simple::SimpleTree'=> 'cpan',
+ 'Pod::Simple::Text' => 'cpan',
+ 'Pod::Simple::TextContent'=> 'cpan',
+ 'Pod::Simple::TiedOutFH'=> 'cpan',
+ 'Pod::Simple::Transcode'=> 'cpan',
+ 'Pod::Simple::TranscodeDumb'=> 'cpan',
+ 'Pod::Simple::TranscodeSmart'=> 'cpan',
+ 'Pod::Simple::XHTML' => 'cpan',
+ 'Pod::Simple::XMLOutStream'=> 'cpan',
+ 'Pod::Text' => 'cpan',
+ 'Pod::Text::Color' => 'cpan',
+ 'Pod::Text::Overstrike' => 'cpan',
+ 'Pod::Text::Termcap' => 'cpan',
+ 'Pod::Usage' => undef,
+ 'Safe' => 'blead',
+ 'Scalar::Util' => undef,
+ 'Scalar::Util::PP' => undef,
+ 'SelfLoader' => 'blead',
+ 'Shell' => undef,
+ 'Storable' => 'blead',
+ 'Sys::Syslog' => 'cpan',
+ 'Sys::Syslog::win32::Win32'=> 'cpan',
+ 'TAP::Base' => 'cpan',
+ 'TAP::Formatter::Base' => 'cpan',
+ 'TAP::Formatter::Color' => 'cpan',
+ 'TAP::Formatter::Console'=> 'cpan',
+ 'TAP::Formatter::Console::ParallelSession'=> 'cpan',
+ 'TAP::Formatter::Console::Session'=> 'cpan',
+ 'TAP::Formatter::File' => 'cpan',
+ 'TAP::Formatter::File::Session'=> 'cpan',
+ 'TAP::Formatter::Session'=> 'cpan',
+ 'TAP::Harness' => 'cpan',
+ 'TAP::Object' => 'cpan',
+ 'TAP::Parser' => 'cpan',
+ 'TAP::Parser::Aggregator'=> 'cpan',
+ 'TAP::Parser::Grammar' => 'cpan',
+ 'TAP::Parser::Iterator' => 'cpan',
+ 'TAP::Parser::Iterator::Array'=> 'cpan',
+ 'TAP::Parser::Iterator::Process'=> 'cpan',
+ 'TAP::Parser::Iterator::Stream'=> 'cpan',
+ 'TAP::Parser::IteratorFactory'=> 'cpan',
+ 'TAP::Parser::Multiplexer'=> 'cpan',
+ 'TAP::Parser::Result' => 'cpan',
+ 'TAP::Parser::Result::Bailout'=> 'cpan',
+ 'TAP::Parser::Result::Comment'=> 'cpan',
+ 'TAP::Parser::Result::Plan'=> 'cpan',
+ 'TAP::Parser::Result::Pragma'=> 'cpan',
+ 'TAP::Parser::Result::Test'=> 'cpan',
+ 'TAP::Parser::Result::Unknown'=> 'cpan',
+ 'TAP::Parser::Result::Version'=> 'cpan',
+ 'TAP::Parser::Result::YAML'=> 'cpan',
+ 'TAP::Parser::ResultFactory'=> 'cpan',
+ 'TAP::Parser::Scheduler'=> 'cpan',
+ 'TAP::Parser::Scheduler::Job'=> 'cpan',
+ 'TAP::Parser::Scheduler::Spinner'=> 'cpan',
+ 'TAP::Parser::Source' => 'cpan',
+ 'TAP::Parser::SourceHandler'=> 'cpan',
+ 'TAP::Parser::SourceHandler::Executable'=> 'cpan',
+ 'TAP::Parser::SourceHandler::File'=> 'cpan',
+ 'TAP::Parser::SourceHandler::Handle'=> 'cpan',
+ 'TAP::Parser::SourceHandler::Perl'=> 'cpan',
+ 'TAP::Parser::SourceHandler::RawTAP'=> 'cpan',
+ 'TAP::Parser::Utils' => 'cpan',
+ 'TAP::Parser::YAMLish::Reader'=> 'cpan',
+ 'TAP::Parser::YAMLish::Writer'=> 'cpan',
+ 'Term::ANSIColor' => 'cpan',
+ 'Term::Cap' => undef,
+ 'Term::UI' => 'cpan',
+ 'Term::UI::History' => 'cpan',
+ 'Test' => 'cpan',
+ 'Test::Builder' => 'cpan',
+ 'Test::Builder::Module' => 'cpan',
+ 'Test::Builder::Tester' => 'cpan',
+ 'Test::Builder::Tester::Color'=> 'cpan',
+ 'Test::Harness' => 'cpan',
+ 'Test::More' => 'cpan',
+ 'Test::Simple' => 'cpan',
+ 'Text::Balanced' => undef,
+ 'Text::ParseWords' => undef,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => 'cpan',
+ 'Text::Wrap' => 'cpan',
+ 'Thread::Queue' => 'blead',
+ 'Thread::Semaphore' => 'blead',
+ 'Tie::File' => 'first-come',
+ 'Tie::RefHash' => 'cpan',
+ 'Time::HiRes' => undef,
+ 'Time::Local' => 'blead',
+ 'Time::Piece' => undef,
+ 'Time::Piece::Seconds' => undef,
+ 'Unicode::Collate' => 'first-come',
+ 'Unicode::Collate::CJK::Big5'=> 'first-come',
+ 'Unicode::Collate::CJK::GB2312'=> 'first-come',
+ 'Unicode::Collate::CJK::JISX0208'=> 'first-come',
+ 'Unicode::Collate::CJK::Korean'=> 'first-come',
+ 'Unicode::Collate::CJK::Pinyin'=> 'first-come',
+ 'Unicode::Collate::CJK::Stroke'=> 'first-come',
+ 'Unicode::Collate::Locale'=> 'first-come',
+ 'Unicode::Normalize' => 'first-come',
+ 'VMS::DCLsym' => undef,
+ 'VMS::Filespec' => undef,
+ 'VMS::Stdio' => undef,
+ 'Win32' => 'cpan',
+ 'Win32API::File' => 'cpan',
+ 'Win32API::File::ExtUtils::Myconst2perl'=> 'cpan',
+ 'Win32CORE' => undef,
+ 'XSLoader' => 'blead',
+ 'XSLoader::XSLoader' => 'blead',
+ 'autodie' => 'cpan',
+ 'autodie::exception' => 'cpan',
+ 'autodie::exception::system'=> 'cpan',
+ 'autodie::hints' => 'cpan',
+ 'base' => 'blead',
+ 'bigint' => 'blead',
+ 'bignum' => 'blead',
+ 'bigrat' => 'blead',
+ 'constant' => 'blead',
+ 'encoding' => 'cpan',
+ 'encoding::warnings' => undef,
+ 'fields' => 'blead',
+ 'if' => 'blead',
+ 'inc::latest' => 'cpan',
+ 'lib' => 'blead',
+ 'parent' => undef,
+ 'threads' => 'blead',
+ 'threads::shared' => 'blead',
+ 'version' => undef,
+ 'warnings' => undef,
+ 'warnings::register' => undef,
+);
+
+%bug_tracker = (
+ 'App::Cpan' => undef,
+ 'App::Prove' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State::Result'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Archive::Extract' => undef,
+ 'Archive::Tar' => undef,
+ 'Archive::Tar::Constant'=> undef,
+ 'Archive::Tar::File' => undef,
+ 'Attribute::Handlers' => undef,
+ 'B::Debug' => undef,
+ 'B::Deparse' => undef,
+ 'B::Lint' => undef,
+ 'B::Lint::Debug' => undef,
+ 'CGI' => undef,
+ 'CGI::Apache' => undef,
+ 'CGI::Carp' => undef,
+ 'CGI::Cookie' => undef,
+ 'CGI::Fast' => undef,
+ 'CGI::Pretty' => undef,
+ 'CGI::Push' => undef,
+ 'CGI::Switch' => undef,
+ 'CGI::Util' => undef,
+ 'CPAN' => undef,
+ 'CPAN::Author' => undef,
+ 'CPAN::Bundle' => undef,
+ 'CPAN::CacheMgr' => undef,
+ 'CPAN::Complete' => undef,
+ 'CPAN::Debug' => undef,
+ 'CPAN::DeferredCode' => undef,
+ 'CPAN::Distribution' => undef,
+ 'CPAN::Distroprefs' => undef,
+ 'CPAN::Distrostatus' => undef,
+ 'CPAN::Exception::RecursiveDependency'=> undef,
+ 'CPAN::Exception::blocked_urllist'=> undef,
+ 'CPAN::Exception::yaml_not_installed'=> undef,
+ 'CPAN::FTP' => undef,
+ 'CPAN::FTP::netrc' => undef,
+ 'CPAN::FirstTime' => undef,
+ 'CPAN::HandleConfig' => undef,
+ 'CPAN::Index' => undef,
+ 'CPAN::InfoObj' => undef,
+ 'CPAN::Kwalify' => undef,
+ 'CPAN::LWP::UserAgent' => undef,
+ 'CPAN::Mirrors' => undef,
+ 'CPAN::Module' => undef,
+ 'CPAN::Nox' => undef,
+ 'CPAN::Prompt' => undef,
+ 'CPAN::Queue' => undef,
+ 'CPAN::Shell' => undef,
+ 'CPAN::Tarzip' => undef,
+ 'CPAN::URL' => undef,
+ 'CPAN::Version' => undef,
+ 'CPANPLUS' => undef,
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => undef,
+ 'CPANPLUS::Dist::Build::Constants'=> undef,
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => undef,
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> undef,
+ 'CPANPLUS::Shell::Default'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'Compress::Raw::Bzip2' => undef,
+ 'Compress::Raw::Zlib' => undef,
+ 'Compress::Zlib' => undef,
+ 'Cwd' => undef,
+ 'DB_File' => undef,
+ 'Devel::InnerPackage' => undef,
+ 'Devel::PPPort' => undef,
+ 'Digest' => undef,
+ 'Digest::MD5' => undef,
+ 'Digest::SHA' => undef,
+ 'Digest::base' => undef,
+ 'Digest::file' => undef,
+ 'Encode' => undef,
+ 'Encode::Alias' => undef,
+ 'Encode::Byte' => undef,
+ 'Encode::CJKConstants' => undef,
+ 'Encode::CN' => undef,
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Config' => undef,
+ 'Encode::EBCDIC' => undef,
+ 'Encode::Encoder' => undef,
+ 'Encode::Encoding' => undef,
+ 'Encode::GSM0338' => undef,
+ 'Encode::Guess' => undef,
+ 'Encode::JP' => undef,
+ 'Encode::JP::H2Z' => undef,
+ 'Encode::JP::JIS7' => undef,
+ 'Encode::KR' => undef,
+ 'Encode::KR::2022_KR' => undef,
+ 'Encode::MIME::Header' => undef,
+ 'Encode::MIME::Header::ISO_2022_JP'=> undef,
+ 'Encode::MIME::Name' => undef,
+ 'Encode::Symbol' => undef,
+ 'Encode::TW' => undef,
+ 'Encode::Unicode' => undef,
+ 'Encode::Unicode::UTF7' => undef,
+ 'Exporter' => undef,
+ 'Exporter::Heavy' => undef,
+ 'ExtUtils::CBuilder' => undef,
+ 'ExtUtils::CBuilder::Base'=> undef,
+ 'ExtUtils::CBuilder::Platform::Unix'=> undef,
+ 'ExtUtils::CBuilder::Platform::VMS'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows::BCC'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows::GCC'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> undef,
+ 'ExtUtils::CBuilder::Platform::aix'=> undef,
+ 'ExtUtils::CBuilder::Platform::cygwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::darwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> undef,
+ 'ExtUtils::CBuilder::Platform::os2'=> undef,
+ 'ExtUtils::Command::MM' => undef,
+ 'ExtUtils::Constant' => undef,
+ 'ExtUtils::Constant::Base'=> undef,
+ 'ExtUtils::Constant::ProxySubs'=> undef,
+ 'ExtUtils::Constant::Utils'=> undef,
+ 'ExtUtils::Constant::XS'=> undef,
+ 'ExtUtils::Install' => undef,
+ 'ExtUtils::Installed' => undef,
+ 'ExtUtils::Liblist' => undef,
+ 'ExtUtils::Liblist::Kid'=> undef,
+ 'ExtUtils::MM' => undef,
+ 'ExtUtils::MM_AIX' => undef,
+ 'ExtUtils::MM_Any' => undef,
+ 'ExtUtils::MM_BeOS' => undef,
+ 'ExtUtils::MM_Cygwin' => undef,
+ 'ExtUtils::MM_DOS' => undef,
+ 'ExtUtils::MM_Darwin' => undef,
+ 'ExtUtils::MM_MacOS' => undef,
+ 'ExtUtils::MM_NW5' => undef,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_QNX' => undef,
+ 'ExtUtils::MM_UWIN' => undef,
+ 'ExtUtils::MM_Unix' => undef,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_VOS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::MM_Win95' => undef,
+ 'ExtUtils::MY' => undef,
+ 'ExtUtils::MakeMaker' => undef,
+ 'ExtUtils::MakeMaker::Config'=> undef,
+ 'ExtUtils::MakeMaker::YAML'=> undef,
+ 'ExtUtils::Mkbootstrap' => undef,
+ 'ExtUtils::Mksymlists' => undef,
+ 'ExtUtils::Packlist' => undef,
+ 'ExtUtils::ParseXS' => undef,
+ 'ExtUtils::testlib' => undef,
+ 'Fatal' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'File::Fetch' => undef,
+ 'File::GlobMapper' => undef,
+ 'File::Path' => undef,
+ 'File::Spec' => undef,
+ 'File::Spec::Cygwin' => undef,
+ 'File::Spec::Epoc' => undef,
+ 'File::Spec::Functions' => undef,
+ 'File::Spec::Mac' => undef,
+ 'File::Spec::OS2' => undef,
+ 'File::Spec::Unix' => undef,
+ 'File::Spec::VMS' => undef,
+ 'File::Spec::Win32' => undef,
+ 'File::Temp' => undef,
+ 'Filter::Simple' => undef,
+ 'Filter::Util::Call' => undef,
+ 'Getopt::Long' => undef,
+ 'IO::Compress::Adapter::Bzip2'=> undef,
+ 'IO::Compress::Adapter::Deflate'=> undef,
+ 'IO::Compress::Adapter::Identity'=> undef,
+ 'IO::Compress::Base' => undef,
+ 'IO::Compress::Base::Common'=> undef,
+ 'IO::Compress::Bzip2' => undef,
+ 'IO::Compress::Deflate' => undef,
+ 'IO::Compress::Gzip' => undef,
+ 'IO::Compress::Gzip::Constants'=> undef,
+ 'IO::Compress::RawDeflate'=> undef,
+ 'IO::Compress::Zip' => undef,
+ 'IO::Compress::Zip::Constants'=> undef,
+ 'IO::Compress::Zlib::Constants'=> undef,
+ 'IO::Compress::Zlib::Extra'=> undef,
+ 'IO::Uncompress::Adapter::Bunzip2'=> undef,
+ 'IO::Uncompress::Adapter::Identity'=> undef,
+ 'IO::Uncompress::Adapter::Inflate'=> undef,
+ 'IO::Uncompress::AnyInflate'=> undef,
+ 'IO::Uncompress::AnyUncompress'=> undef,
+ 'IO::Uncompress::Base' => undef,
+ 'IO::Uncompress::Bunzip2'=> undef,
+ 'IO::Uncompress::Gunzip'=> undef,
+ 'IO::Uncompress::Inflate'=> undef,
+ 'IO::Uncompress::RawInflate'=> undef,
+ 'IO::Uncompress::Unzip' => undef,
+ 'IO::Zlib' => undef,
+ 'IPC::Cmd' => undef,
+ 'IPC::Msg' => undef,
+ 'IPC::Semaphore' => undef,
+ 'IPC::SharedMem' => undef,
+ 'IPC::SysV' => undef,
+ 'List::Util' => undef,
+ 'List::Util::PP' => undef,
+ 'List::Util::XS' => undef,
+ 'Locale::Codes' => undef,
+ 'Locale::Codes::Country'=> undef,
+ 'Locale::Codes::Currency'=> undef,
+ 'Locale::Codes::Language'=> undef,
+ 'Locale::Codes::Script' => undef,
+ 'Locale::Constants' => undef,
+ 'Locale::Country' => undef,
+ 'Locale::Currency' => undef,
+ 'Locale::Language' => undef,
+ 'Locale::Maketext' => undef,
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> undef,
+ 'Locale::Script' => undef,
+ 'Log::Message' => undef,
+ 'Log::Message::Config' => undef,
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => undef,
+ 'MIME::Base64' => undef,
+ 'MIME::QuotedPrint' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigFloat::Trace' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::BigInt::Calc' => undef,
+ 'Math::BigInt::CalcEmu' => undef,
+ 'Math::BigInt::FastCalc'=> undef,
+ 'Math::BigInt::Trace' => undef,
+ 'Math::BigRat' => undef,
+ 'Math::Complex' => undef,
+ 'Math::Trig' => undef,
+ 'Memoize' => undef,
+ 'Memoize::AnyDBM_File' => undef,
+ 'Memoize::Expire' => undef,
+ 'Memoize::ExpireFile' => undef,
+ 'Memoize::ExpireTest' => undef,
+ 'Memoize::NDBM_File' => undef,
+ 'Memoize::SDBM_File' => undef,
+ 'Memoize::Storable' => undef,
+ 'Module::Build' => undef,
+ 'Module::Build::Base' => undef,
+ 'Module::Build::Compat' => undef,
+ 'Module::Build::Config' => undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::Dumper' => undef,
+ 'Module::Build::ModuleInfo'=> undef,
+ 'Module::Build::Notes' => undef,
+ 'Module::Build::PPMMaker'=> undef,
+ 'Module::Build::Platform::Amiga'=> undef,
+ 'Module::Build::Platform::Default'=> undef,
+ 'Module::Build::Platform::EBCDIC'=> undef,
+ 'Module::Build::Platform::MPEiX'=> undef,
+ 'Module::Build::Platform::MacOS'=> undef,
+ 'Module::Build::Platform::RiscOS'=> undef,
+ 'Module::Build::Platform::Unix'=> undef,
+ 'Module::Build::Platform::VMS'=> undef,
+ 'Module::Build::Platform::VOS'=> undef,
+ 'Module::Build::Platform::Windows'=> undef,
+ 'Module::Build::Platform::aix'=> undef,
+ 'Module::Build::Platform::cygwin'=> undef,
+ 'Module::Build::Platform::darwin'=> undef,
+ 'Module::Build::Platform::os2'=> undef,
+ 'Module::Build::PodParser'=> undef,
+ 'Module::Build::Version'=> undef,
+ 'Module::Build::YAML' => undef,
+ 'Module::CoreList' => undef,
+ 'Module::Load' => undef,
+ 'Module::Load::Conditional'=> undef,
+ 'Module::Loaded' => undef,
+ 'Module::Pluggable' => undef,
+ 'Module::Pluggable::Object'=> undef,
+ 'NEXT' => undef,
+ 'Net::Cmd' => undef,
+ 'Net::Config' => undef,
+ 'Net::Domain' => undef,
+ 'Net::FTP' => undef,
+ 'Net::FTP::A' => undef,
+ 'Net::FTP::E' => undef,
+ 'Net::FTP::I' => undef,
+ 'Net::FTP::L' => undef,
+ 'Net::FTP::dataconn' => undef,
+ 'Net::NNTP' => undef,
+ 'Net::Netrc' => undef,
+ 'Net::POP3' => undef,
+ 'Net::Ping' => undef,
+ 'Net::SMTP' => undef,
+ 'Net::Time' => undef,
+ 'Object::Accessor' => undef,
+ 'Package::Constants' => undef,
+ 'Params::Check' => undef,
+ 'Parse::CPAN::Meta' => undef,
+ 'PerlIO::via::QuotedPrint'=> undef,
+ 'Pod::Checker' => undef,
+ 'Pod::Escapes' => undef,
+ 'Pod::Find' => undef,
+ 'Pod::InputObjects' => undef,
+ 'Pod::LaTeX' => undef,
+ 'Pod::Man' => undef,
+ 'Pod::ParseLink' => undef,
+ 'Pod::ParseUtils' => undef,
+ 'Pod::Parser' => undef,
+ 'Pod::Perldoc' => undef,
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => undef,
+ 'Pod::Select' => undef,
+ 'Pod::Simple' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::BlackBox' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Checker' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Debug' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::DumpAsText'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::DumpAsXML'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::HTML' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::HTMLBatch'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::HTMLLegacy'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::LinkSection'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Methody' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Progress' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParser'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserEndToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserStartToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserTextToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::PullParserToken'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::RTF' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Search' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::SimpleTree'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Text' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TextContent'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TiedOutFH'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::Transcode'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TranscodeDumb'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::TranscodeSmart'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::XHTML' => 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Simple::XMLOutStream'=> 'mailto:bug-pod-simple@rt.cpan.org',
+ 'Pod::Text' => undef,
+ 'Pod::Text::Color' => undef,
+ 'Pod::Text::Overstrike' => undef,
+ 'Pod::Text::Termcap' => undef,
+ 'Pod::Usage' => undef,
+ 'Safe' => undef,
+ 'Scalar::Util' => undef,
+ 'Scalar::Util::PP' => undef,
+ 'SelfLoader' => undef,
+ 'Shell' => undef,
+ 'Storable' => undef,
+ 'Sys::Syslog' => undef,
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Color' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console::ParallelSession'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::File' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::File::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Object' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Aggregator'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Grammar' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Array'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Process'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Stream'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::IteratorFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Multiplexer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Bailout'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Comment'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Plan'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Pragma'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Unknown'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Version'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::YAML'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::ResultFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler::Job'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler::Spinner'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Source' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::SourceHandler'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::SourceHandler::Executable'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::SourceHandler::File'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::SourceHandler::Handle'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::SourceHandler::Perl'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::SourceHandler::RawTAP'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Utils' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::YAMLish::Reader'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::YAMLish::Writer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Term::ANSIColor' => undef,
+ 'Term::Cap' => undef,
+ 'Term::UI' => undef,
+ 'Term::UI::History' => undef,
+ 'Test' => undef,
+ 'Test::Builder' => 'http://github.com/schwern/test-more/issues',
+ 'Test::Builder::Module' => 'http://github.com/schwern/test-more/issues',
+ 'Test::Builder::Tester' => 'http://github.com/schwern/test-more/issues',
+ 'Test::Builder::Tester::Color'=> 'http://github.com/schwern/test-more/issues',
+ 'Test::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Test::More' => 'http://github.com/schwern/test-more/issues',
+ 'Test::Simple' => 'http://github.com/schwern/test-more/issues',
+ 'Text::Balanced' => undef,
+ 'Text::ParseWords' => undef,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => undef,
+ 'Text::Wrap' => undef,
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Tie::File' => undef,
+ 'Tie::RefHash' => undef,
+ 'Time::HiRes' => undef,
+ 'Time::Local' => undef,
+ 'Time::Piece' => undef,
+ 'Time::Piece::Seconds' => undef,
+ 'Unicode::Collate' => undef,
+ 'Unicode::Collate::CJK::Big5'=> undef,
+ 'Unicode::Collate::CJK::GB2312'=> undef,
+ 'Unicode::Collate::CJK::JISX0208'=> undef,
+ 'Unicode::Collate::CJK::Korean'=> undef,
+ 'Unicode::Collate::CJK::Pinyin'=> undef,
+ 'Unicode::Collate::CJK::Stroke'=> undef,
+ 'Unicode::Collate::Locale'=> undef,
+ 'Unicode::Normalize' => undef,
+ 'Win32' => undef,
+ 'Win32API::File' => undef,
+ 'Win32API::File::ExtUtils::Myconst2perl'=> undef,
+ 'XSLoader' => undef,
+ 'XSLoader::XSLoader' => undef,
+ 'autodie' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::exception' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::exception::system'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::hints' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'base' => undef,
+ 'bigint' => undef,
+ 'bignum' => undef,
+ 'bigrat' => undef,
+ 'constant' => undef,
+ 'encoding' => undef,
+ 'encoding::warnings' => undef,
+ 'fields' => undef,
+ 'if' => undef,
+ 'inc::latest' => undef,
+ 'lib' => undef,
+ 'parent' => undef,
+ 'threads' => undef,
+ 'threads::shared' => undef,
+ 'version' => undef,
+);
+
+# Create aliases with trailing zeros for $] use
+
+$released{'5.000'} = $released{5};
+$released{'5.010000'} = $released{5.01};
+$released{'5.011000'} = $released{5.011};
+$released{'5.012000'} = $released{5.012};
+$released{'5.013000'} = $released{5.013};
+
+$version{'5.000'} = $version{5};
+$version{'5.010000'} = $version{5.01};
+$version{'5.011000'} = $version{5.011};
+$version{'5.012000'} = $version{5.012};
+$version{'5.013000'} = $version{5.013};
+
+$deprecated{'5.011000'} = $deprecated{5.011};
+$deprecated{'5.012000'} = $deprecated{5.012};
+$deprecated{'5.013000'} = $deprecated{5.013};
+
+1;
+__END__
diff --git a/Master/tlpkg/tlperl/lib/Module/Load.pm b/Master/tlpkg/tlperl/lib/Module/Load.pm
new file mode 100644
index 00000000000..08f64b2b2c0
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Load.pm
@@ -0,0 +1,181 @@
+package Module::Load;
+
+$VERSION = '0.16';
+
+use strict;
+use File::Spec ();
+
+sub import {
+ my $who = _who();
+
+ { no strict 'refs';
+ *{"${who}::load"} = *load;
+ }
+}
+
+sub load (*;@) {
+ my $mod = shift or return;
+ my $who = _who();
+
+ if( _is_file( $mod ) ) {
+ require $mod;
+ } else {
+ LOAD: {
+ my $err;
+ for my $flag ( qw[1 0] ) {
+ my $file = _to_file( $mod, $flag);
+ eval { require $file };
+ $@ ? $err .= $@ : last LOAD;
+ }
+ die $err if $err;
+ }
+ }
+
+ ### This addresses #41883: Module::Load cannot import
+ ### non-Exporter module. ->import() routines weren't
+ ### properly called when load() was used.
+ { no strict 'refs';
+ my $import;
+ if (@_ and $import = $mod->can('import')) {
+ unshift @_, $mod;
+ goto &$import;
+ }
+ }
+}
+
+sub _to_file{
+ local $_ = shift;
+ my $pm = shift || '';
+
+ my @parts = split /::/;
+
+ ### because of [perl #19213], see caveats ###
+ my $file = $^O eq 'MSWin32'
+ ? join "/", @parts
+ : File::Spec->catfile( @parts );
+
+ $file .= '.pm' if $pm;
+
+ ### on perl's before 5.10 (5.9.5@31746) if you require
+ ### a file in VMS format, it's stored in %INC in VMS
+ ### format. Therefor, better unixify it first
+ ### Patch in reply to John Malmbergs patch (as mentioned
+ ### above) on p5p Tue 21 Aug 2007 04:55:07
+ $file = VMS::Filespec::unixify($file) if $^O eq 'VMS';
+
+ return $file;
+}
+
+sub _who { (caller(1))[0] }
+
+sub _is_file {
+ local $_ = shift;
+ return /^\./ ? 1 :
+ /[^\w:']/ ? 1 :
+ undef
+ #' silly bbedit..
+}
+
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Module::Load - runtime require of both modules and files
+
+=head1 SYNOPSIS
+
+ use Module::Load;
+
+ my $module = 'Data:Dumper';
+ load Data::Dumper; # loads that module
+ load 'Data::Dumper'; # ditto
+ load $module # tritto
+
+ my $script = 'some/script.pl'
+ load $script;
+ load 'some/script.pl'; # use quotes because of punctuations
+
+ load thing; # try 'thing' first, then 'thing.pm'
+
+ load CGI, ':standard' # like 'use CGI qw[:standard]'
+
+
+=head1 DESCRIPTION
+
+C<load> eliminates the need to know whether you are trying to require
+either a file or a module.
+
+If you consult C<perldoc -f require> you will see that C<require> will
+behave differently when given a bareword or a string.
+
+In the case of a string, C<require> assumes you are wanting to load a
+file. But in the case of a bareword, it assumes you mean a module.
+
+This gives nasty overhead when you are trying to dynamically require
+modules at runtime, since you will need to change the module notation
+(C<Acme::Comment>) to a file notation fitting the particular platform
+you are on.
+
+C<load> eliminates the need for this overhead and will just DWYM.
+
+=head1 Rules
+
+C<load> has the following rules to decide what it thinks you want:
+
+=over 4
+
+=item *
+
+If the argument has any characters in it other than those matching
+C<\w>, C<:> or C<'>, it must be a file
+
+=item *
+
+If the argument matches only C<[\w:']>, it must be a module
+
+=item *
+
+If the argument matches only C<\w>, it could either be a module or a
+file. We will try to find C<file> first in C<@INC> and if that fails,
+we will try to find C<file.pm> in @INC.
+If both fail, we die with the respective error messages.
+
+=back
+
+=head1 Caveats
+
+Because of a bug in perl (#19213), at least in version 5.6.1, we have
+to hardcode the path separator for a require on Win32 to be C</>, like
+on Unix rather than the Win32 C<\>. Otherwise perl will not read its
+own %INC accurately double load files if they are required again, or
+in the worst case, core dump.
+
+C<Module::Load> cannot do implicit imports, only explicit imports.
+(in other words, you always have to specify explicitly what you wish
+to import from a module, even if the functions are in that modules'
+C<@EXPORT>)
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to Jonas B. Nielsen for making explicit imports work.
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-module-load@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Load/Conditional.pm b/Master/tlpkg/tlperl/lib/Module/Load/Conditional.pm
new file mode 100644
index 00000000000..1bceb4432d7
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Load/Conditional.pm
@@ -0,0 +1,654 @@
+package Module::Load::Conditional;
+
+use strict;
+
+use Module::Load;
+use Params::Check qw[check];
+use Locale::Maketext::Simple Style => 'gettext';
+
+use Carp ();
+use File::Spec ();
+use FileHandle ();
+use version;
+
+use constant ON_VMS => $^O eq 'VMS';
+
+BEGIN {
+ use vars qw[ $VERSION @ISA $VERBOSE $CACHE @EXPORT_OK $DEPRECATED
+ $FIND_VERSION $ERROR $CHECK_INC_HASH];
+ use Exporter;
+ @ISA = qw[Exporter];
+ $VERSION = '0.38';
+ $VERBOSE = 0;
+ $DEPRECATED = 0;
+ $FIND_VERSION = 1;
+ $CHECK_INC_HASH = 0;
+ @EXPORT_OK = qw[check_install can_load requires];
+}
+
+=pod
+
+=head1 NAME
+
+Module::Load::Conditional - Looking up module information / loading at runtime
+
+=head1 SYNOPSIS
+
+ use Module::Load::Conditional qw[can_load check_install requires];
+
+
+ my $use_list = {
+ CPANPLUS => 0.05,
+ LWP => 5.60,
+ 'Test::More' => undef,
+ };
+
+ print can_load( modules => $use_list )
+ ? 'all modules loaded successfully'
+ : 'failed to load required modules';
+
+
+ my $rv = check_install( module => 'LWP', version => 5.60 )
+ or print 'LWP is not installed!';
+
+ print 'LWP up to date' if $rv->{uptodate};
+ print "LWP version is $rv->{version}\n";
+ print "LWP is installed as file $rv->{file}\n";
+
+
+ print "LWP requires the following modules to be installed:\n";
+ print join "\n", requires('LWP');
+
+ ### allow M::L::C to peek in your %INC rather than just
+ ### scanning @INC
+ $Module::Load::Conditional::CHECK_INC_HASH = 1;
+
+ ### reset the 'can_load' cache
+ undef $Module::Load::Conditional::CACHE;
+
+ ### don't have Module::Load::Conditional issue warnings --
+ ### default is '1'
+ $Module::Load::Conditional::VERBOSE = 0;
+
+ ### The last error that happened during a call to 'can_load'
+ my $err = $Module::Load::Conditional::ERROR;
+
+
+=head1 DESCRIPTION
+
+Module::Load::Conditional provides simple ways to query and possibly load any of
+the modules you have installed on your system during runtime.
+
+It is able to load multiple modules at once or none at all if one of
+them was not able to load. It also takes care of any error checking
+and so forth.
+
+=head1 Methods
+
+=head1 $href = check_install( module => NAME [, version => VERSION, verbose => BOOL ] );
+
+C<check_install> allows you to verify if a certain module is installed
+or not. You may call it with the following arguments:
+
+=over 4
+
+=item module
+
+The name of the module you wish to verify -- this is a required key
+
+=item version
+
+The version this module needs to be -- this is optional
+
+=item verbose
+
+Whether or not to be verbose about what it is doing -- it will default
+to $Module::Load::Conditional::VERBOSE
+
+=back
+
+It will return undef if it was not able to find where the module was
+installed, or a hash reference with the following keys if it was able
+to find the file:
+
+=over 4
+
+=item file
+
+Full path to the file that contains the module
+
+=item dir
+
+Directory, or more exact the C<@INC> entry, where the module was
+loaded from.
+
+=item version
+
+The version number of the installed module - this will be C<undef> if
+the module had no (or unparsable) version number, or if the variable
+C<$Module::Load::Conditional::FIND_VERSION> was set to true.
+(See the C<GLOBAL VARIABLES> section below for details)
+
+=item uptodate
+
+A boolean value indicating whether or not the module was found to be
+at least the version you specified. If you did not specify a version,
+uptodate will always be true if the module was found.
+If no parsable version was found in the module, uptodate will also be
+true, since C<check_install> had no way to verify clearly.
+
+See also C<$Module::Load::Conditional::DEPRECATED>, which affects
+the outcome of this value.
+
+=back
+
+=cut
+
+### this checks if a certain module is installed already ###
+### if it returns true, the module in question is already installed
+### or we found the file, but couldn't open it, OR there was no version
+### to be found in the module
+### it will return 0 if the version in the module is LOWER then the one
+### we are looking for, or if we couldn't find the desired module to begin with
+### if the installed version is higher or equal to the one we want, it will return
+### a hashref with he module name and version in it.. so 'true' as well.
+sub check_install {
+ my %hash = @_;
+
+ my $tmpl = {
+ version => { default => '0.0' },
+ module => { required => 1 },
+ verbose => { default => $VERBOSE },
+ };
+
+ my $args;
+ unless( $args = check( $tmpl, \%hash, $VERBOSE ) ) {
+ warn loc( q[A problem occurred checking arguments] ) if $VERBOSE;
+ return;
+ }
+
+ my $file = File::Spec->catfile( split /::/, $args->{module} ) . '.pm';
+ my $file_inc = File::Spec::Unix->catfile(
+ split /::/, $args->{module}
+ ) . '.pm';
+
+ ### where we store the return value ###
+ my $href = {
+ file => undef,
+ version => undef,
+ uptodate => undef,
+ };
+
+ my $filename;
+
+ ### check the inc hash if we're allowed to
+ if( $CHECK_INC_HASH ) {
+ $filename = $href->{'file'} =
+ $INC{ $file_inc } if defined $INC{ $file_inc };
+
+ ### find the version by inspecting the package
+ if( defined $filename && $FIND_VERSION ) {
+ no strict 'refs';
+ $href->{version} = ${ "$args->{module}"."::VERSION" };
+ }
+ }
+
+ ### we didnt find the filename yet by looking in %INC,
+ ### so scan the dirs
+ unless( $filename ) {
+
+ DIR: for my $dir ( @INC ) {
+
+ my $fh;
+
+ if ( ref $dir ) {
+ ### @INC hook -- we invoke it and get the filehandle back
+ ### this is actually documented behaviour as of 5.8 ;)
+
+ if (UNIVERSAL::isa($dir, 'CODE')) {
+ ($fh) = $dir->($dir, $file);
+
+ } elsif (UNIVERSAL::isa($dir, 'ARRAY')) {
+ ($fh) = $dir->[0]->($dir, $file, @{$dir}{1..$#{$dir}})
+
+ } elsif (UNIVERSAL::can($dir, 'INC')) {
+ ($fh) = $dir->INC($file);
+ }
+
+ if (!UNIVERSAL::isa($fh, 'GLOB')) {
+ warn loc(q[Cannot open file '%1': %2], $file, $!)
+ if $args->{verbose};
+ next;
+ }
+
+ $filename = $INC{$file_inc} || $file;
+
+ } else {
+ $filename = File::Spec->catfile($dir, $file);
+ next unless -e $filename;
+
+ $fh = new FileHandle;
+ if (!$fh->open($filename)) {
+ warn loc(q[Cannot open file '%1': %2], $file, $!)
+ if $args->{verbose};
+ next;
+ }
+ }
+
+ ### store the directory we found the file in
+ $href->{dir} = $dir;
+
+ ### files need to be in unix format under vms,
+ ### or they might be loaded twice
+ $href->{file} = ON_VMS
+ ? VMS::Filespec::unixify( $filename )
+ : $filename;
+
+ ### user wants us to find the version from files
+ if( $FIND_VERSION ) {
+
+ my $in_pod = 0;
+ while ( my $line = <$fh> ) {
+
+ ### stolen from EU::MM_Unix->parse_version to address
+ ### #24062: "Problem with CPANPLUS 0.076 misidentifying
+ ### versions after installing Text::NSP 1.03" where a
+ ### VERSION mentioned in the POD was found before
+ ### the real $VERSION declaration.
+ $in_pod = $line =~ /^=(?!cut)/ ? 1 :
+ $line =~ /^=cut/ ? 0 :
+ $in_pod;
+ next if $in_pod;
+
+ ### try to find a version declaration in this string.
+ my $ver = __PACKAGE__->_parse_version( $line );
+
+ if( defined $ver ) {
+ $href->{version} = $ver;
+
+ last DIR;
+ }
+ }
+ }
+ }
+ }
+
+ ### if we couldn't find the file, return undef ###
+ return unless defined $href->{file};
+
+ ### only complain if we're expected to find a version higher than 0.0 anyway
+ if( $FIND_VERSION and not defined $href->{version} ) {
+ { ### don't warn about the 'not numeric' stuff ###
+ local $^W;
+
+ ### if we got here, we didn't find the version
+ warn loc(q[Could not check version on '%1'], $args->{module} )
+ if $args->{verbose} and $args->{version} > 0;
+ }
+ $href->{uptodate} = 1;
+
+ } else {
+ ### don't warn about the 'not numeric' stuff ###
+ local $^W;
+
+ ### use qv(), as it will deal with developer release number
+ ### ie ones containing _ as well. This addresses bug report
+ ### #29348: Version compare logic doesn't handle alphas?
+ ###
+ ### Update from JPeacock: apparently qv() and version->new
+ ### are different things, and we *must* use version->new
+ ### here, or things like #30056 might start happening
+
+ ### We have to wrap this in an eval as version-0.82 raises
+ ### exceptions and not warnings now *sigh*
+
+ eval {
+
+ $href->{uptodate} =
+ version->new( $args->{version} ) <= version->new( $href->{version} )
+ ? 1
+ : 0;
+
+ };
+ }
+
+ if ( $DEPRECATED and version->new($]) >= version->new('5.011') ) {
+ require Module::CoreList;
+ require Config;
+
+ $href->{uptodate} = 0 if
+ exists $Module::CoreList::version{ 0+$] }{ $args->{module} } and
+ Module::CoreList::is_deprecated( $args->{module} ) and
+ $Config::Config{privlibexp} eq $href->{dir};
+ }
+
+ return $href;
+}
+
+sub _parse_version {
+ my $self = shift;
+ my $str = shift or return;
+ my $verbose = shift or 0;
+
+ ### skip lines which doesn't contain VERSION
+ return unless $str =~ /VERSION/;
+
+ ### skip commented out lines, they won't eval to anything.
+ return if $str =~ /^\s*#/;
+
+ ### the following regexp & eval statement comes from the
+ ### ExtUtils::MakeMaker source (EU::MM_Unix->parse_version)
+ ### Following #18892, which tells us the original
+ ### regex breaks under -T, we must modifiy it so
+ ### it captures the entire expression, and eval /that/
+ ### rather than $_, which is insecure.
+ my $taint_safe_str = do { $str =~ /(^.*$)/sm; $1 };
+
+ if( $str =~ /(?<!\\)([\$*])(([\w\:\']*)\bVERSION)\b.*\=/ ) {
+
+ print "Evaluating: $str\n" if $verbose;
+
+ ### this creates a string to be eval'd, like:
+ # package Module::Load::Conditional::_version;
+ # no strict;
+ #
+ # local $VERSION;
+ # $VERSION=undef; do {
+ # use version; $VERSION = qv('0.0.3');
+ # }; $VERSION
+
+ my $eval = qq{
+ package Module::Load::Conditional::_version;
+ no strict;
+
+ local $1$2;
+ \$$2=undef; do {
+ $taint_safe_str
+ }; \$$2
+ };
+
+ print "Evaltext: $eval\n" if $verbose;
+
+ my $result = do {
+ local $^W = 0;
+ eval($eval);
+ };
+
+
+ my $rv = defined $result ? $result : '0.0';
+
+ print( $@ ? "Error: $@\n" : "Result: $rv\n" ) if $verbose;
+
+ return $rv;
+ }
+
+ ### unable to find a version in this string
+ return;
+}
+
+=head2 $bool = can_load( modules => { NAME => VERSION [,NAME => VERSION] }, [verbose => BOOL, nocache => BOOL] )
+
+C<can_load> will take a list of modules, optionally with version
+numbers and determine if it is able to load them. If it can load *ALL*
+of them, it will. If one or more are unloadable, none will be loaded.
+
+This is particularly useful if you have More Than One Way (tm) to
+solve a problem in a program, and only wish to continue down a path
+if all modules could be loaded, and not load them if they couldn't.
+
+This function uses the C<load> function from Module::Load under the
+hood.
+
+C<can_load> takes the following arguments:
+
+=over 4
+
+=item modules
+
+This is a hashref of module/version pairs. The version indicates the
+minimum version to load. If no version is provided, any version is
+assumed to be good enough.
+
+=item verbose
+
+This controls whether warnings should be printed if a module failed
+to load.
+The default is to use the value of $Module::Load::Conditional::VERBOSE.
+
+=item nocache
+
+C<can_load> keeps its results in a cache, so it will not load the
+same module twice, nor will it attempt to load a module that has
+already failed to load before. By default, C<can_load> will check its
+cache, but you can override that by setting C<nocache> to true.
+
+=cut
+
+sub can_load {
+ my %hash = @_;
+
+ my $tmpl = {
+ modules => { default => {}, strict_type => 1 },
+ verbose => { default => $VERBOSE },
+ nocache => { default => 0 },
+ };
+
+ my $args;
+
+ unless( $args = check( $tmpl, \%hash, $VERBOSE ) ) {
+ $ERROR = loc(q[Problem validating arguments!]);
+ warn $ERROR if $VERBOSE;
+ return;
+ }
+
+ ### layout of $CACHE:
+ ### $CACHE = {
+ ### $ module => {
+ ### usable => BOOL,
+ ### version => \d,
+ ### file => /path/to/file,
+ ### },
+ ### };
+
+ $CACHE ||= {}; # in case it was undef'd
+
+ my $error;
+ BLOCK: {
+ my $href = $args->{modules};
+
+ my @load;
+ for my $mod ( keys %$href ) {
+
+ next if $CACHE->{$mod}->{usable} && !$args->{nocache};
+
+ ### else, check if the hash key is defined already,
+ ### meaning $mod => 0,
+ ### indicating UNSUCCESSFUL prior attempt of usage
+
+ ### use qv(), as it will deal with developer release number
+ ### ie ones containing _ as well. This addresses bug report
+ ### #29348: Version compare logic doesn't handle alphas?
+ ###
+ ### Update from JPeacock: apparently qv() and version->new
+ ### are different things, and we *must* use version->new
+ ### here, or things like #30056 might start happening
+ if ( !$args->{nocache}
+ && defined $CACHE->{$mod}->{usable}
+ && (version->new( $CACHE->{$mod}->{version}||0 )
+ >= version->new( $href->{$mod} ) )
+ ) {
+ $error = loc( q[Already tried to use '%1', which was unsuccessful], $mod);
+ last BLOCK;
+ }
+
+ my $mod_data = check_install(
+ module => $mod,
+ version => $href->{$mod}
+ );
+
+ if( !$mod_data or !defined $mod_data->{file} ) {
+ $error = loc(q[Could not find or check module '%1'], $mod);
+ $CACHE->{$mod}->{usable} = 0;
+ last BLOCK;
+ }
+
+ map {
+ $CACHE->{$mod}->{$_} = $mod_data->{$_}
+ } qw[version file uptodate];
+
+ push @load, $mod;
+ }
+
+ for my $mod ( @load ) {
+
+ if ( $CACHE->{$mod}->{uptodate} ) {
+
+ eval { load $mod };
+
+ ### in case anything goes wrong, log the error, the fact
+ ### we tried to use this module and return 0;
+ if( $@ ) {
+ $error = $@;
+ $CACHE->{$mod}->{usable} = 0;
+ last BLOCK;
+ } else {
+ $CACHE->{$mod}->{usable} = 1;
+ }
+
+ ### module not found in @INC, store the result in
+ ### $CACHE and return 0
+ } else {
+
+ $error = loc(q[Module '%1' is not uptodate!], $mod);
+ $CACHE->{$mod}->{usable} = 0;
+ last BLOCK;
+ }
+ }
+
+ } # BLOCK
+
+ if( defined $error ) {
+ $ERROR = $error;
+ Carp::carp( loc(q|%1 [THIS MAY BE A PROBLEM!]|,$error) ) if $args->{verbose};
+ return;
+ } else {
+ return 1;
+ }
+}
+
+=back
+
+=head2 @list = requires( MODULE );
+
+C<requires> can tell you what other modules a particular module
+requires. This is particularly useful when you're intending to write
+a module for public release and are listing its prerequisites.
+
+C<requires> takes but one argument: the name of a module.
+It will then first check if it can actually load this module, and
+return undef if it can't.
+Otherwise, it will return a list of modules and pragmas that would
+have been loaded on the module's behalf.
+
+Note: The list C<require> returns has originated from your current
+perl and your current install.
+
+=cut
+
+sub requires {
+ my $who = shift;
+
+ unless( check_install( module => $who ) ) {
+ warn loc(q[You do not have module '%1' installed], $who) if $VERBOSE;
+ return undef;
+ }
+
+ my $lib = join " ", map { qq["-I$_"] } @INC;
+ my $cmd = qq[$^X $lib -M$who -e"print(join(qq[\\n],keys(%INC)))"];
+
+ return sort
+ grep { !/^$who$/ }
+ map { chomp; s|/|::|g; $_ }
+ grep { s|\.pm$||i; }
+ `$cmd`;
+}
+
+1;
+
+__END__
+
+=head1 Global Variables
+
+The behaviour of Module::Load::Conditional can be altered by changing the
+following global variables:
+
+=head2 $Module::Load::Conditional::VERBOSE
+
+This controls whether Module::Load::Conditional will issue warnings and
+explanations as to why certain things may have failed. If you set it
+to 0, Module::Load::Conditional will not output any warnings.
+The default is 0;
+
+=head2 $Module::Load::Conditional::FIND_VERSION
+
+This controls whether Module::Load::Conditional will try to parse
+(and eval) the version from the module you're trying to load.
+
+If you don't wish to do this, set this variable to C<false>. Understand
+then that version comparisons are not possible, and Module::Load::Conditional
+can not tell you what module version you have installed.
+This may be desirable from a security or performance point of view.
+Note that C<$FIND_VERSION> code runs safely under C<taint mode>.
+
+The default is 1;
+
+=head2 $Module::Load::Conditional::CHECK_INC_HASH
+
+This controls whether C<Module::Load::Conditional> checks your
+C<%INC> hash to see if a module is available. By default, only
+C<@INC> is scanned to see if a module is physically on your
+filesystem, or avialable via an C<@INC-hook>. Setting this variable
+to C<true> will trust any entries in C<%INC> and return them for
+you.
+
+The default is 0;
+
+=head2 $Module::Load::Conditional::CACHE
+
+This holds the cache of the C<can_load> function. If you explicitly
+want to remove the current cache, you can set this variable to
+C<undef>
+
+=head2 $Module::Load::Conditional::ERROR
+
+This holds a string of the last error that happened during a call to
+C<can_load>. It is useful to inspect this when C<can_load> returns
+C<undef>.
+
+=head2 $Module::Load::Conditional::DEPRECATED
+
+This controls whether C<Module::Load::Conditional> checks if
+a dual-life core module has been deprecated. If this is set to
+true C<check_install> will return false to C<uptodate>, if
+a dual-life module is found to be loaded from C<$Config{privlibexp}>
+
+The default is 0;
+
+=head1 See Also
+
+C<Module::Load>
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-module-load-conditional@rt.cpan.orgE<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Module/Loaded.pm b/Master/tlpkg/tlperl/lib/Module/Loaded.pm
new file mode 100644
index 00000000000..26cf07e3e61
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Loaded.pm
@@ -0,0 +1,142 @@
+package Module::Loaded;
+
+use strict;
+use Carp qw[carp];
+
+BEGIN { use base 'Exporter';
+ use vars qw[@EXPORT $VERSION];
+
+ $VERSION = '0.06';
+ @EXPORT = qw[mark_as_loaded mark_as_unloaded is_loaded];
+}
+
+=head1 NAME
+
+Module::Loaded - mark modules as loaded or unloaded
+
+=head1 SYNOPSIS
+
+ use Module::Loaded;
+
+ $bool = mark_as_loaded('Foo'); # Foo.pm is now marked as loaded
+ $loc = is_loaded('Foo'); # location of Foo.pm set to the
+ # loaders location
+ eval "require 'Foo'"; # is now a no-op
+
+ $bool = mark_as_unloaded('Foo'); # Foo.pm no longer marked as loaded
+ eval "require 'Foo'"; # Will try to find Foo.pm in @INC
+
+=head1 DESCRIPTION
+
+When testing applications, often you find yourself needing to provide
+functionality in your test environment that would usually be provided
+by external modules. Rather than munging the C<%INC> by hand to mark
+these external modules as loaded, so they are not attempted to be loaded
+by perl, this module offers you a very simple way to mark modules as
+loaded and/or unloaded.
+
+=head1 FUNCTIONS
+
+=head2 $bool = mark_as_loaded( PACKAGE );
+
+Marks the package as loaded to perl. C<PACKAGE> can be a bareword or
+string.
+
+If the module is already loaded, C<mark_as_loaded> will carp about
+this and tell you from where the C<PACKAGE> has been loaded already.
+
+=cut
+
+sub mark_as_loaded (*) {
+ my $pm = shift;
+ my $file = __PACKAGE__->_pm_to_file( $pm ) or return;
+ my $who = [caller]->[1];
+
+ my $where = is_loaded( $pm );
+ if ( defined $where ) {
+ carp "'$pm' already marked as loaded ('$where')";
+
+ } else {
+ $INC{$file} = $who;
+ }
+
+ return 1;
+}
+
+=head2 $bool = mark_as_unloaded( PACKAGE );
+
+Marks the package as unloaded to perl, which is the exact opposite
+of C<mark_as_loaded>. C<PACKAGE> can be a bareword or string.
+
+If the module is already unloaded, C<mark_as_unloaded> will carp about
+this and tell you the C<PACKAGE> has been unloaded already.
+
+=cut
+
+sub mark_as_unloaded (*) {
+ my $pm = shift;
+ my $file = __PACKAGE__->_pm_to_file( $pm ) or return;
+
+ unless( defined is_loaded( $pm ) ) {
+ carp "'$pm' already marked as unloaded";
+
+ } else {
+ delete $INC{ $file };
+ }
+
+ return 1;
+}
+
+=head2 $loc = is_loaded( PACKAGE );
+
+C<is_loaded> tells you if C<PACKAGE> has been marked as loaded yet.
+C<PACKAGE> can be a bareword or string.
+
+It returns falls if C<PACKAGE> has not been loaded yet and the location
+from where it is said to be loaded on success.
+
+=cut
+
+sub is_loaded (*) {
+ my $pm = shift;
+ my $file = __PACKAGE__->_pm_to_file( $pm ) or return;
+
+ return $INC{$file} if exists $INC{$file};
+
+ return;
+}
+
+
+sub _pm_to_file {
+ my $pkg = shift;
+ my $pm = shift or return;
+
+ my $file = join '/', split '::', $pm;
+ $file .= '.pm';
+
+ return $file;
+}
+
+=head1 BUG REPORTS
+
+Please report bugs or other issues to E<lt>bug-module-loaded@rt.cpan.org<gt>.
+
+=head1 AUTHOR
+
+This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This library is free software; you may redistribute and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+# Local variables:
+# c-indentation-style: bsd
+# c-basic-offset: 4
+# indent-tabs-mode: nil
+# End:
+# vim: expandtab shiftwidth=4:
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Module/Pluggable.pm b/Master/tlpkg/tlperl/lib/Module/Pluggable.pm
new file mode 100644
index 00000000000..bbdb49b6bca
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Pluggable.pm
@@ -0,0 +1,355 @@
+package Module::Pluggable;
+
+use strict;
+use vars qw($VERSION);
+use Module::Pluggable::Object;
+
+# ObQuote:
+# Bob Porter: Looks like you've been missing a lot of work lately.
+# Peter Gibbons: I wouldn't say I've been missing it, Bob!
+
+
+$VERSION = '3.9';
+
+sub import {
+ my $class = shift;
+ my %opts = @_;
+
+ my ($pkg, $file) = caller;
+ # the default name for the method is 'plugins'
+ my $sub = $opts{'sub_name'} || 'plugins';
+ # get our package
+ my ($package) = $opts{'package'} || $pkg;
+ $opts{filename} = $file;
+ $opts{package} = $package;
+
+
+ my $finder = Module::Pluggable::Object->new(%opts);
+ my $subroutine = sub { my $self = shift; return $finder->plugins(@_) };
+
+ my $searchsub = sub {
+ my $self = shift;
+ my ($action,@paths) = @_;
+
+ $finder->{'search_path'} = ["${package}::Plugin"] if ($action eq 'add' and not $finder->{'search_path'} );
+ push @{$finder->{'search_path'}}, @paths if ($action eq 'add');
+ $finder->{'search_path'} = \@paths if ($action eq 'new');
+ return $finder->{'search_path'};
+ };
+
+
+ my $onlysub = sub {
+ my ($self, $only) = @_;
+
+ if (defined $only) {
+ $finder->{'only'} = $only;
+ };
+
+ return $finder->{'only'};
+ };
+
+ my $exceptsub = sub {
+ my ($self, $except) = @_;
+
+ if (defined $except) {
+ $finder->{'except'} = $except;
+ };
+
+ return $finder->{'except'};
+ };
+
+
+ no strict 'refs';
+ no warnings qw(redefine prototype);
+
+ *{"$package\::$sub"} = $subroutine;
+ *{"$package\::search_path"} = $searchsub;
+ *{"$package\::only"} = $onlysub;
+ *{"$package\::except"} = $exceptsub;
+
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Module::Pluggable - automatically give your module the ability to have plugins
+
+=head1 SYNOPSIS
+
+
+Simple use Module::Pluggable -
+
+ package MyClass;
+ use Module::Pluggable;
+
+
+and then later ...
+
+ use MyClass;
+ my $mc = MyClass->new();
+ # returns the names of all plugins installed under MyClass::Plugin::*
+ my @plugins = $mc->plugins();
+
+=head1 EXAMPLE
+
+Why would you want to do this? Say you have something that wants to pass an
+object to a number of different plugins in turn. For example you may
+want to extract meta-data from every email you get sent and do something
+with it. Plugins make sense here because then you can keep adding new
+meta data parsers and all the logic and docs for each one will be
+self contained and new handlers are easy to add without changing the
+core code. For that, you might do something like ...
+
+ package Email::Examiner;
+
+ use strict;
+ use Email::Simple;
+ use Module::Pluggable require => 1;
+
+ sub handle_email {
+ my $self = shift;
+ my $email = shift;
+
+ foreach my $plugin ($self->plugins) {
+ $plugin->examine($email);
+ }
+
+ return 1;
+ }
+
+
+
+.. and all the plugins will get a chance in turn to look at it.
+
+This can be trivally extended so that plugins could save the email
+somewhere and then no other plugin should try and do that.
+Simply have it so that the C<examine> method returns C<1> if
+it has saved the email somewhere. You might also wnat to be paranoid
+and check to see if the plugin has an C<examine> method.
+
+ foreach my $plugin ($self->plugins) {
+ next unless $plugin->can('examine');
+ last if $plugin->examine($email);
+ }
+
+
+And so on. The sky's the limit.
+
+
+=head1 DESCRIPTION
+
+Provides a simple but, hopefully, extensible way of having 'plugins' for
+your module. Obviously this isn't going to be the be all and end all of
+solutions but it works for me.
+
+Essentially all it does is export a method into your namespace that
+looks through a search path for .pm files and turn those into class names.
+
+Optionally it instantiates those classes for you.
+
+=head1 ADVANCED USAGE
+
+
+Alternatively, if you don't want to use 'plugins' as the method ...
+
+ package MyClass;
+ use Module::Pluggable sub_name => 'foo';
+
+
+and then later ...
+
+ my @plugins = $mc->foo();
+
+
+Or if you want to look in another namespace
+
+ package MyClass;
+ use Module::Pluggable search_path => ['Acme::MyClass::Plugin', 'MyClass::Extend'];
+
+or directory
+
+ use Module::Pluggable search_dirs => ['mylibs/Foo'];
+
+
+Or if you want to instantiate each plugin rather than just return the name
+
+ package MyClass;
+ use Module::Pluggable instantiate => 'new';
+
+and then
+
+ # whatever is passed to 'plugins' will be passed
+ # to 'new' for each plugin
+ my @plugins = $mc->plugins(@options);
+
+
+alternatively you can just require the module without instantiating it
+
+ package MyClass;
+ use Module::Pluggable require => 1;
+
+since requiring automatically searches inner packages, which may not be desirable, you can turn this off
+
+
+ package MyClass;
+ use Module::Pluggable require => 1, inner => 0;
+
+
+You can limit the plugins loaded using the except option, either as a string,
+array ref or regex
+
+ package MyClass;
+ use Module::Pluggable except => 'MyClass::Plugin::Foo';
+
+or
+
+ package MyClass;
+ use Module::Pluggable except => ['MyClass::Plugin::Foo', 'MyClass::Plugin::Bar'];
+
+or
+
+ package MyClass;
+ use Module::Pluggable except => qr/^MyClass::Plugin::(Foo|Bar)$/;
+
+
+and similarly for only which will only load plugins which match.
+
+Remember you can use the module more than once
+
+ package MyClass;
+ use Module::Pluggable search_path => 'MyClass::Filters' sub_name => 'filters';
+ use Module::Pluggable search_path => 'MyClass::Plugins' sub_name => 'plugins';
+
+and then later ...
+
+ my @filters = $self->filters;
+ my @plugins = $self->plugins;
+
+=head1 INNER PACKAGES
+
+If you have, for example, a file B<lib/Something/Plugin/Foo.pm> that
+contains package definitions for both C<Something::Plugin::Foo> and
+C<Something::Plugin::Bar> then as long as you either have either
+the B<require> or B<instantiate> option set then we'll also find
+C<Something::Plugin::Bar>. Nifty!
+
+=head1 OPTIONS
+
+You can pass a hash of options when importing this module.
+
+The options can be ...
+
+=head2 sub_name
+
+The name of the subroutine to create in your namespace.
+
+By default this is 'plugins'
+
+=head2 search_path
+
+An array ref of namespaces to look in.
+
+=head2 search_dirs
+
+An array ref of directorys to look in before @INC.
+
+=head2 instantiate
+
+Call this method on the class. In general this will probably be 'new'
+but it can be whatever you want. Whatever arguments are passed to 'plugins'
+will be passed to the method.
+
+The default is 'undef' i.e just return the class name.
+
+=head2 require
+
+Just require the class, don't instantiate (overrides 'instantiate');
+
+=head2 inner
+
+If set to 0 will B<not> search inner packages.
+If set to 1 will override C<require>.
+
+=head2 only
+
+Takes a string, array ref or regex describing the names of the only plugins to
+return. Whilst this may seem perverse ... well, it is. But it also
+makes sense. Trust me.
+
+=head2 except
+
+Similar to C<only> it takes a description of plugins to exclude
+from returning. This is slightly less perverse.
+
+=head2 package
+
+This is for use by extension modules which build on C<Module::Pluggable>:
+passing a C<package> option allows you to place the plugin method in a
+different package other than your own.
+
+=head2 file_regex
+
+By default C<Module::Pluggable> only looks for I<.pm> files.
+
+By supplying a new C<file_regex> then you can change this behaviour e.g
+
+ file_regex => qr/\.plugin$/
+
+=head2 include_editor_junk
+
+By default C<Module::Pluggable> ignores files that look like they were
+left behind by editors. Currently this means files ending in F<~> (~),
+the extensions F<.swp> or F<.swo>, or files beginning with F<.#>.
+
+Setting C<include_editor_junk> changes C<Module::Pluggable> so it does
+not ignore any files it finds.
+
+
+=head1 METHODs
+
+=head2 search_path
+
+The method C<search_path> is exported into you namespace as well.
+You can call that at any time to change or replace the
+search_path.
+
+ $self->search_path( add => "New::Path" ); # add
+ $self->search_path( new => "New::Path" ); # replace
+
+
+
+=head1 FUTURE PLANS
+
+This does everything I need and I can't really think of any other
+features I want to add. Famous last words of course
+
+Recently tried fixed to find inner packages and to make it
+'just work' with PAR but there are still some issues.
+
+
+However suggestions (and patches) are welcome.
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2006 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=head1 SEE ALSO
+
+L<File::Spec>, L<File::Find>, L<File::Basename>, L<Class::Factory::Util>, L<Module::Pluggable::Ordered>
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl/lib/Module/Pluggable/Object.pm b/Master/tlpkg/tlperl/lib/Module/Pluggable/Object.pm
new file mode 100644
index 00000000000..e0ee993075d
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Module/Pluggable/Object.pm
@@ -0,0 +1,373 @@
+package Module::Pluggable::Object;
+
+use strict;
+use File::Find ();
+use File::Basename;
+use File::Spec::Functions qw(splitdir catdir curdir catfile abs2rel);
+use Carp qw(croak carp);
+use Devel::InnerPackage;
+use vars qw($VERSION);
+
+$VERSION = '3.9';
+
+
+sub new {
+ my $class = shift;
+ my %opts = @_;
+
+ return bless \%opts, $class;
+
+}
+
+### Eugggh, this code smells
+### This is what happens when you keep adding patches
+### *sigh*
+
+
+sub plugins {
+ my $self = shift;
+
+ # override 'require'
+ $self->{'require'} = 1 if $self->{'inner'};
+
+ my $filename = $self->{'filename'};
+ my $pkg = $self->{'package'};
+
+ # Get the exception params instantiated
+ $self->_setup_exceptions;
+
+ # automatically turn a scalar search path or namespace into a arrayref
+ for (qw(search_path search_dirs)) {
+ $self->{$_} = [ $self->{$_} ] if exists $self->{$_} && !ref($self->{$_});
+ }
+
+ # default search path is '<Module>::<Name>::Plugin'
+ $self->{'search_path'} = ["${pkg}::Plugin"] unless $self->{'search_path'};
+
+
+ #my %opts = %$self;
+
+
+ # check to see if we're running under test
+ my @SEARCHDIR = exists $INC{"blib.pm"} && defined $filename && $filename =~ m!(^|/)blib/! ? grep {/blib/} @INC : @INC;
+
+ # add any search_dir params
+ unshift @SEARCHDIR, @{$self->{'search_dirs'}} if defined $self->{'search_dirs'};
+
+
+ my @plugins = $self->search_directories(@SEARCHDIR);
+ push(@plugins, $self->handle_innerpackages($_)) for @{$self->{'search_path'}};
+
+ # push @plugins, map { print STDERR "$_\n"; $_->require } list_packages($_) for (@{$self->{'search_path'}});
+
+ # return blank unless we've found anything
+ return () unless @plugins;
+
+
+
+ # remove duplicates
+ # probably not necessary but hey ho
+ my %plugins;
+ for(@plugins) {
+ next unless $self->_is_legit($_);
+ $plugins{$_} = 1;
+ }
+
+ # are we instantiating or requring?
+ if (defined $self->{'instantiate'}) {
+ my $method = $self->{'instantiate'};
+ return map { ($_->can($method)) ? $_->$method(@_) : () } keys %plugins;
+ } else {
+ # no? just return the names
+ return keys %plugins;
+ }
+
+
+}
+
+sub _setup_exceptions {
+ my $self = shift;
+
+ my %only;
+ my %except;
+ my $only;
+ my $except;
+
+ if (defined $self->{'only'}) {
+ if (ref($self->{'only'}) eq 'ARRAY') {
+ %only = map { $_ => 1 } @{$self->{'only'}};
+ } elsif (ref($self->{'only'}) eq 'Regexp') {
+ $only = $self->{'only'}
+ } elsif (ref($self->{'only'}) eq '') {
+ $only{$self->{'only'}} = 1;
+ }
+ }
+
+
+ if (defined $self->{'except'}) {
+ if (ref($self->{'except'}) eq 'ARRAY') {
+ %except = map { $_ => 1 } @{$self->{'except'}};
+ } elsif (ref($self->{'except'}) eq 'Regexp') {
+ $except = $self->{'except'}
+ } elsif (ref($self->{'except'}) eq '') {
+ $except{$self->{'except'}} = 1;
+ }
+ }
+ $self->{_exceptions}->{only_hash} = \%only;
+ $self->{_exceptions}->{only} = $only;
+ $self->{_exceptions}->{except_hash} = \%except;
+ $self->{_exceptions}->{except} = $except;
+
+}
+
+sub _is_legit {
+ my $self = shift;
+ my $plugin = shift;
+ my %only = %{$self->{_exceptions}->{only_hash}||{}};
+ my %except = %{$self->{_exceptions}->{except_hash}||{}};
+ my $only = $self->{_exceptions}->{only};
+ my $except = $self->{_exceptions}->{except};
+
+ return 0 if (keys %only && !$only{$plugin} );
+ return 0 unless (!defined $only || $plugin =~ m!$only! );
+
+ return 0 if (keys %except && $except{$plugin} );
+ return 0 if (defined $except && $plugin =~ m!$except! );
+
+ return 1;
+}
+
+sub search_directories {
+ my $self = shift;
+ my @SEARCHDIR = @_;
+
+ my @plugins;
+ # go through our @INC
+ foreach my $dir (@SEARCHDIR) {
+ push @plugins, $self->search_paths($dir);
+ }
+ return @plugins;
+}
+
+
+sub search_paths {
+ my $self = shift;
+ my $dir = shift;
+ my @plugins;
+
+ my $file_regex = $self->{'file_regex'} || qr/\.pm$/;
+
+
+ # and each directory in our search path
+ foreach my $searchpath (@{$self->{'search_path'}}) {
+ # create the search directory in a cross platform goodness way
+ my $sp = catdir($dir, (split /::/, $searchpath));
+
+ # if it doesn't exist or it's not a dir then skip it
+ next unless ( -e $sp && -d _ ); # Use the cached stat the second time
+
+ my @files = $self->find_files($sp);
+
+ # foreach one we've found
+ foreach my $file (@files) {
+ # untaint the file; accept .pm only
+ next unless ($file) = ($file =~ /(.*$file_regex)$/);
+ # parse the file to get the name
+ my ($name, $directory, $suffix) = fileparse($file, $file_regex);
+
+ next if (!$self->{include_editor_junk} && $self->_is_editor_junk($name));
+
+ $directory = abs2rel($directory, $sp);
+
+ # If we have a mixed-case package name, assume case has been preserved
+ # correctly. Otherwise, root through the file to locate the case-preserved
+ # version of the package name.
+ my @pkg_dirs = ();
+ if ( $name eq lc($name) || $name eq uc($name) ) {
+ my $pkg_file = catfile($sp, $directory, "$name$suffix");
+ open PKGFILE, "<$pkg_file" or die "search_paths: Can't open $pkg_file: $!";
+ my $in_pod = 0;
+ while ( my $line = <PKGFILE> ) {
+ $in_pod = 1 if $line =~ m/^=\w/;
+ $in_pod = 0 if $line =~ /^=cut/;
+ next if ($in_pod || $line =~ /^=cut/); # skip pod text
+ next if $line =~ /^\s*#/; # and comments
+ if ( $line =~ m/^\s*package\s+(.*::)?($name)\s*;/i ) {
+ @pkg_dirs = split /::/, $1;
+ $name = $2;
+ last;
+ }
+ }
+ close PKGFILE;
+ }
+
+ # then create the class name in a cross platform way
+ $directory =~ s/^[a-z]://i if($^O =~ /MSWin32|dos/); # remove volume
+ my @dirs = ();
+ if ($directory) {
+ ($directory) = ($directory =~ /(.*)/);
+ @dirs = grep(length($_), splitdir($directory))
+ unless $directory eq curdir();
+ for my $d (reverse @dirs) {
+ my $pkg_dir = pop @pkg_dirs;
+ last unless defined $pkg_dir;
+ $d =~ s/\Q$pkg_dir\E/$pkg_dir/i; # Correct case
+ }
+ } else {
+ $directory = "";
+ }
+ my $plugin = join '::', $searchpath, @dirs, $name;
+
+ next unless $plugin =~ m!(?:[a-z\d]+)[a-z\d]!i;
+
+ my $err = $self->handle_finding_plugin($plugin);
+ carp "Couldn't require $plugin : $err" if $err;
+
+ push @plugins, $plugin;
+ }
+
+ # now add stuff that may have been in package
+ # NOTE we should probably use all the stuff we've been given already
+ # but then we can't unload it :(
+ push @plugins, $self->handle_innerpackages($searchpath);
+ } # foreach $searchpath
+
+ return @plugins;
+}
+
+sub _is_editor_junk {
+ my $self = shift;
+ my $name = shift;
+
+ # Emacs (and other Unix-y editors) leave temp files ending in a
+ # tilde as a backup.
+ return 1 if $name =~ /~$/;
+ # Emacs makes these files while a buffer is edited but not yet
+ # saved.
+ return 1 if $name =~ /^\.#/;
+ # Vim can leave these files behind if it crashes.
+ return 1 if $name =~ /\.sw[po]$/;
+
+ return 0;
+}
+
+sub handle_finding_plugin {
+ my $self = shift;
+ my $plugin = shift;
+
+ return unless (defined $self->{'instantiate'} || $self->{'require'});
+ return unless $self->_is_legit($plugin);
+ $self->_require($plugin);
+}
+
+sub find_files {
+ my $self = shift;
+ my $search_path = shift;
+ my $file_regex = $self->{'file_regex'} || qr/\.pm$/;
+
+
+ # find all the .pm files in it
+ # this isn't perfect and won't find multiple plugins per file
+ #my $cwd = Cwd::getcwd;
+ my @files = ();
+ { # for the benefit of perl 5.6.1's Find, localize topic
+ local $_;
+ File::Find::find( { no_chdir => 1,
+ wanted => sub {
+ # Inlined from File::Find::Rule C< name => '*.pm' >
+ return unless $File::Find::name =~ /$file_regex/;
+ (my $path = $File::Find::name) =~ s#^\\./##;
+ push @files, $path;
+ }
+ }, $search_path );
+ }
+ #chdir $cwd;
+ return @files;
+
+}
+
+sub handle_innerpackages {
+ my $self = shift;
+ return () if (exists $self->{inner} && !$self->{inner});
+
+ my $path = shift;
+ my @plugins;
+
+ foreach my $plugin (Devel::InnerPackage::list_packages($path)) {
+ my $err = $self->handle_finding_plugin($plugin);
+ #next if $err;
+ #next unless $INC{$plugin};
+ push @plugins, $plugin;
+ }
+ return @plugins;
+
+}
+
+
+sub _require {
+ my $self = shift;
+ my $pack = shift;
+ local $@;
+ eval "CORE::require $pack";
+ return $@;
+}
+
+
+1;
+
+=pod
+
+=head1 NAME
+
+Module::Pluggable::Object - automatically give your module the ability to have plugins
+
+=head1 SYNOPSIS
+
+
+Simple use Module::Pluggable -
+
+ package MyClass;
+ use Module::Pluggable::Object;
+
+ my $finder = Module::Pluggable::Object->new(%opts);
+ print "My plugins are: ".join(", ", $finder->plugins)."\n";
+
+=head1 DESCRIPTION
+
+Provides a simple but, hopefully, extensible way of having 'plugins' for
+your module. Obviously this isn't going to be the be all and end all of
+solutions but it works for me.
+
+Essentially all it does is export a method into your namespace that
+looks through a search path for .pm files and turn those into class names.
+
+Optionally it instantiates those classes for you.
+
+This object is wrapped by C<Module::Pluggable>. If you want to do something
+odd or add non-general special features you're probably best to wrap this
+and produce your own subclass.
+
+=head1 OPTIONS
+
+See the C<Module::Pluggable> docs.
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2006 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=head1 SEE ALSO
+
+L<Module::Pluggable>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Checker.pm b/Master/tlpkg/tlperl/lib/Pod/Checker.pm
new file mode 100644
index 00000000000..a2305423b23
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Checker.pm
@@ -0,0 +1,1268 @@
+#############################################################################
+# Pod/Checker.pm -- check pod documents for syntax errors
+#
+# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Checker;
+use strict;
+
+use vars qw($VERSION @ISA @EXPORT %VALID_COMMANDS %VALID_SEQUENCES);
+$VERSION = '1.45'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+use Pod::ParseUtils; ## for hyperlinks and lists
+
+=head1 NAME
+
+Pod::Checker, podchecker() - check pod documents for syntax errors
+
+=head1 SYNOPSIS
+
+ use Pod::Checker;
+
+ $syntax_okay = podchecker($filepath, $outputpath, %options);
+
+ my $checker = new Pod::Checker %options;
+ $checker->parse_from_file($filepath, \*STDERR);
+
+=head1 OPTIONS/ARGUMENTS
+
+C<$filepath> is the input POD to read and C<$outputpath> is
+where to write POD syntax error messages. Either argument may be a scalar
+indicating a file-path, or else a reference to an open filehandle.
+If unspecified, the input-file it defaults to C<\*STDIN>, and
+the output-file defaults to C<\*STDERR>.
+
+=head2 podchecker()
+
+This function can take a hash of options:
+
+=over 4
+
+=item B<-warnings> =E<gt> I<val>
+
+Turn warnings on/off. I<val> is usually 1 for on, but higher values
+trigger additional warnings. See L<"Warnings">.
+
+=back
+
+=head1 DESCRIPTION
+
+B<podchecker> will perform syntax checking of Perl5 POD format documentation.
+
+Curious/ambitious users are welcome to propose additional features they wish
+to see in B<Pod::Checker> and B<podchecker> and verify that the checks are
+consistent with L<perlpod>.
+
+The following checks are currently performed:
+
+=over 4
+
+=item *
+
+Unknown '=xxxx' commands, unknown 'XE<lt>...E<gt>' interior-sequences,
+and unterminated interior sequences.
+
+=item *
+
+Check for proper balancing of C<=begin> and C<=end>. The contents of such
+a block are generally ignored, i.e. no syntax checks are performed.
+
+=item *
+
+Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>.
+
+=item *
+
+Check for same nested interior-sequences (e.g.
+C<LE<lt>...LE<lt>...E<gt>...E<gt>>).
+
+=item *
+
+Check for malformed or non-existing entities C<EE<lt>...E<gt>>.
+
+=item *
+
+Check for correct syntax of hyperlinks C<LE<lt>...E<gt>>. See L<perlpod>
+for details.
+
+=item *
+
+Check for unresolved document-internal links. This check may also reveal
+misspelled links that seem to be internal links but should be links
+to something else.
+
+=back
+
+=head1 DIAGNOSTICS
+
+=head2 Errors
+
+=over 4
+
+=item * empty =headn
+
+A heading (C<=head1> or C<=head2>) without any text? That ain't no
+heading!
+
+=item * =over on line I<N> without closing =back
+
+The C<=over> command does not have a corresponding C<=back> before the
+next heading (C<=head1> or C<=head2>) or the end of the file.
+
+=item * =item without previous =over
+
+=item * =back without previous =over
+
+An C<=item> or C<=back> command has been found outside a
+C<=over>/C<=back> block.
+
+=item * No argument for =begin
+
+A C<=begin> command was found that is not followed by the formatter
+specification.
+
+=item * =end without =begin
+
+A standalone C<=end> command was found.
+
+=item * Nested =begin's
+
+There were at least two consecutive C<=begin> commands without
+the corresponding C<=end>. Only one C<=begin> may be active at
+a time.
+
+=item * =for without formatter specification
+
+There is no specification of the formatter after the C<=for> command.
+
+=item * unresolved internal link I<NAME>
+
+The given link to I<NAME> does not have a matching node in the current
+POD. This also happened when a single word node name is not enclosed in
+C<"">.
+
+=item * Unknown command "I<CMD>"
+
+An invalid POD command has been found. Valid are C<=head1>, C<=head2>,
+C<=head3>, C<=head4>, C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>,
+C<=for>, C<=pod>, C<=cut>
+
+=item * Unknown interior-sequence "I<SEQ>"
+
+An invalid markup command has been encountered. Valid are:
+C<BE<lt>E<gt>>, C<CE<lt>E<gt>>, C<EE<lt>E<gt>>, C<FE<lt>E<gt>>,
+C<IE<lt>E<gt>>, C<LE<lt>E<gt>>, C<SE<lt>E<gt>>, C<XE<lt>E<gt>>,
+C<ZE<lt>E<gt>>
+
+=item * nested commands I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>
+
+Two nested identical markup commands have been found. Generally this
+does not make sense.
+
+=item * garbled entity I<STRING>
+
+The I<STRING> found cannot be interpreted as a character entity.
+
+=item * Entity number out of range
+
+An entity specified by number (dec, hex, oct) is out of range (1-255).
+
+=item * malformed link LE<lt>E<gt>
+
+The link found cannot be parsed because it does not conform to the
+syntax described in L<perlpod>.
+
+=item * nonempty ZE<lt>E<gt>
+
+The C<ZE<lt>E<gt>> sequence is supposed to be empty.
+
+=item * empty XE<lt>E<gt>
+
+The index entry specified contains nothing but whitespace.
+
+=item * Spurious text after =pod / =cut
+
+The commands C<=pod> and C<=cut> do not take any arguments.
+
+=item * Spurious character(s) after =back
+
+The C<=back> command does not take any arguments.
+
+=back
+
+=head2 Warnings
+
+These may not necessarily cause trouble, but indicate mediocre style.
+
+=over 4
+
+=item * multiple occurrence of link target I<name>
+
+The POD file has some C<=item> and/or C<=head> commands that have
+the same text. Potential hyperlinks to such a text cannot be unique then.
+This warning is printed only with warning level greater than one.
+
+=item * line containing nothing but whitespace in paragraph
+
+There is some whitespace on a seemingly empty line. POD is very sensitive
+to such things, so this is flagged. B<vi> users switch on the B<list>
+option to avoid this problem.
+
+=begin _disabled_
+
+=item * file does not start with =head
+
+The file starts with a different POD directive than head.
+This is most probably something you do not want.
+
+=end _disabled_
+
+=item * previous =item has no contents
+
+There is a list C<=item> right above the flagged line that has no
+text contents. You probably want to delete empty items.
+
+=item * preceding non-item paragraph(s)
+
+A list introduced by C<=over> starts with a text or verbatim paragraph,
+but continues with C<=item>s. Move the non-item paragraph out of the
+C<=over>/C<=back> block.
+
+=item * =item type mismatch (I<one> vs. I<two>)
+
+A list started with e.g. a bullet-like C<=item> and continued with a
+numbered one. This is obviously inconsistent. For most translators the
+type of the I<first> C<=item> determines the type of the list.
+
+=item * I<N> unescaped C<E<lt>E<gt>> in paragraph
+
+Angle brackets not written as C<E<lt>ltE<gt>> and C<E<lt>gtE<gt>>
+can potentially cause errors as they could be misinterpreted as
+markup commands. This is only printed when the -warnings level is
+greater than 1.
+
+=item * Unknown entity
+
+A character entity was found that does not belong to the standard
+ISO set or the POD specials C<verbar> and C<sol>.
+
+=item * No items in =over
+
+The list opened with C<=over> does not contain any items.
+
+=item * No argument for =item
+
+C<=item> without any parameters is deprecated. It should either be followed
+by C<*> to indicate an unordered list, by a number (optionally followed
+by a dot) to indicate an ordered (numbered) list or simple text for a
+definition list.
+
+=item * empty section in previous paragraph
+
+The previous section (introduced by a C<=head> command) does not contain
+any text. This usually indicates that something is missing. Note: A
+C<=head1> followed immediately by C<=head2> does not trigger this warning.
+
+=item * Verbatim paragraph in NAME section
+
+The NAME section (C<=head1 NAME>) should consist of a single paragraph
+with the script/module name, followed by a dash `-' and a very short
+description of what the thing is good for.
+
+=item * =headI<n> without preceding higher level
+
+For example if there is a C<=head2> in the POD file prior to a
+C<=head1>.
+
+=back
+
+=head2 Hyperlinks
+
+There are some warnings with respect to malformed hyperlinks:
+
+=over 4
+
+=item * ignoring leading/trailing whitespace in link
+
+There is whitespace at the beginning or the end of the contents of
+LE<lt>...E<gt>.
+
+=item * (section) in '$page' deprecated
+
+There is a section detected in the page name of LE<lt>...E<gt>, e.g.
+C<LE<lt>passwd(2)E<gt>>. POD hyperlinks may point to POD documents only.
+Please write C<CE<lt>passwd(2)E<gt>> instead. Some formatters are able
+to expand this to appropriate code. For links to (builtin) functions,
+please say C<LE<lt>perlfunc/mkdirE<gt>>, without ().
+
+=item * alternative text/node '%s' contains non-escaped | or /
+
+The characters C<|> and C</> are special in the LE<lt>...E<gt> context.
+Although the hyperlink parser does its best to determine which "/" is
+text and which is a delimiter in case of doubt, one ought to escape
+these literal characters like this:
+
+ / E<sol>
+ | E<verbar>
+
+=back
+
+=head1 RETURN VALUE
+
+B<podchecker> returns the number of POD syntax errors found or -1 if
+there were no POD commands at all found in the file.
+
+=head1 EXAMPLES
+
+See L</SYNOPSIS>
+
+=head1 INTERFACE
+
+While checking, this module collects document properties, e.g. the nodes
+for hyperlinks (C<=headX>, C<=item>) and index entries (C<XE<lt>E<gt>>).
+POD translators can use this feature to syntax-check and get the nodes in
+a first pass before actually starting to convert. This is expensive in terms
+of execution time, but allows for very robust conversions.
+
+Since PodParser-1.24 the B<Pod::Checker> module uses only the B<poderror>
+method to print errors and warnings. The summary output (e.g.
+"Pod syntax OK") has been dropped from the module and has been included in
+B<podchecker> (the script). This allows users of B<Pod::Checker> to
+control completely the output behavior. Users of B<podchecker> (the script)
+get the well-known behavior.
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Carp qw(croak);
+use Exporter;
+use Pod::Parser;
+
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podchecker);
+
+my %VALID_COMMANDS = (
+ 'pod' => 1,
+ 'cut' => 1,
+ 'head1' => 1,
+ 'head2' => 1,
+ 'head3' => 1,
+ 'head4' => 1,
+ 'over' => 1,
+ 'back' => 1,
+ 'item' => 1,
+ 'for' => 1,
+ 'begin' => 1,
+ 'end' => 1,
+ 'encoding' => 1,
+);
+
+my %VALID_SEQUENCES = (
+ 'I' => 1,
+ 'B' => 1,
+ 'S' => 1,
+ 'C' => 1,
+ 'L' => 1,
+ 'F' => 1,
+ 'X' => 1,
+ 'Z' => 1,
+ 'E' => 1,
+);
+
+# stolen from HTML::Entities
+my %ENTITIES = (
+ # Some normal chars that have special meaning in SGML context
+ amp => '&', # ampersand
+'gt' => '>', # greater than
+'lt' => '<', # less than
+ quot => '"', # double quote
+
+ # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML
+ AElig => 'Æ', # capital AE diphthong (ligature)
+ Aacute => 'Á', # capital A, acute accent
+ Acirc => 'Â', # capital A, circumflex accent
+ Agrave => 'À', # capital A, grave accent
+ Aring => 'Å', # capital A, ring
+ Atilde => 'Ã', # capital A, tilde
+ Auml => 'Ä', # capital A, dieresis or umlaut mark
+ Ccedil => 'Ç', # capital C, cedilla
+ ETH => 'Ð', # capital Eth, Icelandic
+ Eacute => 'É', # capital E, acute accent
+ Ecirc => 'Ê', # capital E, circumflex accent
+ Egrave => 'È', # capital E, grave accent
+ Euml => 'Ë', # capital E, dieresis or umlaut mark
+ Iacute => 'Í', # capital I, acute accent
+ Icirc => 'Î', # capital I, circumflex accent
+ Igrave => 'Ì', # capital I, grave accent
+ Iuml => 'Ï', # capital I, dieresis or umlaut mark
+ Ntilde => 'Ñ', # capital N, tilde
+ Oacute => 'Ó', # capital O, acute accent
+ Ocirc => 'Ô', # capital O, circumflex accent
+ Ograve => 'Ò', # capital O, grave accent
+ Oslash => 'Ø', # capital O, slash
+ Otilde => 'Õ', # capital O, tilde
+ Ouml => 'Ö', # capital O, dieresis or umlaut mark
+ THORN => 'Þ', # capital THORN, Icelandic
+ Uacute => 'Ú', # capital U, acute accent
+ Ucirc => 'Û', # capital U, circumflex accent
+ Ugrave => 'Ù', # capital U, grave accent
+ Uuml => 'Ü', # capital U, dieresis or umlaut mark
+ Yacute => 'Ý', # capital Y, acute accent
+ aacute => 'á', # small a, acute accent
+ acirc => 'â', # small a, circumflex accent
+ aelig => 'æ', # small ae diphthong (ligature)
+ agrave => 'à', # small a, grave accent
+ aring => 'å', # small a, ring
+ atilde => 'ã', # small a, tilde
+ auml => 'ä', # small a, dieresis or umlaut mark
+ ccedil => 'ç', # small c, cedilla
+ eacute => 'é', # small e, acute accent
+ ecirc => 'ê', # small e, circumflex accent
+ egrave => 'è', # small e, grave accent
+ eth => 'ð', # small eth, Icelandic
+ euml => 'ë', # small e, dieresis or umlaut mark
+ iacute => 'í', # small i, acute accent
+ icirc => 'î', # small i, circumflex accent
+ igrave => 'ì', # small i, grave accent
+ iuml => 'ï', # small i, dieresis or umlaut mark
+ ntilde => 'ñ', # small n, tilde
+ oacute => 'ó', # small o, acute accent
+ ocirc => 'ô', # small o, circumflex accent
+ ograve => 'ò', # small o, grave accent
+ oslash => 'ø', # small o, slash
+ otilde => 'õ', # small o, tilde
+ ouml => 'ö', # small o, dieresis or umlaut mark
+ szlig => 'ß', # small sharp s, German (sz ligature)
+ thorn => 'þ', # small thorn, Icelandic
+ uacute => 'ú', # small u, acute accent
+ ucirc => 'û', # small u, circumflex accent
+ ugrave => 'ù', # small u, grave accent
+ uuml => 'ü', # small u, dieresis or umlaut mark
+ yacute => 'ý', # small y, acute accent
+ yuml => 'ÿ', # small y, dieresis or umlaut mark
+
+ # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96)
+ copy => '©', # copyright sign
+ reg => '®', # registered sign
+ nbsp => "\240", # non breaking space
+
+ # Additional ISO-8859/1 entities listed in rfc1866 (section 14)
+ iexcl => '¡',
+ cent => '¢',
+ pound => '£',
+ curren => '¤',
+ yen => '¥',
+ brvbar => '¦',
+ sect => '§',
+ uml => '¨',
+ ordf => 'ª',
+ laquo => '«',
+'not' => '¬', # not is a keyword in perl
+ shy => '­',
+ macr => '¯',
+ deg => '°',
+ plusmn => '±',
+ sup1 => '¹',
+ sup2 => '²',
+ sup3 => '³',
+ acute => '´',
+ micro => 'µ',
+ para => '¶',
+ middot => '·',
+ cedil => '¸',
+ ordm => 'º',
+ raquo => '»',
+ frac14 => '¼',
+ frac12 => '½',
+ frac34 => '¾',
+ iquest => '¿',
+'times' => '×', # times is a keyword in perl
+ divide => '÷',
+
+# some POD special entities
+ verbar => '|',
+ sol => '/'
+);
+
+##---------------------------------------------------------------------------
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub podchecker {
+ my ($infile, $outfile, %options) = @_;
+ local $_;
+
+ ## Set defaults
+ $infile ||= \*STDIN;
+ $outfile ||= \*STDERR;
+
+ ## Now create a pod checker
+ my $checker = new Pod::Checker(%options);
+
+ ## Now check the pod document for errors
+ $checker->parse_from_file($infile, $outfile);
+
+ ## Return the number of errors found
+ return $checker->num_errors();
+}
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+##################################
+
+=over 4
+
+=item C<Pod::Checker-E<gt>new( %options )>
+
+Return a reference to a new Pod::Checker object that inherits from
+Pod::Parser and is used for calling the required methods later. The
+following options are recognized:
+
+C<-warnings =E<gt> num>
+ Print warnings if C<num> is true. The higher the value of C<num>,
+the more warnings are printed. Currently there are only levels 1 and 2.
+
+C<-quiet =E<gt> num>
+ If C<num> is true, do not print any errors/warnings. This is useful
+when Pod::Checker is used to munge POD code into plain text from within
+POD formatters.
+
+=cut
+
+## sub new {
+## my $this = shift;
+## my $class = ref($this) || $this;
+## my %params = @_;
+## my $self = {%params};
+## bless $self, $class;
+## $self->initialize();
+## return $self;
+## }
+
+sub initialize {
+ my $self = shift;
+ ## Initialize number of errors, and setup an error function to
+ ## increment this number and then print to the designated output.
+ $self->{_NUM_ERRORS} = 0;
+ $self->{_NUM_WARNINGS} = 0;
+ $self->{-quiet} ||= 0;
+ # set the error handling subroutine
+ $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror');
+ $self->{_commands} = 0; # total number of POD commands encountered
+ $self->{_list_stack} = []; # stack for nested lists
+ $self->{_have_begin} = ''; # stores =begin
+ $self->{_links} = []; # stack for internal hyperlinks
+ $self->{_nodes} = []; # stack for =head/=item nodes
+ $self->{_index} = []; # text in X<>
+ # print warnings?
+ $self->{-warnings} = 1 unless(defined $self->{-warnings});
+ $self->{_current_head1} = ''; # the current =head1 block
+ $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings});
+}
+
+##################################
+
+=item C<$checker-E<gt>poderror( @args )>
+
+=item C<$checker-E<gt>poderror( {%opts}, @args )>
+
+Internal method for printing errors and warnings. If no options are
+given, simply prints "@_". The following options are recognized and used
+to form the output:
+
+ -msg
+
+A message to print prior to C<@args>.
+
+ -line
+
+The line number the error occurred in.
+
+ -file
+
+The file (name) the error occurred in.
+
+ -severity
+
+The error level, should be 'WARNING' or 'ERROR'.
+
+=cut
+
+# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args )
+sub poderror {
+ my $self = shift;
+ my %opts = (ref $_[0]) ? %{shift()} : ();
+
+ ## Retrieve options
+ chomp( my $msg = ($opts{-msg} || '')."@_" );
+ my $line = (exists $opts{-line}) ? " at line $opts{-line}" : '';
+ my $file = (exists $opts{-file}) ? " in file $opts{-file}" : '';
+ unless (exists $opts{-severity}) {
+ ## See if can find severity in message prefix
+ $opts{-severity} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// );
+ }
+ my $severity = (exists $opts{-severity}) ? "*** $opts{-severity}: " : '';
+
+ ## Increment error count and print message "
+ ++($self->{_NUM_ERRORS})
+ if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR'));
+ ++($self->{_NUM_WARNINGS})
+ if(!%opts || ($opts{-severity} && $opts{-severity} eq 'WARNING'));
+ unless($self->{-quiet}) {
+ my $out_fh = $self->output_handle() || \*STDERR;
+ print $out_fh ($severity, $msg, $line, $file, "\n")
+ if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING');
+ }
+}
+
+##################################
+
+=item C<$checker-E<gt>num_errors()>
+
+Set (if argument specified) and retrieve the number of errors found.
+
+=cut
+
+sub num_errors {
+ return (@_ > 1) ? ($_[0]->{_NUM_ERRORS} = $_[1]) : $_[0]->{_NUM_ERRORS};
+}
+
+##################################
+
+=item C<$checker-E<gt>num_warnings()>
+
+Set (if argument specified) and retrieve the number of warnings found.
+
+=cut
+
+sub num_warnings {
+ return (@_ > 1) ? ($_[0]->{_NUM_WARNINGS} = $_[1]) : $_[0]->{_NUM_WARNINGS};
+}
+
+##################################
+
+=item C<$checker-E<gt>name()>
+
+Set (if argument specified) and retrieve the canonical name of POD as
+found in the C<=head1 NAME> section.
+
+=cut
+
+sub name {
+ return (@_ > 1 && $_[1]) ?
+ ($_[0]->{-name} = $_[1]) : $_[0]->{-name};
+}
+
+##################################
+
+=item C<$checker-E<gt>node()>
+
+Add (if argument specified) and retrieve the nodes (as defined by C<=headX>
+and C<=item>) of the current POD. The nodes are returned in the order of
+their occurrence. They consist of plain text, each piece of whitespace is
+collapsed to a single blank.
+
+=cut
+
+sub node {
+ my ($self,$text) = @_;
+ if(defined $text) {
+ $text =~ s/\s+$//s; # strip trailing whitespace
+ $text =~ s/\s+/ /gs; # collapse whitespace
+ # add node, order important!
+ push(@{$self->{_nodes}}, $text);
+ # keep also a uniqueness counter
+ $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
+ return $text;
+ }
+ @{$self->{_nodes}};
+}
+
+##################################
+
+=item C<$checker-E<gt>idx()>
+
+Add (if argument specified) and retrieve the index entries (as defined by
+C<XE<lt>E<gt>>) of the current POD. They consist of plain text, each piece
+of whitespace is collapsed to a single blank.
+
+=cut
+
+# set/return index entries of current POD
+sub idx {
+ my ($self,$text) = @_;
+ if(defined $text) {
+ $text =~ s/\s+$//s; # strip trailing whitespace
+ $text =~ s/\s+/ /gs; # collapse whitespace
+ # add node, order important!
+ push(@{$self->{_index}}, $text);
+ # keep also a uniqueness counter
+ $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s);
+ return $text;
+ }
+ @{$self->{_index}};
+}
+
+##################################
+
+=item C<$checker-E<gt>hyperlink()>
+
+Add (if argument specified) and retrieve the hyperlinks (as defined by
+C<LE<lt>E<gt>>) of the current POD. They consist of a 2-item array: line
+number and C<Pod::Hyperlink> object.
+
+=back
+
+=cut
+
+# set/return hyperlinks of the current POD
+sub hyperlink {
+ my $self = shift;
+ if($_[0]) {
+ push(@{$self->{_links}}, $_[0]);
+ return $_[0];
+ }
+ @{$self->{_links}};
+}
+
+## overrides for Pod::Parser
+
+sub end_pod {
+ ## Do some final checks and
+ ## print the number of errors found
+ my $self = shift;
+ my $infile = $self->input_file();
+
+ if(@{$self->{_list_stack}}) {
+ my $list;
+ while(($list = $self->_close_list('EOF',$infile)) &&
+ $list->indent() ne 'auto') {
+ $self->poderror({ -line => 'EOF', -file => $infile,
+ -severity => 'ERROR', -msg => '=over on line ' .
+ $list->start() . ' without closing =back' });
+ }
+ }
+
+ # check validity of document internal hyperlinks
+ # first build the node names from the paragraph text
+ my %nodes;
+ foreach($self->node()) {
+ $nodes{$_} = 1;
+ if(/^(\S+)\s+\S/) {
+ # we have more than one word. Use the first as a node, too.
+ # This is used heavily in perlfunc.pod
+ $nodes{$1} ||= 2; # derived node
+ }
+ }
+ foreach($self->idx()) {
+ $nodes{$_} = 3; # index node
+ }
+ foreach($self->hyperlink()) {
+ my ($line,$link) = @$_;
+ # _TODO_ what if there is a link to the page itself by the name,
+ # e.g. in Tk::Pod : L<Tk::Pod/"DESCRIPTION">
+ if($link->node() && !$link->page() && $link->type() ne 'hyperlink') {
+ my $node = $self->_check_ptree($self->parse_text($link->node(),
+ $line), $line, $infile, 'L');
+ if($node && !$nodes{$node}) {
+ $self->poderror({ -line => $line || '', -file => $infile,
+ -severity => 'ERROR',
+ -msg => "unresolved internal link '$node'"});
+ }
+ }
+ }
+
+ # check the internal nodes for uniqueness. This pertains to
+ # =headX, =item and X<...>
+ if($self->{-warnings} && $self->{-warnings}>1) {
+ foreach(grep($self->{_unique_nodes}->{$_} > 1,
+ keys %{$self->{_unique_nodes}})) {
+ $self->poderror({ -line => '-', -file => $infile,
+ -severity => 'WARNING',
+ -msg => "multiple occurrence of link target '$_'"});
+ }
+ }
+
+ # no POD found here
+ $self->num_errors(-1) if($self->{_commands} == 0);
+}
+
+# check a POD command directive
+sub command {
+ my ($self, $cmd, $paragraph, $line_num, $pod_para) = @_;
+ my ($file, $line) = $pod_para->file_line;
+ ## Check the command syntax
+ my $arg; # this will hold the command argument
+ if (! $VALID_COMMANDS{$cmd}) {
+ $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR',
+ -msg => "Unknown command '$cmd'" });
+ }
+ else { # found a valid command
+ $self->{_commands}++; # delete this line if below is enabled again
+
+ ##### following check disabled due to strong request
+ #if(!$self->{_commands}++ && $cmd !~ /^head/) {
+ # $self->poderror({ -line => $line, -file => $file,
+ # -severity => 'WARNING',
+ # -msg => "file does not start with =head" });
+ #}
+
+ # check syntax of particular command
+ if($cmd eq 'over') {
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ my $indent = 4; # default
+ if($arg && $arg =~ /^\s*(\d+)\s*$/) {
+ $indent = $1;
+ }
+ # start a new list
+ $self->_open_list($indent,$line,$file);
+ }
+ elsif($cmd eq 'item') {
+ # are we in a list?
+ unless(@{$self->{_list_stack}}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => '=item without previous =over' });
+ # auto-open in case we encounter many more
+ $self->_open_list('auto',$line,$file);
+ }
+ my $list = $self->{_list_stack}->[0];
+ # check whether the previous item had some contents
+ if(defined $self->{_list_item_contents} &&
+ $self->{_list_item_contents} == 0) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'previous =item has no contents' });
+ }
+ if($list->{_has_par}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'preceding non-item paragraph(s)' });
+ delete $list->{_has_par};
+ }
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line, $file);
+ if($arg && $arg =~ /(\S+)/) {
+ $arg =~ s/[\s\n]+$//;
+ my $type;
+ if($arg =~ /^[*]\s*(\S*.*)/) {
+ $type = 'bullet';
+ $self->{_list_item_contents} = $1 ? 1 : 0;
+ $arg = $1;
+ }
+ elsif($arg =~ /^\d+\.?\s+(\S*)/) {
+ $type = 'number';
+ $self->{_list_item_contents} = $1 ? 1 : 0;
+ $arg = $1;
+ }
+ else {
+ $type = 'definition';
+ $self->{_list_item_contents} = 1;
+ }
+ my $first = $list->type();
+ if($first && $first ne $type) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "=item type mismatch ('$first' vs. '$type')"});
+ }
+ else { # first item
+ $list->type($type);
+ }
+ }
+ else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'No argument for =item' });
+ $arg = ' '; # empty
+ $self->{_list_item_contents} = 0;
+ }
+ # add this item
+ $list->item($arg);
+ # remember this node
+ $self->node($arg);
+ }
+ elsif($cmd eq 'back') {
+ # check if we have an open list
+ unless(@{$self->{_list_stack}}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => '=back without previous =over' });
+ }
+ else {
+ # check for spurious characters
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ if($arg && $arg =~ /\S/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'Spurious character(s) after =back' });
+ }
+ # close list
+ my $list = $self->_close_list($line,$file);
+ # check for empty lists
+ if(!$list->item() && $self->{-warnings}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'No items in =over (at line ' .
+ $list->start() . ') / =back list'});
+ }
+ }
+ }
+ elsif($cmd =~ /^head(\d+)/) {
+ my $hnum = $1;
+ $self->{"_have_head_$hnum"}++; # count head types
+ if($hnum > 1 && !$self->{'_have_head_'.($hnum -1)}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "=head$hnum without preceding higher level"});
+ }
+ # check whether the previous =head section had some contents
+ if(defined $self->{_commands_in_head} &&
+ $self->{_commands_in_head} == 0 &&
+ defined $self->{_last_head} &&
+ $self->{_last_head} >= $hnum) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'empty section in previous paragraph'});
+ }
+ $self->{_commands_in_head} = -1;
+ $self->{_last_head} = $hnum;
+ # check if there is an open list
+ if(@{$self->{_list_stack}}) {
+ my $list;
+ while(($list = $self->_close_list($line,$file)) &&
+ $list->indent() ne 'auto') {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => '=over on line '. $list->start() .
+ " without closing =back (at $cmd)" });
+ }
+ }
+ # remember this node
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ $arg =~ s/[\s\n]+$//s;
+ $self->node($arg);
+ unless(length($arg)) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "empty =$cmd"});
+ }
+ if($cmd eq 'head1') {
+ $self->{_current_head1} = $arg;
+ } else {
+ $self->{_current_head1} = '';
+ }
+ }
+ elsif($cmd eq 'begin') {
+ if($self->{_have_begin}) {
+ # already have a begin
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => q{Nested =begin's (first at line } .
+ $self->{_have_begin} . ')'});
+ }
+ else {
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ unless($arg && $arg =~ /(\S+)/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'No argument for =begin'});
+ }
+ # remember the =begin
+ $self->{_have_begin} = "$line:$1";
+ }
+ }
+ elsif($cmd eq 'end') {
+ if($self->{_have_begin}) {
+ # close the existing =begin
+ $self->{_have_begin} = '';
+ # check for spurious characters
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ # the closing argument is optional
+ #if($arg && $arg =~ /\S/) {
+ # $self->poderror({ -line => $line, -file => $file,
+ # -severity => 'WARNING',
+ # -msg => "Spurious character(s) after =end" });
+ #}
+ }
+ else {
+ # don't have a matching =begin
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => '=end without =begin' });
+ }
+ }
+ elsif($cmd eq 'for') {
+ unless($paragraph =~ /\s*(\S+)\s*/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => '=for without formatter specification' });
+ }
+ $arg = ''; # do not expand paragraph below
+ }
+ elsif($cmd =~ /^(pod|cut)$/) {
+ # check for argument
+ $arg = $self->interpolate_and_check($paragraph, $line,$file);
+ if($arg && $arg =~ /(\S+)/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => "Spurious text after =$cmd"});
+ }
+ }
+ $self->{_commands_in_head}++;
+ ## Check the interior sequences in the command-text
+ $self->interpolate_and_check($paragraph, $line,$file)
+ unless(defined $arg);
+ }
+}
+
+sub _open_list
+{
+ my ($self,$indent,$line,$file) = @_;
+ my $list = Pod::List->new(
+ -indent => $indent,
+ -start => $line,
+ -file => $file);
+ unshift(@{$self->{_list_stack}}, $list);
+ undef $self->{_list_item_contents};
+ $list;
+}
+
+sub _close_list
+{
+ my ($self,$line,$file) = @_;
+ my $list = shift(@{$self->{_list_stack}});
+ if(defined $self->{_list_item_contents} &&
+ $self->{_list_item_contents} == 0) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'previous =item has no contents' });
+ }
+ undef $self->{_list_item_contents};
+ $list;
+}
+
+# process a block of some text
+sub interpolate_and_check {
+ my ($self, $paragraph, $line, $file) = @_;
+ ## Check the interior sequences in the command-text
+ # and return the text
+ $self->_check_ptree(
+ $self->parse_text($paragraph,$line), $line, $file, '');
+}
+
+sub _check_ptree {
+ my ($self,$ptree,$line,$file,$nestlist) = @_;
+ local($_);
+ my $text = '';
+ # process each node in the parse tree
+ foreach(@$ptree) {
+ # regular text chunk
+ unless(ref) {
+ # count the unescaped angle brackets
+ # complain only when warning level is greater than 1
+ if($self->{-warnings} && $self->{-warnings}>1) {
+ my $count;
+ if($count = tr/<>/<>/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "$count unescaped <> in paragraph" });
+ }
+ }
+ $text .= $_;
+ next;
+ }
+ # have an interior sequence
+ my $cmd = $_->cmd_name();
+ my $contents = $_->parse_tree();
+ ($file,$line) = $_->file_line();
+ # check for valid tag
+ if (! $VALID_SEQUENCES{$cmd}) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => qq(Unknown interior-sequence '$cmd')});
+ # expand it anyway
+ $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+ next;
+ }
+ if($nestlist =~ /$cmd/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => "nested commands $cmd<...$cmd<...>...>"});
+ # _TODO_ should we add the contents anyway?
+ # expand it anyway, see below
+ }
+ if($cmd eq 'E') {
+ # preserve entities
+ if(@$contents > 1 || ref $$contents[0] || $$contents[0] !~ /^\w+$/) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'garbled entity ' . $_->raw_text()});
+ next;
+ }
+ my $ent = $$contents[0];
+ my $val;
+ if($ent =~ /^0x[0-9a-f]+$/i) {
+ # hexadec entity
+ $val = hex($ent);
+ }
+ elsif($ent =~ /^0\d+$/) {
+ # octal
+ $val = oct($ent);
+ }
+ elsif($ent =~ /^\d+$/) {
+ # numeric entity
+ $val = $ent;
+ }
+ if(defined $val) {
+ if($val>0 && $val<256) {
+ $text .= chr($val);
+ }
+ else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'Entity number out of range ' . $_->raw_text()});
+ }
+ }
+ elsif($ENTITIES{$ent}) {
+ # known ISO entity
+ $text .= $ENTITIES{$ent};
+ }
+ else {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'Unknown entity ' . $_->raw_text()});
+ $text .= "E<$ent>";
+ }
+ }
+ elsif($cmd eq 'L') {
+ # try to parse the hyperlink
+ my $link = Pod::Hyperlink->new($contents->raw_text());
+ unless(defined $link) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'malformed link ' . $_->raw_text() ." : $@"});
+ next;
+ }
+ $link->line($line); # remember line
+ if($self->{-warnings}) {
+ foreach my $w ($link->warning()) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => $w });
+ }
+ }
+ # check the link text
+ $text .= $self->_check_ptree($self->parse_text($link->text(),
+ $line), $line, $file, "$nestlist$cmd");
+ # remember link
+ $self->hyperlink([$line,$link]);
+ }
+ elsif($cmd =~ /[BCFIS]/) {
+ # add the guts
+ $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+ }
+ elsif($cmd eq 'Z') {
+ if(length($contents->raw_text())) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'Nonempty Z<>'});
+ }
+ }
+ elsif($cmd eq 'X') {
+ my $idx = $self->_check_ptree($contents, $line, $file, "$nestlist$cmd");
+ if($idx =~ /^\s*$/s) {
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'ERROR',
+ -msg => 'Empty X<>'});
+ }
+ else {
+ # remember this node
+ $self->idx($idx);
+ }
+ }
+ else {
+ # not reached
+ croak 'internal error';
+ }
+ }
+ $text;
+}
+
+# process a block of verbatim text
+sub verbatim {
+ ## Nothing particular to check
+ my ($self, $paragraph, $line_num, $pod_para) = @_;
+
+ $self->_preproc_par($paragraph);
+
+ if($self->{_current_head1} eq 'NAME') {
+ my ($file, $line) = $pod_para->file_line;
+ $self->poderror({ -line => $line, -file => $file,
+ -severity => 'WARNING',
+ -msg => 'Verbatim paragraph in NAME section' });
+ }
+}
+
+# process a block of regular text
+sub textblock {
+ my ($self, $paragraph, $line_num, $pod_para) = @_;
+ my ($file, $line) = $pod_para->file_line;
+
+ $self->_preproc_par($paragraph);
+
+ # skip this paragraph if in a =begin block
+ unless($self->{_have_begin}) {
+ my $block = $self->interpolate_and_check($paragraph, $line,$file);
+ if($self->{_current_head1} eq 'NAME') {
+ if($block =~ /^\s*(\S+?)\s*[,-]/) {
+ # this is the canonical name
+ $self->{-name} = $1 unless(defined $self->{-name});
+ }
+ }
+ }
+}
+
+sub _preproc_par
+{
+ my $self = shift;
+ $_[0] =~ s/[\s\n]+$//;
+ if($_[0]) {
+ $self->{_commands_in_head}++;
+ $self->{_list_item_contents}++ if(defined $self->{_list_item_contents});
+ if(@{$self->{_list_stack}} && !$self->{_list_stack}->[0]->item()) {
+ $self->{_list_stack}->[0]->{_has_par} = 1;
+ }
+ }
+}
+
+1;
+
+__END__
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt> (initial version),
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Escapes.pm b/Master/tlpkg/tlperl/lib/Pod/Escapes.pm
new file mode 100644
index 00000000000..de4d75a7b83
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Escapes.pm
@@ -0,0 +1,721 @@
+
+require 5;
+# The documentation is at the end.
+# Time-stamp: "2004-05-07 15:31:25 ADT"
+package Pod::Escapes;
+require Exporter;
+@ISA = ('Exporter');
+$VERSION = '1.04';
+@EXPORT_OK = qw(
+ %Code2USASCII
+ %Name2character
+ %Name2character_number
+ %Latin1Code_to_fallback
+ %Latin1Char_to_fallback
+ e2char
+ e2charnum
+);
+%EXPORT_TAGS = ('ALL' => \@EXPORT_OK);
+
+#==========================================================================
+
+use strict;
+use vars qw(
+ %Code2USASCII
+ %Name2character
+ %Name2character_number
+ %Latin1Code_to_fallback
+ %Latin1Char_to_fallback
+ $FAR_CHAR
+ $FAR_CHAR_NUMBER
+ $NOT_ASCII
+);
+
+$FAR_CHAR = "?" unless defined $FAR_CHAR;
+$FAR_CHAR_NUMBER = ord($FAR_CHAR) unless defined $FAR_CHAR_NUMBER;
+
+$NOT_ASCII = 'A' ne chr(65) unless defined $NOT_ASCII;
+
+#--------------------------------------------------------------------------
+sub e2char {
+ my $in = $_[0];
+ return undef unless defined $in and length $in;
+
+ # Convert to decimal:
+ if($in =~ m/^(0[0-7]*)$/s ) {
+ $in = oct $in;
+ } elsif($in =~ m/^0?x([0-9a-fA-F]+)$/s ) {
+ $in = hex $1;
+ } # else it's decimal, or named
+
+ if($NOT_ASCII) {
+ # We're in bizarro world of not-ASCII!
+ # Cope with US-ASCII codes, use fallbacks for Latin-1, or use FAR_CHAR.
+ unless($in =~ m/^\d+$/s) {
+ # It's a named character reference. Get its numeric Unicode value.
+ $in = $Name2character{$in};
+ return undef unless defined $in; # (if there's no such name)
+ $in = ord $in; # (All ents must be one character long.)
+ # ...So $in holds the char's US-ASCII numeric value, which we'll
+ # now go get the local equivalent for.
+ }
+
+ # It's numeric, whether by origin or by mutation from a known name
+ return $Code2USASCII{$in} # so "65" => "A" everywhere
+ || $Latin1Code_to_fallback{$in} # Fallback.
+ || $FAR_CHAR; # Fall further back
+ }
+
+ # Normal handling:
+ if($in =~ m/^\d+$/s) {
+ if($] < 5.007 and $in > 255) { # can't be trusted with Unicode
+ return $FAR_CHAR;
+ } else {
+ return chr($in);
+ }
+ } else {
+ return $Name2character{$in}; # returns undef if unknown
+ }
+}
+
+#--------------------------------------------------------------------------
+sub e2charnum {
+ my $in = $_[0];
+ return undef unless defined $in and length $in;
+
+ # Convert to decimal:
+ if($in =~ m/^(0[0-7]*)$/s ) {
+ $in = oct $in;
+ } elsif($in =~ m/^0?x([0-9a-fA-F]+)$/s ) {
+ $in = hex $1;
+ } # else it's decimal, or named
+
+ if($in =~ m/^\d+$/s) {
+ return 0 + $in;
+ } else {
+ return $Name2character_number{$in}; # returns undef if unknown
+ }
+}
+
+#--------------------------------------------------------------------------
+
+%Name2character_number = (
+ # General XML/XHTML:
+ 'lt' => 60,
+ 'gt' => 62,
+ 'quot' => 34,
+ 'amp' => 38,
+ 'apos' => 39,
+
+ # POD-specific:
+ 'sol' => 47,
+ 'verbar' => 124,
+
+ 'lchevron' => 171, # legacy for laquo
+ 'rchevron' => 187, # legacy for raquo
+
+ # Remember, grave looks like \ (as in virtu\)
+ # acute looks like / (as in re/sume/)
+ # circumflex looks like ^ (as in papier ma^che/)
+ # umlaut/dieresis looks like " (as in nai"ve, Chloe")
+
+ # From the XHTML 1 .ent files:
+ 'nbsp' , 160,
+ 'iexcl' , 161,
+ 'cent' , 162,
+ 'pound' , 163,
+ 'curren' , 164,
+ 'yen' , 165,
+ 'brvbar' , 166,
+ 'sect' , 167,
+ 'uml' , 168,
+ 'copy' , 169,
+ 'ordf' , 170,
+ 'laquo' , 171,
+ 'not' , 172,
+ 'shy' , 173,
+ 'reg' , 174,
+ 'macr' , 175,
+ 'deg' , 176,
+ 'plusmn' , 177,
+ 'sup2' , 178,
+ 'sup3' , 179,
+ 'acute' , 180,
+ 'micro' , 181,
+ 'para' , 182,
+ 'middot' , 183,
+ 'cedil' , 184,
+ 'sup1' , 185,
+ 'ordm' , 186,
+ 'raquo' , 187,
+ 'frac14' , 188,
+ 'frac12' , 189,
+ 'frac34' , 190,
+ 'iquest' , 191,
+ 'Agrave' , 192,
+ 'Aacute' , 193,
+ 'Acirc' , 194,
+ 'Atilde' , 195,
+ 'Auml' , 196,
+ 'Aring' , 197,
+ 'AElig' , 198,
+ 'Ccedil' , 199,
+ 'Egrave' , 200,
+ 'Eacute' , 201,
+ 'Ecirc' , 202,
+ 'Euml' , 203,
+ 'Igrave' , 204,
+ 'Iacute' , 205,
+ 'Icirc' , 206,
+ 'Iuml' , 207,
+ 'ETH' , 208,
+ 'Ntilde' , 209,
+ 'Ograve' , 210,
+ 'Oacute' , 211,
+ 'Ocirc' , 212,
+ 'Otilde' , 213,
+ 'Ouml' , 214,
+ 'times' , 215,
+ 'Oslash' , 216,
+ 'Ugrave' , 217,
+ 'Uacute' , 218,
+ 'Ucirc' , 219,
+ 'Uuml' , 220,
+ 'Yacute' , 221,
+ 'THORN' , 222,
+ 'szlig' , 223,
+ 'agrave' , 224,
+ 'aacute' , 225,
+ 'acirc' , 226,
+ 'atilde' , 227,
+ 'auml' , 228,
+ 'aring' , 229,
+ 'aelig' , 230,
+ 'ccedil' , 231,
+ 'egrave' , 232,
+ 'eacute' , 233,
+ 'ecirc' , 234,
+ 'euml' , 235,
+ 'igrave' , 236,
+ 'iacute' , 237,
+ 'icirc' , 238,
+ 'iuml' , 239,
+ 'eth' , 240,
+ 'ntilde' , 241,
+ 'ograve' , 242,
+ 'oacute' , 243,
+ 'ocirc' , 244,
+ 'otilde' , 245,
+ 'ouml' , 246,
+ 'divide' , 247,
+ 'oslash' , 248,
+ 'ugrave' , 249,
+ 'uacute' , 250,
+ 'ucirc' , 251,
+ 'uuml' , 252,
+ 'yacute' , 253,
+ 'thorn' , 254,
+ 'yuml' , 255,
+
+ 'fnof' , 402,
+ 'Alpha' , 913,
+ 'Beta' , 914,
+ 'Gamma' , 915,
+ 'Delta' , 916,
+ 'Epsilon' , 917,
+ 'Zeta' , 918,
+ 'Eta' , 919,
+ 'Theta' , 920,
+ 'Iota' , 921,
+ 'Kappa' , 922,
+ 'Lambda' , 923,
+ 'Mu' , 924,
+ 'Nu' , 925,
+ 'Xi' , 926,
+ 'Omicron' , 927,
+ 'Pi' , 928,
+ 'Rho' , 929,
+ 'Sigma' , 931,
+ 'Tau' , 932,
+ 'Upsilon' , 933,
+ 'Phi' , 934,
+ 'Chi' , 935,
+ 'Psi' , 936,
+ 'Omega' , 937,
+ 'alpha' , 945,
+ 'beta' , 946,
+ 'gamma' , 947,
+ 'delta' , 948,
+ 'epsilon' , 949,
+ 'zeta' , 950,
+ 'eta' , 951,
+ 'theta' , 952,
+ 'iota' , 953,
+ 'kappa' , 954,
+ 'lambda' , 955,
+ 'mu' , 956,
+ 'nu' , 957,
+ 'xi' , 958,
+ 'omicron' , 959,
+ 'pi' , 960,
+ 'rho' , 961,
+ 'sigmaf' , 962,
+ 'sigma' , 963,
+ 'tau' , 964,
+ 'upsilon' , 965,
+ 'phi' , 966,
+ 'chi' , 967,
+ 'psi' , 968,
+ 'omega' , 969,
+ 'thetasym' , 977,
+ 'upsih' , 978,
+ 'piv' , 982,
+ 'bull' , 8226,
+ 'hellip' , 8230,
+ 'prime' , 8242,
+ 'Prime' , 8243,
+ 'oline' , 8254,
+ 'frasl' , 8260,
+ 'weierp' , 8472,
+ 'image' , 8465,
+ 'real' , 8476,
+ 'trade' , 8482,
+ 'alefsym' , 8501,
+ 'larr' , 8592,
+ 'uarr' , 8593,
+ 'rarr' , 8594,
+ 'darr' , 8595,
+ 'harr' , 8596,
+ 'crarr' , 8629,
+ 'lArr' , 8656,
+ 'uArr' , 8657,
+ 'rArr' , 8658,
+ 'dArr' , 8659,
+ 'hArr' , 8660,
+ 'forall' , 8704,
+ 'part' , 8706,
+ 'exist' , 8707,
+ 'empty' , 8709,
+ 'nabla' , 8711,
+ 'isin' , 8712,
+ 'notin' , 8713,
+ 'ni' , 8715,
+ 'prod' , 8719,
+ 'sum' , 8721,
+ 'minus' , 8722,
+ 'lowast' , 8727,
+ 'radic' , 8730,
+ 'prop' , 8733,
+ 'infin' , 8734,
+ 'ang' , 8736,
+ 'and' , 8743,
+ 'or' , 8744,
+ 'cap' , 8745,
+ 'cup' , 8746,
+ 'int' , 8747,
+ 'there4' , 8756,
+ 'sim' , 8764,
+ 'cong' , 8773,
+ 'asymp' , 8776,
+ 'ne' , 8800,
+ 'equiv' , 8801,
+ 'le' , 8804,
+ 'ge' , 8805,
+ 'sub' , 8834,
+ 'sup' , 8835,
+ 'nsub' , 8836,
+ 'sube' , 8838,
+ 'supe' , 8839,
+ 'oplus' , 8853,
+ 'otimes' , 8855,
+ 'perp' , 8869,
+ 'sdot' , 8901,
+ 'lceil' , 8968,
+ 'rceil' , 8969,
+ 'lfloor' , 8970,
+ 'rfloor' , 8971,
+ 'lang' , 9001,
+ 'rang' , 9002,
+ 'loz' , 9674,
+ 'spades' , 9824,
+ 'clubs' , 9827,
+ 'hearts' , 9829,
+ 'diams' , 9830,
+ 'OElig' , 338,
+ 'oelig' , 339,
+ 'Scaron' , 352,
+ 'scaron' , 353,
+ 'Yuml' , 376,
+ 'circ' , 710,
+ 'tilde' , 732,
+ 'ensp' , 8194,
+ 'emsp' , 8195,
+ 'thinsp' , 8201,
+ 'zwnj' , 8204,
+ 'zwj' , 8205,
+ 'lrm' , 8206,
+ 'rlm' , 8207,
+ 'ndash' , 8211,
+ 'mdash' , 8212,
+ 'lsquo' , 8216,
+ 'rsquo' , 8217,
+ 'sbquo' , 8218,
+ 'ldquo' , 8220,
+ 'rdquo' , 8221,
+ 'bdquo' , 8222,
+ 'dagger' , 8224,
+ 'Dagger' , 8225,
+ 'permil' , 8240,
+ 'lsaquo' , 8249,
+ 'rsaquo' , 8250,
+ 'euro' , 8364,
+);
+
+
+# Fill out %Name2character...
+{
+ %Name2character = ();
+ my($name, $number);
+ while( ($name, $number) = each %Name2character_number) {
+ if($] < 5.007 and $number > 255) {
+ $Name2character{$name} = $FAR_CHAR;
+ # substitute for Unicode characters, for perls
+ # that can't reliable handle them
+ } else {
+ $Name2character{$name} = chr $number;
+ # normal case
+ }
+ }
+ # So they resolve 'right' even in EBCDIC-land
+ $Name2character{'lt' } = '<';
+ $Name2character{'gt' } = '>';
+ $Name2character{'quot'} = '"';
+ $Name2character{'amp' } = '&';
+ $Name2character{'apos'} = "'";
+ $Name2character{'sol' } = '/';
+ $Name2character{'verbar'} = '|';
+}
+
+#--------------------------------------------------------------------------
+
+%Code2USASCII = (
+# mostly generated by
+# perl -e "printf qq{ \x25 3s, '\x25s',\n}, $_, chr($_) foreach (32 .. 126)"
+ 32, ' ',
+ 33, '!',
+ 34, '"',
+ 35, '#',
+ 36, '$',
+ 37, '%',
+ 38, '&',
+ 39, "'", #!
+ 40, '(',
+ 41, ')',
+ 42, '*',
+ 43, '+',
+ 44, ',',
+ 45, '-',
+ 46, '.',
+ 47, '/',
+ 48, '0',
+ 49, '1',
+ 50, '2',
+ 51, '3',
+ 52, '4',
+ 53, '5',
+ 54, '6',
+ 55, '7',
+ 56, '8',
+ 57, '9',
+ 58, ':',
+ 59, ';',
+ 60, '<',
+ 61, '=',
+ 62, '>',
+ 63, '?',
+ 64, '@',
+ 65, 'A',
+ 66, 'B',
+ 67, 'C',
+ 68, 'D',
+ 69, 'E',
+ 70, 'F',
+ 71, 'G',
+ 72, 'H',
+ 73, 'I',
+ 74, 'J',
+ 75, 'K',
+ 76, 'L',
+ 77, 'M',
+ 78, 'N',
+ 79, 'O',
+ 80, 'P',
+ 81, 'Q',
+ 82, 'R',
+ 83, 'S',
+ 84, 'T',
+ 85, 'U',
+ 86, 'V',
+ 87, 'W',
+ 88, 'X',
+ 89, 'Y',
+ 90, 'Z',
+ 91, '[',
+ 92, "\\", #!
+ 93, ']',
+ 94, '^',
+ 95, '_',
+ 96, '`',
+ 97, 'a',
+ 98, 'b',
+ 99, 'c',
+ 100, 'd',
+ 101, 'e',
+ 102, 'f',
+ 103, 'g',
+ 104, 'h',
+ 105, 'i',
+ 106, 'j',
+ 107, 'k',
+ 108, 'l',
+ 109, 'm',
+ 110, 'n',
+ 111, 'o',
+ 112, 'p',
+ 113, 'q',
+ 114, 'r',
+ 115, 's',
+ 116, 't',
+ 117, 'u',
+ 118, 'v',
+ 119, 'w',
+ 120, 'x',
+ 121, 'y',
+ 122, 'z',
+ 123, '{',
+ 124, '|',
+ 125, '}',
+ 126, '~',
+);
+
+#--------------------------------------------------------------------------
+
+%Latin1Code_to_fallback = ();
+@Latin1Code_to_fallback{0xA0 .. 0xFF} = (
+# Copied from Text/Unidecode/x00.pm:
+
+' ', qq{!}, qq{C/}, 'PS', qq{\$?}, qq{Y=}, qq{|}, 'SS', qq{"}, qq{(c)}, 'a', qq{<<}, qq{!}, "", qq{(r)}, qq{-},
+'deg', qq{+-}, '2', '3', qq{'}, 'u', 'P', qq{*}, qq{,}, '1', 'o', qq{>>}, qq{1/4}, qq{1/2}, qq{3/4}, qq{?},
+'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I',
+'D', 'N', 'O', 'O', 'O', 'O', 'O', 'x', 'O', 'U', 'U', 'U', 'U', 'U', 'Th', 'ss',
+'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
+'d', 'n', 'o', 'o', 'o', 'o', 'o', qq{/}, 'o', 'u', 'u', 'u', 'u', 'y', 'th', 'y',
+
+);
+
+{
+ # Now stuff %Latin1Char_to_fallback:
+ %Latin1Char_to_fallback = ();
+ my($k,$v);
+ while( ($k,$v) = each %Latin1Code_to_fallback) {
+ $Latin1Char_to_fallback{chr $k} = $v;
+ #print chr($k), ' => ', $v, "\n";
+ }
+}
+
+#--------------------------------------------------------------------------
+1;
+__END__
+
+=head1 NAME
+
+Pod::Escapes -- for resolving Pod EE<lt>...E<gt> sequences
+
+=head1 SYNOPSIS
+
+ use Pod::Escapes qw(e2char);
+ ...la la la, parsing POD, la la la...
+ $text = e2char($e_node->label);
+ unless(defined $text) {
+ print "Unknown E sequence \"", $e_node->label, "\"!";
+ }
+ ...else print/interpolate $text...
+
+=head1 DESCRIPTION
+
+This module provides things that are useful in decoding
+Pod EE<lt>...E<gt> sequences. Presumably, it should be used
+only by Pod parsers and/or formatters.
+
+By default, Pod::Escapes exports none of its symbols. But
+you can request any of them to be exported.
+Either request them individually, as with
+C<use Pod::Escapes qw(symbolname symbolname2...);>,
+or you can do C<use Pod::Escapes qw(:ALL);> to get all
+exportable symbols.
+
+=head1 GOODIES
+
+=over
+
+=item e2char($e_content)
+
+Given a name or number that could appear in a
+C<EE<lt>name_or_numE<gt>> sequence, this returns the string that
+it stands for. For example, C<e2char('sol')>, C<e2char('47')>,
+C<e2char('0x2F')>, and C<e2char('057')> all return "/",
+because C<EE<lt>solE<gt>>, C<EE<lt>47E<gt>>, C<EE<lt>0x2fE<gt>>,
+and C<EE<lt>057E<gt>>, all mean "/". If
+the name has no known value (as with a name of "qacute") or is
+syntactally invalid (as with a name of "1/4"), this returns undef.
+
+=item e2charnum($e_content)
+
+Given a name or number that could appear in a
+C<EE<lt>name_or_numE<gt>> sequence, this returns the number of
+the Unicode character that this stands for. For example,
+C<e2char('sol')>, C<e2char('47')>,
+C<e2char('0x2F')>, and C<e2char('057')> all return 47,
+because C<EE<lt>solE<gt>>, C<EE<lt>47E<gt>>, C<EE<lt>0x2fE<gt>>,
+and C<EE<lt>057E<gt>>, all mean "/", whose Unicode number is 47. If
+the name has no known value (as with a name of "qacute") or is
+syntactally invalid (as with a name of "1/4"), this returns undef.
+
+=item $Name2character{I<name>}
+
+Maps from names (as in C<EE<lt>I<name>E<gt>>) like "eacute" or "sol"
+to the string that each stands for. Note that this does not
+include numerics (like "64" or "x981c"). Under old Perl versions
+(before 5.7) you get a "?" in place of characters whose Unicode
+value is over 255.
+
+=item $Name2character_number{I<name>}
+
+Maps from names (as in C<EE<lt>I<name>E<gt>>) like "eacute" or "sol"
+to the Unicode value that each stands for. For example,
+C<$Name2character_number{'eacute'}> is 201, and
+C<$Name2character_number{'eacute'}> is 8364. You get the correct
+Unicode value, regardless of the version of Perl you're using --
+which differs from C<%Name2character>'s behavior under pre-5.7 Perls.
+
+Note that this hash does not
+include numerics (like "64" or "x981c").
+
+=item $Latin1Code_to_fallback{I<integer>}
+
+For numbers in the range 160 (0x00A0) to 255 (0x00FF), this maps
+from the character code for a Latin-1 character (like 233 for
+lowercase e-acute) to the US-ASCII character that best aproximates
+it (like "e"). You may find this useful if you are rendering
+POD in a format that you think deals well only with US-ASCII
+characters.
+
+=item $Latin1Char_to_fallback{I<character>}
+
+Just as above, but maps from characters (like "\xE9",
+lowercase e-acute) to characters (like "e").
+
+=item $Code2USASCII{I<integer>}
+
+This maps from US-ASCII codes (like 32) to the corresponding
+character (like space, for 32). Only characters 32 to 126 are
+defined. This is meant for use by C<e2char($x)> when it senses
+that it's running on a non-ASCII platform (where chr(32) doesn't
+get you a space -- but $Code2USASCII{32} will). It's
+documented here just in case you might find it useful.
+
+=back
+
+=head1 CAVEATS
+
+On Perl versions before 5.7, Unicode characters with a value
+over 255 (like lambda or emdash) can't be conveyed. This
+module does work under such early Perl versions, but in the
+place of each such character, you get a "?". Latin-1
+characters (characters 160-255) are unaffected.
+
+Under EBCDIC platforms, C<e2char($n)> may not always be the
+same as C<chr(e2charnum($n))>, and ditto for
+C<$Name2character{$name}> and
+C<chr($Name2character_number{$name})>.
+
+=head1 SEE ALSO
+
+L<perlpod|perlpod>
+
+L<perlpodspec|perlpodspec>
+
+L<Text::Unidecode|Text::Unidecode>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2001-2004 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+Portions of the data tables in this module are derived from the
+entity declarations in the W3C XHTML specification.
+
+Currently (October 2001), that's these three:
+
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
+ http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
+
+=head1 AUTHOR
+
+Sean M. Burke C<sburke@cpan.org>
+
+=cut
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# What I used for reading the XHTML .ent files:
+
+use strict;
+my(@norms, @good, @bad);
+my $dir = 'c:/sgml/docbook/';
+my %escapes;
+foreach my $file (qw(
+ xhtml-symbol.ent
+ xhtml-lat1.ent
+ xhtml-special.ent
+)) {
+ open(IN, "<$dir$file") or die "can't read-open $dir$file: $!";
+ print "Reading $file...\n";
+ while(<IN>) {
+ if(m/<!ENTITY\s+(\S+)\s+"&#([^;]+);">/) {
+ my($name, $value) = ($1,$2);
+ next if $name eq 'quot' or $name eq 'apos' or $name eq 'gt';
+
+ $value = hex $1 if $value =~ m/^x([a-fA-F0-9]+)$/s;
+ print "ILLEGAL VALUE $value" unless $value =~ m/^\d+$/s;
+ if($value > 255) {
+ push @good , sprintf " %-10s , chr(%s),\n", "'$name'", $value;
+ push @bad , sprintf " %-10s , \$bad,\n", "'$name'", $value;
+ } else {
+ push @norms, sprintf " %-10s , chr(%s),\n", "'$name'", $value;
+ }
+ } elsif(m/<!ENT/) {
+ print "# Skipping $_";
+ }
+
+ }
+ close(IN);
+}
+
+print @norms;
+print "\n ( \$] .= 5.006001 ? (\n";
+print @good;
+print " ) : (\n";
+print @bad;
+print " )\n);\n";
+
+__END__
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Find.pm b/Master/tlpkg/tlperl/lib/Pod/Find.pm
new file mode 100644
index 00000000000..8d1103b6a1f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Find.pm
@@ -0,0 +1,535 @@
+#############################################################################
+# Pod/Find.pm -- finds files containing POD documentation
+#
+# Author: Marek Rouchal <marekr@cpan.org>
+#
+# Copyright (C) 1999-2000 by Marek Rouchal (and borrowing code
+# from Nick Ing-Simmon's PodToHtml). All rights reserved.
+# This file is part of "PodParser". Pod::Find is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Find;
+use strict;
+
+use vars qw($VERSION);
+$VERSION = '1.35'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+use Carp;
+
+BEGIN {
+ if ($] < 5.006) {
+ require Symbol;
+ import Symbol;
+ }
+}
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Find - find POD documents in directory trees
+
+=head1 SYNOPSIS
+
+ use Pod::Find qw(pod_find simplify_name);
+ my %pods = pod_find({ -verbose => 1, -inc => 1 });
+ foreach(keys %pods) {
+ print "found library POD `$pods{$_}' in $_\n";
+ }
+
+ print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n";
+
+ $location = pod_where( { -inc => 1 }, "Pod::Find" );
+
+=head1 DESCRIPTION
+
+B<Pod::Find> provides a set of functions to locate POD files. Note that
+no function is exported by default to avoid pollution of your namespace,
+so be sure to specify them in the B<use> statement if you need them:
+
+ use Pod::Find qw(pod_find);
+
+From this version on the typical SCM (software configuration management)
+files/directories like RCS, CVS, SCCS, .svn are ignored.
+
+=cut
+
+#use diagnostics;
+use Exporter;
+use File::Spec;
+use File::Find;
+use Cwd;
+
+use vars qw(@ISA @EXPORT_OK $VERSION);
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(&pod_find &simplify_name &pod_where &contains_pod);
+
+# package global variables
+my $SIMPLIFY_RX;
+
+=head2 C<pod_find( { %opts } , @directories )>
+
+The function B<pod_find> searches for POD documents in a given set of
+files and/or directories. It returns a hash with the file names as keys
+and the POD name as value. The POD name is derived from the file name
+and its position in the directory tree.
+
+E.g. when searching in F<$HOME/perl5lib>, the file
+F<$HOME/perl5lib/MyModule.pm> would get the POD name I<MyModule>,
+whereas F<$HOME/perl5lib/Myclass/Subclass.pm> would be
+I<Myclass::Subclass>. The name information can be used for POD
+translators.
+
+Only text files containing at least one valid POD command are found.
+
+A warning is printed if more than one POD file with the same POD name
+is found, e.g. F<CPAN.pm> in different directories. This usually
+indicates duplicate occurrences of modules in the I<@INC> search path.
+
+B<OPTIONS> The first argument for B<pod_find> may be a hash reference
+with options. The rest are either directories that are searched
+recursively or files. The POD names of files are the plain basenames
+with any Perl-like extension (.pm, .pl, .pod) stripped.
+
+=over 4
+
+=item C<-verbose =E<gt> 1>
+
+Print progress information while scanning.
+
+=item C<-perl =E<gt> 1>
+
+Apply Perl-specific heuristics to find the correct PODs. This includes
+stripping Perl-like extensions, omitting subdirectories that are numeric
+but do I<not> match the current Perl interpreter's version id, suppressing
+F<site_perl> as a module hierarchy name etc.
+
+=item C<-script =E<gt> 1>
+
+Search for PODs in the current Perl interpreter's installation
+B<scriptdir>. This is taken from the local L<Config|Config> module.
+
+=item C<-inc =E<gt> 1>
+
+Search for PODs in the current Perl interpreter's I<@INC> paths. This
+automatically considers paths specified in the C<PERL5LIB> environment
+as this is included in I<@INC> by the Perl interpreter itself.
+
+=back
+
+=cut
+
+# return a hash of the POD files found
+# first argument may be a hashref (options),
+# rest is a list of directories to search recursively
+sub pod_find
+{
+ my %opts;
+ if(ref $_[0]) {
+ %opts = %{shift()};
+ }
+
+ $opts{-verbose} ||= 0;
+ $opts{-perl} ||= 0;
+
+ my (@search) = @_;
+
+ if($opts{-script}) {
+ require Config;
+ push(@search, $Config::Config{scriptdir})
+ if -d $Config::Config{scriptdir};
+ $opts{-perl} = 1;
+ }
+
+ if($opts{-inc}) {
+ if ($^O eq 'MacOS') {
+ # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS
+ my @new_INC = @INC;
+ for (@new_INC) {
+ if ( $_ eq '.' ) {
+ $_ = ':';
+ } elsif ( $_ =~ s{^((?:\.\./)+)}{':' x (length($1)/3)}e ) {
+ $_ = ':'. $_;
+ } else {
+ $_ =~ s{^\./}{:};
+ }
+ }
+ push(@search, grep($_ ne File::Spec->curdir, @new_INC));
+ } else {
+ push(@search, grep($_ ne File::Spec->curdir, @INC));
+ }
+
+ $opts{-perl} = 1;
+ }
+
+ if($opts{-perl}) {
+ require Config;
+ # this code simplifies the POD name for Perl modules:
+ # * remove "site_perl"
+ # * remove e.g. "i586-linux" (from 'archname')
+ # * remove e.g. 5.00503
+ # * remove pod/ if followed by *.pod (e.g. in pod/perlfunc.pod)
+
+ # Mac OS:
+ # * remove ":?site_perl:"
+ # * remove :?pod: if followed by *.pod (e.g. in :pod:perlfunc.pod)
+
+ if ($^O eq 'MacOS') {
+ $SIMPLIFY_RX =
+ qq!^(?i:\:?site_perl\:|\:?pod\:(?=.*?\\.pod\\z))*!;
+ } else {
+ $SIMPLIFY_RX =
+ qq!^(?i:site(_perl)?/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!;
+ }
+ }
+
+ my %dirs_visited;
+ my %pods;
+ my %names;
+ my $pwd = cwd();
+
+ foreach my $try (@search) {
+ unless(File::Spec->file_name_is_absolute($try)) {
+ # make path absolute
+ $try = File::Spec->catfile($pwd,$try);
+ }
+ # simplify path
+ # on VMS canonpath will vmsify:[the.path], but File::Find::find
+ # wants /unixy/paths
+ $try = File::Spec->canonpath($try) if ($^O ne 'VMS');
+ $try = VMS::Filespec::unixify($try) if ($^O eq 'VMS');
+ my $name;
+ if(-f $try) {
+ if($name = _check_and_extract_name($try, $opts{-verbose})) {
+ _check_for_duplicates($try, $name, \%names, \%pods);
+ }
+ next;
+ }
+ my $root_rx = $^O eq 'MacOS' ? qq!^\Q$try\E! : qq!^\Q$try\E/!;
+ File::Find::find( sub {
+ my $item = $File::Find::name;
+ if(-d) {
+ if($item =~ m{/(?:RCS|CVS|SCCS|\.svn)$}) {
+ $File::Find::prune = 1;
+ return;
+ }
+ elsif($dirs_visited{$item}) {
+ warn "Directory '$item' already seen, skipping.\n"
+ if($opts{-verbose});
+ $File::Find::prune = 1;
+ return;
+ }
+ else {
+ $dirs_visited{$item} = 1;
+ }
+ if($opts{-perl} && /^(\d+\.[\d_]+)\z/s && eval "$1" != $]) {
+ $File::Find::prune = 1;
+ warn "Perl $] version mismatch on $_, skipping.\n"
+ if($opts{-verbose});
+ }
+ return;
+ }
+ if($name = _check_and_extract_name($item, $opts{-verbose}, $root_rx)) {
+ _check_for_duplicates($item, $name, \%names, \%pods);
+ }
+ }, $try); # end of File::Find::find
+ }
+ chdir $pwd;
+ return %pods;
+}
+
+sub _check_for_duplicates {
+ my ($file, $name, $names_ref, $pods_ref) = @_;
+ if($$names_ref{$name}) {
+ warn "Duplicate POD found (shadowing?): $name ($file)\n";
+ warn ' Already seen in ',
+ join(' ', grep($$pods_ref{$_} eq $name, keys %$pods_ref)),"\n";
+ }
+ else {
+ $$names_ref{$name} = 1;
+ }
+ return $$pods_ref{$file} = $name;
+}
+
+sub _check_and_extract_name {
+ my ($file, $verbose, $root_rx) = @_;
+
+ # check extension or executable flag
+ # this involves testing the .bat extension on Win32!
+ unless(-f $file && -T $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x $file )) {
+ return;
+ }
+
+ return unless contains_pod($file,$verbose);
+
+ # strip non-significant path components
+ # TODO what happens on e.g. Win32?
+ my $name = $file;
+ if(defined $root_rx) {
+ $name =~ s/$root_rx//s;
+ $name =~ s/$SIMPLIFY_RX//s if(defined $SIMPLIFY_RX);
+ }
+ else {
+ if ($^O eq 'MacOS') {
+ $name =~ s/^.*://s;
+ } else {
+ $name =~ s{^.*/}{}s;
+ }
+ }
+ _simplify($name);
+ $name =~ s{/+}{::}g;
+ if ($^O eq 'MacOS') {
+ $name =~ s{:+}{::}g; # : -> ::
+ } else {
+ $name =~ s{/+}{::}g; # / -> ::
+ }
+ return $name;
+}
+
+=head2 C<simplify_name( $str )>
+
+The function B<simplify_name> is equivalent to B<basename>, but also
+strips Perl-like extensions (.pm, .pl, .pod) and extensions like
+F<.bat>, F<.cmd> on Win32 and OS/2, or F<.com> on VMS, respectively.
+
+=cut
+
+# basic simplification of the POD name:
+# basename & strip extension
+sub simplify_name {
+ my ($str) = @_;
+ # remove all path components
+ if ($^O eq 'MacOS') {
+ $str =~ s/^.*://s;
+ } else {
+ $str =~ s{^.*/}{}s;
+ }
+ _simplify($str);
+ return $str;
+}
+
+# internal sub only
+sub _simplify {
+ # strip Perl's own extensions
+ $_[0] =~ s/\.(pod|pm|plx?)\z//i;
+ # strip meaningless extensions on Win32 and OS/2
+ $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /mswin|os2/i);
+ # strip meaningless extensions on VMS
+ $_[0] =~ s/\.(com)\z//i if($^O eq 'VMS');
+}
+
+# contribution from Tim Jenness <t.jenness@jach.hawaii.edu>
+
+=head2 C<pod_where( { %opts }, $pod )>
+
+Returns the location of a pod document given a search directory
+and a module (e.g. C<File::Find>) or script (e.g. C<perldoc>) name.
+
+Options:
+
+=over 4
+
+=item C<-inc =E<gt> 1>
+
+Search @INC for the pod and also the C<scriptdir> defined in the
+L<Config|Config> module.
+
+=item C<-dirs =E<gt> [ $dir1, $dir2, ... ]>
+
+Reference to an array of search directories. These are searched in order
+before looking in C<@INC> (if B<-inc>). Current directory is used if
+none are specified.
+
+=item C<-verbose =E<gt> 1>
+
+List directories as they are searched
+
+=back
+
+Returns the full path of the first occurrence to the file.
+Package names (eg 'A::B') are automatically converted to directory
+names in the selected directory. (eg on unix 'A::B' is converted to
+'A/B'). Additionally, '.pm', '.pl' and '.pod' are appended to the
+search automatically if required.
+
+A subdirectory F<pod/> is also checked if it exists in any of the given
+search directories. This ensures that e.g. L<perlfunc|perlfunc> is
+found.
+
+It is assumed that if a module name is supplied, that that name
+matches the file name. Pods are not opened to check for the 'NAME'
+entry.
+
+A check is made to make sure that the file that is found does
+contain some pod documentation.
+
+=cut
+
+sub pod_where {
+
+ # default options
+ my %options = (
+ '-inc' => 0,
+ '-verbose' => 0,
+ '-dirs' => [ File::Spec->curdir ],
+ );
+
+ # Check for an options hash as first argument
+ if (defined $_[0] && ref($_[0]) eq 'HASH') {
+ my $opt = shift;
+
+ # Merge default options with supplied options
+ %options = (%options, %$opt);
+ }
+
+ # Check usage
+ carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_));
+
+ # Read argument
+ my $pod = shift;
+
+ # Split on :: and then join the name together using File::Spec
+ my @parts = split (/::/, $pod);
+
+ # Get full directory list
+ my @search_dirs = @{ $options{'-dirs'} };
+
+ if ($options{'-inc'}) {
+
+ require Config;
+
+ # Add @INC
+ if ($^O eq 'MacOS' && $options{'-inc'}) {
+ # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS
+ my @new_INC = @INC;
+ for (@new_INC) {
+ if ( $_ eq '.' ) {
+ $_ = ':';
+ } elsif ( $_ =~ s{^((?:\.\./)+)}{':' x (length($1)/3)}e ) {
+ $_ = ':'. $_;
+ } else {
+ $_ =~ s{^\./}{:};
+ }
+ }
+ push (@search_dirs, @new_INC);
+ } elsif ($options{'-inc'}) {
+ push (@search_dirs, @INC);
+ }
+
+ # Add location of pod documentation for perl man pages (eg perlfunc)
+ # This is a pod directory in the private install tree
+ #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'},
+ # 'pod');
+ #push (@search_dirs, $perlpoddir)
+ # if -d $perlpoddir;
+
+ # Add location of binaries such as pod2text
+ push (@search_dirs, $Config::Config{'scriptdir'})
+ if -d $Config::Config{'scriptdir'};
+ }
+
+ warn 'Search path is: '.join(' ', @search_dirs)."\n"
+ if $options{'-verbose'};
+
+ # Loop over directories
+ Dir: foreach my $dir ( @search_dirs ) {
+
+ # Don't bother if can't find the directory
+ if (-d $dir) {
+ warn "Looking in directory $dir\n"
+ if $options{'-verbose'};
+
+ # Now concatenate this directory with the pod we are searching for
+ my $fullname = File::Spec->catfile($dir, @parts);
+ warn "Filename is now $fullname\n"
+ if $options{'-verbose'};
+
+ # Loop over possible extensions
+ foreach my $ext ('', '.pod', '.pm', '.pl') {
+ my $fullext = $fullname . $ext;
+ if (-f $fullext &&
+ contains_pod($fullext, $options{'-verbose'}) ) {
+ warn "FOUND: $fullext\n" if $options{'-verbose'};
+ return $fullext;
+ }
+ }
+ } else {
+ warn "Directory $dir does not exist\n"
+ if $options{'-verbose'};
+ next Dir;
+ }
+ # for some strange reason the path on MacOS/darwin/cygwin is
+ # 'pods' not 'pod'
+ # this could be the case also for other systems that
+ # have a case-tolerant file system, but File::Spec
+ # does not recognize 'darwin' yet. And cygwin also has "pods",
+ # but is not case tolerant. Oh well...
+ if((File::Spec->case_tolerant || $^O =~ /macos|darwin|cygwin/i)
+ && -d File::Spec->catdir($dir,'pods')) {
+ $dir = File::Spec->catdir($dir,'pods');
+ redo Dir;
+ }
+ if(-d File::Spec->catdir($dir,'pod')) {
+ $dir = File::Spec->catdir($dir,'pod');
+ redo Dir;
+ }
+ }
+ # No match;
+ return;
+}
+
+=head2 C<contains_pod( $file , $verbose )>
+
+Returns true if the supplied filename (not POD module) contains some pod
+information.
+
+=cut
+
+sub contains_pod {
+ my $file = shift;
+ my $verbose = 0;
+ $verbose = shift if @_;
+
+ # check for one line of POD
+ my $podfh;
+ if ($] < 5.006) {
+ $podfh = gensym();
+ }
+
+ unless(open($podfh,"<$file")) {
+ warn "Error: $file is unreadable: $!\n";
+ return;
+ }
+
+ local $/ = undef;
+ my $pod = <$podfh>;
+ close($podfh) || die "Error closing $file: $!\n";
+ unless($pod =~ /^=(head\d|pod|over|item|cut)\b/m) {
+ warn "No POD in $file, skipping.\n"
+ if($verbose);
+ return 0;
+ }
+
+ return 1;
+}
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>,
+heavily borrowing code from Nick Ing-Simmons' PodToHtml.
+
+Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt> provided
+C<pod_where> and C<contains_pod>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Checker>, L<perldoc>
+
+=cut
+
+1;
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Functions.pm b/Master/tlpkg/tlperl/lib/Pod/Functions.pm
new file mode 100644
index 00000000000..5181c3990bf
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Functions.pm
@@ -0,0 +1,376 @@
+package Pod::Functions;
+use strict;
+
+=head1 NAME
+
+Pod::Functions - Group Perl's functions a la perlfunc.pod
+
+=head1 SYNOPSIS
+
+ use Pod::Functions;
+
+ my @misc_ops = @{ $Kinds{ 'Misc' } };
+ my $misc_dsc = $Type_Description{ 'Misc' };
+
+or
+
+ perl /path/to/lib/Pod/Functions.pm
+
+This will print a grouped list of Perl's functions, like the
+L<perlfunc/"Perl Functions by Category"> section.
+
+=head1 DESCRIPTION
+
+It exports the following variables:
+
+=over 4
+
+=item %Kinds
+
+This holds a hash-of-lists. Each list contains the functions in the category
+the key denotes.
+
+=item %Type
+
+In this hash each key represents a function and the value is the category.
+The category can be a comma separated list.
+
+=item %Flavor
+
+In this hash each key represents a function and the value is a short
+description of that function.
+
+=item %Type_Description
+
+In this hash each key represents a category of functions and the value is
+a short description of that category.
+
+=item @Type_Order
+
+This list of categories is used to produce the same order as the
+L<perlfunc/"Perl Functions by Category"> section.
+
+=back
+
+=head1 CHANGES
+
+1.02 20020813 <abe@ztreet.demon.nl>
+ de-typo in the SYNOPSIS section (thanks Mike Castle for noticing)
+
+1.01 20011229 <abe@ztreet.demon.nl>
+ fixed some bugs that slipped in after 5.6.1
+ added the pod
+ finished making it strict safe
+
+1.00 ??
+ first numbered version
+
+=cut
+
+our $VERSION = '1.04';
+
+require Exporter;
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(%Kinds %Type %Flavor %Type_Description @Type_Order);
+
+our(%Kinds, %Type, %Flavor);
+
+our %Type_Description = (
+ 'ARRAY' => 'Functions for real @ARRAYs',
+ 'Binary' => 'Functions for fixed length data or records',
+ 'File' => 'Functions for filehandles, files, or directories',
+ 'Flow' => 'Keywords related to control flow of your perl program',
+ 'HASH' => 'Functions for real %HASHes',
+ 'I/O' => 'Input and output functions',
+ 'LIST' => 'Functions for list data',
+ 'Math' => 'Numeric functions',
+ 'Misc' => 'Miscellaneous functions',
+ 'Modules' => 'Keywords related to perl modules',
+ 'Network' => 'Fetching network info',
+ 'Objects' => 'Keywords related to classes and object-orientedness',
+ 'Process' => 'Functions for processes and process groups',
+ 'Regexp' => 'Regular expressions and pattern matching',
+ 'Socket' => 'Low-level socket functions',
+ 'String' => 'Functions for SCALARs or strings',
+ 'SysV' => 'System V interprocess communication functions',
+ 'Time' => 'Time-related functions',
+ 'User' => 'Fetching user and group info',
+ 'Namespace' => 'Keywords altering or affecting scoping of identifiers',
+);
+
+our @Type_Order = qw{
+ String
+ Regexp
+ Math
+ ARRAY
+ LIST
+ HASH
+ I/O
+ Binary
+ File
+ Flow
+ Namespace
+ Misc
+ Process
+ Modules
+ Objects
+ Socket
+ SysV
+ User
+ Network
+ Time
+};
+
+while (<DATA>) {
+ chomp;
+ s/#.*//;
+ next unless $_;
+ my($name, $type, $text) = split " ", $_, 3;
+ $Type{$name} = $type;
+ $Flavor{$name} = $text;
+ for my $t ( split /[,\s]+/, $type ) {
+ push @{$Kinds{$t}}, $name;
+ }
+}
+
+close DATA;
+
+my( $typedesc, $list );
+unless (caller) {
+ foreach my $type ( @Type_Order ) {
+ $list = join(", ", sort @{$Kinds{$type}});
+ $typedesc = $Type_Description{$type} . ":";
+ write;
+ }
+}
+
+format =
+
+^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $typedesc
+~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $typedesc
+ ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ $list
+.
+
+1;
+
+__DATA__
+-X File a file test (-r, -x, etc)
+abs Math absolute value function
+accept Socket accept an incoming socket connect
+alarm Process schedule a SIGALRM
+atan2 Math arctangent of Y/X in the range -PI to PI
+bind Socket binds an address to a socket
+binmode I/O prepare binary files for I/O
+bless Objects create an object
+caller Flow,Namespace get context of the current subroutine call
+chdir File change your current working directory
+chmod File changes the permissions on a list of files
+chomp String remove a trailing record separator from a string
+chop String remove the last character from a string
+chown File change the ownership on a list of files
+chr String get character this number represents
+chroot File make directory new root for path lookups
+close I/O close file (or pipe or socket) handle
+closedir I/O close directory handle
+connect Socket connect to a remote socket
+continue Flow optional trailing block in a while or foreach
+cos Math cosine function
+crypt String one-way passwd-style encryption
+dbmclose Objects,I/O breaks binding on a tied dbm file
+dbmopen Objects,I/O create binding on a tied dbm file
+defined Misc test whether a value, variable, or function is defined
+delete HASH deletes a value from a hash
+die I/O,Flow raise an exception or bail out
+do Flow,Modules turn a BLOCK into a TERM
+dump Misc,Flow create an immediate core dump
+each HASH retrieve the next key/value pair from a hash
+endgrent User be done using group file
+endhostent User be done using hosts file
+endnetent User be done using networks file
+endprotoent Network be done using protocols file
+endpwent User be done using passwd file
+endservent Network be done using services file
+eof I/O test a filehandle for its end
+eval Flow,Misc catch exceptions or compile and run code
+exec Process abandon this program to run another
+exists HASH test whether a hash key is present
+exit Flow terminate this program
+exp Math raise I<e> to a power
+fcntl File file control system call
+fileno I/O return file descriptor from filehandle
+flock I/O lock an entire file with an advisory lock
+fork Process create a new process just like this one
+format I/O declare a picture format with use by the write() function
+formline Misc internal function used for formats
+getc I/O get the next character from the filehandle
+getgrent User get next group record
+getgrgid User get group record given group user ID
+getgrnam User get group record given group name
+gethostbyaddr Network get host record given its address
+gethostbyname Network get host record given name
+gethostent Network get next hosts record
+getlogin User return who logged in at this tty
+getnetbyaddr Network get network record given its address
+getnetbyname Network get networks record given name
+getnetent Network get next networks record
+getpeername Socket find the other end of a socket connection
+getpgrp Process get process group
+getppid Process get parent process ID
+getpriority Process get current nice value
+getprotobyname Network get protocol record given name
+getprotobynumber Network get protocol record numeric protocol
+getprotoent Network get next protocols record
+getpwent User get next passwd record
+getpwnam User get passwd record given user login name
+getpwuid User get passwd record given user ID
+getservbyname Network get services record given its name
+getservbyport Network get services record given numeric port
+getservent Network get next services record
+getsockname Socket retrieve the sockaddr for a given socket
+getsockopt Socket get socket options on a given socket
+glob File expand filenames using wildcards
+gmtime Time convert UNIX time into record or string using Greenwich time
+goto Flow create spaghetti code
+grep LIST locate elements in a list test true against a given criterion
+hex Math,String convert a string to a hexadecimal number
+import Modules,Namespace patch a module's namespace into your own
+index String find a substring within a string
+int Math get the integer portion of a number
+ioctl File system-dependent device control system call
+join LIST join a list into a string using a separator
+keys HASH retrieve list of indices from a hash
+kill Process send a signal to a process or process group
+last Flow exit a block prematurely
+lc String return lower-case version of a string
+lcfirst String return a string with just the next letter in lower case
+length String return the number of bytes in a string
+link File create a hard link in the filesystem
+listen Socket register your socket as a server
+local Misc,Namespace create a temporary value for a global variable (dynamic scoping)
+localtime Time convert UNIX time into record or string using local time
+lock Threads get a thread lock on a variable, subroutine, or method
+log Math retrieve the natural logarithm for a number
+lstat File stat a symbolic link
+m// Regexp match a string with a regular expression pattern
+map LIST apply a change to a list to get back a new list with the changes
+mkdir File create a directory
+msgctl SysV SysV IPC message control operations
+msgget SysV get SysV IPC message queue
+msgrcv SysV receive a SysV IPC message from a message queue
+msgsnd SysV send a SysV IPC message to a message queue
+my Misc,Namespace declare and assign a local variable (lexical scoping)
+next Flow iterate a block prematurely
+no Modules unimport some module symbols or semantics at compile time
+package Modules,Objects,Namespace declare a separate global namespace
+prototype Flow,Misc get the prototype (if any) of a subroutine
+oct String,Math convert a string to an octal number
+open File open a file, pipe, or descriptor
+opendir File open a directory
+ord String find a character's numeric representation
+our Misc,Namespace declare and assign a package variable (lexical scoping)
+pack Binary,String convert a list into a binary representation
+pipe Process open a pair of connected filehandles
+pop ARRAY remove the last element from an array and return it
+pos Regexp find or set the offset for the last/next m//g search
+print I/O output a list to a filehandle
+printf I/O output a formatted list to a filehandle
+push ARRAY append one or more elements to an array
+q/STRING/ String singly quote a string
+qq/STRING/ String doubly quote a string
+quotemeta Regexp quote regular expression magic characters
+qw/STRING/ LIST quote a list of words
+qx/STRING/ Process backquote quote a string
+qr/STRING/ Regexp Compile pattern
+rand Math retrieve the next pseudorandom number
+read I/O,Binary fixed-length buffered input from a filehandle
+readdir I/O get a directory from a directory handle
+readline I/O fetch a record from a file
+readlink File determine where a symbolic link is pointing
+readpipe Process execute a system command and collect standard output
+recv Socket receive a message over a Socket
+redo Flow start this loop iteration over again
+ref Objects find out the type of thing being referenced
+rename File change a filename
+require Modules load in external functions from a library at runtime
+reset Misc clear all variables of a given name
+return Flow get out of a function early
+reverse String,LIST flip a string or a list
+rewinddir I/O reset directory handle
+rindex String right-to-left substring search
+rmdir File remove a directory
+s/// Regexp replace a pattern with a string
+scalar Misc force a scalar context
+seek I/O reposition file pointer for random-access I/O
+seekdir I/O reposition directory pointer
+select I/O reset default output or do I/O multiplexing
+semctl SysV SysV semaphore control operations
+semget SysV get set of SysV semaphores
+semop SysV SysV semaphore operations
+send Socket send a message over a socket
+setgrent User prepare group file for use
+sethostent Network prepare hosts file for use
+setnetent Network prepare networks file for use
+setpgrp Process set the process group of a process
+setpriority Process set a process's nice value
+setprotoent Network prepare protocols file for use
+setpwent User prepare passwd file for use
+setservent Network prepare services file for use
+setsockopt Socket set some socket options
+shift ARRAY remove the first element of an array, and return it
+shmctl SysV SysV shared memory operations
+shmget SysV get SysV shared memory segment identifier
+shmread SysV read SysV shared memory
+shmwrite SysV write SysV shared memory
+shutdown Socket close down just half of a socket connection
+sin Math return the sine of a number
+sleep Process block for some number of seconds
+socket Socket create a socket
+socketpair Socket create a pair of sockets
+sort LIST sort a list of values
+splice ARRAY add or remove elements anywhere in an array
+split Regexp split up a string using a regexp delimiter
+sprintf String formatted print into a string
+sqrt Math square root function
+srand Math seed the random number generator
+stat File get a file's status information
+study Regexp optimize input data for repeated searches
+sub Flow declare a subroutine, possibly anonymously
+substr String get or alter a portion of a string
+symlink File create a symbolic link to a file
+syscall I/O,Binary execute an arbitrary system call
+sysopen File open a file, pipe, or descriptor
+sysread I/O,Binary fixed-length unbuffered input from a filehandle
+sysseek I/O,Binary position I/O pointer on handle used with sysread and syswrite
+system Process run a separate program
+syswrite I/O,Binary fixed-length unbuffered output to a filehandle
+tell I/O get current seekpointer on a filehandle
+telldir I/O get current seekpointer on a directory handle
+tie Objects bind a variable to an object class
+tied Objects get a reference to the object underlying a tied variable
+time Time return number of seconds since 1970
+times Process,Time return elapsed time for self and child processes
+tr/// String transliterate a string
+truncate I/O shorten a file
+uc String return upper-case version of a string
+ucfirst String return a string with just the next letter in upper case
+umask File set file creation mode mask
+undef Misc remove a variable or function definition
+unlink File remove one link to a file
+unpack Binary,LIST convert binary structure into normal perl variables
+unshift ARRAY prepend more elements to the beginning of a list
+untie Objects break a tie binding to a variable
+use Modules,Namespace load a module and import its namespace
+use Objects load in a module at compile time
+utime File set a file's last access and modify times
+values HASH return a list of the values in a hash
+vec Binary test or set particular bits in a string
+wait Process wait for any child process to die
+waitpid Process wait for a particular child process to die
+wantarray Misc,Flow get void vs scalar vs list context of current subroutine call
+warn I/O print debugging info
+write I/O print a picture record
+y/// String transliterate a string
diff --git a/Master/tlpkg/tlperl/lib/Pod/Html.pm b/Master/tlpkg/tlperl/lib/Pod/Html.pm
new file mode 100644
index 00000000000..6174dd74576
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Html.pm
@@ -0,0 +1,2235 @@
+package Pod::Html;
+use strict;
+require Exporter;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+$VERSION = 1.09;
+@ISA = qw(Exporter);
+@EXPORT = qw(pod2html htmlify);
+@EXPORT_OK = qw(anchorify);
+
+use Carp;
+use Config;
+use Cwd;
+use File::Spec;
+use File::Spec::Unix;
+use Getopt::Long;
+
+use locale; # make \w work right in non-ASCII lands
+
+=head1 NAME
+
+Pod::Html - module to convert pod files to HTML
+
+=head1 SYNOPSIS
+
+ use Pod::Html;
+ pod2html([options]);
+
+=head1 DESCRIPTION
+
+Converts files from pod format (see L<perlpod>) to HTML format. It
+can automatically generate indexes and cross-references, and it keeps
+a cache of things it knows how to cross-reference.
+
+=head1 FUNCTIONS
+
+=head2 pod2html
+
+ pod2html("pod2html",
+ "--podpath=lib:ext:pod:vms",
+ "--podroot=/usr/src/perl",
+ "--htmlroot=/perl/nmanual",
+ "--libpods=perlfunc:perlguts:perlvar:perlrun:perlop",
+ "--recurse",
+ "--infile=foo.pod",
+ "--outfile=/perl/nmanual/foo.html");
+
+pod2html takes the following arguments:
+
+=over 4
+
+=item backlink
+
+ --backlink="Back to Top"
+
+Adds "Back to Top" links in front of every C<head1> heading (except for
+the first). By default, no backlinks are generated.
+
+=item cachedir
+
+ --cachedir=name
+
+Creates the item and directory caches in the given directory.
+
+=item css
+
+ --css=stylesheet
+
+Specify the URL of a cascading style sheet. Also disables all HTML/CSS
+C<style> attributes that are output by default (to avoid conflicts).
+
+=item flush
+
+ --flush
+
+Flushes the item and directory caches.
+
+=item header
+
+ --header
+ --noheader
+
+Creates header and footer blocks containing the text of the C<NAME>
+section. By default, no headers are generated.
+
+=item help
+
+ --help
+
+Displays the usage message.
+
+=item hiddendirs
+
+ --hiddendirs
+ --nohiddendirs
+
+Include hidden directories in the search for POD's in podpath if recurse
+is set.
+The default is not to traverse any directory whose name begins with C<.>.
+See L</"podpath"> and L</"recurse">.
+
+[This option is for backward compatibility only.
+It's hard to imagine that one would usefully create a module with a
+name component beginning with C<.>.]
+
+=item htmldir
+
+ --htmldir=name
+
+Sets the directory in which the resulting HTML file is placed. This
+is used to generate relative links to other files. Not passing this
+causes all links to be absolute, since this is the value that tells
+Pod::Html the root of the documentation tree.
+
+=item htmlroot
+
+ --htmlroot=name
+
+Sets the base URL for the HTML files. When cross-references are made,
+the HTML root is prepended to the URL.
+
+=item index
+
+ --index
+ --noindex
+
+Generate an index at the top of the HTML file. This is the default
+behaviour.
+
+=item infile
+
+ --infile=name
+
+Specify the pod file to convert. Input is taken from STDIN if no
+infile is specified.
+
+=item libpods
+
+ --libpods=name:...:name
+
+List of page names (eg, "perlfunc") which contain linkable C<=item>s.
+
+=item netscape
+
+ --netscape
+ --nonetscape
+
+B<Deprecated>, has no effect. For backwards compatibility only.
+
+=item outfile
+
+ --outfile=name
+
+Specify the HTML file to create. Output goes to STDOUT if no outfile
+is specified.
+
+=item podpath
+
+ --podpath=name:...:name
+
+Specify which subdirectories of the podroot contain pod files whose
+HTML converted forms can be linked to in cross references.
+
+=item podroot
+
+ --podroot=name
+
+Specify the base directory for finding library pods.
+
+=item quiet
+
+ --quiet
+ --noquiet
+
+Don't display I<mostly harmless> warning messages. These messages
+will be displayed by default. But this is not the same as C<verbose>
+mode.
+
+=item recurse
+
+ --recurse
+ --norecurse
+
+Recurse into subdirectories specified in podpath (default behaviour).
+
+=item title
+
+ --title=title
+
+Specify the title of the resulting HTML file.
+
+=item verbose
+
+ --verbose
+ --noverbose
+
+Display progress messages. By default, they won't be displayed.
+
+=back
+
+=head2 htmlify
+
+ htmlify($heading);
+
+Converts a pod section specification to a suitable section specification
+for HTML. Note that we keep spaces and special characters except
+C<", ?> (Netscape problem) and the hyphen (writer's problem...).
+
+=head2 anchorify
+
+ anchorify(@heading);
+
+Similar to C<htmlify()>, but turns non-alphanumerics into underscores. Note
+that C<anchorify()> is not exported by default.
+
+=head1 ENVIRONMENT
+
+Uses C<$Config{pod2html}> to setup default options.
+
+=head1 AUTHOR
+
+Tom Christiansen, E<lt>tchrist@perl.comE<gt>.
+
+=head1 SEE ALSO
+
+L<perlpod>
+
+=head1 COPYRIGHT
+
+This program is distributed under the Artistic License.
+
+=cut
+
+my($Cachedir);
+my($Dircache, $Itemcache);
+my @Begin_Stack;
+my @Libpods;
+my($Htmlroot, $Htmldir, $Htmlfile, $Htmlfileurl);
+my($Podfile, @Podpath, $Podroot);
+my $Css;
+
+my $Recurse;
+my $Quiet;
+my $HiddenDirs;
+my $Verbose;
+my $Doindex;
+
+my $Backlink;
+my($Listlevel, @Listtype);
+my $ListNewTerm;
+use vars qw($Ignore); # need to localize it later.
+
+my(%Items_Named, @Items_Seen);
+my($Title, $Header);
+
+my $Top;
+my $Paragraph;
+
+my %Sections;
+
+# Caches
+my %Pages = (); # associative array used to find the location
+ # of pages referenced by L<> links.
+my %Items = (); # associative array used to find the location
+ # of =item directives referenced by C<> links
+
+my %Local_Items;
+my $Is83;
+
+my $Curdir = File::Spec->curdir;
+
+init_globals();
+
+sub init_globals {
+ $Cachedir = "."; # The directory to which item and directory
+ # caches will be written.
+
+ $Dircache = "pod2htmd.tmp";
+ $Itemcache = "pod2htmi.tmp";
+
+ @Begin_Stack = (); # begin/end stack
+
+ @Libpods = (); # files to search for links from C<> directives
+ $Htmlroot = "/"; # http-server base directory from which all
+ # relative paths in $podpath stem.
+ $Htmldir = ""; # The directory to which the html pages
+ # will (eventually) be written.
+ $Htmlfile = ""; # write to stdout by default
+ $Htmlfileurl = ""; # The url that other files would use to
+ # refer to this file. This is only used
+ # to make relative urls that point to
+ # other files.
+
+ $Podfile = ""; # read from stdin by default
+ @Podpath = (); # list of directories containing library pods.
+ $Podroot = $Curdir; # filesystem base directory from which all
+ # relative paths in $podpath stem.
+ $Css = ''; # Cascading style sheet
+ $Recurse = 1; # recurse on subdirectories in $podpath.
+ $Quiet = 0; # not quiet by default
+ $Verbose = 0; # not verbose by default
+ $Doindex = 1; # non-zero if we should generate an index
+ $Backlink = ''; # text for "back to top" links
+ $Listlevel = 0; # current list depth
+ @Listtype = (); # list types for open lists
+ $ListNewTerm = 0; # indicates new term in definition list; used
+ # to correctly open/close <dd> tags
+ $Ignore = 1; # whether or not to format text. we don't
+ # format text until we hit our first pod
+ # directive.
+
+ @Items_Seen = (); # for multiples of the same item in perlfunc
+ %Items_Named = ();
+ $Header = 0; # produce block header/footer
+ $Title = ''; # title to give the pod(s)
+ $Top = 1; # true if we are at the top of the doc. used
+ # to prevent the first <hr /> directive.
+ $Paragraph = ''; # which paragraph we're processing (used
+ # for error messages)
+ %Sections = (); # sections within this page
+
+ %Local_Items = ();
+ $Is83 = $^O eq 'dos'; # Is it an 8.3 filesystem?
+}
+
+#
+# clean_data: global clean-up of pod data
+#
+sub clean_data($){
+ my( $dataref ) = @_;
+ for my $i ( 0..$#{$dataref} ) {
+ ${$dataref}[$i] =~ s/\s+\Z//;
+
+ # have a look for all-space lines
+ if( ${$dataref}[$i] =~ /^\s+$/m and $dataref->[$i] !~ /^\s/ ){
+ my @chunks = split( /^\s+$/m, ${$dataref}[$i] );
+ splice( @$dataref, $i, 1, @chunks );
+ }
+ }
+}
+
+
+sub pod2html {
+ local(@ARGV) = @_;
+ local($/);
+ local $_;
+
+ init_globals();
+
+ $Is83 = 0 if (defined (&Dos::UseLFN) && Dos::UseLFN());
+
+ # cache of %Pages and %Items from last time we ran pod2html
+
+ #undef $opt_help if defined $opt_help;
+
+ # parse the command-line parameters
+ parse_command_line();
+
+ # escape the backlink argument (same goes for title but is done later...)
+ $Backlink = html_escape($Backlink) if defined $Backlink;
+
+ # set some variables to their default values if necessary
+ local *POD;
+ unless (@ARGV && $ARGV[0]) {
+ $Podfile = "-" unless $Podfile; # stdin
+ open(POD, "<$Podfile")
+ || die "$0: cannot open $Podfile file for input: $!\n";
+ } else {
+ $Podfile = $ARGV[0]; # XXX: might be more filenames
+ *POD = *ARGV;
+ }
+ $Htmlfile = "-" unless $Htmlfile; # stdout
+ $Htmlroot = "" if $Htmlroot eq "/"; # so we don't get a //
+ $Htmldir =~ s#/\z## ; # so we don't get a //
+ if ( $Htmlroot eq ''
+ && defined( $Htmldir )
+ && $Htmldir ne ''
+ && substr( $Htmlfile, 0, length( $Htmldir ) ) eq $Htmldir
+ )
+ {
+ # Set the 'base' url for this file, so that we can use it
+ # as the location from which to calculate relative links
+ # to other files. If this is '', then absolute links will
+ # be used throughout.
+ $Htmlfileurl= "$Htmldir/" . substr( $Htmlfile, length( $Htmldir ) + 1);
+ }
+
+ # read the pod a paragraph at a time
+ warn "Scanning for sections in input file(s)\n" if $Verbose;
+ $/ = "";
+ my @poddata = <POD>;
+ close(POD);
+
+ # be eol agnostic
+ for (@poddata) {
+ if (/\r/) {
+ if (/\r\n/) {
+ @poddata = map { s/\r\n/\n/g;
+ /\n\n/ ?
+ map { "$_\n\n" } split /\n\n/ :
+ $_ } @poddata;
+ } else {
+ @poddata = map { s/\r/\n/g;
+ /\n\n/ ?
+ map { "$_\n\n" } split /\n\n/ :
+ $_ } @poddata;
+ }
+ last;
+ }
+ }
+
+ clean_data( \@poddata );
+
+ # scan the pod for =head[1-6] directives and build an index
+ my $index = scan_headings(\%Sections, @poddata);
+
+ unless($index) {
+ warn "No headings in $Podfile\n" if $Verbose;
+ }
+
+ # open the output file
+ open(HTML, ">$Htmlfile")
+ || die "$0: cannot open $Htmlfile file for output: $!\n";
+
+ # put a title in the HTML file if one wasn't specified
+ if ($Title eq '') {
+ TITLE_SEARCH: {
+ for (my $i = 0; $i < @poddata; $i++) {
+ if ($poddata[$i] =~ /^=head1\s*NAME\b/m) {
+ for my $para ( @poddata[$i, $i+1] ) {
+ last TITLE_SEARCH
+ if ($Title) = $para =~ /(\S+\s+-+.*\S)/s;
+ }
+ }
+
+ }
+ }
+ }
+ if (!$Title and $Podfile =~ /\.pod\z/) {
+ # probably a split pod so take first =head[12] as title
+ for (my $i = 0; $i < @poddata; $i++) {
+ last if ($Title) = $poddata[$i] =~ /^=head[12]\s*(.*)/;
+ }
+ warn "adopted '$Title' as title for $Podfile\n"
+ if $Verbose and $Title;
+ }
+ if ($Title) {
+ $Title =~ s/\s*\(.*\)//;
+ } else {
+ warn "$0: no title for $Podfile.\n" unless $Quiet;
+ $Podfile =~ /^(.*)(\.[^.\/]+)?\z/s;
+ $Title = ($Podfile eq "-" ? 'No Title' : $1);
+ warn "using $Title" if $Verbose;
+ }
+ $Title = html_escape($Title);
+
+ my $csslink = '';
+ my $bodystyle = ' style="background-color: white"';
+ my $tdstyle = ' style="background-color: #cccccc"';
+
+ if ($Css) {
+ $csslink = qq(\n<link rel="stylesheet" href="$Css" type="text/css" />);
+ $csslink =~ s,\\,/,g;
+ $csslink =~ s,(/.):,$1|,;
+ $bodystyle = '';
+ $tdstyle = '';
+ }
+
+ my $block = $Header ? <<END_OF_BLOCK : '';
+<table border="0" width="100%" cellspacing="0" cellpadding="3">
+<tr><td class="block"$tdstyle valign="middle">
+<big><strong><span class="block">&nbsp;$Title</span></strong></big>
+</td></tr>
+</table>
+END_OF_BLOCK
+
+ print HTML <<END_OF_HEAD;
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>$Title</title>$csslink
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:$Config{perladmin}" />
+</head>
+
+<body$bodystyle>
+$block
+END_OF_HEAD
+
+ # load/reload/validate/cache %Pages and %Items
+ get_cache($Dircache, $Itemcache, \@Podpath, $Podroot, $Recurse);
+
+ # scan the pod for =item directives
+ scan_items( \%Local_Items, "", @poddata);
+
+ # put an index at the top of the file. note, if $Doindex is 0 we
+ # still generate an index, but surround it with an html comment.
+ # that way some other program can extract it if desired.
+ $index =~ s/--+/-/g;
+
+ my $hr = ($Doindex and $index) ? qq(<hr name="index" />) : "";
+
+ unless ($Doindex)
+ {
+ $index = qq(<!--\n$index\n-->\n);
+ }
+
+ print HTML << "END_OF_INDEX";
+
+<!-- INDEX BEGIN -->
+<div name="index">
+<p><a name=\"__index__\"></a></p>
+$index
+$hr
+</div>
+<!-- INDEX END -->
+
+END_OF_INDEX
+
+ # now convert this file
+ my $after_item; # set to true after an =item
+ warn "Converting input file $Podfile\n" if $Verbose;
+ foreach my $i (0..$#poddata){
+ $_ = $poddata[$i];
+ $Paragraph = $i+1;
+ if (/^(=.*)/s) { # is it a pod directive?
+ $Ignore = 0;
+ $after_item = 0;
+ $_ = $1;
+ if (/^=begin\s+(\S+)\s*(.*)/si) {# =begin
+ process_begin($1, $2);
+ } elsif (/^=end\s+(\S+)\s*(.*)/si) {# =end
+ process_end($1, $2);
+ } elsif (/^=cut/) { # =cut
+ process_cut();
+ } elsif (/^=pod/) { # =pod
+ process_pod();
+ } else {
+ next if @Begin_Stack && $Begin_Stack[-1] ne 'html';
+
+ if (/^=(head[1-6])\s+(.*\S)/s) { # =head[1-6] heading
+ process_head( $1, $2, $Doindex && $index );
+ } elsif (/^=item\s*(.*\S)?/sm) { # =item text
+ process_item( $1 );
+ $after_item = 1;
+ } elsif (/^=over\s*(.*)/) { # =over N
+ process_over();
+ } elsif (/^=back/) { # =back
+ process_back();
+ } elsif (/^=for\s+(\S+)\s*(.*)/si) {# =for
+ process_for($1,$2);
+ } else {
+ /^=(\S*)\s*/;
+ warn "$0: $Podfile: unknown pod directive '$1' in "
+ . "paragraph $Paragraph. ignoring.\n" unless $Quiet;
+ }
+ }
+ $Top = 0;
+ }
+ else {
+ next if $Ignore;
+ next if @Begin_Stack && $Begin_Stack[-1] ne 'html';
+ print HTML and next if @Begin_Stack && $Begin_Stack[-1] eq 'html';
+ my $text = $_;
+
+ # Open tag for definition list as we have something to put in it
+ if( $ListNewTerm ){
+ print HTML "<dd>\n";
+ $ListNewTerm = 0;
+ }
+
+ if( $text =~ /\A\s+/ ){
+ process_pre( \$text );
+ print HTML "<pre>\n$text</pre>\n";
+
+ } else {
+ process_text( \$text );
+
+ # experimental: check for a paragraph where all lines
+ # have some ...\t...\t...\n pattern
+ if( $text =~ /\t/ ){
+ my @lines = split( "\n", $text );
+ if( @lines > 1 ){
+ my $all = 2;
+ foreach my $line ( @lines ){
+ if( $line =~ /\S/ && $line !~ /\t/ ){
+ $all--;
+ last if $all == 0;
+ }
+ }
+ if( $all > 0 ){
+ $text =~ s/\t+/<td>/g;
+ $text =~ s/^/<tr><td>/gm;
+ $text = '<table cellspacing="0" cellpadding="0">' .
+ $text . '</table>';
+ }
+ }
+ }
+ ## end of experimental
+
+ print HTML "<p>$text</p>\n";
+ }
+ $after_item = 0;
+ }
+ }
+
+ # finish off any pending directives
+ finish_list();
+
+ # link to page index
+ print HTML "<p><a href=\"#__index__\"><small>$Backlink</small></a></p>\n"
+ if $Doindex and $index and $Backlink;
+
+ print HTML <<END_OF_TAIL;
+$block
+</body>
+
+</html>
+END_OF_TAIL
+
+ # close the html file
+ close(HTML);
+
+ warn "Finished\n" if $Verbose;
+}
+
+##############################################################################
+
+sub usage {
+ my $podfile = shift;
+ warn "$0: $podfile: @_\n" if @_;
+ die <<END_OF_USAGE;
+Usage: $0 --help --htmlroot=<name> --infile=<name> --outfile=<name>
+ --podpath=<name>:...:<name> --podroot=<name>
+ --libpods=<name>:...:<name> --recurse --verbose --index
+ --netscape --norecurse --noindex --cachedir=<name>
+
+ --backlink - set text for "back to top" links (default: none).
+ --cachedir - directory for the item and directory cache files.
+ --css - stylesheet URL
+ --flush - flushes the item and directory caches.
+ --[no]header - produce block header/footer (default is no headers).
+ --help - prints this message.
+ --hiddendirs - search hidden directories in podpath
+ --htmldir - directory for resulting HTML files.
+ --htmlroot - http-server base directory from which all relative paths
+ in podpath stem (default is /).
+ --[no]index - generate an index at the top of the resulting html
+ (default behaviour).
+ --infile - filename for the pod to convert (input taken from stdin
+ by default).
+ --libpods - colon-separated list of pages to search for =item pod
+ directives in as targets of C<> and implicit links (empty
+ by default). note, these are not filenames, but rather
+ page names like those that appear in L<> links.
+ --outfile - filename for the resulting html file (output sent to
+ stdout by default).
+ --podpath - colon-separated list of directories containing library
+ pods (empty by default).
+ --podroot - filesystem base directory from which all relative paths
+ in podpath stem (default is .).
+ --[no]quiet - suppress some benign warning messages (default is off).
+ --[no]recurse - recurse on those subdirectories listed in podpath
+ (default behaviour).
+ --title - title that will appear in resulting html file.
+ --[no]verbose - self-explanatory (off by default).
+ --[no]netscape - deprecated, has no effect. for backwards compatibility only.
+
+END_OF_USAGE
+
+}
+
+sub parse_command_line {
+ my ($opt_backlink,$opt_cachedir,$opt_css,$opt_flush,$opt_header,$opt_help,
+ $opt_htmldir,$opt_htmlroot,$opt_index,$opt_infile,$opt_libpods,
+ $opt_netscape,$opt_outfile,$opt_podpath,$opt_podroot,$opt_quiet,
+ $opt_recurse,$opt_title,$opt_verbose,$opt_hiddendirs);
+
+ unshift @ARGV, split ' ', $Config{pod2html} if $Config{pod2html};
+ my $result = GetOptions(
+ 'backlink=s' => \$opt_backlink,
+ 'cachedir=s' => \$opt_cachedir,
+ 'css=s' => \$opt_css,
+ 'flush' => \$opt_flush,
+ 'header!' => \$opt_header,
+ 'help' => \$opt_help,
+ 'hiddendirs!'=> \$opt_hiddendirs,
+ 'htmldir=s' => \$opt_htmldir,
+ 'htmlroot=s' => \$opt_htmlroot,
+ 'index!' => \$opt_index,
+ 'infile=s' => \$opt_infile,
+ 'libpods=s' => \$opt_libpods,
+ 'netscape!' => \$opt_netscape,
+ 'outfile=s' => \$opt_outfile,
+ 'podpath=s' => \$opt_podpath,
+ 'podroot=s' => \$opt_podroot,
+ 'quiet!' => \$opt_quiet,
+ 'recurse!' => \$opt_recurse,
+ 'title=s' => \$opt_title,
+ 'verbose!' => \$opt_verbose,
+ );
+ usage("-", "invalid parameters") if not $result;
+
+ usage("-") if defined $opt_help; # see if the user asked for help
+ $opt_help = ""; # just to make -w shut-up.
+
+ @Podpath = split(":", $opt_podpath) if defined $opt_podpath;
+ @Libpods = split(":", $opt_libpods) if defined $opt_libpods;
+
+ $Backlink = $opt_backlink if defined $opt_backlink;
+ $Cachedir = $opt_cachedir if defined $opt_cachedir;
+ $Css = $opt_css if defined $opt_css;
+ $Header = $opt_header if defined $opt_header;
+ $Htmldir = $opt_htmldir if defined $opt_htmldir;
+ $Htmlroot = $opt_htmlroot if defined $opt_htmlroot;
+ $Doindex = $opt_index if defined $opt_index;
+ $Podfile = $opt_infile if defined $opt_infile;
+ $HiddenDirs = $opt_hiddendirs if defined $opt_hiddendirs;
+ $Htmlfile = $opt_outfile if defined $opt_outfile;
+ $Podroot = $opt_podroot if defined $opt_podroot;
+ $Quiet = $opt_quiet if defined $opt_quiet;
+ $Recurse = $opt_recurse if defined $opt_recurse;
+ $Title = $opt_title if defined $opt_title;
+ $Verbose = $opt_verbose if defined $opt_verbose;
+
+ warn "Flushing item and directory caches\n"
+ if $opt_verbose && defined $opt_flush;
+ $Dircache = "$Cachedir/pod2htmd.tmp";
+ $Itemcache = "$Cachedir/pod2htmi.tmp";
+ if (defined $opt_flush) {
+ 1 while unlink($Dircache, $Itemcache);
+ }
+}
+
+
+my $Saved_Cache_Key;
+
+sub get_cache {
+ my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_;
+ my @cache_key_args = @_;
+
+ # A first-level cache:
+ # Don't bother reading the cache files if they still apply
+ # and haven't changed since we last read them.
+
+ my $this_cache_key = cache_key(@cache_key_args);
+
+ return if $Saved_Cache_Key and $this_cache_key eq $Saved_Cache_Key;
+
+ # load the cache of %Pages and %Items if possible. $tests will be
+ # non-zero if successful.
+ my $tests = 0;
+ if (-f $dircache && -f $itemcache) {
+ warn "scanning for item cache\n" if $Verbose;
+ $tests = load_cache($dircache, $itemcache, $podpath, $podroot);
+ }
+
+ # if we didn't succeed in loading the cache then we must (re)build
+ # %Pages and %Items.
+ if (!$tests) {
+ warn "scanning directories in pod-path\n" if $Verbose;
+ scan_podpath($podroot, $recurse, 0);
+ }
+ $Saved_Cache_Key = cache_key(@cache_key_args);
+}
+
+sub cache_key {
+ my($dircache, $itemcache, $podpath, $podroot, $recurse) = @_;
+ return join('!', $dircache, $itemcache, $recurse,
+ @$podpath, $podroot, stat($dircache), stat($itemcache));
+}
+
+#
+# load_cache - tries to find if the caches stored in $dircache and $itemcache
+# are valid caches of %Pages and %Items. if they are valid then it loads
+# them and returns a non-zero value.
+#
+sub load_cache {
+ my($dircache, $itemcache, $podpath, $podroot) = @_;
+ my($tests);
+ local $_;
+
+ $tests = 0;
+
+ open(CACHE, "<$itemcache") ||
+ die "$0: error opening $itemcache for reading: $!\n";
+ $/ = "\n";
+
+ # is it the same podpath?
+ $_ = <CACHE>;
+ chomp($_);
+ $tests++ if (join(":", @$podpath) eq $_);
+
+ # is it the same podroot?
+ $_ = <CACHE>;
+ chomp($_);
+ $tests++ if ($podroot eq $_);
+
+ # load the cache if its good
+ if ($tests != 2) {
+ close(CACHE);
+ return 0;
+ }
+
+ warn "loading item cache\n" if $Verbose;
+ while (<CACHE>) {
+ /(.*?) (.*)$/;
+ $Items{$1} = $2;
+ }
+ close(CACHE);
+
+ warn "scanning for directory cache\n" if $Verbose;
+ open(CACHE, "<$dircache") ||
+ die "$0: error opening $dircache for reading: $!\n";
+ $/ = "\n";
+ $tests = 0;
+
+ # is it the same podpath?
+ $_ = <CACHE>;
+ chomp($_);
+ $tests++ if (join(":", @$podpath) eq $_);
+
+ # is it the same podroot?
+ $_ = <CACHE>;
+ chomp($_);
+ $tests++ if ($podroot eq $_);
+
+ # load the cache if its good
+ if ($tests != 2) {
+ close(CACHE);
+ return 0;
+ }
+
+ warn "loading directory cache\n" if $Verbose;
+ while (<CACHE>) {
+ /(.*?) (.*)$/;
+ $Pages{$1} = $2;
+ }
+
+ close(CACHE);
+
+ return 1;
+}
+
+#
+# scan_podpath - scans the directories specified in @podpath for directories,
+# .pod files, and .pm files. it also scans the pod files specified in
+# @Libpods for =item directives.
+#
+sub scan_podpath {
+ my($podroot, $recurse, $append) = @_;
+ my($pwd, $dir);
+ my($libpod, $dirname, $pod, @files, @poddata);
+
+ unless($append) {
+ %Items = ();
+ %Pages = ();
+ }
+
+ # scan each directory listed in @Podpath
+ $pwd = getcwd();
+ chdir($podroot)
+ || die "$0: error changing to directory $podroot: $!\n";
+ foreach $dir (@Podpath) {
+ scan_dir($dir, $recurse);
+ }
+
+ # scan the pods listed in @Libpods for =item directives
+ foreach $libpod (@Libpods) {
+ # if the page isn't defined then we won't know where to find it
+ # on the system.
+ next unless defined $Pages{$libpod} && $Pages{$libpod};
+
+ # if there is a directory then use the .pod and .pm files within it.
+ # NOTE: Only finds the first so-named directory in the tree.
+# if ($Pages{$libpod} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+ if ($Pages{$libpod} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) {
+ # find all the .pod and .pm files within the directory
+ $dirname = $1;
+ opendir(DIR, $dirname) ||
+ die "$0: error opening directory $dirname: $!\n";
+ @files = grep(/(\.pod|\.pm)\z/ && ! -d $_, readdir(DIR));
+ closedir(DIR);
+
+ # scan each .pod and .pm file for =item directives
+ foreach $pod (@files) {
+ open(POD, "<$dirname/$pod") ||
+ die "$0: error opening $dirname/$pod for input: $!\n";
+ @poddata = <POD>;
+ close(POD);
+ clean_data( \@poddata );
+
+ scan_items( \%Items, "$dirname/$pod", @poddata);
+ }
+
+ # use the names of files as =item directives too.
+### Don't think this should be done this way - confuses issues.(WL)
+### foreach $pod (@files) {
+### $pod =~ /^(.*)(\.pod|\.pm)$/;
+### $Items{$1} = "$dirname/$1.html" if $1;
+### }
+ } elsif ($Pages{$libpod} =~ /([^:]*\.pod):/ ||
+ $Pages{$libpod} =~ /([^:]*\.pm):/) {
+ # scan the .pod or .pm file for =item directives
+ $pod = $1;
+ open(POD, "<$pod") ||
+ die "$0: error opening $pod for input: $!\n";
+ @poddata = <POD>;
+ close(POD);
+ clean_data( \@poddata );
+
+ scan_items( \%Items, "$pod", @poddata);
+ } else {
+ warn "$0: shouldn't be here (line ".__LINE__."\n" unless $Quiet;
+ }
+ }
+ @poddata = (); # clean-up a bit
+
+ chdir($pwd)
+ || die "$0: error changing to directory $pwd: $!\n";
+
+ # cache the item list for later use
+ warn "caching items for later use\n" if $Verbose;
+ open(CACHE, ">$Itemcache") ||
+ die "$0: error open $Itemcache for writing: $!\n";
+
+ print CACHE join(":", @Podpath) . "\n$podroot\n";
+ foreach my $key (keys %Items) {
+ print CACHE "$key $Items{$key}\n";
+ }
+
+ close(CACHE);
+
+ # cache the directory list for later use
+ warn "caching directories for later use\n" if $Verbose;
+ open(CACHE, ">$Dircache") ||
+ die "$0: error open $Dircache for writing: $!\n";
+
+ print CACHE join(":", @Podpath) . "\n$podroot\n";
+ foreach my $key (keys %Pages) {
+ print CACHE "$key $Pages{$key}\n";
+ }
+
+ close(CACHE);
+}
+
+#
+# scan_dir - scans the directory specified in $dir for subdirectories, .pod
+# files, and .pm files. notes those that it finds. this information will
+# be used later in order to figure out where the pages specified in L<>
+# links are on the filesystem.
+#
+sub scan_dir {
+ my($dir, $recurse) = @_;
+ my($t, @subdirs, @pods, $pod, $dirname, @dirs);
+ local $_;
+
+ @subdirs = ();
+ @pods = ();
+
+ opendir(DIR, $dir) ||
+ die "$0: error opening directory $dir: $!\n";
+ while (defined($_ = readdir(DIR))) {
+ if (-d "$dir/$_" && $_ ne "." && $_ ne ".."
+ && ($HiddenDirs || !/^\./)
+ ) { # directory
+ $Pages{$_} = "" unless defined $Pages{$_};
+ $Pages{$_} .= "$dir/$_:";
+ push(@subdirs, $_);
+ } elsif (/\.pod\z/) { # .pod
+ s/\.pod\z//;
+ $Pages{$_} = "" unless defined $Pages{$_};
+ $Pages{$_} .= "$dir/$_.pod:";
+ push(@pods, "$dir/$_.pod");
+ } elsif (/\.html\z/) { # .html
+ s/\.html\z//;
+ $Pages{$_} = "" unless defined $Pages{$_};
+ $Pages{$_} .= "$dir/$_.pod:";
+ } elsif (/\.pm\z/) { # .pm
+ s/\.pm\z//;
+ $Pages{$_} = "" unless defined $Pages{$_};
+ $Pages{$_} .= "$dir/$_.pm:";
+ push(@pods, "$dir/$_.pm");
+ } elsif (-T "$dir/$_") { # script(?)
+ local *F;
+ if (open(F, "$dir/$_")) {
+ my $line;
+ while (defined($line = <F>)) {
+ if ($line =~ /^=(?:pod|head1)/) {
+ $Pages{$_} = "" unless defined $Pages{$_};
+ $Pages{$_} .= "$dir/$_.pod:";
+ last;
+ }
+ }
+ close(F);
+ }
+ }
+ }
+ closedir(DIR);
+
+ # recurse on the subdirectories if necessary
+ if ($recurse) {
+ foreach my $subdir (@subdirs) {
+ scan_dir("$dir/$subdir", $recurse);
+ }
+ }
+}
+
+#
+# scan_headings - scan a pod file for head[1-6] tags, note the tags, and
+# build an index.
+#
+sub scan_headings {
+ my($sections, @data) = @_;
+ my($tag, $which_head, $otitle, $listdepth, $index);
+
+ local $Ignore = 0;
+
+ $listdepth = 0;
+ $index = "";
+
+ # scan for =head directives, note their name, and build an index
+ # pointing to each of them.
+ foreach my $line (@data) {
+ if ($line =~ /^=(head)([1-6])\s+(.*)/) {
+ ($tag, $which_head, $otitle) = ($1,$2,$3);
+
+ my $title = depod( $otitle );
+ my $name = anchorify( $title );
+ $$sections{$name} = 1;
+ $title = process_text( \$otitle );
+
+ while ($which_head != $listdepth) {
+ if ($which_head > $listdepth) {
+ $index .= "\n" . ("\t" x $listdepth) . "<ul>\n";
+ $listdepth++;
+ } elsif ($which_head < $listdepth) {
+ $listdepth--;
+ $index .= "\n" . ("\t" x $listdepth) . "</ul>\n";
+ }
+ }
+
+ $index .= "\n" . ("\t" x $listdepth) . "<li>" .
+ "<a href=\"#" . $name . "\">" .
+ $title . "</a></li>";
+ }
+ }
+
+ # finish off the lists
+ while ($listdepth--) {
+ $index .= "\n" . ("\t" x $listdepth) . "</ul>\n";
+ }
+
+ # get rid of bogus lists
+ $index =~ s,\t*<ul>\s*</ul>\n,,g;
+
+ return $index;
+}
+
+#
+# scan_items - scans the pod specified by $pod for =item directives. we
+# will use this information later on in resolving C<> links.
+#
+sub scan_items {
+ my( $itemref, $pod, @poddata ) = @_;
+ my($i, $item);
+ local $_;
+
+ $pod =~ s/\.pod\z//;
+ $pod .= ".html" if $pod;
+
+ foreach $i (0..$#poddata) {
+ my $txt = depod( $poddata[$i] );
+
+ # figure out what kind of item it is.
+ # Build string for referencing this item.
+ if ( $txt =~ /\A=item\s+\*\s*(.*)\Z/s ) { # bulleted list
+ next unless $1;
+ $item = $1;
+ } elsif( $txt =~ /\A=item\s+(?>\d+\.?)\s*(.*)\Z/s ) { # numbered list
+ $item = $1;
+ } elsif( $txt =~ /\A=item\s+(.*)\Z/s ) { # definition list
+ $item = $1;
+ } else {
+ next;
+ }
+ my $fid = fragment_id( $item );
+ $$itemref{$fid} = "$pod" if $fid;
+ }
+}
+
+#
+# process_head - convert a pod head[1-6] tag and convert it to HTML format.
+#
+sub process_head {
+ my($tag, $heading, $hasindex) = @_;
+
+ # figure out the level of the =head
+ $tag =~ /head([1-6])/;
+ my $level = $1;
+
+ finish_list();
+
+ print HTML "<p>\n";
+ if( $level == 1 && ! $Top ){
+ print HTML "<a href=\"#__index__\"><small>$Backlink</small></a>\n"
+ if $hasindex and $Backlink;
+ print HTML "</p>\n<hr />\n"
+ } else {
+ print HTML "</p>\n";
+ }
+
+ my $name = anchorify( depod( $heading ) );
+ my $convert = process_text( \$heading );
+ print HTML "<h$level><a name=\"$name\">$convert</a></h$level>\n";
+}
+
+
+#
+# emit_item_tag - print an =item's text
+# Note: The global $EmittedItem is used for inhibiting self-references.
+#
+my $EmittedItem;
+
+sub emit_item_tag($$$){
+ my( $otext, $text, $compact ) = @_;
+ my $item = fragment_id( depod($text) , -generate);
+ Carp::confess("Undefined fragment '$text' (".depod($text).") from fragment_id() in emit_item_tag() in $Podfile")
+ if !defined $item;
+ $EmittedItem = $item;
+ ### print STDERR "emit_item_tag=$item ($text)\n";
+
+ print HTML '<strong>';
+ if ($Items_Named{$item}++) {
+ print HTML process_text( \$otext );
+ } else {
+ my $name = $item;
+ $name = anchorify($name);
+ print HTML qq{<a name="$name" class="item">}, process_text( \$otext ), '</a>';
+ }
+ print HTML "</strong>";
+ undef( $EmittedItem );
+}
+
+sub new_listitem {
+ my( $tag ) = @_;
+ # Open tag for definition list as we have something to put in it
+ if( ($tag ne 'dl') && ($ListNewTerm) ){
+ print HTML "<dd>\n";
+ $ListNewTerm = 0;
+ }
+
+ if( $Items_Seen[$Listlevel]++ == 0 ){
+ # start of new list
+ push( @Listtype, "$tag" );
+ print HTML "<$tag>\n";
+ } else {
+ # if this is not the first item, close the previous one
+ if ( $tag eq 'dl' ){
+ print HTML "</dd>\n" unless $ListNewTerm;
+ } else {
+ print HTML "</li>\n";
+ }
+ }
+ my $opentag = $tag eq 'dl' ? 'dt' : 'li';
+ print HTML "<$opentag>";
+}
+
+#
+# process_item - convert a pod item tag and convert it to HTML format.
+#
+sub process_item {
+ my( $otext ) = @_;
+
+ # lots of documents start a list without doing an =over. this is
+ # bad! but, the proper thing to do seems to be to just assume
+ # they did do an =over. so warn them once and then continue.
+ if( $Listlevel == 0 ){
+ warn "$0: $Podfile: unexpected =item directive in paragraph $Paragraph. ignoring.\n" unless $Quiet;
+ process_over();
+ }
+
+ # remove formatting instructions from the text
+ my $text = depod( $otext );
+
+ # all the list variants:
+ if( $text =~ /\A\*/ ){ # bullet
+ new_listitem( 'ul' );
+ if ($text =~ /\A\*\s+(\S.*)\Z/s ) { # with additional text
+ my $tag = $1;
+ $otext =~ s/\A\*\s+//;
+ emit_item_tag( $otext, $tag, 1 );
+ print HTML "\n";
+ }
+
+ } elsif( $text =~ /\A\d+/ ){ # numbered list
+ new_listitem( 'ol' );
+ if ($text =~ /\A(?>\d+\.?)\s*(\S.*)\Z/s ) { # with additional text
+ my $tag = $1;
+ $otext =~ s/\A\d+\.?\s*//;
+ emit_item_tag( $otext, $tag, 1 );
+ print HTML "\n";
+ }
+
+ } else { # definition list
+ # new_listitem takes care of opening the <dt> tag
+ new_listitem( 'dl' );
+ if ($text =~ /\A(.+)\Z/s ){ # should have text
+ emit_item_tag( $otext, $text, 1 );
+ # write the definition term and close <dt> tag
+ print HTML "</dt>\n";
+ }
+ # trigger opening a <dd> tag for the actual definition; will not
+ # happen if next paragraph is also a definition term (=item)
+ $ListNewTerm = 1;
+ }
+ print HTML "\n";
+}
+
+#
+# process_over - process a pod over tag and start a corresponding HTML list.
+#
+sub process_over {
+ # start a new list
+ $Listlevel++;
+ push( @Items_Seen, 0 );
+}
+
+#
+# process_back - process a pod back tag and convert it to HTML format.
+#
+sub process_back {
+ if( $Listlevel == 0 ){
+ warn "$0: $Podfile: unexpected =back directive in paragraph $Paragraph. ignoring.\n" unless $Quiet;
+ return;
+ }
+
+ # close off the list. note, I check to see if $Listtype[$Listlevel] is
+ # defined because an =item directive may have never appeared and thus
+ # $Listtype[$Listlevel] may have never been initialized.
+ $Listlevel--;
+ if( defined $Listtype[$Listlevel] ){
+ if ( $Listtype[$Listlevel] eq 'dl' ){
+ print HTML "</dd>\n" unless $ListNewTerm;
+ } else {
+ print HTML "</li>\n";
+ }
+ print HTML "</$Listtype[$Listlevel]>\n";
+ pop( @Listtype );
+ $ListNewTerm = 0;
+ }
+
+ # clean up item count
+ pop( @Items_Seen );
+}
+
+#
+# process_cut - process a pod cut tag, thus start ignoring pod directives.
+#
+sub process_cut {
+ $Ignore = 1;
+}
+
+#
+# process_pod - process a pod tag, thus stop ignoring pod directives
+# until we see a corresponding cut.
+#
+sub process_pod {
+ # no need to set $Ignore to 0 cause the main loop did it
+}
+
+#
+# process_for - process a =for pod tag. if it's for html, spit
+# it out verbatim, if illustration, center it, otherwise ignore it.
+#
+sub process_for {
+ my($whom, $text) = @_;
+ if ( $whom =~ /^(pod2)?html$/i) {
+ print HTML $text;
+ } elsif ($whom =~ /^illustration$/i) {
+ 1 while chomp $text;
+ for my $ext (qw[.png .gif .jpeg .jpg .tga .pcl .bmp]) {
+ $text .= $ext, last if -r "$text$ext";
+ }
+ print HTML qq{<p align="center"><img src="$text" alt="$text illustration" /></p>};
+ }
+}
+
+#
+# process_begin - process a =begin pod tag. this pushes
+# whom we're beginning on the begin stack. if there's a
+# begin stack, we only print if it us.
+#
+sub process_begin {
+ my($whom, $text) = @_;
+ $whom = lc($whom);
+ push (@Begin_Stack, $whom);
+ if ( $whom =~ /^(pod2)?html$/) {
+ print HTML $text if $text;
+ }
+}
+
+#
+# process_end - process a =end pod tag. pop the
+# begin stack. die if we're mismatched.
+#
+sub process_end {
+ my($whom, $text) = @_;
+ $whom = lc($whom);
+ if (!defined $Begin_Stack[-1] or $Begin_Stack[-1] ne $whom ) {
+ Carp::confess("Unmatched begin/end at chunk $Paragraph in pod $Podfile\n")
+ }
+ pop( @Begin_Stack );
+}
+
+#
+# process_pre - indented paragraph, made into <pre></pre>
+#
+sub process_pre {
+ my( $text ) = @_;
+ my( $rest );
+ return if $Ignore;
+
+ $rest = $$text;
+
+ # insert spaces in place of tabs
+ $rest =~ s#(.+)#
+ my $line = $1;
+ 1 while $line =~ s/(\t+)/' ' x ((length($1) * 8) - $-[0] % 8)/e;
+ $line;
+ #eg;
+
+ # convert some special chars to HTML escapes
+ $rest = html_escape($rest);
+
+ # try and create links for all occurrences of perl.* within
+ # the preformatted text.
+ $rest =~ s{
+ (\s*)(perl\w+)
+ }{
+ if ( defined $Pages{$2} ){ # is a link
+ qq($1<a href="$Htmlroot/$Pages{$2}">$2</a>);
+ } elsif (defined $Pages{dosify($2)}) { # is a link
+ qq($1<a href="$Htmlroot/$Pages{dosify($2)}">$2</a>);
+ } else {
+ "$1$2";
+ }
+ }xeg;
+ $rest =~ s{
+ (<a\ href="?) ([^>:]*:)? ([^>:]*) \.pod: ([^>:]*:)?
+ }{
+ my $url ;
+ if ( $Htmlfileurl ne '' ){
+ # Here, we take advantage of the knowledge
+ # that $Htmlfileurl ne '' implies $Htmlroot eq ''.
+ # Since $Htmlroot eq '', we need to prepend $Htmldir
+ # on the fron of the link to get the absolute path
+ # of the link's target. We check for a leading '/'
+ # to avoid corrupting links that are #, file:, etc.
+ my $old_url = $3 ;
+ $old_url = "$Htmldir$old_url" if $old_url =~ m{^\/};
+ $url = relativize_url( "$old_url.html", $Htmlfileurl );
+ } else {
+ $url = "$3.html" ;
+ }
+ "$1$url" ;
+ }xeg;
+
+ # Look for embedded URLs and make them into links. We don't
+ # relativize them since they are best left as the author intended.
+
+ my $urls = '(' . join ('|', qw{
+ http
+ telnet
+ mailto
+ news
+ gopher
+ file
+ wais
+ ftp
+ } )
+ . ')';
+
+ my $ltrs = '\w';
+ my $gunk = '/#~:.?+=&%@!\-';
+ my $punc = '.:!?\-;';
+ my $any = "${ltrs}${gunk}${punc}";
+
+ $rest =~ s{
+ \b # start at word boundary
+ ( # begin $1 {
+ $urls : # need resource and a colon
+ (?!:) # Ignore File::, among others.
+ [$any] +? # followed by one or more of any valid
+ # character, but be conservative and
+ # take only what you need to....
+ ) # end $1 }
+ (?=
+ &quot; &gt; # maybe pre-quoted '<a href="...">'
+ | # or:
+ [$punc]* # 0 or more punctuation
+ (?: # followed
+ [^$any] # by a non-url char
+ | # or
+ $ # end of the string
+ ) #
+ | # or else
+ $ # then end of the string
+ )
+ }{<a href="$1">$1</a>}igox;
+
+ # text should be as it is (verbatim)
+ $$text = $rest;
+}
+
+
+#
+# pure text processing
+#
+# pure_text/inIS_text: differ with respect to automatic C<> recognition.
+# we don't want this to happen within IS
+#
+sub pure_text($){
+ my $text = shift();
+ process_puretext( $text, 1 );
+}
+
+sub inIS_text($){
+ my $text = shift();
+ process_puretext( $text, 0 );
+}
+
+#
+# process_puretext - process pure text (without pod-escapes) converting
+# double-quotes and handling implicit C<> links.
+#
+sub process_puretext {
+ my($text, $notinIS) = @_;
+
+ ## Guessing at func() or [\$\@%&]*var references in plain text is destined
+ ## to produce some strange looking ref's. uncomment to disable:
+ ## $notinIS = 0;
+
+ my(@words, $lead, $trail);
+
+ # keep track of leading and trailing white-space
+ $lead = ($text =~ s/\A(\s+)//s ? $1 : "");
+ $trail = ($text =~ s/(\s+)\Z//s ? $1 : "");
+
+ # split at space/non-space boundaries
+ @words = split( /(?<=\s)(?=\S)|(?<=\S)(?=\s)/, $text );
+
+ # process each word individually
+ foreach my $word (@words) {
+ # skip space runs
+ next if $word =~ /^\s*$/;
+ # see if we can infer a link or a function call
+ #
+ # NOTE: This is a word based search, it won't automatically
+ # mark "substr($var, 1, 2)" because the 1st word would be "substr($var"
+ # User has to enclose those with proper C<>
+
+ if( $notinIS && $word =~
+ m/
+ ^([a-z_]{2,}) # The function name
+ \(
+ ([0-9][a-z]* # Manual page(1) or page(1M)
+ |[^)]*[\$\@\%][^)]+ # ($foo), (1, @foo), (%hash)
+ | # ()
+ )
+ \)
+ ([.,;]?)$ # a possible punctuation follows
+ /xi
+ ) {
+ # has parenthesis so should have been a C<> ref
+ ## try for a pagename (perlXXX(1))?
+ my( $func, $args, $rest ) = ( $1, $2, $3 || '' );
+ if( $args =~ /^\d+$/ ){
+ my $url = page_sect( $word, '' );
+ if( defined $url ){
+ $word = qq(<a href="$url" class="man">the $word manpage</a>$rest);
+ next;
+ }
+ }
+ ## try function name for a link, append tt'ed argument list
+ $word = emit_C( $func, '', "($args)") . $rest;
+
+#### disabled. either all (including $\W, $\w+{.*} etc.) or nothing.
+## } elsif( $notinIS && $word =~ /^[\$\@%&*]+\w+$/) {
+## # perl variables, should be a C<> ref
+## $word = emit_C( $word );
+
+ } elsif ($word =~ m,^\w+://\w,) {
+ # looks like a URL
+ # Don't relativize it: leave it as the author intended
+ $word = qq(<a href="$word">$word</a>);
+ } elsif ($word =~ /[\w.-]+\@[\w-]+\.\w/) {
+ # looks like an e-mail address
+ my ($w1, $w2, $w3) = ("", $word, "");
+ ($w1, $w2, $w3) = ("(", $1, ")$2") if $word =~ /^\((.*?)\)(,?)/;
+ ($w1, $w2, $w3) = ("&lt;", $1, "&gt;$2") if $word =~ /^<(.*?)>(,?)/;
+ $word = qq($w1<a href="mailto:$w2">$w2</a>$w3);
+ } else {
+ $word = html_escape($word) if $word =~ /["&<>]/;
+ }
+ }
+
+ # put everything back together
+ return $lead . join( '', @words ) . $trail;
+}
+
+
+#
+# process_text - handles plaintext that appears in the input pod file.
+# there may be pod commands embedded within the text so those must be
+# converted to html commands.
+#
+
+sub process_text1($$;$$);
+sub pattern ($) { $_[0] ? '\s+'.('>' x ($_[0] + 1)) : '>' }
+sub closing ($) { local($_) = shift; (defined && s/\s+\z//) ? length : 0 }
+
+sub process_text {
+ return if $Ignore;
+ my( $tref ) = @_;
+ my $res = process_text1( 0, $tref );
+ $res =~ s/\s+$//s;
+ $$tref = $res;
+}
+
+sub process_text_rfc_links {
+ my $text = shift;
+
+ # For every "RFCnnnn" or "RFC nnn", link it to the authoritative
+ # ource. Do not use the /i modifier here. Require "RFC" to be written in
+ # in capital letters.
+
+ $text =~ s{
+ (?<=[^<>[:alpha:]]) # Make sure this is not an URL already
+ (RFC\s*([0-9]{1,5}))(?![0-9]) # max 5 digits
+ }
+ {<a href="http://www.ietf.org/rfc/rfc$2.txt" class="rfc">$1</a>}gx;
+
+ $text;
+}
+
+sub process_text1($$;$$){
+ my( $lev, $rstr, $func, $closing ) = @_;
+ my $res = '';
+
+ unless (defined $func) {
+ $func = '';
+ $lev++;
+ }
+
+ if( $func eq 'B' ){
+ # B<text> - boldface
+ $res = '<strong>' . process_text1( $lev, $rstr ) . '</strong>';
+
+ } elsif( $func eq 'C' ){
+ # C<code> - can be a ref or <code></code>
+ # need to extract text
+ my $par = go_ahead( $rstr, 'C', $closing );
+
+ ## clean-up of the link target
+ my $text = depod( $par );
+
+ ### my $x = $par =~ /[BI]</ ? 'yes' : 'no' ;
+ ### print STDERR "-->call emit_C($par) lev=$lev, par with BI=$x\n";
+
+ $res = emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
+
+ } elsif( $func eq 'E' ){
+ # E<x> - convert to character
+ $$rstr =~ s/^([^>]*)>//;
+ my $escape = $1;
+ $escape =~ s/^0?x([\dA-F]+)$/#x$1/i
+ or $escape =~ s/^0([0-7]+)$/'#'.oct($1)/ei
+ or $escape =~ s/^(\d+)$/#$1/;
+ $res = "&$escape;";
+
+ } elsif( $func eq 'F' ){
+ # F<filename> - italicize
+ $res = '<em class="file">' . process_text1( $lev, $rstr ) . '</em>';
+
+ } elsif( $func eq 'I' ){
+ # I<text> - italicize
+ $res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
+
+ } elsif( $func eq 'L' ){
+ # L<link> - link
+ ## L<text|cross-ref> => produce text, use cross-ref for linking
+ ## L<cross-ref> => make text from cross-ref
+ ## need to extract text
+ my $par = go_ahead( $rstr, 'L', $closing );
+
+ # some L<>'s that shouldn't be:
+ # a) full-blown URL's are emitted as-is
+ if( $par =~ m{^\w+://}s ){
+ return make_URL_href( $par );
+ }
+ # b) C<...> is stripped and treated as C<>
+ if( $par =~ /^C<(.*)>$/ ){
+ my $text = depod( $1 );
+ return emit_C( $text, $lev > 1 || ($par =~ /[BI]</) );
+ }
+
+ # analyze the contents
+ $par =~ s/\n/ /g; # undo word-wrapped tags
+ my $opar = $par;
+ my $linktext;
+ if( $par =~ s{^([^|]+)\|}{} ){
+ $linktext = $1;
+ }
+
+ # make sure sections start with a /
+ $par =~ s{^"}{/"};
+
+ my( $page, $section, $ident );
+
+ # check for link patterns
+ if( $par =~ m{^([^/]+?)/(?!")(.*?)$} ){ # name/ident
+ # we've got a name/ident (no quotes)
+ if (length $2) {
+ ( $page, $ident ) = ( $1, $2 );
+ } else {
+ ( $page, $section ) = ( $1, $2 );
+ }
+ ### print STDERR "--> L<$par> to page $page, ident $ident\n";
+
+ } elsif( $par =~ m{^(.*?)/"?(.*?)"?$} ){ # [name]/"section"
+ # even though this should be a "section", we go for ident first
+ ( $page, $ident ) = ( $1, $2 );
+ ### print STDERR "--> L<$par> to page $page, section $section\n";
+
+ } elsif( $par =~ /\s/ ){ # this must be a section with missing quotes
+ ( $page, $section ) = ( '', $par );
+ ### print STDERR "--> L<$par> to void page, section $section\n";
+
+ } else {
+ ( $page, $section ) = ( $par, '' );
+ ### print STDERR "--> L<$par> to page $par, void section\n";
+ }
+
+ # now, either $section or $ident is defined. the convoluted logic
+ # below tries to resolve L<> according to what the user specified.
+ # failing this, we try to find the next best thing...
+ my( $url, $ltext, $fid );
+
+ RESOLVE: {
+ if( defined $ident ){
+ ## try to resolve $ident as an item
+ ( $url, $fid ) = coderef( $page, $ident );
+ if( $url ){
+ if( ! defined( $linktext ) ){
+ $linktext = $ident;
+ $linktext .= " in " if $ident && $page;
+ $linktext .= "the $page manpage" if $page;
+ }
+ ### print STDERR "got coderef url=$url\n";
+ last RESOLVE;
+ }
+ ## no luck: go for a section (auto-quoting!)
+ $section = $ident;
+ }
+ ## now go for a section
+ my $htmlsection = htmlify( $section );
+ $url = page_sect( $page, $htmlsection );
+ if( $url ){
+ if( ! defined( $linktext ) ){
+ $linktext = $section;
+ $linktext .= " in " if $section && $page;
+ $linktext .= "the $page manpage" if $page;
+ }
+ ### print STDERR "got page/section url=$url\n";
+ last RESOLVE;
+ }
+ ## no luck: go for an ident
+ if( $section ){
+ $ident = $section;
+ } else {
+ $ident = $page;
+ $page = undef();
+ }
+ ( $url, $fid ) = coderef( $page, $ident );
+ if( $url ){
+ if( ! defined( $linktext ) ){
+ $linktext = $ident;
+ $linktext .= " in " if $ident && $page;
+ $linktext .= "the $page manpage" if $page;
+ }
+ ### print STDERR "got section=>coderef url=$url\n";
+ last RESOLVE;
+ }
+
+ # warning; show some text.
+ $linktext = $opar unless defined $linktext;
+ warn "$0: $Podfile: cannot resolve L<$opar> in paragraph $Paragraph.\n" unless $Quiet;
+ }
+
+ # now we have a URL or just plain code
+ $$rstr = $linktext . '>' . $$rstr;
+ if( defined( $url ) ){
+ $res = "<a href=\"$url\">" . process_text1( $lev, $rstr ) . '</a>';
+ } else {
+ $res = '<em>' . process_text1( $lev, $rstr ) . '</em>';
+ }
+
+ } elsif( $func eq 'S' ){
+ # S<text> - non-breaking spaces
+ $res = process_text1( $lev, $rstr );
+ $res =~ s/ /&nbsp;/g;
+
+ } elsif( $func eq 'X' ){
+ # X<> - ignore
+ warn "$0: $Podfile: invalid X<> in paragraph $Paragraph.\n"
+ unless $$rstr =~ s/^[^>]*>// or $Quiet;
+ } elsif( $func eq 'Z' ){
+ # Z<> - empty
+ warn "$0: $Podfile: invalid Z<> in paragraph $Paragraph.\n"
+ unless $$rstr =~ s/^>// or $Quiet;
+
+ } else {
+ my $term = pattern $closing;
+ while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)//s ){
+ # all others: either recurse into new function or
+ # terminate at closing angle bracket(s)
+ my $pt = $1;
+ $pt .= $2 if !$3 && $lev == 1;
+ $res .= $lev == 1 ? pure_text( $pt ) : inIS_text( $pt );
+ return $res if !$3 && $lev > 1;
+ if( $3 ){
+ $res .= process_text1( $lev, $rstr, $3, closing $4 );
+ }
+ }
+ if( $lev == 1 ){
+ $res .= pure_text( $$rstr );
+ } elsif( ! $Quiet ) {
+ my $snippet = substr($$rstr,0,60);
+ warn "$0: $Podfile: undelimited $func<> in paragraph $Paragraph: '$snippet'.\n"
+
+ }
+ $res = process_text_rfc_links($res);
+ }
+ return $res;
+}
+
+#
+# go_ahead: extract text of an IS (can be nested)
+#
+sub go_ahead($$$){
+ my( $rstr, $func, $closing ) = @_;
+ my $res = '';
+ my @closing = ($closing);
+ while( $$rstr =~
+ s/\A(.*?)(([BCEFILSXZ])<(<+\s+)?|@{[pattern $closing[0]]})//s ){
+ $res .= $1;
+ unless( $3 ){
+ shift @closing;
+ return $res unless @closing;
+ } else {
+ unshift @closing, closing $4;
+ }
+ $res .= $2;
+ }
+ unless ($Quiet) {
+ my $snippet = substr($$rstr,0,60);
+ warn "$0: $Podfile: undelimited $func<> in paragraph $Paragraph (go_ahead): '$snippet'.\n"
+ }
+ return $res;
+}
+
+#
+# emit_C - output result of C<text>
+# $text is the depod-ed text
+#
+sub emit_C($;$$){
+ my( $text, $nocode, $args ) = @_;
+ $args = '' unless defined $args;
+ my $res;
+ my( $url, $fid ) = coderef( undef(), $text );
+
+ # need HTML-safe text
+ my $linktext = html_escape( "$text$args" );
+
+ if( defined( $url ) &&
+ (!defined( $EmittedItem ) || $EmittedItem ne $fid ) ){
+ $res = "<a href=\"$url\"><code>$linktext</code></a>";
+ } elsif( 0 && $nocode ){
+ $res = $linktext;
+ } else {
+ $res = "<code>$linktext</code>";
+ }
+ return $res;
+}
+
+#
+# html_escape: make text safe for HTML
+#
+sub html_escape {
+ my $rest = $_[0];
+ $rest =~ s/&/&amp;/g;
+ $rest =~ s/</&lt;/g;
+ $rest =~ s/>/&gt;/g;
+ $rest =~ s/"/&quot;/g;
+ # &apos; is only in XHTML, not HTML4. Be conservative
+ #$rest =~ s/'/&apos;/g;
+ return $rest;
+}
+
+
+#
+# dosify - convert filenames to 8.3
+#
+sub dosify {
+ my($str) = @_;
+ return lc($str) if $^O eq 'VMS'; # VMS just needs casing
+ if ($Is83) {
+ $str = lc $str;
+ $str =~ s/(\.\w+)/substr ($1,0,4)/ge;
+ $str =~ s/(\w+)/substr ($1,0,8)/ge;
+ }
+ return $str;
+}
+
+#
+# page_sect - make a URL from the text of a L<>
+#
+sub page_sect($$) {
+ my( $page, $section ) = @_;
+ my( $linktext, $page83, $link); # work strings
+
+ # check if we know that this is a section in this page
+ if (!defined $Pages{$page} && defined $Sections{$page}) {
+ $section = $page;
+ $page = "";
+ ### print STDERR "reset page='', section=$section\n";
+ }
+
+ $page83=dosify($page);
+ $page=$page83 if (defined $Pages{$page83});
+ if ($page eq "") {
+ $link = "#" . anchorify( $section );
+ } elsif ( $page =~ /::/ ) {
+ $page =~ s,::,/,g;
+ # Search page cache for an entry keyed under the html page name,
+ # then look to see what directory that page might be in. NOTE:
+ # this will only find one page. A better solution might be to produce
+ # an intermediate page that is an index to all such pages.
+ my $page_name = $page ;
+ $page_name =~ s,^.*/,,s ;
+ if ( defined( $Pages{ $page_name } ) &&
+ $Pages{ $page_name } =~ /([^:]*$page)\.(?:pod|pm):/
+ ) {
+ $page = $1 ;
+ }
+ else {
+ # NOTE: This branch assumes that all A::B pages are located in
+ # $Htmlroot/A/B.html . This is often incorrect, since they are
+ # often in $Htmlroot/lib/A/B.html or such like. Perhaps we could
+ # analyze the contents of %Pages and figure out where any
+ # cousins of A::B are, then assume that. So, if A::B isn't found,
+ # but A::C is found in lib/A/C.pm, then A::B is assumed to be in
+ # lib/A/B.pm. This is also limited, but it's an improvement.
+ # Maybe a hints file so that the links point to the correct places
+ # nonetheless?
+
+ }
+ $link = "$Htmlroot/$page.html";
+ $link .= "#" . anchorify( $section ) if ($section);
+ } elsif (!defined $Pages{$page}) {
+ $link = "";
+ } else {
+ $section = anchorify( $section ) if $section ne "";
+ ### print STDERR "...section=$section\n";
+
+ # if there is a directory by the name of the page, then assume that an
+ # appropriate section will exist in the subdirectory
+# if ($section ne "" && $Pages{$page} =~ /([^:]*[^(\.pod|\.pm)]):/) {
+ if ($section ne "" && $Pages{$page} =~ /([^:]*(?<!\.pod)(?<!\.pm)):/) {
+ $link = "$Htmlroot/$1/$section.html";
+ ### print STDERR "...link=$link\n";
+
+ # since there is no directory by the name of the page, the section will
+ # have to exist within a .html of the same name. thus, make sure there
+ # is a .pod or .pm that might become that .html
+ } else {
+ $section = "#$section" if $section;
+ ### print STDERR "...section=$section\n";
+
+ # check if there is a .pod with the page name.
+ # for L<Foo>, Foo.(pod|pm) is preferred to A/Foo.(pod|pm)
+ if ($Pages{$page} =~ /([^:]*)\.(?:pod|pm):/) {
+ $link = "$Htmlroot/$1.html$section";
+ } else {
+ $link = "";
+ }
+ }
+ }
+
+ if ($link) {
+ # Here, we take advantage of the knowledge that $Htmlfileurl ne ''
+ # implies $Htmlroot eq ''. This means that the link in question
+ # needs a prefix of $Htmldir if it begins with '/'. The test for
+ # the initial '/' is done to avoid '#'-only links, and to allow
+ # for other kinds of links, like file:, ftp:, etc.
+ my $url ;
+ if ( $Htmlfileurl ne '' ) {
+ $link = "$Htmldir$link" if $link =~ m{^/}s;
+ $url = relativize_url( $link, $Htmlfileurl );
+# print( " b: [$link,$Htmlfileurl,$url]\n" );
+ }
+ else {
+ $url = $link ;
+ }
+ return $url;
+
+ } else {
+ return undef();
+ }
+}
+
+#
+# relativize_url - convert an absolute URL to one relative to a base URL.
+# Assumes both end in a filename.
+#
+sub relativize_url {
+ my ($dest,$source) = @_ ;
+
+ my ($dest_volume,$dest_directory,$dest_file) =
+ File::Spec::Unix->splitpath( $dest ) ;
+ $dest = File::Spec::Unix->catpath( $dest_volume, $dest_directory, '' ) ;
+
+ my ($source_volume,$source_directory,$source_file) =
+ File::Spec::Unix->splitpath( $source ) ;
+ $source = File::Spec::Unix->catpath( $source_volume, $source_directory, '' ) ;
+
+ my $rel_path = '' ;
+ if ( $dest ne '' ) {
+ $rel_path = File::Spec::Unix->abs2rel( $dest, $source ) ;
+ }
+
+ if ( $rel_path ne '' &&
+ substr( $rel_path, -1 ) ne '/' &&
+ substr( $dest_file, 0, 1 ) ne '#'
+ ) {
+ $rel_path .= "/$dest_file" ;
+ }
+ else {
+ $rel_path .= "$dest_file" ;
+ }
+
+ return $rel_path ;
+}
+
+
+#
+# coderef - make URL from the text of a C<>
+#
+sub coderef($$){
+ my( $page, $item ) = @_;
+ my( $url );
+
+ my $fid = fragment_id( $item );
+
+ if( defined( $page ) && $page ne "" ){
+ # we have been given a $page...
+ $page =~ s{::}{/}g;
+
+ Carp::confess("Undefined fragment '$item' from fragment_id() in coderef() in $Podfile")
+ if !defined $fid;
+ # Do we take it? Item could be a section!
+ my $base = $Items{$fid} || "";
+ $base =~ s{[^/]*/}{};
+ if( $base ne "$page.html" ){
+ ### print STDERR "coderef( $page, $item ): items{$fid} = $Items{$fid} = $base => discard page!\n";
+ $page = undef();
+ }
+
+ } else {
+ # no page - local items precede cached items
+ if( defined( $fid ) ){
+ if( exists $Local_Items{$fid} ){
+ $page = $Local_Items{$fid};
+ } else {
+ $page = $Items{$fid};
+ }
+ }
+ }
+
+ # if there was a pod file that we found earlier with an appropriate
+ # =item directive, then create a link to that page.
+ if( defined $page ){
+ if( $page ){
+ if( exists $Pages{$page} and $Pages{$page} =~ /([^:.]*)\.[^:]*:/){
+ $page = $1 . '.html';
+ }
+ my $link = "$Htmlroot/$page#" . anchorify($fid);
+
+ # Here, we take advantage of the knowledge that $Htmlfileurl
+ # ne '' implies $Htmlroot eq ''.
+ if ( $Htmlfileurl ne '' ) {
+ $link = "$Htmldir$link" ;
+ $url = relativize_url( $link, $Htmlfileurl ) ;
+ } else {
+ $url = $link ;
+ }
+ } else {
+ $url = "#" . anchorify($fid);
+ }
+
+ confess "url has space: $url" if $url =~ /"[^"]*\s[^"]*"/;
+ }
+ return( $url, $fid );
+}
+
+
+
+#
+# Adapted from Nick Ing-Simmons' PodToHtml package.
+sub relative_url {
+ my $source_file = shift ;
+ my $destination_file = shift;
+
+ my $source = URI::file->new_abs($source_file);
+ my $uo = URI::file->new($destination_file,$source)->abs;
+ return $uo->rel->as_string;
+}
+
+
+#
+# finish_list - finish off any pending HTML lists. this should be called
+# after the entire pod file has been read and converted.
+#
+sub finish_list {
+ if( $Listlevel ){
+ warn "$0: $Podfile: unterminated list(s) at =head in paragraph $Paragraph. ignoring.\n" unless $Quiet;
+ while( $Listlevel ){
+ process_back();
+ }
+ }
+}
+
+#
+# htmlify - converts a pod section specification to a suitable section
+# specification for HTML. Note that we keep spaces and special characters
+# except ", ? (Netscape problem) and the hyphen (writer's problem...).
+#
+sub htmlify {
+ my( $heading) = @_;
+ $heading =~ s/(\s+)/ /g;
+ $heading =~ s/\s+\Z//;
+ $heading =~ s/\A\s+//;
+ # The hyphen is a disgrace to the English language.
+ # $heading =~ s/[-"?]//g;
+ $heading =~ s/["?]//g;
+ $heading = lc( $heading );
+ return $heading;
+}
+
+#
+# similar to htmlify, but turns non-alphanumerics into underscores
+#
+sub anchorify {
+ my ($anchor) = @_;
+ $anchor = htmlify($anchor);
+ $anchor =~ s/\W/_/g;
+ return $anchor;
+}
+
+#
+# depod - convert text by eliminating all interior sequences
+# Note: can be called with copy or modify semantics
+#
+my %E2c;
+$E2c{lt} = '<';
+$E2c{gt} = '>';
+$E2c{sol} = '/';
+$E2c{verbar} = '|';
+$E2c{amp} = '&'; # in Tk's pods
+
+sub depod1($;$$);
+
+sub depod($){
+ my $string;
+ if( ref( $_[0] ) ){
+ $string = ${$_[0]};
+ ${$_[0]} = depod1( \$string );
+ } else {
+ $string = $_[0];
+ depod1( \$string );
+ }
+}
+
+sub depod1($;$$){
+ my( $rstr, $func, $closing ) = @_;
+ my $res = '';
+ return $res unless defined $$rstr;
+ if( ! defined( $func ) ){
+ # skip to next begin of an interior sequence
+ while( $$rstr =~ s/\A(.*?)([BCEFILSXZ])<(<+[^\S\n]+)?//s ){
+ # recurse into its text
+ $res .= $1 . depod1( $rstr, $2, closing $3);
+ }
+ $res .= $$rstr;
+ } elsif( $func eq 'E' ){
+ # E<x> - convert to character
+ $$rstr =~ s/^([^>]*)>//;
+ $res .= $E2c{$1} || "";
+ } elsif( $func eq 'X' ){
+ # X<> - ignore
+ $$rstr =~ s/^[^>]*>//;
+ } elsif( $func eq 'Z' ){
+ # Z<> - empty
+ $$rstr =~ s/^>//;
+ } else {
+ # all others: either recurse into new function or
+ # terminate at closing angle bracket
+ my $term = pattern $closing;
+ while( $$rstr =~ s/\A(.*?)(([BCEFILSXZ])<(<+[^\S\n]+)?|$term)//s ){
+ $res .= $1;
+ last unless $3;
+ $res .= depod1( $rstr, $3, closing $4 );
+ }
+ ## If we're here and $2 ne '>': undelimited interior sequence.
+ ## Ignored, as this is called without proper indication of where we are.
+ ## Rely on process_text to produce diagnostics.
+ }
+ return $res;
+}
+
+{
+ my %seen; # static fragment record hash
+
+sub fragment_id_readable {
+ my $text = shift;
+ my $generate = shift; # optional flag
+
+ my $orig = $text;
+
+ # leave the words for the fragment identifier,
+ # change everything else to underbars.
+ $text =~ s/[^A-Za-z0-9_]+/_/g; # do not use \W to avoid locale dependency.
+ $text =~ s/_{2,}/_/g;
+ $text =~ s/\A_//;
+ $text =~ s/_\Z//;
+
+ unless ($text)
+ {
+ # Nothing left after removing punctuation, so leave it as is
+ # E.g. if option is named: "=item -#"
+
+ $text = $orig;
+ }
+
+ if ($generate) {
+ if ( exists $seen{$text} ) {
+ # This already exists, make it unique
+ $seen{$text}++;
+ $text = $text . $seen{$text};
+ } else {
+ $seen{$text} = 1; # first time seen this fragment
+ }
+ }
+
+ $text;
+}}
+
+my @HC;
+sub fragment_id_obfuscated { # This was the old "_2d_2d__"
+ my $text = shift;
+ my $generate = shift; # optional flag
+
+ # text? Normalize by obfuscating the fragment id to make it unique
+ $text =~ s/\s+/_/sg;
+
+ $text =~ s{(\W)}{
+ defined( $HC[ord($1)] ) ? $HC[ord($1)]
+ : ( $HC[ord($1)] = sprintf( "%%%02X", ord($1) ) ) }gxe;
+ $text = substr( $text, 0, 50 );
+
+ $text;
+}
+
+#
+# fragment_id - construct a fragment identifier from:
+# a) =item text
+# b) contents of C<...>
+#
+
+sub fragment_id {
+ my $text = shift;
+ my $generate = shift; # optional flag
+
+ $text =~ s/\s+\Z//s;
+ if( $text ){
+ # a method or function?
+ return $1 if $text =~ /(\w+)\s*\(/;
+ return $1 if $text =~ /->\s*(\w+)\s*\(?/;
+
+ # a variable name?
+ return $1 if $text =~ /^([\$\@%*]\S+)/;
+
+ # some pattern matching operator?
+ return $1 if $text =~ m|^(\w+/).*/\w*$|;
+
+ # fancy stuff... like "do { }"
+ return $1 if $text =~ m|^(\w+)\s*{.*}$|;
+
+ # honour the perlfunc manpage: func [PAR[,[ ]PAR]...]
+ # and some funnies with ... Module ...
+ return $1 if $text =~ m{^([a-z\d_]+)(\s+[A-Z,/& ][A-Z\d,/& ]*)?$};
+ return $1 if $text =~ m{^([a-z\d]+)\s+Module(\s+[A-Z\d,/& ]+)?$};
+
+ return fragment_id_readable($text, $generate);
+ } else {
+ return;
+ }
+}
+
+#
+# make_URL_href - generate HTML href from URL
+# Special treatment for CGI queries.
+#
+sub make_URL_href($){
+ my( $url ) = @_;
+ if( $url !~
+ s{^(http:[-\w/#~:.+=&%@!]+)(\?.*)$}{<a href="$1$2">$1</a>}i ){
+ $url = "<a href=\"$url\">$url</a>";
+ }
+ return $url;
+}
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Pod/InputObjects.pm b/Master/tlpkg/tlperl/lib/Pod/InputObjects.pm
new file mode 100644
index 00000000000..13a86188bcb
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/InputObjects.pm
@@ -0,0 +1,936 @@
+#############################################################################
+# Pod/InputObjects.pm -- package which defines objects for input streams
+# and paragraphs and commands when parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::InputObjects;
+use strict;
+
+use vars qw($VERSION);
+$VERSION = '1.31'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::InputObjects - objects representing POD input paragraphs, commands, etc.
+
+=head1 SYNOPSIS
+
+ use Pod::InputObjects;
+
+=head1 REQUIRES
+
+perl5.004, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+This module defines some basic input objects used by B<Pod::Parser> when
+reading and parsing POD text from an input source. The following objects
+are defined:
+
+=over 4
+
+=begin __PRIVATE__
+
+=item package B<Pod::InputSource>
+
+An object corresponding to a source of POD input text. It is mostly a
+wrapper around a filehandle or C<IO::Handle>-type object (or anything
+that implements the C<getline()> method) which keeps track of some
+additional information relevant to the parsing of PODs.
+
+=end __PRIVATE__
+
+=item package B<Pod::Paragraph>
+
+An object corresponding to a paragraph of POD input text. It may be a
+plain paragraph, a verbatim paragraph, or a command paragraph (see
+L<perlpod>).
+
+=item package B<Pod::InteriorSequence>
+
+An object corresponding to an interior sequence command from the POD
+input text (see L<perlpod>).
+
+=item package B<Pod::ParseTree>
+
+An object corresponding to a tree of parsed POD text. Each "node" in
+a parse-tree (or I<ptree>) is either a text-string or a reference to
+a B<Pod::InteriorSequence> object. The nodes appear in the parse-tree
+in the order in which they were parsed from left-to-right.
+
+=back
+
+Each of these input objects are described in further detail in the
+sections which follow.
+
+=cut
+
+#############################################################################
+
+package Pod::InputSource;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<Pod::InputSource>
+
+This object corresponds to an input source or stream of POD
+documentation. When parsing PODs, it is necessary to associate and store
+certain context information with each input source. All of this
+information is kept together with the stream itself in one of these
+C<Pod::InputSource> objects. Each such object is merely a wrapper around
+an C<IO::Handle> object of some kind (or at least something that
+implements the C<getline()> method). They have the following
+methods/attributes:
+
+=end __PRIVATE__
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<new()>
+
+ my $pod_input1 = Pod::InputSource->new(-handle => $filehandle);
+ my $pod_input2 = new Pod::InputSource(-handle => $filehandle,
+ -name => $name);
+ my $pod_input3 = new Pod::InputSource(-handle => \*STDIN);
+ my $pod_input4 = Pod::InputSource->new(-handle => \*STDIN,
+ -name => "(STDIN)");
+
+This is a class method that constructs a C<Pod::InputSource> object and
+returns a reference to the new input source object. It takes one or more
+keyword arguments in the form of a hash. The keyword C<-handle> is
+required and designates the corresponding input handle. The keyword
+C<-name> is optional and specifies the name associated with the input
+handle (typically a file name).
+
+=end __PRIVATE__
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = { -name => '(unknown)',
+ -handle => undef,
+ -was_cutting => 0,
+ @_ };
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<name()>
+
+ my $filename = $pod_input->name();
+ $pod_input->name($new_filename_to_use);
+
+This method gets/sets the name of the input source (usually a filename).
+If no argument is given, it returns a string containing the name of
+the input source; otherwise it sets the name of the input source to the
+contents of the given argument.
+
+=end __PRIVATE__
+
+=cut
+
+sub name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## allow 'filename' as an alias for 'name'
+*filename = \&name;
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<handle()>
+
+ my $handle = $pod_input->handle();
+
+Returns a reference to the handle object from which input is read (the
+one used to contructed this input source object).
+
+=end __PRIVATE__
+
+=cut
+
+sub handle {
+ return $_[0]->{'-handle'};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head2 B<was_cutting()>
+
+ print "Yes.\n" if ($pod_input->was_cutting());
+
+The value of the C<cutting> state (that the B<cutting()> method would
+have returned) immediately before any input was read from this input
+stream. After all input from this stream has been read, the C<cutting>
+state is restored to this value.
+
+=end __PRIVATE__
+
+=cut
+
+sub was_cutting {
+ (@_ > 1) and $_[0]->{-was_cutting} = $_[1];
+ return $_[0]->{-was_cutting};
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::Paragraph;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::Paragraph>
+
+An object representing a paragraph of POD input text.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::Paragraph-E<gt>B<new()>
+
+ my $pod_para1 = Pod::Paragraph->new(-text => $text);
+ my $pod_para2 = Pod::Paragraph->new(-name => $cmd,
+ -text => $text);
+ my $pod_para3 = new Pod::Paragraph(-text => $text);
+ my $pod_para4 = new Pod::Paragraph(-name => $cmd,
+ -text => $text);
+ my $pod_para5 = Pod::Paragraph->new(-name => $cmd,
+ -text => $text,
+ -file => $filename,
+ -line => $line_number);
+
+This is a class method that constructs a C<Pod::Paragraph> object and
+returns a reference to the new paragraph object. It may be given one or
+two keyword arguments. The C<-text> keyword indicates the corresponding
+text of the POD paragraph. The C<-name> keyword indicates the name of
+the corresponding POD command, such as C<head1> or C<item> (it should
+I<not> contain the C<=> prefix); this is needed only if the POD
+paragraph corresponds to a command paragraph. The C<-file> and C<-line>
+keywords indicate the filename and line number corresponding to the
+beginning of the paragraph
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = {
+ -name => undef,
+ -text => (@_ == 1) ? shift : undef,
+ -file => '<unknown-file>',
+ -line => 0,
+ -prefix => '=',
+ -separator => ' ',
+ -ptree => [],
+ @_
+ };
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_name()>
+
+ my $para_cmd = $pod_para->cmd_name();
+
+If this paragraph is a command paragraph, then this method will return
+the name of the command (I<without> any leading C<=> prefix).
+
+=cut
+
+sub cmd_name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<text()>
+
+ my $para_text = $pod_para->text();
+
+This method will return the corresponding text of the paragraph.
+
+=cut
+
+sub text {
+ (@_ > 1) and $_[0]->{'-text'} = $_[1];
+ return $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<raw_text()>
+
+ my $raw_pod_para = $pod_para->raw_text();
+
+This method will return the I<raw> text of the POD paragraph, exactly
+as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ return $_[0]->{'-text'} unless (defined $_[0]->{'-name'});
+ return $_[0]->{'-prefix'} . $_[0]->{'-name'} .
+ $_[0]->{'-separator'} . $_[0]->{'-text'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_prefix()>
+
+ my $prefix = $pod_para->cmd_prefix();
+
+If this paragraph is a command paragraph, then this method will return
+the prefix used to denote the command (which should be the string "="
+or "==").
+
+=cut
+
+sub cmd_prefix {
+ return $_[0]->{'-prefix'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<cmd_separator()>
+
+ my $separator = $pod_para->cmd_separator();
+
+If this paragraph is a command paragraph, then this method will return
+the text used to separate the command name from the rest of the
+paragraph (if any).
+
+=cut
+
+sub cmd_separator {
+ return $_[0]->{'-separator'};
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<parse_tree()>
+
+ my $ptree = $pod_parser->parse_text( $pod_para->text() );
+ $pod_para->parse_tree( $ptree );
+ $ptree = $pod_para->parse_tree();
+
+This method will get/set the corresponding parse-tree of the paragraph's text.
+
+=cut
+
+sub parse_tree {
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+}
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_para-E<gt>B<file_line()>
+
+ my ($filename, $line_number) = $pod_para->file_line();
+ my $position = $pod_para->file_line();
+
+Returns the current filename and line number for the paragraph
+object. If called in a list context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+ my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+ $_[0]->{'-line'} || 0);
+ return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::InteriorSequence;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::InteriorSequence>
+
+An object representing a POD interior sequence command.
+It has the following methods/attributes:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::InteriorSequence-E<gt>B<new()>
+
+ my $pod_seq1 = Pod::InteriorSequence->new(-name => $cmd
+ -ldelim => $delimiter);
+ my $pod_seq2 = new Pod::InteriorSequence(-name => $cmd,
+ -ldelim => $delimiter);
+ my $pod_seq3 = new Pod::InteriorSequence(-name => $cmd,
+ -ldelim => $delimiter,
+ -file => $filename,
+ -line => $line_number);
+
+ my $pod_seq4 = new Pod::InteriorSequence(-name => $cmd, $ptree);
+ my $pod_seq5 = new Pod::InteriorSequence($cmd, $ptree);
+
+This is a class method that constructs a C<Pod::InteriorSequence> object
+and returns a reference to the new interior sequence object. It should
+be given two keyword arguments. The C<-ldelim> keyword indicates the
+corresponding left-delimiter of the interior sequence (e.g. 'E<lt>').
+The C<-name> keyword indicates the name of the corresponding interior
+sequence command, such as C<I> or C<B> or C<C>. The C<-file> and
+C<-line> keywords indicate the filename and line number corresponding
+to the beginning of the interior sequence. If the C<$ptree> argument is
+given, it must be the last argument, and it must be either string, or
+else an array-ref suitable for passing to B<Pod::ParseTree::new> (or
+it may be a reference to a Pod::ParseTree object).
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ ## See if first argument has no keyword
+ if (((@_ <= 2) or (@_ % 2)) and $_[0] !~ /^-\w/) {
+ ## Yup - need an implicit '-name' before first parameter
+ unshift @_, '-name';
+ }
+
+ ## See if odd number of args
+ if ((@_ % 2) != 0) {
+ ## Yup - need an implicit '-ptree' before the last parameter
+ splice @_, $#_, 0, '-ptree';
+ }
+
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object. Note that we default
+ ## certain values by specifying them *before* the arguments passed.
+ ## If they are in the argument list, they will override the defaults.
+ my $self = {
+ -name => (@_ == 1) ? $_[0] : undef,
+ -file => '<unknown-file>',
+ -line => 0,
+ -ldelim => '<',
+ -rdelim => '>',
+ @_
+ };
+
+ ## Initialize contents if they havent been already
+ my $ptree = $self->{'-ptree'} || new Pod::ParseTree();
+ if ( ref $ptree =~ /^(ARRAY)?$/ ) {
+ ## We have an array-ref, or a normal scalar. Pass it as an
+ ## an argument to the ptree-constructor
+ $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree);
+ }
+ $self->{'-ptree'} = $ptree;
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<cmd_name()>
+
+ my $seq_cmd = $pod_seq->cmd_name();
+
+The name of the interior sequence command.
+
+=cut
+
+sub cmd_name {
+ (@_ > 1) and $_[0]->{'-name'} = $_[1];
+ return $_[0]->{'-name'};
+}
+
+## let name() be an alias for cmd_name()
+*name = \&cmd_name;
+
+##---------------------------------------------------------------------------
+
+## Private subroutine to set the parent pointer of all the given
+## children that are interior-sequences to be $self
+
+sub _set_child2parent_links {
+ my ($self, @children) = @_;
+ ## Make sure any sequences know who their parent is
+ for (@children) {
+ next unless (length and ref and ref ne 'SCALAR');
+ if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or
+ UNIVERSAL::can($_, 'nested'))
+ {
+ $_->nested($self);
+ }
+ }
+}
+
+## Private subroutine to unset child->parent links
+
+sub _unset_child2parent_links {
+ my $self = shift;
+ $self->{'-parent_sequence'} = undef;
+ my $ptree = $self->{'-ptree'};
+ for (@$ptree) {
+ next unless (length and ref and ref ne 'SCALAR');
+ $_->_unset_child2parent_links()
+ if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<prepend()>
+
+ $pod_seq->prepend($text);
+ $pod_seq1->prepend($pod_seq2);
+
+Prepends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub prepend {
+ my $self = shift;
+ $self->{'-ptree'}->prepend(@_);
+ _set_child2parent_links($self, @_);
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<append()>
+
+ $pod_seq->append($text);
+ $pod_seq1->append($pod_seq2);
+
+Appends the given string or parse-tree or sequence object to the parse-tree
+of this interior sequence.
+
+=cut
+
+sub append {
+ my $self = shift;
+ $self->{'-ptree'}->append(@_);
+ _set_child2parent_links($self, @_);
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<nested()>
+
+ $outer_seq = $pod_seq->nested || print "not nested";
+
+If this interior sequence is nested inside of another interior
+sequence, then the outer/parent sequence that contains it is
+returned. Otherwise C<undef> is returned.
+
+=cut
+
+sub nested {
+ my $self = shift;
+ (@_ == 1) and $self->{'-parent_sequence'} = shift;
+ return $self->{'-parent_sequence'} || undef;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<raw_text()>
+
+ my $seq_raw_text = $pod_seq->raw_text();
+
+This method will return the I<raw> text of the POD interior sequence,
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ my $self = shift;
+ my $text = $self->{'-name'} . $self->{'-ldelim'};
+ for ( $self->{'-ptree'}->children ) {
+ $text .= (ref $_) ? $_->raw_text : $_;
+ }
+ $text .= $self->{'-rdelim'};
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<left_delimiter()>
+
+ my $ldelim = $pod_seq->left_delimiter();
+
+The leftmost delimiter beginning the argument text to the interior
+sequence (should be "<").
+
+=cut
+
+sub left_delimiter {
+ (@_ > 1) and $_[0]->{'-ldelim'} = $_[1];
+ return $_[0]->{'-ldelim'};
+}
+
+## let ldelim() be an alias for left_delimiter()
+*ldelim = \&left_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<right_delimiter()>
+
+The rightmost delimiter beginning the argument text to the interior
+sequence (should be ">").
+
+=cut
+
+sub right_delimiter {
+ (@_ > 1) and $_[0]->{'-rdelim'} = $_[1];
+ return $_[0]->{'-rdelim'};
+}
+
+## let rdelim() be an alias for right_delimiter()
+*rdelim = \&right_delimiter;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<parse_tree()>
+
+ my $ptree = $pod_parser->parse_text($paragraph_text);
+ $pod_seq->parse_tree( $ptree );
+ $ptree = $pod_seq->parse_tree();
+
+This method will get/set the corresponding parse-tree of the interior
+sequence's text.
+
+=cut
+
+sub parse_tree {
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+}
+
+## let ptree() be an alias for parse_tree()
+*ptree = \&parse_tree;
+
+##---------------------------------------------------------------------------
+
+=head2 $pod_seq-E<gt>B<file_line()>
+
+ my ($filename, $line_number) = $pod_seq->file_line();
+ my $position = $pod_seq->file_line();
+
+Returns the current filename and line number for the interior sequence
+object. If called in a list context, it returns a list of two
+elements: first the filename, then the line number. If called in
+a scalar context, it returns a string containing the filename, followed
+by a colon (':'), followed by the line number.
+
+=cut
+
+sub file_line {
+ my @loc = ($_[0]->{'-file'} || '<unknown-file>',
+ $_[0]->{'-line'} || 0);
+ return (wantarray) ? @loc : join(':', @loc);
+}
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::InteriorSequence::B<DESTROY()>
+
+This method performs any necessary cleanup for the interior-sequence.
+If you override this method then it is B<imperative> that you invoke
+the parent method from within your own method, otherwise
+I<interior-sequence storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+ ## We need to get rid of all child->parent pointers throughout the
+ ## tree so their reference counts will go to zero and they can be
+ ## garbage-collected
+ _unset_child2parent_links(@_);
+}
+
+##---------------------------------------------------------------------------
+
+#############################################################################
+
+package Pod::ParseTree;
+
+##---------------------------------------------------------------------------
+
+=head1 B<Pod::ParseTree>
+
+This object corresponds to a tree of parsed POD text. As POD text is
+scanned from left to right, it is parsed into an ordered list of
+text-strings and B<Pod::InteriorSequence> objects (in order of
+appearance). A B<Pod::ParseTree> object corresponds to this list of
+strings and sequences. Each interior sequence in the parse-tree may
+itself contain a parse-tree (since interior sequences may be nested).
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head2 Pod::ParseTree-E<gt>B<new()>
+
+ my $ptree1 = Pod::ParseTree->new;
+ my $ptree2 = new Pod::ParseTree;
+ my $ptree4 = Pod::ParseTree->new($array_ref);
+ my $ptree3 = new Pod::ParseTree($array_ref);
+
+This is a class method that constructs a C<Pod::Parse_tree> object and
+returns a reference to the new parse-tree. If a single-argument is given,
+it must be a reference to an array, and is used to initialize the root
+(top) of the parse tree.
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my $this = shift;
+ my $class = ref($this) || $this;
+
+ my $self = (@_ == 1 and ref $_[0]) ? $_[0] : [];
+
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<top()>
+
+ my $top_node = $ptree->top();
+ $ptree->top( $top_node );
+ $ptree->top( @children );
+
+This method gets/sets the top node of the parse-tree. If no arguments are
+given, it returns the topmost node in the tree (the root), which is also
+a B<Pod::ParseTree>. If it is given a single argument that is a reference,
+then the reference is assumed to a parse-tree and becomes the new top node.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub top {
+ my $self = shift;
+ if (@_ > 0) {
+ @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_;
+ }
+ return $self;
+}
+
+## let parse_tree() & ptree() be aliases for the 'top' method
+*parse_tree = *ptree = \&top;
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<children()>
+
+This method gets/sets the children of the top node in the parse-tree.
+If no arguments are given, it returns the list (array) of children
+(each of which should be either a string or a B<Pod::InteriorSequence>.
+Otherwise, if arguments are given, they are treated as the new list of
+children for the top node.
+
+=cut
+
+sub children {
+ my $self = shift;
+ if (@_ > 0) {
+ @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_;
+ }
+ return @{ $self };
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<prepend()>
+
+This method prepends the given text or parse-tree to the current parse-tree.
+If the first item on the parse-tree is text and the argument is also text,
+then the text is prepended to the first item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<before>
+the current one.
+
+=cut
+
+use vars qw(@ptree); ## an alias used for performance reasons
+
+sub prepend {
+ my $self = shift;
+ local *ptree = $self;
+ for (@_) {
+ next unless length;
+ if (@ptree && !(ref $ptree[0]) && !(ref $_)) {
+ $ptree[0] = $_ . $ptree[0];
+ }
+ else {
+ unshift @ptree, $_;
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head2 $ptree-E<gt>B<append()>
+
+This method appends the given text or parse-tree to the current parse-tree.
+If the last item on the parse-tree is text and the argument is also text,
+then the text is appended to the last item (not added as a separate string).
+Otherwise the argument is added as a new string or parse-tree I<after>
+the current one.
+
+=cut
+
+sub append {
+ my $self = shift;
+ local *ptree = $self;
+ my $can_append = @ptree && !(ref $ptree[-1]);
+ for (@_) {
+ if (ref) {
+ push @ptree, $_;
+ }
+ elsif(!length) {
+ next;
+ }
+ elsif ($can_append) {
+ $ptree[-1] .= $_;
+ }
+ else {
+ push @ptree, $_;
+ }
+ }
+}
+
+=head2 $ptree-E<gt>B<raw_text()>
+
+ my $ptree_raw_text = $ptree->raw_text();
+
+This method will return the I<raw> text of the POD parse-tree
+exactly as it appeared in the input.
+
+=cut
+
+sub raw_text {
+ my $self = shift;
+ my $text = '';
+ for ( @$self ) {
+ $text .= (ref $_) ? $_->raw_text : $_;
+ }
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+## Private routines to set/unset child->parent links
+
+sub _unset_child2parent_links {
+ my $self = shift;
+ local *ptree = $self;
+ for (@ptree) {
+ next unless (defined and length and ref and ref ne 'SCALAR');
+ $_->_unset_child2parent_links()
+ if UNIVERSAL::isa($_, 'Pod::InteriorSequence');
+ }
+}
+
+sub _set_child2parent_links {
+ ## nothing to do, Pod::ParseTrees cant have parent pointers
+}
+
+=head2 Pod::ParseTree::B<DESTROY()>
+
+This method performs any necessary cleanup for the parse-tree.
+If you override this method then it is B<imperative>
+that you invoke the parent method from within your own method,
+otherwise I<parse-tree storage will not be reclaimed upon destruction!>
+
+=cut
+
+sub DESTROY {
+ ## We need to get rid of all child->parent pointers throughout the
+ ## tree so their reference counts will go to zero and they can be
+ ## garbage-collected
+ _unset_child2parent_links(@_);
+}
+
+#############################################################################
+
+=head1 SEE ALSO
+
+See L<Pod::Parser>, L<Pod::Select>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Pod/LaTeX.pm b/Master/tlpkg/tlperl/lib/Pod/LaTeX.pm
new file mode 100644
index 00000000000..9d3a905258f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/LaTeX.pm
@@ -0,0 +1,1876 @@
+package Pod::LaTeX;
+
+=head1 NAME
+
+Pod::LaTeX - Convert Pod data to formatted Latex
+
+=head1 SYNOPSIS
+
+ use Pod::LaTeX;
+ my $parser = Pod::LaTeX->new ( );
+
+ $parser->parse_from_filehandle;
+
+ $parser->parse_from_file ('file.pod', 'file.tex');
+
+=head1 DESCRIPTION
+
+C<Pod::LaTeX> is a module to convert documentation in the Pod format
+into Latex. The L<B<pod2latex>|pod2latex> X<pod2latex> command uses
+this module for translation.
+
+C<Pod::LaTeX> is a derived class from L<Pod::Select|Pod::Select>.
+
+=cut
+
+
+use strict;
+require Pod::ParseUtils;
+use base qw/ Pod::Select /;
+
+# use Data::Dumper; # for debugging
+use Carp;
+
+use vars qw/ $VERSION %HTML_Escapes @LatexSections /;
+
+$VERSION = '0.58';
+
+# Definitions of =headN -> latex mapping
+@LatexSections = (qw/
+ chapter
+ section
+ subsection
+ subsubsection
+ paragraph
+ subparagraph
+ /);
+
+# Standard escape sequences converted to Latex.
+# The Unicode name of each character is given in the comments.
+# Complete LaTeX set added by Peter Acklam.
+
+%HTML_Escapes = (
+ 'sol' => '\textfractionsolidus{}', # xxx - or should it be just '/'
+ 'verbar' => '|',
+
+ # The stuff below is based on the information available at
+ # http://www.w3.org/TR/html401/sgml/entities.html
+
+ # All characters in the range 0xA0-0xFF of the ISO 8859-1 character set.
+ # Several of these characters require the `textcomp' LaTeX package.
+ 'nbsp' => q|~|, # 0xA0 - no-break space = non-breaking space
+ 'iexcl' => q|\textexclamdown{}|, # 0xA1 - inverted exclamation mark
+ 'cent' => q|\textcent{}|, # 0xA2 - cent sign
+ 'pound' => q|\textsterling{}|, # 0xA3 - pound sign
+ 'curren' => q|\textcurrency{}|, # 0xA4 - currency sign
+ 'yen' => q|\textyen{}|, # 0xA5 - yen sign = yuan sign
+ 'brvbar' => q|\textbrokenbar{}|, # 0xA6 - broken bar = broken vertical bar
+ 'sect' => q|\textsection{}|, # 0xA7 - section sign
+ 'uml' => q|\textasciidieresis{}|, # 0xA8 - diaeresis = spacing diaeresis
+ 'copy' => q|\textcopyright{}|, # 0xA9 - copyright sign
+ 'ordf' => q|\textordfeminine{}|, # 0xAA - feminine ordinal indicator
+ 'laquo' => q|\guillemotleft{}|, # 0xAB - left-pointing double angle quotation mark = left pointing guillemet
+ 'not' => q|\textlnot{}|, # 0xAC - not sign
+ 'shy' => q|\-|, # 0xAD - soft hyphen = discretionary hyphen
+ 'reg' => q|\textregistered{}|, # 0xAE - registered sign = registered trade mark sign
+ 'macr' => q|\textasciimacron{}|, # 0xAF - macron = spacing macron = overline = APL overbar
+ 'deg' => q|\textdegree{}|, # 0xB0 - degree sign
+ 'plusmn' => q|\textpm{}|, # 0xB1 - plus-minus sign = plus-or-minus sign
+ 'sup2' => q|\texttwosuperior{}|, # 0xB2 - superscript two = superscript digit two = squared
+ 'sup3' => q|\textthreesuperior{}|, # 0xB3 - superscript three = superscript digit three = cubed
+ 'acute' => q|\textasciiacute{}|, # 0xB4 - acute accent = spacing acute
+ 'micro' => q|\textmu{}|, # 0xB5 - micro sign
+ 'para' => q|\textparagraph{}|, # 0xB6 - pilcrow sign = paragraph sign
+ 'middot' => q|\textperiodcentered{}|, # 0xB7 - middle dot = Georgian comma = Greek middle dot
+ 'cedil' => q|\c{}|, # 0xB8 - cedilla = spacing cedilla
+ 'sup1' => q|\textonesuperior{}|, # 0xB9 - superscript one = superscript digit one
+ 'ordm' => q|\textordmasculine{}|, # 0xBA - masculine ordinal indicator
+ 'raquo' => q|\guillemotright{}|, # 0xBB - right-pointing double angle quotation mark = right pointing guillemet
+ 'frac14' => q|\textonequarter{}|, # 0xBC - vulgar fraction one quarter = fraction one quarter
+ 'frac12' => q|\textonehalf{}|, # 0xBD - vulgar fraction one half = fraction one half
+ 'frac34' => q|\textthreequarters{}|, # 0xBE - vulgar fraction three quarters = fraction three quarters
+ 'iquest' => q|\textquestiondown{}|, # 0xBF - inverted question mark = turned question mark
+ 'Agrave' => q|\`A|, # 0xC0 - latin capital letter A with grave = latin capital letter A grave
+ 'Aacute' => q|\'A|, # 0xC1 - latin capital letter A with acute
+ 'Acirc' => q|\^A|, # 0xC2 - latin capital letter A with circumflex
+ 'Atilde' => q|\~A|, # 0xC3 - latin capital letter A with tilde
+ 'Auml' => q|\"A|, # 0xC4 - latin capital letter A with diaeresis
+ 'Aring' => q|\AA{}|, # 0xC5 - latin capital letter A with ring above = latin capital letter A ring
+ 'AElig' => q|\AE{}|, # 0xC6 - latin capital letter AE = latin capital ligature AE
+ 'Ccedil' => q|\c{C}|, # 0xC7 - latin capital letter C with cedilla
+ 'Egrave' => q|\`E|, # 0xC8 - latin capital letter E with grave
+ 'Eacute' => q|\'E|, # 0xC9 - latin capital letter E with acute
+ 'Ecirc' => q|\^E|, # 0xCA - latin capital letter E with circumflex
+ 'Euml' => q|\"E|, # 0xCB - latin capital letter E with diaeresis
+ 'Igrave' => q|\`I|, # 0xCC - latin capital letter I with grave
+ 'Iacute' => q|\'I|, # 0xCD - latin capital letter I with acute
+ 'Icirc' => q|\^I|, # 0xCE - latin capital letter I with circumflex
+ 'Iuml' => q|\"I|, # 0xCF - latin capital letter I with diaeresis
+ 'ETH' => q|\DH{}|, # 0xD0 - latin capital letter ETH
+ 'Ntilde' => q|\~N|, # 0xD1 - latin capital letter N with tilde
+ 'Ograve' => q|\`O|, # 0xD2 - latin capital letter O with grave
+ 'Oacute' => q|\'O|, # 0xD3 - latin capital letter O with acute
+ 'Ocirc' => q|\^O|, # 0xD4 - latin capital letter O with circumflex
+ 'Otilde' => q|\~O|, # 0xD5 - latin capital letter O with tilde
+ 'Ouml' => q|\"O|, # 0xD6 - latin capital letter O with diaeresis
+ 'times' => q|\texttimes{}|, # 0xD7 - multiplication sign
+ 'Oslash' => q|\O{}|, # 0xD8 - latin capital letter O with stroke = latin capital letter O slash
+ 'Ugrave' => q|\`U|, # 0xD9 - latin capital letter U with grave
+ 'Uacute' => q|\'U|, # 0xDA - latin capital letter U with acute
+ 'Ucirc' => q|\^U|, # 0xDB - latin capital letter U with circumflex
+ 'Uuml' => q|\"U|, # 0xDC - latin capital letter U with diaeresis
+ 'Yacute' => q|\'Y|, # 0xDD - latin capital letter Y with acute
+ 'THORN' => q|\TH{}|, # 0xDE - latin capital letter THORN
+ 'szlig' => q|\ss{}|, # 0xDF - latin small letter sharp s = ess-zed
+ 'agrave' => q|\`a|, # 0xE0 - latin small letter a with grave = latin small letter a grave
+ 'aacute' => q|\'a|, # 0xE1 - latin small letter a with acute
+ 'acirc' => q|\^a|, # 0xE2 - latin small letter a with circumflex
+ 'atilde' => q|\~a|, # 0xE3 - latin small letter a with tilde
+ 'auml' => q|\"a|, # 0xE4 - latin small letter a with diaeresis
+ 'aring' => q|\aa{}|, # 0xE5 - latin small letter a with ring above = latin small letter a ring
+ 'aelig' => q|\ae{}|, # 0xE6 - latin small letter ae = latin small ligature ae
+ 'ccedil' => q|\c{c}|, # 0xE7 - latin small letter c with cedilla
+ 'egrave' => q|\`e|, # 0xE8 - latin small letter e with grave
+ 'eacute' => q|\'e|, # 0xE9 - latin small letter e with acute
+ 'ecirc' => q|\^e|, # 0xEA - latin small letter e with circumflex
+ 'euml' => q|\"e|, # 0xEB - latin small letter e with diaeresis
+ 'igrave' => q|\`i|, # 0xEC - latin small letter i with grave
+ 'iacute' => q|\'i|, # 0xED - latin small letter i with acute
+ 'icirc' => q|\^i|, # 0xEE - latin small letter i with circumflex
+ 'iuml' => q|\"i|, # 0xEF - latin small letter i with diaeresis
+ 'eth' => q|\dh{}|, # 0xF0 - latin small letter eth
+ 'ntilde' => q|\~n|, # 0xF1 - latin small letter n with tilde
+ 'ograve' => q|\`o|, # 0xF2 - latin small letter o with grave
+ 'oacute' => q|\'o|, # 0xF3 - latin small letter o with acute
+ 'ocirc' => q|\^o|, # 0xF4 - latin small letter o with circumflex
+ 'otilde' => q|\~o|, # 0xF5 - latin small letter o with tilde
+ 'ouml' => q|\"o|, # 0xF6 - latin small letter o with diaeresis
+ 'divide' => q|\textdiv{}|, # 0xF7 - division sign
+ 'oslash' => q|\o{}|, # 0xF8 - latin small letter o with stroke, = latin small letter o slash
+ 'ugrave' => q|\`u|, # 0xF9 - latin small letter u with grave
+ 'uacute' => q|\'u|, # 0xFA - latin small letter u with acute
+ 'ucirc' => q|\^u|, # 0xFB - latin small letter u with circumflex
+ 'uuml' => q|\"u|, # 0xFC - latin small letter u with diaeresis
+ 'yacute' => q|\'y|, # 0xFD - latin small letter y with acute
+ 'thorn' => q|\th{}|, # 0xFE - latin small letter thorn
+ 'yuml' => q|\"y|, # 0xFF - latin small letter y with diaeresis
+
+ # Latin Extended-B
+ 'fnof' => q|\textflorin{}|, # latin small f with hook = function = florin
+
+ # Greek
+ 'Alpha' => q|$\mathrm{A}$|, # greek capital letter alpha
+ 'Beta' => q|$\mathrm{B}$|, # greek capital letter beta
+ 'Gamma' => q|$\Gamma$|, # greek capital letter gamma
+ 'Delta' => q|$\Delta$|, # greek capital letter delta
+ 'Epsilon' => q|$\mathrm{E}$|, # greek capital letter epsilon
+ 'Zeta' => q|$\mathrm{Z}$|, # greek capital letter zeta
+ 'Eta' => q|$\mathrm{H}$|, # greek capital letter eta
+ 'Theta' => q|$\Theta$|, # greek capital letter theta
+ 'Iota' => q|$\mathrm{I}$|, # greek capital letter iota
+ 'Kappa' => q|$\mathrm{K}$|, # greek capital letter kappa
+ 'Lambda' => q|$\Lambda$|, # greek capital letter lambda
+ 'Mu' => q|$\mathrm{M}$|, # greek capital letter mu
+ 'Nu' => q|$\mathrm{N}$|, # greek capital letter nu
+ 'Xi' => q|$\Xi$|, # greek capital letter xi
+ 'Omicron' => q|$\mathrm{O}$|, # greek capital letter omicron
+ 'Pi' => q|$\Pi$|, # greek capital letter pi
+ 'Rho' => q|$\mathrm{R}$|, # greek capital letter rho
+ 'Sigma' => q|$\Sigma$|, # greek capital letter sigma
+ 'Tau' => q|$\mathrm{T}$|, # greek capital letter tau
+ 'Upsilon' => q|$\Upsilon$|, # greek capital letter upsilon
+ 'Phi' => q|$\Phi$|, # greek capital letter phi
+ 'Chi' => q|$\mathrm{X}$|, # greek capital letter chi
+ 'Psi' => q|$\Psi$|, # greek capital letter psi
+ 'Omega' => q|$\Omega$|, # greek capital letter omega
+
+ 'alpha' => q|$\alpha$|, # greek small letter alpha
+ 'beta' => q|$\beta$|, # greek small letter beta
+ 'gamma' => q|$\gamma$|, # greek small letter gamma
+ 'delta' => q|$\delta$|, # greek small letter delta
+ 'epsilon' => q|$\epsilon$|, # greek small letter epsilon
+ 'zeta' => q|$\zeta$|, # greek small letter zeta
+ 'eta' => q|$\eta$|, # greek small letter eta
+ 'theta' => q|$\theta$|, # greek small letter theta
+ 'iota' => q|$\iota$|, # greek small letter iota
+ 'kappa' => q|$\kappa$|, # greek small letter kappa
+ 'lambda' => q|$\lambda$|, # greek small letter lambda
+ 'mu' => q|$\mu$|, # greek small letter mu
+ 'nu' => q|$\nu$|, # greek small letter nu
+ 'xi' => q|$\xi$|, # greek small letter xi
+ 'omicron' => q|$o$|, # greek small letter omicron
+ 'pi' => q|$\pi$|, # greek small letter pi
+ 'rho' => q|$\rho$|, # greek small letter rho
+# 'sigmaf' => q||, # greek small letter final sigma
+ 'sigma' => q|$\sigma$|, # greek small letter sigma
+ 'tau' => q|$\tau$|, # greek small letter tau
+ 'upsilon' => q|$\upsilon$|, # greek small letter upsilon
+ 'phi' => q|$\phi$|, # greek small letter phi
+ 'chi' => q|$\chi$|, # greek small letter chi
+ 'psi' => q|$\psi$|, # greek small letter psi
+ 'omega' => q|$\omega$|, # greek small letter omega
+# 'thetasym' => q||, # greek small letter theta symbol
+# 'upsih' => q||, # greek upsilon with hook symbol
+# 'piv' => q||, # greek pi symbol
+
+ # General Punctuation
+ 'bull' => q|\textbullet{}|, # bullet = black small circle
+ # bullet is NOT the same as bullet operator
+ 'hellip' => q|\textellipsis{}|, # horizontal ellipsis = three dot leader
+ 'prime' => q|\textquotesingle{}|, # prime = minutes = feet
+ 'Prime' => q|\textquotedbl{}|, # double prime = seconds = inches
+ 'oline' => q|\textasciimacron{}|, # overline = spacing overscore
+ 'frasl' => q|\textfractionsolidus{}|, # fraction slash
+
+ # Letterlike Symbols
+ 'weierp' => q|$\wp$|, # script capital P = power set = Weierstrass p
+ 'image' => q|$\Re$|, # blackletter capital I = imaginary part
+ 'real' => q|$\Im$|, # blackletter capital R = real part symbol
+ 'trade' => q|\texttrademark{}|, # trade mark sign
+# 'alefsym' => q||, # alef symbol = first transfinite cardinal
+ # alef symbol is NOT the same as hebrew letter alef, although the same
+ # glyph could be used to depict both characters
+
+ # Arrows
+ 'larr' => q|\textleftarrow{}|, # leftwards arrow
+ 'uarr' => q|\textuparrow{}|, # upwards arrow
+ 'rarr' => q|\textrightarrow{}|, # rightwards arrow
+ 'darr' => q|\textdownarrow{}|, # downwards arrow
+ 'harr' => q|$\leftrightarrow$|, # left right arrow
+# 'crarr' => q||, # downwards arrow with corner leftwards = carriage return
+ 'lArr' => q|$\Leftarrow$|, # leftwards double arrow
+ # ISO 10646 does not say that lArr is the same as the 'is implied by'
+ # arrow but also does not have any other character for that function. So
+ # lArr can be used for 'is implied by' as ISOtech suggests
+ 'uArr' => q|$\Uparrow$|, # upwards double arrow
+ 'rArr' => q|$\Rightarrow$|, # rightwards double arrow
+ # ISO 10646 does not say this is the 'implies' character but does not
+ # have another character with this function so ? rArr can be used for
+ # 'implies' as ISOtech suggests
+ 'dArr' => q|$\Downarrow$|, # downwards double arrow
+ 'hArr' => q|$\Leftrightarrow$|, # left right double arrow
+
+ # Mathematical Operators.
+ # Some of these require the `amssymb' package.
+ 'forall' => q|$\forall$|, # for all
+ 'part' => q|$\partial$|, # partial differential
+ 'exist' => q|$\exists$|, # there exists
+ 'empty' => q|$\emptyset$|, # empty set = null set = diameter
+ 'nabla' => q|$\nabla$|, # nabla = backward difference
+ 'isin' => q|$\in$|, # element of
+ 'notin' => q|$\notin$|, # not an element of
+ 'ni' => q|$\ni$|, # contains as member
+ 'prod' => q|$\prod$|, # n-ary product = product sign
+ # prod is NOT the same character as 'greek capital letter pi' though the
+ # same glyph might be used for both
+ 'sum' => q|$\sum$|, # n-ary sumation
+ # sum is NOT the same character as 'greek capital letter sigma' though
+ # the same glyph might be used for both
+ 'minus' => q|$-$|, # minus sign
+ 'lowast' => q|$\ast$|, # asterisk operator
+ 'radic' => q|$\surd$|, # square root = radical sign
+ 'prop' => q|$\propto$|, # proportional to
+ 'infin' => q|$\infty$|, # infinity
+ 'ang' => q|$\angle$|, # angle
+ 'and' => q|$\wedge$|, # logical and = wedge
+ 'or' => q|$\vee$|, # logical or = vee
+ 'cap' => q|$\cap$|, # intersection = cap
+ 'cup' => q|$\cup$|, # union = cup
+ 'int' => q|$\int$|, # integral
+ 'there4' => q|$\therefore$|, # therefore
+ 'sim' => q|$\sim$|, # tilde operator = varies with = similar to
+ # tilde operator is NOT the same character as the tilde
+ 'cong' => q|$\cong$|, # approximately equal to
+ 'asymp' => q|$\asymp$|, # almost equal to = asymptotic to
+ 'ne' => q|$\neq$|, # not equal to
+ 'equiv' => q|$\equiv$|, # identical to
+ 'le' => q|$\leq$|, # less-than or equal to
+ 'ge' => q|$\geq$|, # greater-than or equal to
+ 'sub' => q|$\subset$|, # subset of
+ 'sup' => q|$\supset$|, # superset of
+ # note that nsup, 'not a superset of' is not covered by the Symbol font
+ # encoding and is not included.
+ 'nsub' => q|$\not\subset$|, # not a subset of
+ 'sube' => q|$\subseteq$|, # subset of or equal to
+ 'supe' => q|$\supseteq$|, # superset of or equal to
+ 'oplus' => q|$\oplus$|, # circled plus = direct sum
+ 'otimes' => q|$\otimes$|, # circled times = vector product
+ 'perp' => q|$\perp$|, # up tack = orthogonal to = perpendicular
+ 'sdot' => q|$\cdot$|, # dot operator
+ # dot operator is NOT the same character as middle dot
+
+ # Miscellaneous Technical
+ 'lceil' => q|$\lceil$|, # left ceiling = apl upstile
+ 'rceil' => q|$\rceil$|, # right ceiling
+ 'lfloor' => q|$\lfloor$|, # left floor = apl downstile
+ 'rfloor' => q|$\rfloor$|, # right floor
+ 'lang' => q|$\langle$|, # left-pointing angle bracket = bra
+ # lang is NOT the same character as 'less than' or 'single left-pointing
+ # angle quotation mark'
+ 'rang' => q|$\rangle$|, # right-pointing angle bracket = ket
+ # rang is NOT the same character as 'greater than' or 'single
+ # right-pointing angle quotation mark'
+
+ # Geometric Shapes
+ 'loz' => q|$\lozenge$|, # lozenge
+
+ # Miscellaneous Symbols
+ 'spades' => q|$\spadesuit$|, # black spade suit
+ 'clubs' => q|$\clubsuit$|, # black club suit = shamrock
+ 'hearts' => q|$\heartsuit$|, # black heart suit = valentine
+ 'diams' => q|$\diamondsuit$|, # black diamond suit
+
+ # C0 Controls and Basic Latin
+ 'quot' => q|"|, # quotation mark = APL quote ["]
+ 'amp' => q|\&|, # ampersand
+ 'lt' => q|<|, # less-than sign
+ 'gt' => q|>|, # greater-than sign
+ 'OElig' => q|\OE{}|, # latin capital ligature OE
+ 'oelig' => q|\oe{}|, # latin small ligature oe
+ 'Scaron' => q|\v{S}|, # latin capital letter S with caron
+ 'scaron' => q|\v{s}|, # latin small letter s with caron
+ 'Yuml' => q|\"Y|, # latin capital letter Y with diaeresis
+ 'circ' => q|\textasciicircum{}|, # modifier letter circumflex accent
+ 'tilde' => q|\textasciitilde{}|, # small tilde
+ 'ensp' => q|\phantom{n}|, # en space
+ 'emsp' => q|\hspace{1em}|, # em space
+ 'thinsp' => q|\,|, # thin space
+ 'zwnj' => q|{}|, # zero width non-joiner
+# 'zwj' => q||, # zero width joiner
+# 'lrm' => q||, # left-to-right mark
+# 'rlm' => q||, # right-to-left mark
+ 'ndash' => q|--|, # en dash
+ 'mdash' => q|---|, # em dash
+ 'lsquo' => q|\textquoteleft{}|, # left single quotation mark
+ 'rsquo' => q|\textquoteright{}|, # right single quotation mark
+ 'sbquo' => q|\quotesinglbase{}|, # single low-9 quotation mark
+ 'ldquo' => q|\textquotedblleft{}|, # left double quotation mark
+ 'rdquo' => q|\textquotedblright{}|, # right double quotation mark
+ 'bdquo' => q|\quotedblbase{}|, # double low-9 quotation mark
+ 'dagger' => q|\textdagger{}|, # dagger
+ 'Dagger' => q|\textdaggerdbl{}|, # double dagger
+ 'permil' => q|\textperthousand{}|, # per mille sign
+ 'lsaquo' => q|\guilsinglleft{}|, # single left-pointing angle quotation mark
+ 'rsaquo' => q|\guilsinglright{}|, # single right-pointing angle quotation mark
+ 'euro' => q|\texteuro{}|, # euro sign
+);
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Methods inherited
+from C<Pod::Select> are not described in the public interface.
+
+=over 4
+
+=begin __PRIVATE__
+
+=item C<initialize>
+
+Initialise the object. This method is subclassed from C<Pod::Parser>.
+The base class method is invoked. This method defines the default
+behaviour of the object unless overridden by supplying arguments to
+the constructor.
+
+Internal settings are defaulted as well as the public instance data.
+Internal hash values are accessed directly (rather than through
+a method) and start with an underscore.
+
+This method should not be invoked by the user directly.
+
+=end __PRIVATE__
+
+=cut
+
+
+
+# - An array for nested lists
+
+# Arguments have already been read by this point
+
+sub initialize {
+ my $self = shift;
+
+ # print Dumper($self);
+
+ # Internals
+ $self->{_Lists} = []; # For nested lists
+ $self->{_suppress_all_para} = 0; # For =begin blocks
+ $self->{_dont_modify_any_para}=0; # For =begin blocks
+ $self->{_CURRENT_HEAD1} = ''; # Name of current HEAD1 section
+
+ # Options - only initialise if not already set
+
+ # Cause the '=head1 NAME' field to be treated specially
+ # The contents of the NAME paragraph will be converted
+ # to a section title. All subsequent =head1 will be converted
+ # to =head2 and down. Will not affect =head1's prior to NAME
+ # Assumes: 'Module - purpose' format
+ # Also creates a purpose field
+ # The name is used for Labeling of the subsequent subsections
+ $self->{ReplaceNAMEwithSection} = 0
+ unless exists $self->{ReplaceNAMEwithSection};
+ $self->{AddPreamble} = 1 # make full latex document
+ unless exists $self->{AddPreamble};
+ $self->{StartWithNewPage} = 0 # Start new page for pod section
+ unless exists $self->{StartWithNewPage};
+ $self->{TableOfContents} = 0 # Add table of contents
+ unless exists $self->{TableOfContents}; # only relevent if AddPreamble=1
+ $self->{AddPostamble} = 1 # Add closing latex code at end
+ unless exists $self->{AddPostamble}; # effectively end{document} and index
+ $self->{MakeIndex} = 1 # Add index (only relevant AddPostamble
+ unless exists $self->{MakeIndex}; # and AddPreamble)
+
+ $self->{UniqueLabels} = 1 # Use label unique for each pod
+ unless exists $self->{UniqueLabels}; # either based on the filename
+ # or supplied
+
+ # Control the level of =head1. default is \section
+ #
+ $self->{Head1Level} = 1 # Offset in latex sections
+ unless exists $self->{Head1Level}; # 0 is chapter, 2 is subsection
+
+ # Control at which level numbering of sections is turned off
+ # ie subsection becomes subsection*
+ # The numbering is relative to the latex sectioning commands
+ # and is independent of Pod heading level
+ # default is to number \section but not \subsection
+ $self->{LevelNoNum} = 2
+ unless exists $self->{LevelNoNum};
+
+ # Label to be used as prefix to all internal section names
+ # If not defined will attempt to derive it from the filename
+ # This can not happen when running parse_from_filehandle though
+ # hence the ability to set the label externally
+ # The label could then be Pod::Parser_DESCRIPTION or somesuch
+
+ $self->{Label} = undef # label to be used as prefix
+ unless exists $self->{Label}; # to all internal section names
+
+ # These allow the caller to add arbritrary latex code to
+ # start and end of document. AddPreamble and AddPostamble are ignored
+ # if these are set.
+ # Also MakeIndex and TableOfContents are also ignored.
+ $self->{UserPreamble} = undef # User supplied start (AddPreamble =1)
+ unless exists $self->{Label};
+ $self->{UserPostamble} = undef # Use supplied end (AddPostamble=1)
+ unless exists $self->{Label};
+
+ # Run base initialize
+ $self->SUPER::initialize;
+
+}
+
+=back
+
+=head2 Data Accessors
+
+The following methods are provided for accessing instance data. These
+methods should be used for accessing configuration parameters rather
+than assuming the object is a hash.
+
+Default values can be supplied by using these names as keys to a hash
+of arguments when using the C<new()> constructor.
+
+=over 4
+
+=item B<AddPreamble>
+
+Logical to control whether a C<latex> preamble is to be written.
+If true, a valid C<latex> preamble is written before the pod data is written.
+This is similar to:
+
+ \documentclass{article}
+ \usepackage[T1]{fontenc}
+ \usepackage{textcomp}
+ \begin{document}
+
+but will be more complicated if table of contents and indexing are required.
+Can be used to set or retrieve the current value.
+
+ $add = $parser->AddPreamble();
+ $parser->AddPreamble(1);
+
+If used in conjunction with C<AddPostamble> a full latex document will
+be written that could be immediately processed by C<latex>.
+
+For some pod escapes it may be necessary to include the amsmath
+package. This is not yet added to the preamble automaatically.
+
+=cut
+
+sub AddPreamble {
+ my $self = shift;
+ if (@_) {
+ $self->{AddPreamble} = shift;
+ }
+ return $self->{AddPreamble};
+}
+
+=item B<AddPostamble>
+
+Logical to control whether a standard C<latex> ending is written to the output
+file after the document has been processed.
+In its simplest form this is simply:
+
+ \end{document}
+
+but can be more complicated if a index is required.
+Can be used to set or retrieve the current value.
+
+ $add = $parser->AddPostamble();
+ $parser->AddPostamble(1);
+
+If used in conjunction with C<AddPreaamble> a full latex document will
+be written that could be immediately processed by C<latex>.
+
+=cut
+
+sub AddPostamble {
+ my $self = shift;
+ if (@_) {
+ $self->{AddPostamble} = shift;
+ }
+ return $self->{AddPostamble};
+}
+
+=item B<Head1Level>
+
+The C<latex> sectioning level that should be used to correspond to
+a pod C<=head1> directive. This can be used, for example, to turn
+a C<=head1> into a C<latex> C<subsection>. This should hold a number
+corresponding to the required position in an array containing the
+following elements:
+
+ [0] chapter
+ [1] section
+ [2] subsection
+ [3] subsubsection
+ [4] paragraph
+ [5] subparagraph
+
+Can be used to set or retrieve the current value:
+
+ $parser->Head1Level(2);
+ $sect = $parser->Head1Level;
+
+Setting this number too high can result in sections that may not be reproducible
+in the expected way. For example, setting this to 4 would imply that C<=head3>
+do not have a corresponding C<latex> section (C<=head1> would correspond to
+a C<paragraph>).
+
+A check is made to ensure that the supplied value is an integer in the
+range 0 to 5.
+
+Default is for a value of 1 (i.e. a C<section>).
+
+=cut
+
+sub Head1Level {
+ my $self = shift;
+ if (@_) {
+ my $arg = shift;
+ if ($arg =~ /^\d$/ && $arg <= $#LatexSections) {
+ $self->{Head1Level} = $arg;
+ } else {
+ carp "Head1Level supplied ($arg) must be integer in range 0 to ".$#LatexSections . "- Ignoring\n";
+ }
+ }
+ return $self->{Head1Level};
+}
+
+=item B<Label>
+
+This is the label that is prefixed to all C<latex> label and index
+entries to make them unique. In general, pods have similarly titled
+sections (NAME, DESCRIPTION etc) and a C<latex> label will be multiply
+defined if more than one pod document is to be included in a single
+C<latex> file. To overcome this, this label is prefixed to a label
+whenever a label is required (joined with an underscore) or to an
+index entry (joined by an exclamation mark which is the normal index
+separator). For example, C<\label{text}> becomes C<\label{Label_text}>.
+
+Can be used to set or retrieve the current value:
+
+ $label = $parser->Label;
+ $parser->Label($label);
+
+This label is only used if C<UniqueLabels> is true.
+Its value is set automatically from the C<NAME> field
+if C<ReplaceNAMEwithSection> is true. If this is not the case
+it must be set manually before starting the parse.
+
+Default value is C<undef>.
+
+=cut
+
+sub Label {
+ my $self = shift;
+ if (@_) {
+ $self->{Label} = shift;
+ }
+ return $self->{Label};
+}
+
+=item B<LevelNoNum>
+
+Control the point at which C<latex> section numbering is turned off.
+For example, this can be used to make sure that C<latex> sections
+are numbered but subsections are not.
+
+Can be used to set or retrieve the current value:
+
+ $lev = $parser->LevelNoNum;
+ $parser->LevelNoNum(2);
+
+The argument must be an integer between 0 and 5 and is the same as the
+number described in C<Head1Level> method description. The number has
+nothing to do with the pod heading number, only the C<latex> sectioning.
+
+Default is 2. (i.e. C<latex> subsections are written as C<subsection*>
+but sections are numbered).
+
+=cut
+
+sub LevelNoNum {
+ my $self = shift;
+ if (@_) {
+ $self->{LevelNoNum} = shift;
+ }
+ return $self->{LevelNoNum};
+}
+
+=item B<MakeIndex>
+
+Controls whether C<latex> commands for creating an index are to be inserted
+into the preamble and postamble
+
+ $makeindex = $parser->MakeIndex;
+ $parser->MakeIndex(0);
+
+Irrelevant if both C<AddPreamble> and C<AddPostamble> are false (or equivalently,
+C<UserPreamble> and C<UserPostamble> are set).
+
+Default is for an index to be created.
+
+=cut
+
+sub MakeIndex {
+ my $self = shift;
+ if (@_) {
+ $self->{MakeIndex} = shift;
+ }
+ return $self->{MakeIndex};
+}
+
+=item B<ReplaceNAMEwithSection>
+
+This controls whether the C<NAME> section in the pod is to be translated
+literally or converted to a slightly modified output where the section
+name is the pod name rather than "NAME".
+
+If true, the pod segment
+
+ =head1 NAME
+
+ pod::name - purpose
+
+ =head1 SYNOPSIS
+
+is converted to the C<latex>
+
+ \section{pod::name\label{pod_name}\index{pod::name}}
+
+ Purpose
+
+ \subsection*{SYNOPSIS\label{pod_name_SYNOPSIS}%
+ \index{pod::name!SYNOPSIS}}
+
+(dependent on the value of C<Head1Level> and C<LevelNoNum>). Note that
+subsequent C<head1> directives translate to subsections rather than
+sections and that the labels and index now include the pod name (dependent
+on the value of C<UniqueLabels>).
+
+The C<Label> is set from the pod name regardless of any current value
+of C<Label>.
+
+ $mod = $parser->ReplaceNAMEwithSection;
+ $parser->ReplaceNAMEwithSection(0);
+
+Default is to translate the pod literally.
+
+=cut
+
+sub ReplaceNAMEwithSection {
+ my $self = shift;
+ if (@_) {
+ $self->{ReplaceNAMEwithSection} = shift;
+ }
+ return $self->{ReplaceNAMEwithSection};
+}
+
+=item B<StartWithNewPage>
+
+If true, each pod translation will begin with a C<latex>
+C<\clearpage>.
+
+ $parser->StartWithNewPage(1);
+ $newpage = $parser->StartWithNewPage;
+
+Default is false.
+
+=cut
+
+sub StartWithNewPage {
+ my $self = shift;
+ if (@_) {
+ $self->{StartWithNewPage} = shift;
+ }
+ return $self->{StartWithNewPage};
+}
+
+=item B<TableOfContents>
+
+If true, a table of contents will be created.
+Irrelevant if C<AddPreamble> is false or C<UserPreamble>
+is set.
+
+ $toc = $parser->TableOfContents;
+ $parser->TableOfContents(1);
+
+Default is false.
+
+=cut
+
+sub TableOfContents {
+ my $self = shift;
+ if (@_) {
+ $self->{TableOfContents} = shift;
+ }
+ return $self->{TableOfContents};
+}
+
+=item B<UniqueLabels>
+
+If true, the translator will attempt to make sure that
+each C<latex> label or index entry will be uniquely identified
+by prefixing the contents of C<Label>. This allows
+multiple documents to be combined without clashing
+common labels such as C<DESCRIPTION> and C<SYNOPSIS>
+
+ $parser->UniqueLabels(1);
+ $unq = $parser->UniqueLabels;
+
+Default is true.
+
+=cut
+
+sub UniqueLabels {
+ my $self = shift;
+ if (@_) {
+ $self->{UniqueLabels} = shift;
+ }
+ return $self->{UniqueLabels};
+}
+
+=item B<UserPreamble>
+
+User supplied C<latex> preamble. Added before the pod translation
+data.
+
+If set, the contents will be prepended to the output file before the translated
+data regardless of the value of C<AddPreamble>.
+C<MakeIndex> and C<TableOfContents> will also be ignored.
+
+=cut
+
+sub UserPreamble {
+ my $self = shift;
+ if (@_) {
+ $self->{UserPreamble} = shift;
+ }
+ return $self->{UserPreamble};
+}
+
+=item B<UserPostamble>
+
+User supplied C<latex> postamble. Added after the pod translation
+data.
+
+If set, the contents will be prepended to the output file after the translated
+data regardless of the value of C<AddPostamble>.
+C<MakeIndex> will also be ignored.
+
+=cut
+
+sub UserPostamble {
+ my $self = shift;
+ if (@_) {
+ $self->{UserPostamble} = shift;
+ }
+ return $self->{UserPostamble};
+}
+
+=begin __PRIVATE__
+
+=item B<Lists>
+
+Contains details of the currently active lists.
+ The array contains C<Pod::List> objects. A new C<Pod::List>
+object is created each time a list is encountered and it is
+pushed onto this stack. When the list context ends, it
+is popped from the stack. The array will be empty if no
+lists are active.
+
+Returns array of list information in list context
+Returns array ref in scalar context
+
+=cut
+
+
+
+sub lists {
+ my $self = shift;
+ return @{ $self->{_Lists} } if wantarray();
+ return $self->{_Lists};
+}
+
+=end __PRIVATE__
+
+=back
+
+=begin __PRIVATE__
+
+=head2 Subclassed methods
+
+The following methods override methods provided in the C<Pod::Select>
+base class. See C<Pod::Parser> and C<Pod::Select> for more information
+on what these methods require.
+
+=over 4
+
+=cut
+
+######### END ACCESSORS ###################
+
+# Opening pod
+
+=item B<begin_pod>
+
+Writes the C<latex> preamble if requested. Only writes something
+if AddPreamble is true. Writes a standard header unless a UserPreamble
+is defined.
+
+=cut
+
+sub begin_pod {
+ my $self = shift;
+
+ # Get the pod identification
+ # This should really come from the '=head1 NAME' paragraph
+
+ my $infile = $self->input_file;
+ my $class = ref($self);
+ my $date = gmtime(time);
+
+ # Comment message to say where this came from
+ my $comment = << "__TEX_COMMENT__";
+%% Latex generated from POD in document $infile
+%% Using the perl module $class
+%% Converted on $date
+__TEX_COMMENT__
+
+ # Write the preamble
+ # If the caller has supplied one then we just use that
+
+ my $preamble = '';
+
+ if ($self->AddPreamble) {
+
+ if (defined $self->UserPreamble) {
+
+ $preamble = $self->UserPreamble;
+
+ # Add the description of where this came from
+ $preamble .= "\n$comment\n%% Preamble supplied by user.\n\n";
+
+ } else {
+
+ # Write our own preamble
+
+ # Code to initialise index making
+ # Use an array so that we can prepend comment if required
+ my @makeidx = (
+ '\usepackage{makeidx}',
+ '\makeindex',
+ );
+
+ unless ($self->MakeIndex) {
+ foreach (@makeidx) {
+ $_ = '%% ' . $_;
+ }
+ }
+ my $makeindex = join("\n",@makeidx) . "\n";
+
+ # Table of contents
+ my $tableofcontents = '\tableofcontents';
+
+ $tableofcontents = '%% ' . $tableofcontents
+ unless $self->TableOfContents;
+
+ # Roll our own
+ $preamble = << "__TEX_HEADER__";
+\\documentclass{article}
+\\usepackage[T1]{fontenc}
+\\usepackage{textcomp}
+
+$comment
+
+$makeindex
+
+\\begin{document}
+
+$tableofcontents
+
+__TEX_HEADER__
+
+ }
+ }
+
+ # Write the header (blank if none)
+ $self->_output($preamble);
+
+ # Start on new page if requested
+ $self->_output("\\clearpage\n") if $self->StartWithNewPage;
+
+}
+
+
+=item B<end_pod>
+
+Write the closing C<latex> code. Only writes something if AddPostamble
+is true. Writes a standard header unless a UserPostamble is defined.
+
+=cut
+
+sub end_pod {
+ my $self = shift;
+
+ # End string
+ my $end = '';
+
+ # Use the user version of the postamble if defined
+ if ($self->AddPostamble) {
+
+ if (defined $self->UserPostamble) {
+ $end = $self->UserPostamble;
+
+ } else {
+
+ # Check for index
+ my $makeindex = '\printindex';
+
+ $makeindex = '%% '. $makeindex unless $self->MakeIndex;
+
+ $end = "$makeindex\n\n\\end{document}\n";
+ }
+ }
+
+ $self->_output($end);
+
+}
+
+=item B<command>
+
+Process basic pod commands.
+
+=cut
+
+sub command {
+ my $self = shift;
+ my ($command, $paragraph, $line_num, $parobj) = @_;
+
+ # return if we dont care
+ return if $command eq 'pod';
+
+ # Store a copy of the raw text in case we are in a =for
+ # block and need to preserve the existing latex
+ my $rawpara = $paragraph;
+
+ # Do the latex escapes
+ $paragraph = $self->_replace_special_chars($paragraph);
+
+ # Interpolate pod sequences in paragraph
+ $paragraph = $self->interpolate($paragraph, $line_num);
+ $paragraph =~ s/\s+$//;
+
+ # Replace characters that can only be done after
+ # interpolation of interior sequences
+ $paragraph = $self->_replace_special_chars_late($paragraph);
+
+ # Now run the command
+ if ($command eq 'over') {
+
+ $self->begin_list($paragraph, $line_num);
+
+ } elsif ($command eq 'item') {
+
+ $self->add_item($paragraph, $line_num);
+
+ } elsif ($command eq 'back') {
+
+ $self->end_list($line_num);
+
+ } elsif ($command eq 'head1') {
+
+ # Store the name of the section
+ $self->{_CURRENT_HEAD1} = $paragraph;
+
+ # Print it
+ $self->head(1, $paragraph, $parobj);
+
+ } elsif ($command eq 'head2') {
+
+ $self->head(2, $paragraph, $parobj);
+
+ } elsif ($command eq 'head3') {
+
+ $self->head(3, $paragraph, $parobj);
+
+ } elsif ($command eq 'head4') {
+
+ $self->head(4, $paragraph, $parobj);
+
+ } elsif ($command eq 'head5') {
+
+ $self->head(5, $paragraph, $parobj);
+
+ } elsif ($command eq 'head6') {
+
+ $self->head(6, $paragraph, $parobj);
+
+ } elsif ($command eq 'begin') {
+
+ # pass through if latex
+ if ($paragraph =~ /^latex/i) {
+ # Make sure that subsequent paragraphs are not modfied before printing
+ $self->{_dont_modify_any_para} = 1;
+
+ } else {
+ # Suppress all subsequent paragraphs unless
+ # it is explcitly intended for latex
+ $self->{_suppress_all_para} = 1;
+ }
+
+ } elsif ($command eq 'for') {
+
+ # =for latex
+ # some latex
+
+ # With =for we will get the text for the full paragraph
+ # as well as the format name.
+ # We do not get an additional paragraph later on. The next
+ # paragraph is not governed by the =for
+
+ # The first line contains the format and the rest is the
+ # raw code.
+ my ($format, $chunk) = split(/\n/, $rawpara, 2);
+
+ # If we have got some latex code print it out immediately
+ # unmodified. Else do nothing.
+ if ($format =~ /^latex/i) {
+ # Make sure that next paragraph is not modfied before printing
+ $self->_output( $chunk );
+
+ }
+
+ } elsif ($command eq 'end') {
+
+ # Reset suppression
+ $self->{_suppress_all_para} = 0;
+ $self->{_dont_modify_any_para} = 0;
+
+ } elsif ($command eq 'pod') {
+
+ # Do nothing
+
+ } else {
+ carp "Command $command not recognised at line $line_num\n";
+ }
+
+}
+
+=item B<verbatim>
+
+Verbatim text
+
+=cut
+
+sub verbatim {
+ my $self = shift;
+ my ($paragraph, $line_num, $parobj) = @_;
+
+ # Expand paragraph unless in =begin block
+ if ($self->{_dont_modify_any_para}) {
+ # Just print as is
+ $self->_output($paragraph);
+
+ } else {
+
+ return if $paragraph =~ /^\s+$/;
+
+ # Clean trailing space
+ $paragraph =~ s/\s+$//;
+
+ # Clean tabs. Routine taken from Tabs.pm
+ # by David Muir Sharnoff muir@idiom.com,
+ # slightly modified by hsmyers@sdragons.com 10/22/01
+ my @l = split("\n",$paragraph);
+ foreach (@l) {
+ 1 while s/(^|\n)([^\t\n]*)(\t+)/
+ $1. $2 . (" " x
+ (8 * length($3)
+ - (length($2) % 8)))
+ /sex;
+ }
+ $paragraph = join("\n",@l);
+ # End of change.
+
+
+
+ $self->_output('\begin{verbatim}' . "\n$paragraph\n". '\end{verbatim}'."\n");
+ }
+}
+
+=item B<textblock>
+
+Plain text paragraph.
+
+=cut
+
+sub textblock {
+ my $self = shift;
+ my ($paragraph, $line_num, $parobj) = @_;
+
+ # print Dumper($self);
+
+ # Expand paragraph unless in =begin block
+ if ($self->{_dont_modify_any_para}) {
+ # Just print as is
+ $self->_output($paragraph);
+
+ return;
+ }
+
+
+ # Escape latex special characters
+ $paragraph = $self->_replace_special_chars($paragraph);
+
+ # Interpolate interior sequences
+ my $expansion = $self->interpolate($paragraph, $line_num);
+ $expansion =~ s/\s+$//;
+
+ # Escape special characters that can not be done earlier
+ $expansion = $self->_replace_special_chars_late($expansion);
+
+ # If we are replacing 'head1 NAME' with a section
+ # we need to look in the paragraph and rewrite things
+ # Need to make sure this is called only on the first paragraph
+ # following 'head1 NAME' and not on subsequent paragraphs that may be
+ # present.
+ if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection()) {
+
+ # Strip white space from start and end
+ $paragraph =~ s/^\s+//;
+ $paragraph =~ s/\s$//;
+
+ # Split the string into 2 parts
+ my ($name, $purpose) = split(/\s+-\s+/, $expansion,2);
+
+ # Now prevent this from triggering until a new head1 NAME is set
+ $self->{_CURRENT_HEAD1} = '_NAME';
+
+ # Might want to clear the Label() before doing this (CHECK)
+
+ # Print the heading
+ $self->head(1, $name, $parobj);
+
+ # Set the labeling in case we want unique names later
+ $self->Label( $self->_create_label( $name, 1 ) );
+
+ # Raise the Head1Level by one so that subsequent =head1 appear
+ # as subsections of the main name section unless we are already
+ # at maximum [Head1Level() could check this itself - CHECK]
+ $self->Head1Level( $self->Head1Level() + 1)
+ unless $self->Head1Level == $#LatexSections;
+
+ # Now write out the new latex paragraph
+ $purpose = ucfirst($purpose);
+ $self->_output("\n\n$purpose\n\n");
+
+ } else {
+ # Just write the output
+ $self->_output("\n\n$expansion\n\n");
+ }
+
+}
+
+=item B<interior_sequence>
+
+Interior sequence expansion
+
+=cut
+
+sub interior_sequence {
+ my $self = shift;
+
+ my ($seq_command, $seq_argument, $pod_seq) = @_;
+
+ if ($seq_command eq 'B') {
+ return "\\textbf{$seq_argument}";
+
+ } elsif ($seq_command eq 'I') {
+ return "\\textit{$seq_argument}";
+
+ } elsif ($seq_command eq 'E') {
+
+ # If it is simply a number
+ if ($seq_argument =~ /^\d+$/) {
+ return chr($seq_argument);
+ # Look up escape in hash table
+ } elsif (exists $HTML_Escapes{$seq_argument}) {
+ return $HTML_Escapes{$seq_argument};
+
+ } else {
+ my ($file, $line) = $pod_seq->file_line();
+ warn "Escape sequence $seq_argument not recognised at line $line of file $file\n";
+ return;
+ }
+
+ } elsif ($seq_command eq 'Z') {
+
+ # Zero width space
+ return '{}';
+
+ } elsif ($seq_command eq 'C') {
+ return "\\texttt{$seq_argument}";
+
+ } elsif ($seq_command eq 'F') {
+ return "\\emph{$seq_argument}";
+
+ } elsif ($seq_command eq 'S') {
+ # non breakable spaces
+ my $nbsp = '~';
+
+ $seq_argument =~ s/\s/$nbsp/g;
+ return $seq_argument;
+
+ } elsif ($seq_command eq 'L') {
+ my $link = new Pod::Hyperlink($seq_argument);
+
+ # undef on failure
+ unless (defined $link) {
+ carp $@;
+ return;
+ }
+
+ # Handle internal links differently
+ my $type = $link->type;
+ my $page = $link->page;
+
+ if ($type eq 'section' && $page eq '') {
+ # Use internal latex reference
+ my $node = $link->node;
+
+ # Convert to a label
+ $node = $self->_create_label($node);
+
+ return "\\S\\ref{$node}";
+
+ } else {
+ # Use default markup for external references
+ # (although Starlink would use \xlabel)
+ my $markup = $link->markup;
+ my ($file, $line) = $pod_seq->file_line();
+
+ return $self->interpolate($link->markup, $line);
+ }
+
+
+
+ } elsif ($seq_command eq 'P') {
+ # Special markup for Pod::Hyperlink
+ # Replace :: with / - but not sure if I want to do this
+ # any more.
+ my $link = $seq_argument;
+ $link =~ s|::|/|g;
+
+ my $ref = "\\emph{$seq_argument}";
+ return $ref;
+
+ } elsif ($seq_command eq 'Q') {
+ # Special markup for Pod::Hyperlink
+ return "\\textsf{$seq_argument}";
+
+ } elsif ($seq_command eq 'X') {
+ # Index entries
+
+ # use \index command
+ # I will let '!' go through for now
+ # not sure how sub categories are handled in X<>
+ my $index = $self->_create_index($seq_argument);
+ return "\\index{$index}\n";
+
+ } else {
+ carp "Unknown sequence $seq_command<$seq_argument>";
+ }
+
+}
+
+=back
+
+=head2 List Methods
+
+Methods used to handle lists.
+
+=over 4
+
+=item B<begin_list>
+
+Called when a new list is found (via the C<over> directive).
+Creates a new C<Pod::List> object and stores it on the
+list stack.
+
+ $parser->begin_list($indent, $line_num);
+
+=cut
+
+sub begin_list {
+ my $self = shift;
+ my $indent = shift;
+ my $line_num = shift;
+
+ # Indicate that a list should be started for the next item
+ # need to do this to work out the type of list
+ push ( @{$self->lists}, new Pod::List(-indent => $indent,
+ -start => $line_num,
+ -file => $self->input_file,
+ )
+ );
+
+}
+
+=item B<end_list>
+
+Called when the end of a list is found (the C<back> directive).
+Pops the C<Pod::List> object off the stack of lists and writes
+the C<latex> code required to close a list.
+
+ $parser->end_list($line_num);
+
+=cut
+
+sub end_list {
+ my $self = shift;
+ my $line_num = shift;
+
+ unless (defined $self->lists->[-1]) {
+ my $file = $self->input_file;
+ warn "No list is active at line $line_num (file=$file). Missing =over?\n";
+ return;
+ }
+
+ # What to write depends on list type
+ my $type = $self->lists->[-1]->type;
+
+ # Dont write anything if the list type is not set
+ # iomplying that a list was created but no entries were
+ # placed in it (eg because of a =begin/=end combination)
+ $self->_output("\\end{$type}\n")
+ if (defined $type && length($type) > 0);
+
+ # Clear list
+ pop(@{ $self->lists});
+
+}
+
+=item B<add_item>
+
+Add items to the list. The first time an item is encountered
+(determined from the state of the current C<Pod::List> object)
+the type of list is determined (ordered, unnumbered or description)
+and the relevant latex code issued.
+
+ $parser->add_item($paragraph, $line_num);
+
+=cut
+
+sub add_item {
+ my $self = shift;
+ my $paragraph = shift;
+ my $line_num = shift;
+
+ unless (defined $self->lists->[-1]) {
+ my $file = $self->input_file;
+ warn "List has already ended by line $line_num of file $file. Missing =over?\n";
+ # Replace special chars
+# $paragraph = $self->_replace_special_chars($paragraph);
+ $self->_output("$paragraph\n\n");
+ return;
+ }
+
+ # If paragraphs printing is turned off via =begin/=end or whatver
+ # simply return immediately
+ return if $self->{_suppress_all_para};
+
+ # Check to see whether we are starting a new lists
+ if (scalar($self->lists->[-1]->item) == 0) {
+
+ # Examine the paragraph to determine what type of list
+ # we have
+ $paragraph =~ s/\s+$//;
+ $paragraph =~ s/^\s+//;
+
+ my $type;
+ if (substr($paragraph, 0,1) eq '*') {
+ $type = 'itemize';
+ } elsif ($paragraph =~ /^\d/) {
+ $type = 'enumerate';
+ } else {
+ $type = 'description';
+ }
+ $self->lists->[-1]->type($type);
+
+ $self->_output("\\begin{$type}\n");
+
+ }
+
+ my $type = $self->lists->[-1]->type;
+
+ if ($type eq 'description') {
+ # Handle long items - long items do not wrap
+ # If the string is longer than 40 characters we split
+ # it into a real item header and some bold text.
+ my $maxlen = 40;
+ my ($hunk1, $hunk2) = $self->_split_delimited( $paragraph, $maxlen );
+
+ # Print the first hunk
+ $self->_output("\n\\item[{$hunk1}] ");
+
+ # and the second hunk if it is defined
+ if ($hunk2) {
+ $self->_output("\\textbf{$hunk2}");
+ } else {
+ # Not there so make sure we have a new line
+ $self->_output("\\mbox{}");
+ }
+
+ } else {
+ # If the item was '* Something' or '\d+ something' we still need to write
+ # out the something. Also allow 1) and 1.
+ my $extra_info = $paragraph;
+ $extra_info =~ s/^(\*|\d+[\.\)]?)\s*//;
+ $self->_output("\n\\item $extra_info");
+ }
+
+ # Store the item name in the object. Required so that
+ # we can tell if the list is new or not
+ $self->lists->[-1]->item($paragraph);
+
+}
+
+=back
+
+=head2 Methods for headings
+
+=over 4
+
+=item B<head>
+
+Print a heading of the required level.
+
+ $parser->head($level, $paragraph, $parobj);
+
+The first argument is the pod heading level. The second argument
+is the contents of the heading. The 3rd argument is a Pod::Paragraph
+object so that the line number can be extracted.
+
+=cut
+
+sub head {
+ my $self = shift;
+ my $num = shift;
+ my $paragraph = shift;
+ my $parobj = shift;
+
+ # If we are replace 'head1 NAME' with a section
+ # we return immediately if we get it
+ return
+ if ($self->{_CURRENT_HEAD1} =~ /^NAME/i && $self->ReplaceNAMEwithSection());
+
+ # Create a label
+ my $label = $self->_create_label($paragraph);
+
+ # Create an index entry
+ my $index = $self->_create_index($paragraph);
+
+ # Work out position in the above array taking into account
+ # that =head1 is equivalent to $self->Head1Level
+
+ my $level = $self->Head1Level() - 1 + $num;
+
+ # Warn if heading to large
+ if ($num > $#LatexSections) {
+ my $line = $parobj->file_line;
+ my $file = $self->input_file;
+ warn "Heading level too large ($level) for LaTeX at line $line of file $file\n";
+ $level = $#LatexSections;
+ }
+
+ # Check to see whether section should be unnumbered
+ my $star = ($level >= $self->LevelNoNum ? '*' : '');
+
+ # Section
+ $self->_output("\\" .$LatexSections[$level] .$star ."{$paragraph\\label{".$label ."}\\index{".$index."}}\n");
+
+}
+
+
+=back
+
+=end __PRIVATE__
+
+=begin __PRIVATE__
+
+=head2 Internal methods
+
+Internal routines are described in this section. They do not form part of the
+public interface. All private methods start with an underscore.
+
+=over 4
+
+=item B<_output>
+
+Output text to the output filehandle. This method must be always be called
+to output parsed text.
+
+ $parser->_output($text);
+
+Does not write anything if a =begin is active that should be
+ignored.
+
+=cut
+
+sub _output {
+ my $self = shift;
+ my $text = shift;
+
+ print { $self->output_handle } $text
+ unless $self->{_suppress_all_para};
+
+}
+
+
+=item B<_replace_special_chars>
+
+Subroutine to replace characters that are special in C<latex>
+with the escaped forms
+
+ $escaped = $parser->_replace_special_chars($paragraph);
+
+Need to call this routine before interior_sequences are munged but not
+if verbatim. It must be called before interpolation of interior
+sequences so that curly brackets and special latex characters inserted
+during interpolation are not themselves escaped. This means that < and
+> can not be modified here since the text still contains interior
+sequences.
+
+Special characters and the C<latex> equivalents are:
+
+ } \}
+ { \{
+ _ \_
+ $ \$
+ % \%
+ & \&
+ \ $\backslash$
+ ^ \^{}
+ ~ \~{}
+ # \#
+
+=cut
+
+sub _replace_special_chars {
+ my $self = shift;
+ my $paragraph = shift;
+
+ # Replace a \ with $\backslash$
+ # This is made more complicated because the dollars will be escaped
+ # by the subsequent replacement. Easiest to add \backslash
+ # now and then add the dollars
+ $paragraph =~ s/\\/\\backslash/g;
+
+ # Must be done after escape of \ since this command adds latex escapes
+ # Replace characters that can be escaped
+ $paragraph =~ s/([\$\#&%_{}])/\\$1/g;
+
+ # Replace ^ characters with \^{} so that $^F works okay
+ $paragraph =~ s/(\^)/\\$1\{\}/g;
+
+ # Replace tilde (~) with \texttt{\~{}}
+ $paragraph =~ s/~/\\texttt\{\\~\{\}\}/g;
+
+ # Now add the dollars around each \backslash
+ $paragraph =~ s/(\\backslash)/\$$1\$/g;
+ return $paragraph;
+}
+
+=item B<_replace_special_chars_late>
+
+Replace special characters that can not be replaced before interior
+sequence interpolation. See C<_replace_special_chars> for a routine
+to replace special characters prior to interpolation of interior
+sequences.
+
+Does the following transformation:
+
+ < $<$
+ > $>$
+ | $|$
+
+
+=cut
+
+sub _replace_special_chars_late {
+ my $self = shift;
+ my $paragraph = shift;
+
+ # < and >
+ $paragraph =~ s/(<|>)/\$$1\$/g;
+
+ # Replace | with $|$
+ $paragraph =~ s'\|'$|$'g;
+
+
+ return $paragraph;
+}
+
+
+=item B<_create_label>
+
+Return a string that can be used as an internal reference
+in a C<latex> document (i.e. accepted by the C<\label> command)
+
+ $label = $parser->_create_label($string)
+
+If UniqueLabels is true returns a label prefixed by Label()
+This can be suppressed with an optional second argument.
+
+ $label = $parser->_create_label($string, $suppress);
+
+If a second argument is supplied (of any value including undef)
+the Label() is never prefixed. This means that this routine can
+be called to create a Label() without prefixing a previous setting.
+
+=cut
+
+sub _create_label {
+ my $self = shift;
+ my $paragraph = shift;
+ my $suppress = (@_ ? 1 : 0 );
+
+ # Remove latex commands
+ $paragraph = $self->_clean_latex_commands($paragraph);
+
+ # Remove non alphanumerics from the label and replace with underscores
+ # want to protect '-' though so use negated character classes
+ $paragraph =~ s/[^-:\w]/_/g;
+
+ # Multiple underscores will look unsightly so remove repeats
+ # This will also have the advantage of tidying up the end and
+ # start of string
+ $paragraph =~ s/_+/_/g;
+
+ # If required need to make sure that the label is unique
+ # since it is possible to have multiple pods in a single
+ # document
+ if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
+ $paragraph = $self->Label() .'_'. $paragraph;
+ }
+
+ return $paragraph;
+}
+
+
+=item B<_create_index>
+
+Similar to C<_create_label> except an index entry is created.
+If C<UniqueLabels> is true, the index entry is prefixed by
+the current C<Label> and an exclamation mark.
+
+ $ind = $parser->_create_index($paragraph);
+
+An exclamation mark is used by C<makeindex> to generate
+sub-entries in an index.
+
+=cut
+
+sub _create_index {
+ my $self = shift;
+ my $paragraph = shift;
+ my $suppress = (@_ ? 1 : 0 );
+
+ # Remove latex commands
+ $paragraph = $self->_clean_latex_commands($paragraph);
+
+ # If required need to make sure that the index entry is unique
+ # since it is possible to have multiple pods in a single
+ # document
+ if (!$suppress && $self->UniqueLabels() && defined $self->Label) {
+ $paragraph = $self->Label() .'!'. $paragraph;
+ }
+
+ # Need to replace _ with space
+ $paragraph =~ s/_/ /g;
+
+ return $paragraph;
+
+}
+
+=item B<_clean_latex_commands>
+
+Removes latex commands from text. The latex command is assumed to be of the
+form C<\command{ text }>. "C<text>" is retained
+
+ $clean = $parser->_clean_latex_commands($text);
+
+=cut
+
+sub _clean_latex_commands {
+ my $self = shift;
+ my $paragraph = shift;
+
+ # Remove latex commands of the form \text{ }
+ # and replace with the contents of the { }
+ # need to make this non-greedy so that it can handle
+ # "\text{a} and \text2{b}"
+ # without converting it to
+ # "a} and \text2{b"
+ # This match will still get into trouble if \} is present
+ # This is not vital since the subsequent replacement of non-alphanumeric
+ # characters will tidy it up anyway
+ $paragraph =~ s/\\\w+{(.*?)}/$1/g;
+
+ return $paragraph
+}
+
+=item B<_split_delimited>
+
+Split the supplied string into two parts at approximately the
+specified word boundary. Special care is made to make sure that it
+does not split in the middle of some curly brackets.
+
+e.g. "this text is \textbf{very bold}" would not be split into
+"this text is \textbf{very" and " bold".
+
+ ($hunk1, $hunk2) = $self->_split_delimited( $para, $length);
+
+The length indicates the maximum length of hunk1.
+
+=cut
+
+# initially Supplied by hsmyers@sdragons.com
+# 10/25/01, utility to split \hbox
+# busting lines. Reformatted by TimJ to match module style.
+sub _split_delimited {
+ my $self = shift;
+ my $input = shift;
+ my $limit = shift;
+
+ # Return immediately if already small
+ return ($input, '') if length($input) < $limit;
+
+ my @output;
+ my $s = '';
+ my $t = '';
+ my $depth = 0;
+ my $token;
+
+ $input =~ s/\n/ /gm;
+ $input .= ' ';
+ foreach ( split ( //, $input ) ) {
+ $token .= $_;
+ if (/\{/) {
+ $depth++;
+ } elsif ( /}/ ) {
+ $depth--;
+ } elsif ( / / and $depth == 0) {
+ push @output, $token if ( $token and $token ne ' ' );
+ $token = '';
+ }
+ }
+
+ foreach (@output) {
+ if (length($s) < $limit) {
+ $s .= $_;
+ } else {
+ $t .= $_;
+ }
+ }
+
+ # Tidy up
+ $s =~ s/\s+$//;
+ $t =~ s/\s+$//;
+ return ($s,$t);
+}
+
+=back
+
+=end __PRIVATE__
+
+=head1 NOTES
+
+Compatible with C<latex2e> only. Can not be used with C<latex> v2.09
+or earlier.
+
+A subclass of C<Pod::Select> so that specific pod sections can be
+converted to C<latex> by using the C<select> method.
+
+Some HTML escapes are missing and many have not been tested.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Pod::Select>, L<pod2latex>
+
+=head1 AUTHORS
+
+Tim Jenness E<lt>tjenness@cpan.orgE<gt>
+
+Bug fixes and improvements have been received from: Simon Cozens
+E<lt>simon@cozens.netE<gt>, Mark A. Hershberger
+E<lt>mah@everybody.orgE<gt>, Marcel Grunauer
+E<lt>marcel@codewerk.comE<gt>, Hugh S Myers
+E<lt>hsmyers@sdragons.comE<gt>, Peter J Acklam
+E<lt>jacklam@math.uio.noE<gt>, Sudhi Herle E<lt>sudhi@herle.netE<gt>,
+Ariel Scolnicov E<lt>ariels@compugen.co.ilE<gt>,
+Adriano Rodrigues Ferreira E<lt>ferreira@triang.com.brE<gt> and
+R. de Vries E<lt>r.de.vries@dutchspace.nlE<gt>.
+
+
+=head1 COPYRIGHT
+
+Copyright (C) 2000-2004 Tim Jenness. All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=begin __PRIVATE__
+
+=head1 REVISION
+
+$Id: LaTeX.pm,v 1.19 2004/12/30 01:40:44 timj Exp $
+
+=end __PRIVATE__
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Pod/Man.pm b/Master/tlpkg/tlperl/lib/Pod/Man.pm
new file mode 100644
index 00000000000..9339f835bbc
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Man.pm
@@ -0,0 +1,1764 @@
+# Pod::Man -- Convert POD data to formatted *roff input.
+#
+# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+# Russ Allbery <rra@stanford.edu>
+# Substantial contributions by Sean Burke <sburke@cpan.org>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module translates POD documentation into *roff markup using the man
+# macro set, and is intended for converting POD documents written as Unix
+# manual pages to manual pages that can be read by the man(1) command. It is
+# a replacement for the pod2man command distributed with versions of Perl
+# prior to 5.6.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators. Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Man;
+
+require 5.005;
+
+use strict;
+use subs qw(makespace);
+use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION);
+
+use Carp qw(croak);
+use Pod::Simple ();
+
+@ISA = qw(Pod::Simple);
+
+$VERSION = '2.23';
+
+# Set the debugging level. If someone has inserted a debug function into this
+# class already, use that. Otherwise, use any Pod::Simple debug function
+# that's defined, and failing that, define a debug level of 10.
+BEGIN {
+ my $parent = defined (&Pod::Simple::DEBUG) ? \&Pod::Simple::DEBUG : undef;
+ unless (defined &DEBUG) {
+ *DEBUG = $parent || sub () { 10 };
+ }
+}
+
+# Import the ASCII constant from Pod::Simple. This is true iff we're in an
+# ASCII-based universe (including such things as ISO 8859-1 and UTF-8), and is
+# generally only false for EBCDIC.
+BEGIN { *ASCII = \&Pod::Simple::ASCII }
+
+# Pretty-print a data structure. Only used for debugging.
+BEGIN { *pretty = \&Pod::Simple::pretty }
+
+##############################################################################
+# Object initialization
+##############################################################################
+
+# Initialize the object and set various Pod::Simple options that we need.
+# Here, we also process any additional options passed to the constructor or
+# set up defaults if none were given. Note that all internal object keys are
+# in all-caps, reserving all lower-case object keys for Pod::Simple and user
+# arguments.
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new;
+
+ # Tell Pod::Simple not to handle S<> by automatically inserting &nbsp;.
+ $self->nbsp_for_S (1);
+
+ # Tell Pod::Simple to keep whitespace whenever possible.
+ if ($self->can ('preserve_whitespace')) {
+ $self->preserve_whitespace (1);
+ } else {
+ $self->fullstop_space_harden (1);
+ }
+
+ # The =for and =begin targets that we accept.
+ $self->accept_targets (qw/man MAN roff ROFF/);
+
+ # Ensure that contiguous blocks of code are merged together. Otherwise,
+ # some of the guesswork heuristics don't work right.
+ $self->merge_text (1);
+
+ # Pod::Simple doesn't do anything useful with our arguments, but we want
+ # to put them in our object as hash keys and values. This could cause
+ # problems if we ever clash with Pod::Simple's own internal class
+ # variables.
+ %$self = (%$self, @_);
+
+ # Send errors to stderr if requested.
+ if ($$self{stderr}) {
+ $self->no_errata_section (1);
+ $self->complain_stderr (1);
+ delete $$self{stderr};
+ }
+
+ # Initialize various other internal constants based on our arguments.
+ $self->init_fonts;
+ $self->init_quotes;
+ $self->init_page;
+
+ # For right now, default to turning on all of the magic.
+ $$self{MAGIC_CPP} = 1;
+ $$self{MAGIC_EMDASH} = 1;
+ $$self{MAGIC_FUNC} = 1;
+ $$self{MAGIC_MANREF} = 1;
+ $$self{MAGIC_SMALLCAPS} = 1;
+ $$self{MAGIC_VARS} = 1;
+
+ return $self;
+}
+
+# Translate a font string into an escape.
+sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] }
+
+# Determine which fonts the user wishes to use and store them in the object.
+# Regular, italic, bold, and bold-italic are constants, but the fixed width
+# fonts may be set by the user. Sets the internal hash key FONTS which is
+# used to map our internal font escapes to actual *roff sequences later.
+sub init_fonts {
+ my ($self) = @_;
+
+ # Figure out the fixed-width font. If user-supplied, make sure that they
+ # are the right length.
+ for (qw/fixed fixedbold fixeditalic fixedbolditalic/) {
+ my $font = $$self{$_};
+ if (defined ($font) && (length ($font) < 1 || length ($font) > 2)) {
+ croak qq(roff font should be 1 or 2 chars, not "$font");
+ }
+ }
+
+ # Set the default fonts. We can't be sure portably across different
+ # implementations what fixed bold-italic may be called (if it's even
+ # available), so default to just bold.
+ $$self{fixed} ||= 'CW';
+ $$self{fixedbold} ||= 'CB';
+ $$self{fixeditalic} ||= 'CI';
+ $$self{fixedbolditalic} ||= 'CB';
+
+ # Set up a table of font escapes. First number is fixed-width, second is
+ # bold, third is italic.
+ $$self{FONTS} = { '000' => '\fR', '001' => '\fI',
+ '010' => '\fB', '011' => '\f(BI',
+ '100' => toescape ($$self{fixed}),
+ '101' => toescape ($$self{fixeditalic}),
+ '110' => toescape ($$self{fixedbold}),
+ '111' => toescape ($$self{fixedbolditalic}) };
+}
+
+# Initialize the quotes that we'll be using for C<> text. This requires some
+# special handling, both to parse the user parameter if given and to make sure
+# that the quotes will be safe against *roff. Sets the internal hash keys
+# LQUOTE and RQUOTE.
+sub init_quotes {
+ my ($self) = (@_);
+
+ $$self{quotes} ||= '"';
+ if ($$self{quotes} eq 'none') {
+ $$self{LQUOTE} = $$self{RQUOTE} = '';
+ } elsif (length ($$self{quotes}) == 1) {
+ $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes};
+ } elsif ($$self{quotes} =~ /^(.)(.)$/
+ || $$self{quotes} =~ /^(..)(..)$/) {
+ $$self{LQUOTE} = $1;
+ $$self{RQUOTE} = $2;
+ } else {
+ croak(qq(Invalid quote specification "$$self{quotes}"))
+ }
+
+ # Double the first quote; note that this should not be s///g as two double
+ # quotes is represented in *roff as three double quotes, not four. Weird,
+ # I know.
+ $$self{LQUOTE} =~ s/\"/\"\"/;
+ $$self{RQUOTE} =~ s/\"/\"\"/;
+}
+
+# Initialize the page title information and indentation from our arguments.
+sub init_page {
+ my ($self) = @_;
+
+ # We used to try first to get the version number from a local binary, but
+ # we shouldn't need that any more. Get the version from the running Perl.
+ # Work a little magic to handle subversions correctly under both the
+ # pre-5.6 and the post-5.6 version numbering schemes.
+ my @version = ($] =~ /^(\d+)\.(\d{3})(\d{0,3})$/);
+ $version[2] ||= 0;
+ $version[2] *= 10 ** (3 - length $version[2]);
+ for (@version) { $_ += 0 }
+ my $version = join ('.', @version);
+
+ # Set the defaults for page titles and indentation if the user didn't
+ # override anything.
+ $$self{center} = 'User Contributed Perl Documentation'
+ unless defined $$self{center};
+ $$self{release} = 'perl v' . $version
+ unless defined $$self{release};
+ $$self{indent} = 4
+ unless defined $$self{indent};
+
+ # Double quotes in things that will be quoted.
+ for (qw/center release/) {
+ $$self{$_} =~ s/\"/\"\"/g if $$self{$_};
+ }
+}
+
+##############################################################################
+# Core parsing
+##############################################################################
+
+# This is the glue that connects the code below with Pod::Simple itself. The
+# goal is to convert the event stream coming from the POD parser into method
+# calls to handlers once the complete content of a tag has been seen. Each
+# paragraph or POD command will have textual content associated with it, and
+# as soon as all of a paragraph or POD command has been seen, that content
+# will be passed in to the corresponding method for handling that type of
+# object. The exceptions are handlers for lists, which have opening tag
+# handlers and closing tag handlers that will be called right away.
+#
+# The internal hash key PENDING is used to store the contents of a tag until
+# all of it has been seen. It holds a stack of open tags, each one
+# represented by a tuple of the attributes hash for the tag, formatting
+# options for the tag (which are inherited), and the contents of the tag.
+
+# Add a block of text to the contents of the current node, formatting it
+# according to the current formatting instructions as we do.
+sub _handle_text {
+ my ($self, $text) = @_;
+ DEBUG > 3 and print "== $text\n";
+ my $tag = $$self{PENDING}[-1];
+ $$tag[2] .= $self->format_text ($$tag[1], $text);
+}
+
+# Given an element name, get the corresponding method name.
+sub method_for_element {
+ my ($self, $element) = @_;
+ $element =~ tr/-/_/;
+ $element =~ tr/A-Z/a-z/;
+ $element =~ tr/_a-z0-9//cd;
+ return $element;
+}
+
+# Handle the start of a new element. If cmd_element is defined, assume that
+# we need to collect the entire tree for this element before passing it to the
+# element method, and create a new tree into which we'll collect blocks of
+# text and nested elements. Otherwise, if start_element is defined, call it.
+sub _handle_element_start {
+ my ($self, $element, $attrs) = @_;
+ DEBUG > 3 and print "++ $element (<", join ('> <', %$attrs), ">)\n";
+ my $method = $self->method_for_element ($element);
+
+ # If we have a command handler, we need to accumulate the contents of the
+ # tag before calling it. Turn off IN_NAME for any command other than
+ # <Para> and the formatting codes so that IN_NAME isn't still set for the
+ # first heading after the NAME heading.
+ if ($self->can ("cmd_$method")) {
+ DEBUG > 2 and print "<$element> starts saving a tag\n";
+ $$self{IN_NAME} = 0 if ($element ne 'Para' && length ($element) > 1);
+
+ # How we're going to format embedded text blocks depends on the tag
+ # and also depends on our parent tags. Thankfully, inside tags that
+ # turn off guesswork and reformatting, nothing else can turn it back
+ # on, so this can be strictly inherited.
+ my $formatting = $$self{PENDING}[-1][1];
+ $formatting = $self->formatting ($formatting, $element);
+ push (@{ $$self{PENDING} }, [ $attrs, $formatting, '' ]);
+ DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n";
+ } elsif ($self->can ("start_$method")) {
+ my $method = 'start_' . $method;
+ $self->$method ($attrs, '');
+ } else {
+ DEBUG > 2 and print "No $method start method, skipping\n";
+ }
+}
+
+# Handle the end of an element. If we had a cmd_ method for this element,
+# this is where we pass along the tree that we built. Otherwise, if we have
+# an end_ method for the element, call that.
+sub _handle_element_end {
+ my ($self, $element) = @_;
+ DEBUG > 3 and print "-- $element\n";
+ my $method = $self->method_for_element ($element);
+
+ # If we have a command handler, pull off the pending text and pass it to
+ # the handler along with the saved attribute hash.
+ if ($self->can ("cmd_$method")) {
+ DEBUG > 2 and print "</$element> stops saving a tag\n";
+ my $tag = pop @{ $$self{PENDING} };
+ DEBUG > 4 and print "Popped: [", pretty ($tag), "]\n";
+ DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n";
+ my $method = 'cmd_' . $method;
+ my $text = $self->$method ($$tag[0], $$tag[2]);
+ if (defined $text) {
+ if (@{ $$self{PENDING} } > 1) {
+ $$self{PENDING}[-1][2] .= $text;
+ } else {
+ $self->output ($text);
+ }
+ }
+ } elsif ($self->can ("end_$method")) {
+ my $method = 'end_' . $method;
+ $self->$method ();
+ } else {
+ DEBUG > 2 and print "No $method end method, skipping\n";
+ }
+}
+
+##############################################################################
+# General formatting
+##############################################################################
+
+# Return formatting instructions for a new block. Takes the current
+# formatting and the new element. Formatting inherits negatively, in the
+# sense that if the parent has turned off guesswork, all child elements should
+# leave it off. We therefore return a copy of the same formatting
+# instructions but possibly with more things turned off depending on the
+# element.
+sub formatting {
+ my ($self, $current, $element) = @_;
+ my %options;
+ if ($current) {
+ %options = %$current;
+ } else {
+ %options = (guesswork => 1, cleanup => 1, convert => 1);
+ }
+ if ($element eq 'Data') {
+ $options{guesswork} = 0;
+ $options{cleanup} = 0;
+ $options{convert} = 0;
+ } elsif ($element eq 'X') {
+ $options{guesswork} = 0;
+ $options{cleanup} = 0;
+ } elsif ($element eq 'Verbatim' || $element eq 'C') {
+ $options{guesswork} = 0;
+ $options{literal} = 1;
+ }
+ return \%options;
+}
+
+# Format a text block. Takes a hash of formatting options and the text to
+# format. Currently, the only formatting options are guesswork, cleanup, and
+# convert, all of which are boolean.
+sub format_text {
+ my ($self, $options, $text) = @_;
+ my $guesswork = $$options{guesswork} && !$$self{IN_NAME};
+ my $cleanup = $$options{cleanup};
+ my $convert = $$options{convert};
+ my $literal = $$options{literal};
+
+ # Cleanup just tidies up a few things, telling *roff that the hyphens are
+ # hard, putting a bit of space between consecutive underscores, and
+ # escaping backslashes. Be careful not to mangle our character
+ # translations by doing this before processing character translation.
+ if ($cleanup) {
+ $text =~ s/\\/\\e/g;
+ $text =~ s/-/\\-/g;
+ $text =~ s/_(?=_)/_\\|/g;
+ }
+
+ # Normally we do character translation, but we won't even do that in
+ # <Data> blocks or if UTF-8 output is desired.
+ if ($convert && !$$self{utf8} && ASCII) {
+ $text =~ s/([^\x00-\x7F])/$ESCAPES{ord ($1)} || "X"/eg;
+ }
+
+ # Ensure that *roff doesn't convert literal quotes to UTF-8 single quotes,
+ # but don't mess up our accept escapes.
+ if ($literal) {
+ $text =~ s/(?<!\\\*)\'/\\*\(Aq/g;
+ $text =~ s/(?<!\\\*)\`/\\\`/g;
+ }
+
+ # If guesswork is asked for, do that. This involves more substantial
+ # formatting based on various heuristics that may only be appropriate for
+ # particular documents.
+ if ($guesswork) {
+ $text = $self->guesswork ($text);
+ }
+
+ return $text;
+}
+
+# Handles C<> text, deciding whether to put \*C` around it or not. This is a
+# whole bunch of messy heuristics to try to avoid overquoting, originally from
+# Barrie Slaymaker. This largely duplicates similar code in Pod::Text.
+sub quote_literal {
+ my $self = shift;
+ local $_ = shift;
+
+ # A regex that matches the portion of a variable reference that's the
+ # array or hash index, separated out just because we want to use it in
+ # several places in the following regex.
+ my $index = '(?: \[.*\] | \{.*\} )?';
+
+ # If in NAME section, just return an ASCII quoted string to avoid
+ # confusing tools like whatis.
+ return qq{"$_"} if $$self{IN_NAME};
+
+ # Check for things that we don't want to quote, and if we find any of
+ # them, return the string with just a font change and no quoting.
+ m{
+ ^\s*
+ (?:
+ ( [\'\`\"] ) .* \1 # already quoted
+ | \\\*\(Aq .* \\\*\(Aq # quoted and escaped
+ | \\?\` .* ( \' | \\\*\(Aq ) # `quoted'
+ | \$+ [\#^]? \S $index # special ($^Foo, $")
+ | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func
+ | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
+ | [-+]? ( \d[\d.]* | \.\d+ ) (?: [eE][-+]?\d+ )? # a number
+ | 0x [a-fA-F\d]+ # a hex constant
+ )
+ \s*\z
+ }xso and return '\f(FS' . $_ . '\f(FE';
+
+ # If we didn't return, go ahead and quote the text.
+ return '\f(FS\*(C`' . $_ . "\\*(C'\\f(FE";
+}
+
+# Takes a text block to perform guesswork on. Returns the text block with
+# formatting codes added. This is the code that marks up various Perl
+# constructs and things commonly used in man pages without requiring the user
+# to add any explicit markup, and is applied to all non-literal text. We're
+# guaranteed that the text we're applying guesswork to does not contain any
+# *roff formatting codes. Note that the inserted font sequences must be
+# treated later with mapfonts or textmapfonts.
+#
+# This method is very fragile, both in the regular expressions it uses and in
+# the ordering of those modifications. Care and testing is required when
+# modifying it.
+sub guesswork {
+ my $self = shift;
+ local $_ = shift;
+ DEBUG > 5 and print " Guesswork called on [$_]\n";
+
+ # By the time we reach this point, all hypens will be escaped by adding a
+ # backslash. We want to undo that escaping if they're part of regular
+ # words and there's only a single dash, since that's a real hyphen that
+ # *roff gets to consider a possible break point. Make sure that a dash
+ # after the first character of a word stays non-breaking, however.
+ #
+ # Note that this is not user-controllable; we pretty much have to do this
+ # transformation or *roff will mangle the output in unacceptable ways.
+ s{
+ ( (?:\G|^|\s) [\(\"]* [a-zA-Z] ) ( \\- )?
+ ( (?: [a-zA-Z\']+ \\-)+ )
+ ( [a-zA-Z\']+ ) (?= [\)\".?!,;:]* (?:\s|\Z|\\\ ) )
+ \b
+ } {
+ my ($prefix, $hyphen, $main, $suffix) = ($1, $2, $3, $4);
+ $hyphen ||= '';
+ $main =~ s/\\-/-/g;
+ $prefix . $hyphen . $main . $suffix;
+ }egx;
+
+ # Translate "--" into a real em-dash if it's used like one. This means
+ # that it's either surrounded by whitespace, it follows a regular word, or
+ # it occurs between two regular words.
+ if ($$self{MAGIC_EMDASH}) {
+ s{ (\s) \\-\\- (\s) } { $1 . '\*(--' . $2 }egx;
+ s{ (\b[a-zA-Z]+) \\-\\- (\s|\Z|[a-zA-Z]+\b) } { $1 . '\*(--' . $2 }egx;
+ }
+
+ # Make words in all-caps a little bit smaller; they look better that way.
+ # However, we don't want to change Perl code (like @ARGV), nor do we want
+ # to fix the MIME in MIME-Version since it looks weird with the
+ # full-height V.
+ #
+ # We change only a string of all caps (2) either at the beginning of the
+ # line or following regular punctuation (like quotes) or whitespace (1),
+ # and followed by either similar punctuation, an em-dash, or the end of
+ # the line (3).
+ if ($$self{MAGIC_SMALLCAPS}) {
+ s{
+ ( ^ | [\s\(\"\'\`\[\{<>] | \\\ ) # (1)
+ ( [A-Z] [A-Z] (?: [/A-Z+:\d_\$&] | \\- )* ) # (2)
+ (?= [\s>\}\]\(\)\'\".?!,;] | \\*\(-- | \\\ | $ ) # (3)
+ } {
+ $1 . '\s-1' . $2 . '\s0'
+ }egx;
+ }
+
+ # Note that from this point forward, we have to adjust for \s-1 and \s-0
+ # strings inserted around things that we've made small-caps if later
+ # transforms should work on those strings.
+
+ # Italize functions in the form func(), including functions that are in
+ # all capitals, but don't italize if there's anything between the parens.
+ # The function must start with an alphabetic character or underscore and
+ # then consist of word characters or colons.
+ if ($$self{MAGIC_FUNC}) {
+ s{
+ ( \b | \\s-1 )
+ ( [A-Za-z_] ([:\w] | \\s-?[01])+ \(\) )
+ } {
+ $1 . '\f(IS' . $2 . '\f(IE'
+ }egx;
+ }
+
+ # Change references to manual pages to put the page name in italics but
+ # the number in the regular font, with a thin space between the name and
+ # the number. Only recognize func(n) where func starts with an alphabetic
+ # character or underscore and contains only word characters, periods (for
+ # configuration file man pages), or colons, and n is a single digit,
+ # optionally followed by some number of lowercase letters. Note that this
+ # does not recognize man page references like perl(l) or socket(3SOCKET).
+ if ($$self{MAGIC_MANREF}) {
+ s{
+ ( \b | \\s-1 )
+ ( [A-Za-z_] (?:[.:\w] | \\- | \\s-?[01])+ )
+ ( \( \d [a-z]* \) )
+ } {
+ $1 . '\f(IS' . $2 . '\f(IE\|' . $3
+ }egx;
+ }
+
+ # Convert simple Perl variable references to a fixed-width font. Be
+ # careful not to convert functions, though; there are too many subtleties
+ # with them to want to perform this transformation.
+ if ($$self{MAGIC_VARS}) {
+ s{
+ ( ^ | \s+ )
+ ( [\$\@%] [\w:]+ )
+ (?! \( )
+ } {
+ $1 . '\f(FS' . $2 . '\f(FE'
+ }egx;
+ }
+
+ # Fix up double quotes. Unfortunately, we miss this transformation if the
+ # quoted text contains any code with formatting codes and there's not much
+ # we can effectively do about that, which makes it somewhat unclear if
+ # this is really a good idea.
+ s{ \" ([^\"]+) \" } { '\*(L"' . $1 . '\*(R"' }egx;
+
+ # Make C++ into \*(C+, which is a squinched version.
+ if ($$self{MAGIC_CPP}) {
+ s{ \b C\+\+ } {\\*\(C+}gx;
+ }
+
+ # Done.
+ DEBUG > 5 and print " Guesswork returning [$_]\n";
+ return $_;
+}
+
+##############################################################################
+# Output
+##############################################################################
+
+# When building up the *roff code, we don't use real *roff fonts. Instead, we
+# embed font codes of the form \f(<font>[SE] where <font> is one of B, I, or
+# F, S stands for start, and E stands for end. This method turns these into
+# the right start and end codes.
+#
+# We add this level of complexity because the old pod2man didn't get code like
+# B<someI<thing> else> right; after I<> it switched back to normal text rather
+# than bold. We take care of this by using variables that state whether bold,
+# italic, or fixed are turned on as a combined pointer to our current font
+# sequence, and set each to the number of current nestings of start tags for
+# that font.
+#
+# \fP changes to the previous font, but only one previous font is kept. We
+# don't know what the outside level font is; normally it's R, but if we're
+# inside a heading it could be something else. So arrange things so that the
+# outside font is always the "previous" font and end with \fP instead of \fR.
+# Idea from Zack Weinberg.
+sub mapfonts {
+ my ($self, $text) = @_;
+ my ($fixed, $bold, $italic) = (0, 0, 0);
+ my %magic = (F => \$fixed, B => \$bold, I => \$italic);
+ my $last = '\fR';
+ $text =~ s<
+ \\f\((.)(.)
+ > <
+ my $sequence = '';
+ my $f;
+ if ($last ne '\fR') { $sequence = '\fP' }
+ ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
+ $f = $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) };
+ if ($f eq $last) {
+ '';
+ } else {
+ if ($f ne '\fR') { $sequence .= $f }
+ $last = $f;
+ $sequence;
+ }
+ >gxe;
+ return $text;
+}
+
+# Unfortunately, there is a bug in Solaris 2.6 nroff (not present in GNU
+# groff) where the sequence \fB\fP\f(CW\fP leaves the font set to B rather
+# than R, presumably because \f(CW doesn't actually do a font change. To work
+# around this, use a separate textmapfonts for text blocks where the default
+# font is always R and only use the smart mapfonts for headings.
+sub textmapfonts {
+ my ($self, $text) = @_;
+ my ($fixed, $bold, $italic) = (0, 0, 0);
+ my %magic = (F => \$fixed, B => \$bold, I => \$italic);
+ $text =~ s<
+ \\f\((.)(.)
+ > <
+ ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1;
+ $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) };
+ >gxe;
+ return $text;
+}
+
+# Given a command and a single argument that may or may not contain double
+# quotes, handle double-quote formatting for it. If there are no double
+# quotes, just return the command followed by the argument in double quotes.
+# If there are double quotes, use an if statement to test for nroff, and for
+# nroff output the command followed by the argument in double quotes with
+# embedded double quotes doubled. For other formatters, remap paired double
+# quotes to LQUOTE and RQUOTE.
+sub switchquotes {
+ my ($self, $command, $text, $extra) = @_;
+ $text =~ s/\\\*\([LR]\"/\"/g;
+
+ # We also have to deal with \*C` and \*C', which are used to add the
+ # quotes around C<> text, since they may expand to " and if they do this
+ # confuses the .SH macros and the like no end. Expand them ourselves.
+ # Also separate troff from nroff if there are any fixed-width fonts in use
+ # to work around problems with Solaris nroff.
+ my $c_is_quote = ($$self{LQUOTE} =~ /\"/) || ($$self{RQUOTE} =~ /\"/);
+ my $fixedpat = join '|', @{ $$self{FONTS} }{'100', '101', '110', '111'};
+ $fixedpat =~ s/\\/\\\\/g;
+ $fixedpat =~ s/\(/\\\(/g;
+ if ($text =~ m/\"/ || $text =~ m/$fixedpat/) {
+ $text =~ s/\"/\"\"/g;
+ my $nroff = $text;
+ my $troff = $text;
+ $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g;
+ if ($c_is_quote and $text =~ m/\\\*\(C[\'\`]/) {
+ $nroff =~ s/\\\*\(C\`/$$self{LQUOTE}/g;
+ $nroff =~ s/\\\*\(C\'/$$self{RQUOTE}/g;
+ $troff =~ s/\\\*\(C[\'\`]//g;
+ }
+ $nroff = qq("$nroff") . ($extra ? " $extra" : '');
+ $troff = qq("$troff") . ($extra ? " $extra" : '');
+
+ # Work around the Solaris nroff bug where \f(CW\fP leaves the font set
+ # to Roman rather than the actual previous font when used in headings.
+ # troff output may still be broken, but at least we can fix nroff by
+ # just switching the font changes to the non-fixed versions.
+ $nroff =~ s/\Q$$self{FONTS}{100}\E(.*?)\\f[PR]/$1/g;
+ $nroff =~ s/\Q$$self{FONTS}{101}\E(.*?)\\f([PR])/\\fI$1\\f$2/g;
+ $nroff =~ s/\Q$$self{FONTS}{110}\E(.*?)\\f([PR])/\\fB$1\\f$2/g;
+ $nroff =~ s/\Q$$self{FONTS}{111}\E(.*?)\\f([PR])/\\f\(BI$1\\f$2/g;
+
+ # Now finally output the command. Bother with .ie only if the nroff
+ # and troff output aren't the same.
+ if ($nroff ne $troff) {
+ return ".ie n $command $nroff\n.el $command $troff\n";
+ } else {
+ return "$command $nroff\n";
+ }
+ } else {
+ $text = qq("$text") . ($extra ? " $extra" : '');
+ return "$command $text\n";
+ }
+}
+
+# Protect leading quotes and periods against interpretation as commands. Also
+# protect anything starting with a backslash, since it could expand or hide
+# something that *roff would interpret as a command. This is overkill, but
+# it's much simpler than trying to parse *roff here.
+sub protect {
+ my ($self, $text) = @_;
+ $text =~ s/^([.\'\\])/\\&$1/mg;
+ return $text;
+}
+
+# Make vertical whitespace if NEEDSPACE is set, appropriate to the indentation
+# level the situation. This function is needed since in *roff one has to
+# create vertical whitespace after paragraphs and between some things, but
+# other macros create their own whitespace. Also close out a sequence of
+# repeated =items, since calling makespace means we're about to begin the item
+# body.
+sub makespace {
+ my ($self) = @_;
+ $self->output (".PD\n") if $$self{ITEMS} > 1;
+ $$self{ITEMS} = 0;
+ $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n")
+ if $$self{NEEDSPACE};
+}
+
+# Output any pending index entries, and optionally an index entry given as an
+# argument. Support multiple index entries in X<> separated by slashes, and
+# strip special escapes from index entries.
+sub outindex {
+ my ($self, $section, $index) = @_;
+ my @entries = map { split m%\s*/\s*% } @{ $$self{INDEX} };
+ return unless ($section || @entries);
+
+ # We're about to output all pending entries, so clear our pending queue.
+ $$self{INDEX} = [];
+
+ # Build the output. Regular index entries are marked Xref, and headings
+ # pass in their own section. Undo some *roff formatting on headings.
+ my @output;
+ if (@entries) {
+ push @output, [ 'Xref', join (' ', @entries) ];
+ }
+ if ($section) {
+ $index =~ s/\\-/-/g;
+ $index =~ s/\\(?:s-?\d|.\(..|.)//g;
+ push @output, [ $section, $index ];
+ }
+
+ # Print out the .IX commands.
+ for (@output) {
+ my ($type, $entry) = @$_;
+ $entry =~ s/\"/\"\"/g;
+ $entry =~ s/\\/\\\\/g;
+ $self->output (".IX $type " . '"' . $entry . '"' . "\n");
+ }
+}
+
+# Output some text, without any additional changes.
+sub output {
+ my ($self, @text) = @_;
+ print { $$self{output_fh} } @text;
+}
+
+##############################################################################
+# Document initialization
+##############################################################################
+
+# Handle the start of the document. Here we handle empty documents, as well
+# as setting up our basic macros in a preamble and building the page title.
+sub start_document {
+ my ($self, $attrs) = @_;
+ if ($$attrs{contentless} && !$$self{ALWAYS_EMIT_SOMETHING}) {
+ DEBUG and print "Document is contentless\n";
+ $$self{CONTENTLESS} = 1;
+ return;
+ }
+
+ # If we were given the utf8 option, set an output encoding on our file
+ # handle. Wrap in an eval in case we're using a version of Perl too old
+ # to understand this.
+ #
+ # This is evil because it changes the global state of a file handle that
+ # we may not own. However, we can't just blindly encode all output, since
+ # there may be a pre-applied output encoding (such as from PERL_UNICODE)
+ # and then we would double-encode. This seems to be the least bad
+ # approach.
+ if ($$self{utf8}) {
+ eval { binmode ($$self{output_fh}, ':encoding(UTF-8)') };
+ }
+
+ # Determine information for the preamble and then output it.
+ my ($name, $section);
+ if (defined $$self{name}) {
+ $name = $$self{name};
+ $section = $$self{section} || 1;
+ } else {
+ ($name, $section) = $self->devise_title;
+ }
+ my $date = $$self{date} || $self->devise_date;
+ $self->preamble ($name, $section, $date)
+ unless $self->bare_output or DEBUG > 9;
+
+ # Initialize a few per-document variables.
+ $$self{INDENT} = 0; # Current indentation level.
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{INDEX} = []; # Index keys waiting to be printed.
+ $$self{IN_NAME} = 0; # Whether processing the NAME section.
+ $$self{ITEMS} = 0; # The number of consecutive =items.
+ $$self{ITEMTYPES} = []; # Stack of =item types, one per list.
+ $$self{SHIFTWAIT} = 0; # Whether there is a shift waiting.
+ $$self{SHIFTS} = []; # Stack of .RS shifts.
+ $$self{PENDING} = [[]]; # Pending output.
+}
+
+# Handle the end of the document. This does nothing but print out a final
+# comment at the end of the document under debugging.
+sub end_document {
+ my ($self) = @_;
+ return if $self->bare_output;
+ return if ($$self{CONTENTLESS} && !$$self{ALWAYS_EMIT_SOMETHING});
+ $self->output (q(.\" [End document]) . "\n") if DEBUG;
+}
+
+# Try to figure out the name and section from the file name and return them as
+# a list, returning an empty name and section 1 if we can't find any better
+# information. Uses File::Basename and File::Spec as necessary.
+sub devise_title {
+ my ($self) = @_;
+ my $name = $self->source_filename || '';
+ my $section = $$self{section} || 1;
+ $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i);
+ $name =~ s/\.p(od|[lm])\z//i;
+
+ # If the section isn't 3, then the name defaults to just the basename of
+ # the file. Otherwise, assume we're dealing with a module. We want to
+ # figure out the full module name from the path to the file, but we don't
+ # want to include too much of the path into the module name. Lose
+ # anything up to the first off:
+ #
+ # */lib/*perl*/ standard or site_perl module
+ # */*perl*/lib/ from -Dprefix=/opt/perl
+ # */*perl*/ random module hierarchy
+ #
+ # which works. Also strip off a leading site, site_perl, or vendor_perl
+ # component, any OS-specific component, and any version number component,
+ # and strip off an initial component of "lib" or "blib/lib" since that's
+ # what ExtUtils::MakeMaker creates. splitdir requires at least File::Spec
+ # 0.8.
+ if ($section !~ /^3/) {
+ require File::Basename;
+ $name = uc File::Basename::basename ($name);
+ } else {
+ require File::Spec;
+ my ($volume, $dirs, $file) = File::Spec->splitpath ($name);
+ my @dirs = File::Spec->splitdir ($dirs);
+ my $cut = 0;
+ my $i;
+ for ($i = 0; $i < @dirs; $i++) {
+ if ($dirs[$i] =~ /perl/) {
+ $cut = $i + 1;
+ $cut++ if ($dirs[$i + 1] && $dirs[$i + 1] eq 'lib');
+ last;
+ }
+ }
+ if ($cut > 0) {
+ splice (@dirs, 0, $cut);
+ shift @dirs if ($dirs[0] =~ /^(site|vendor)(_perl)?$/);
+ shift @dirs if ($dirs[0] =~ /^[\d.]+$/);
+ shift @dirs if ($dirs[0] =~ /^(.*-$^O|$^O-.*|$^O)$/);
+ }
+ shift @dirs if $dirs[0] eq 'lib';
+ splice (@dirs, 0, 2) if ($dirs[0] eq 'blib' && $dirs[1] eq 'lib');
+
+ # Remove empty directories when building the module name; they
+ # occur too easily on Unix by doubling slashes.
+ $name = join ('::', (grep { $_ ? $_ : () } @dirs), $file);
+ }
+ return ($name, $section);
+}
+
+# Determine the modification date and return that, properly formatted in ISO
+# format. If we can't get the modification date of the input, instead use the
+# current time. Pod::Simple returns a completely unuseful stringified file
+# handle as the source_filename for input from a file handle, so we have to
+# deal with that as well.
+sub devise_date {
+ my ($self) = @_;
+ my $input = $self->source_filename;
+ my $time;
+ if ($input) {
+ $time = (stat $input)[9] || time;
+ } else {
+ $time = time;
+ }
+
+ # Can't use POSIX::strftime(), which uses Fcntl, because MakeMaker
+ # uses this and it has to work in the core which can't load dynamic
+ # libraries.
+ my ($year, $month, $day) = (localtime $time)[5,4,3];
+ return sprintf ("%04d-%02d-%02d", $year + 1900, $month + 1, $day);
+}
+
+# Print out the preamble and the title. The meaning of the arguments to .TH
+# unfortunately vary by system; some systems consider the fourth argument to
+# be a "source" and others use it as a version number. Generally it's just
+# presented as the left-side footer, though, so it doesn't matter too much if
+# a particular system gives it another interpretation.
+#
+# The order of date and release used to be reversed in older versions of this
+# module, but this order is correct for both Solaris and Linux.
+sub preamble {
+ my ($self, $name, $section, $date) = @_;
+ my $preamble = $self->preamble_template (!$$self{utf8});
+
+ # Build the index line and make sure that it will be syntactically valid.
+ my $index = "$name $section";
+ $index =~ s/\"/\"\"/g;
+
+ # If name or section contain spaces, quote them (section really never
+ # should, but we may as well be cautious).
+ for ($name, $section) {
+ if (/\s/) {
+ s/\"/\"\"/g;
+ $_ = '"' . $_ . '"';
+ }
+ }
+
+ # Double quotes in date, since it will be quoted.
+ $date =~ s/\"/\"\"/g;
+
+ # Substitute into the preamble the configuration options.
+ $preamble =~ s/\@CFONT\@/$$self{fixed}/;
+ $preamble =~ s/\@LQUOTE\@/$$self{LQUOTE}/;
+ $preamble =~ s/\@RQUOTE\@/$$self{RQUOTE}/;
+ chomp $preamble;
+
+ # Get the version information.
+ my $version = $self->version_report;
+
+ # Finally output everything.
+ $self->output (<<"----END OF HEADER----");
+.\\" Automatically generated by $version
+.\\"
+.\\" Standard preamble:
+.\\" ========================================================================
+$preamble
+.\\" ========================================================================
+.\\"
+.IX Title "$index"
+.TH $name $section "$date" "$$self{release}" "$$self{center}"
+.\\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+----END OF HEADER----
+ $self->output (".\\\" [End of preamble]\n") if DEBUG;
+}
+
+##############################################################################
+# Text blocks
+##############################################################################
+
+# Handle a basic block of text. The only tricky part of this is if this is
+# the first paragraph of text after an =over, in which case we have to change
+# indentations for *roff.
+sub cmd_para {
+ my ($self, $attrs, $text) = @_;
+ my $line = $$attrs{start_line};
+
+ # Output the paragraph. We also have to handle =over without =item. If
+ # there's an =over without =item, SHIFTWAIT will be set, and we need to
+ # handle creation of the indent here. Add the shift to SHIFTS so that it
+ # will be cleaned up on =back.
+ $self->makespace;
+ if ($$self{SHIFTWAIT}) {
+ $self->output (".RS $$self{INDENT}\n");
+ push (@{ $$self{SHIFTS} }, $$self{INDENT});
+ $$self{SHIFTWAIT} = 0;
+ }
+
+ # Add the line number for debugging, but not in the NAME section just in
+ # case the comment would confuse apropos.
+ $self->output (".\\\" [At source line $line]\n")
+ if defined ($line) && DEBUG && !$$self{IN_NAME};
+
+ # Force exactly one newline at the end and strip unwanted trailing
+ # whitespace at the end.
+ $text =~ s/\s*$/\n/;
+
+ # Output the paragraph.
+ $self->output ($self->protect ($self->textmapfonts ($text)));
+ $self->outindex;
+ $$self{NEEDSPACE} = 1;
+ return '';
+}
+
+# Handle a verbatim paragraph. Put a null token at the beginning of each line
+# to protect against commands and wrap in .Vb/.Ve (which we define in our
+# prelude).
+sub cmd_verbatim {
+ my ($self, $attrs, $text) = @_;
+
+ # Ignore an empty verbatim paragraph.
+ return unless $text =~ /\S/;
+
+ # Force exactly one newline at the end and strip unwanted trailing
+ # whitespace at the end.
+ $text =~ s/\s*$/\n/;
+
+ # Get a count of the number of lines before the first blank line, which
+ # we'll pass to .Vb as its parameter. This tells *roff to keep that many
+ # lines together. We don't want to tell *roff to keep huge blocks
+ # together.
+ my @lines = split (/\n/, $text);
+ my $unbroken = 0;
+ for (@lines) {
+ last if /^\s*$/;
+ $unbroken++;
+ }
+ $unbroken = 10 if ($unbroken > 12 && !$$self{MAGIC_VNOPAGEBREAK_LIMIT});
+
+ # Prepend a null token to each line.
+ $text =~ s/^/\\&/gm;
+
+ # Output the results.
+ $self->makespace;
+ $self->output (".Vb $unbroken\n$text.Ve\n");
+ $$self{NEEDSPACE} = 1;
+ return '';
+}
+
+# Handle literal text (produced by =for and similar constructs). Just output
+# it with the minimum of changes.
+sub cmd_data {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/^\n+//;
+ $text =~ s/\n{0,2}$/\n/;
+ $self->output ($text);
+ return '';
+}
+
+##############################################################################
+# Headings
+##############################################################################
+
+# Common code for all headings. This is called before the actual heading is
+# output. It returns the cleaned up heading text (putting the heading all on
+# one line) and may do other things, like closing bad =item blocks.
+sub heading_common {
+ my ($self, $text, $line) = @_;
+ $text =~ s/\s+$//;
+ $text =~ s/\s*\n\s*/ /g;
+
+ # This should never happen; it means that we have a heading after =item
+ # without an intervening =back. But just in case, handle it anyway.
+ if ($$self{ITEMS} > 1) {
+ $$self{ITEMS} = 0;
+ $self->output (".PD\n");
+ }
+
+ # Output the current source line.
+ $self->output ( ".\\\" [At source line $line]\n" )
+ if defined ($line) && DEBUG;
+ return $text;
+}
+
+# First level heading. We can't output .IX in the NAME section due to a bug
+# in some versions of catman, so don't output a .IX for that section. .SH
+# already uses small caps, so remove \s0 and \s-1. Maintain IN_NAME as
+# appropriate.
+sub cmd_head1 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\\s-?\d//g;
+ $text = $self->heading_common ($text, $$attrs{start_line});
+ my $isname = ($text eq 'NAME' || $text =~ /\(NAME\)/);
+ $self->output ($self->switchquotes ('.SH', $self->mapfonts ($text)));
+ $self->outindex ('Header', $text) unless $isname;
+ $$self{NEEDSPACE} = 0;
+ $$self{IN_NAME} = $isname;
+ return '';
+}
+
+# Second level heading.
+sub cmd_head2 {
+ my ($self, $attrs, $text) = @_;
+ $text = $self->heading_common ($text, $$attrs{start_line});
+ $self->output ($self->switchquotes ('.SS', $self->mapfonts ($text)));
+ $self->outindex ('Subsection', $text);
+ $$self{NEEDSPACE} = 0;
+ return '';
+}
+
+# Third level heading. *roff doesn't have this concept, so just put the
+# heading in italics as a normal paragraph.
+sub cmd_head3 {
+ my ($self, $attrs, $text) = @_;
+ $text = $self->heading_common ($text, $$attrs{start_line});
+ $self->makespace;
+ $self->output ($self->textmapfonts ('\f(IS' . $text . '\f(IE') . "\n");
+ $self->outindex ('Subsection', $text);
+ $$self{NEEDSPACE} = 1;
+ return '';
+}
+
+# Fourth level heading. *roff doesn't have this concept, so just put the
+# heading as a normal paragraph.
+sub cmd_head4 {
+ my ($self, $attrs, $text) = @_;
+ $text = $self->heading_common ($text, $$attrs{start_line});
+ $self->makespace;
+ $self->output ($self->textmapfonts ($text) . "\n");
+ $self->outindex ('Subsection', $text);
+ $$self{NEEDSPACE} = 1;
+ return '';
+}
+
+##############################################################################
+# Formatting codes
+##############################################################################
+
+# All of the formatting codes that aren't handled internally by the parser,
+# other than L<> and X<>.
+sub cmd_b { return $_[0]->{IN_NAME} ? $_[2] : '\f(BS' . $_[2] . '\f(BE' }
+sub cmd_i { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' }
+sub cmd_f { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' }
+sub cmd_c { return $_[0]->quote_literal ($_[2]) }
+
+# Index entries are just added to the pending entries.
+sub cmd_x {
+ my ($self, $attrs, $text) = @_;
+ push (@{ $$self{INDEX} }, $text);
+ return '';
+}
+
+# Links reduce to the text that we're given, wrapped in angle brackets if it's
+# a URL.
+sub cmd_l {
+ my ($self, $attrs, $text) = @_;
+ if ($$attrs{type} eq 'url') {
+ if (not defined($$attrs{to}) or $$attrs{to} eq $text) {
+ return "<$text>";
+ } else {
+ return "$text <$$attrs{to}>";
+ }
+ } else {
+ return $text;
+ }
+}
+
+##############################################################################
+# List handling
+##############################################################################
+
+# Handle the beginning of an =over block. Takes the type of the block as the
+# first argument, and then the attr hash. This is called by the handlers for
+# the four different types of lists (bullet, number, text, and block).
+sub over_common_start {
+ my ($self, $type, $attrs) = @_;
+ my $line = $$attrs{start_line};
+ my $indent = $$attrs{indent};
+ DEBUG > 3 and print " Starting =over $type (line $line, indent ",
+ ($indent || '?'), "\n";
+
+ # Find the indentation level.
+ unless (defined ($indent) && $indent =~ /^[-+]?\d{1,4}\s*$/) {
+ $indent = $$self{indent};
+ }
+
+ # If we've gotten multiple indentations in a row, we need to emit the
+ # pending indentation for the last level that we saw and haven't acted on
+ # yet. SHIFTS is the stack of indentations that we've actually emitted
+ # code for.
+ if (@{ $$self{SHIFTS} } < @{ $$self{INDENTS} }) {
+ $self->output (".RS $$self{INDENT}\n");
+ push (@{ $$self{SHIFTS} }, $$self{INDENT});
+ }
+
+ # Now, do record-keeping. INDENTS is a stack of indentations that we've
+ # seen so far, and INDENT is the current level of indentation. ITEMTYPES
+ # is a stack of list types that we've seen.
+ push (@{ $$self{INDENTS} }, $$self{INDENT});
+ push (@{ $$self{ITEMTYPES} }, $type);
+ $$self{INDENT} = $indent + 0;
+ $$self{SHIFTWAIT} = 1;
+}
+
+# End an =over block. Takes no options other than the class pointer.
+# Normally, once we close a block and therefore remove something from INDENTS,
+# INDENTS will now be longer than SHIFTS, indicating that we also need to emit
+# *roff code to close the indent. This isn't *always* true, depending on the
+# circumstance. If we're still inside an indentation, we need to emit another
+# .RE and then a new .RS to unconfuse *roff.
+sub over_common_end {
+ my ($self) = @_;
+ DEBUG > 3 and print " Ending =over\n";
+ $$self{INDENT} = pop @{ $$self{INDENTS} };
+ pop @{ $$self{ITEMTYPES} };
+
+ # If we emitted code for that indentation, end it.
+ if (@{ $$self{SHIFTS} } > @{ $$self{INDENTS} }) {
+ $self->output (".RE\n");
+ pop @{ $$self{SHIFTS} };
+ }
+
+ # If we're still in an indentation, *roff will have now lost track of the
+ # right depth of that indentation, so fix that.
+ if (@{ $$self{INDENTS} } > 0) {
+ $self->output (".RE\n");
+ $self->output (".RS $$self{INDENT}\n");
+ }
+ $$self{NEEDSPACE} = 1;
+ $$self{SHIFTWAIT} = 0;
+}
+
+# Dispatch the start and end calls as appropriate.
+sub start_over_bullet { my $s = shift; $s->over_common_start ('bullet', @_) }
+sub start_over_number { my $s = shift; $s->over_common_start ('number', @_) }
+sub start_over_text { my $s = shift; $s->over_common_start ('text', @_) }
+sub start_over_block { my $s = shift; $s->over_common_start ('block', @_) }
+sub end_over_bullet { $_[0]->over_common_end }
+sub end_over_number { $_[0]->over_common_end }
+sub end_over_text { $_[0]->over_common_end }
+sub end_over_block { $_[0]->over_common_end }
+
+# The common handler for all item commands. Takes the type of the item, the
+# attributes, and then the text of the item.
+#
+# Emit an index entry for anything that's interesting, but don't emit index
+# entries for things like bullets and numbers. Newlines in an item title are
+# turned into spaces since *roff can't handle them embedded.
+sub item_common {
+ my ($self, $type, $attrs, $text) = @_;
+ my $line = $$attrs{start_line};
+ DEBUG > 3 and print " $type item (line $line): $text\n";
+
+ # Clean up the text. We want to end up with two variables, one ($text)
+ # which contains any body text after taking out the item portion, and
+ # another ($item) which contains the actual item text.
+ $text =~ s/\s+$//;
+ my ($item, $index);
+ if ($type eq 'bullet') {
+ $item = "\\\(bu";
+ $text =~ s/\n*$/\n/;
+ } elsif ($type eq 'number') {
+ $item = $$attrs{number} . '.';
+ } else {
+ $item = $text;
+ $item =~ s/\s*\n\s*/ /g;
+ $text = '';
+ $index = $item if ($item =~ /\w/);
+ }
+
+ # Take care of the indentation. If shifts and indents are equal, close
+ # the top shift, since we're about to create an indentation with .IP.
+ # Also output .PD 0 to turn off spacing between items if this item is
+ # directly following another one. We only have to do that once for a
+ # whole chain of items so do it for the second item in the change. Note
+ # that makespace is what undoes this.
+ if (@{ $$self{SHIFTS} } == @{ $$self{INDENTS} }) {
+ $self->output (".RE\n");
+ pop @{ $$self{SHIFTS} };
+ }
+ $self->output (".PD 0\n") if ($$self{ITEMS} == 1);
+
+ # Now, output the item tag itself.
+ $item = $self->textmapfonts ($item);
+ $self->output ($self->switchquotes ('.IP', $item, $$self{INDENT}));
+ $$self{NEEDSPACE} = 0;
+ $$self{ITEMS}++;
+ $$self{SHIFTWAIT} = 0;
+
+ # If body text for this item was included, go ahead and output that now.
+ if ($text) {
+ $text =~ s/\s*$/\n/;
+ $self->makespace;
+ $self->output ($self->protect ($self->textmapfonts ($text)));
+ $$self{NEEDSPACE} = 1;
+ }
+ $self->outindex ($index ? ('Item', $index) : ());
+}
+
+# Dispatch the item commands to the appropriate place.
+sub cmd_item_bullet { my $self = shift; $self->item_common ('bullet', @_) }
+sub cmd_item_number { my $self = shift; $self->item_common ('number', @_) }
+sub cmd_item_text { my $self = shift; $self->item_common ('text', @_) }
+sub cmd_item_block { my $self = shift; $self->item_common ('block', @_) }
+
+##############################################################################
+# Backward compatibility
+##############################################################################
+
+# Reset the underlying Pod::Simple object between calls to parse_from_file so
+# that the same object can be reused to convert multiple pages.
+sub parse_from_file {
+ my $self = shift;
+ $self->reinit;
+
+ # Fake the old cutting option to Pod::Parser. This fiddings with internal
+ # Pod::Simple state and is quite ugly; we need a better approach.
+ if (ref ($_[0]) eq 'HASH') {
+ my $opts = shift @_;
+ if (defined ($$opts{-cutting}) && !$$opts{-cutting}) {
+ $$self{in_pod} = 1;
+ $$self{last_was_blank} = 1;
+ }
+ }
+
+ # Do the work.
+ my $retval = $self->SUPER::parse_from_file (@_);
+
+ # Flush output, since Pod::Simple doesn't do this. Ideally we should also
+ # close the file descriptor if we had to open one, but we can't easily
+ # figure this out.
+ my $fh = $self->output_fh ();
+ my $oldfh = select $fh;
+ my $oldflush = $|;
+ $| = 1;
+ print $fh '';
+ $| = $oldflush;
+ select $oldfh;
+ return $retval;
+}
+
+# Pod::Simple failed to provide this backward compatibility function, so
+# implement it ourselves. File handles are one of the inputs that
+# parse_from_file supports.
+sub parse_from_filehandle {
+ my $self = shift;
+ $self->parse_from_file (@_);
+}
+
+##############################################################################
+# Translation tables
+##############################################################################
+
+# The following table is adapted from Tom Christiansen's pod2man. It assumes
+# that the standard preamble has already been printed, since that's what
+# defines all of the accent marks. We really want to do something better than
+# this when *roff actually supports other character sets itself, since these
+# results are pretty poor.
+#
+# This only works in an ASCII world. What to do in a non-ASCII world is very
+# unclear -- hopefully we can assume UTF-8 and just leave well enough alone.
+@ESCAPES{0xA0 .. 0xFF} = (
+ "\\ ", undef, undef, undef, undef, undef, undef, undef,
+ undef, undef, undef, undef, undef, "\\%", undef, undef,
+
+ undef, undef, undef, undef, undef, undef, undef, undef,
+ undef, undef, undef, undef, undef, undef, undef, undef,
+
+ "A\\*`", "A\\*'", "A\\*^", "A\\*~", "A\\*:", "A\\*o", "\\*(AE", "C\\*,",
+ "E\\*`", "E\\*'", "E\\*^", "E\\*:", "I\\*`", "I\\*'", "I\\*^", "I\\*:",
+
+ "\\*(D-", "N\\*~", "O\\*`", "O\\*'", "O\\*^", "O\\*~", "O\\*:", undef,
+ "O\\*/", "U\\*`", "U\\*'", "U\\*^", "U\\*:", "Y\\*'", "\\*(Th", "\\*8",
+
+ "a\\*`", "a\\*'", "a\\*^", "a\\*~", "a\\*:", "a\\*o", "\\*(ae", "c\\*,",
+ "e\\*`", "e\\*'", "e\\*^", "e\\*:", "i\\*`", "i\\*'", "i\\*^", "i\\*:",
+
+ "\\*(d-", "n\\*~", "o\\*`", "o\\*'", "o\\*^", "o\\*~", "o\\*:", undef,
+ "o\\*/" , "u\\*`", "u\\*'", "u\\*^", "u\\*:", "y\\*'", "\\*(th", "y\\*:",
+) if ASCII;
+
+##############################################################################
+# Premable
+##############################################################################
+
+# The following is the static preamble which starts all *roff output we
+# generate. Most is static except for the font to use as a fixed-width font,
+# which is designed by @CFONT@, and the left and right quotes to use for C<>
+# text, designated by @LQOUTE@ and @RQUOTE@. However, the second part, which
+# defines the accent marks, is only used if $escapes is set to true.
+sub preamble_template {
+ my ($self, $accents) = @_;
+ my $preamble = <<'----END OF PREAMBLE----';
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft @CFONT@
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` @LQUOTE@
+. ds C' @RQUOTE@
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
+..
+.\}
+----END OF PREAMBLE----
+
+ if ($accents) {
+ $preamble .= <<'----END OF PREAMBLE----'
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+----END OF PREAMBLE----
+#`# for cperl-mode
+ }
+ return $preamble;
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Man - Convert POD data to formatted *roff input
+
+=for stopwords
+en em ALLCAPS teeny fixedbold fixeditalic fixedbolditalic stderr utf8
+UTF-8 Allbery Sean Burke Ossanna Solaris formatters troff uppercased
+Christiansen
+
+=head1 SYNOPSIS
+
+ use Pod::Man;
+ my $parser = Pod::Man->new (release => $VERSION, section => 8);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_file (\*STDIN);
+
+ # Read POD from file.pod and write to file.1.
+ $parser->parse_from_file ('file.pod', 'file.1');
+
+=head1 DESCRIPTION
+
+Pod::Man is a module to convert documentation in the POD format (the
+preferred language for documenting Perl) into *roff input using the man
+macro set. The resulting *roff code is suitable for display on a terminal
+using L<nroff(1)>, normally via L<man(1)>, or printing using L<troff(1)>.
+It is conventionally invoked using the driver script B<pod2man>, but it can
+also be used directly.
+
+As a derived class from Pod::Simple, Pod::Man supports the same methods and
+interfaces. See L<Pod::Simple> for all the details.
+
+new() can take options, in the form of key/value pairs that control the
+behavior of the parser. See below for details.
+
+If no options are given, Pod::Man uses the name of the input file with any
+trailing C<.pod>, C<.pm>, or C<.pl> stripped as the man page title, to
+section 1 unless the file ended in C<.pm> in which case it defaults to
+section 3, to a centered title of "User Contributed Perl Documentation", to
+a centered footer of the Perl version it is run with, and to a left-hand
+footer of the modification date of its input (or the current date if given
+C<STDIN> for input).
+
+Pod::Man assumes that your *roff formatters have a fixed-width font named
+C<CW>. If yours is called something else (like C<CR>), use the C<fixed>
+option to specify it. This generally only matters for troff output for
+printing. Similarly, you can set the fonts used for bold, italic, and
+bold italic fixed-width output.
+
+Besides the obvious pod conversions, Pod::Man also takes care of
+formatting func(), func(3), and simple variable references like $foo or
+@bar so you don't have to use code escapes for them; complex expressions
+like C<$fred{'stuff'}> will still need to be escaped, though. It also
+translates dashes that aren't used as hyphens into en dashes, makes long
+dashes--like this--into proper em dashes, fixes "paired quotes," makes C++
+look right, puts a little space between double underscores, makes ALLCAPS
+a teeny bit smaller in B<troff>, and escapes stuff that *roff treats as
+special so that you don't have to.
+
+The recognized options to new() are as follows. All options take a single
+argument.
+
+=over 4
+
+=item center
+
+Sets the centered page header to use instead of "User Contributed Perl
+Documentation".
+
+=item date
+
+Sets the left-hand footer. By default, the modification date of the input
+file will be used, or the current date if stat() can't find that file (the
+case if the input is from C<STDIN>), and the date will be formatted as
+C<YYYY-MM-DD>.
+
+=item fixed
+
+The fixed-width font to use for verbatim text and code. Defaults to
+C<CW>. Some systems may want C<CR> instead. Only matters for B<troff>
+output.
+
+=item fixedbold
+
+Bold version of the fixed-width font. Defaults to C<CB>. Only matters
+for B<troff> output.
+
+=item fixeditalic
+
+Italic version of the fixed-width font (actually, something of a misnomer,
+since most fixed-width fonts only have an oblique version, not an italic
+version). Defaults to C<CI>. Only matters for B<troff> output.
+
+=item fixedbolditalic
+
+Bold italic (probably actually oblique) version of the fixed-width font.
+Pod::Man doesn't assume you have this, and defaults to C<CB>. Some
+systems (such as Solaris) have this font available as C<CX>. Only matters
+for B<troff> output.
+
+=item name
+
+Set the name of the manual page. Without this option, the manual name is
+set to the uppercased base name of the file being converted unless the
+manual section is 3, in which case the path is parsed to see if it is a Perl
+module path. If it is, a path like C<.../lib/Pod/Man.pm> is converted into
+a name like C<Pod::Man>. This option, if given, overrides any automatic
+determination of the name.
+
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text. If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text (but the font is still changed for troff
+output).
+
+=item release
+
+Set the centered footer. By default, this is the version of Perl you run
+Pod::Man under. Note that some system an macro sets assume that the
+centered footer will be a modification date and will prepend something like
+"Last modified: "; if this is the case, you may want to set C<release> to
+the last modified date and C<date> to the version number.
+
+=item section
+
+Set the section for the C<.TH> macro. The standard section numbering
+convention is to use 1 for user commands, 2 for system calls, 3 for
+functions, 4 for devices, 5 for file formats, 6 for games, 7 for
+miscellaneous information, and 8 for administrator commands. There is a lot
+of variation here, however; some systems (like Solaris) use 4 for file
+formats, 5 for miscellaneous information, and 7 for devices. Still others
+use 1m instead of 8, or some mix of both. About the only section numbers
+that are reliably consistent are 1, 2, and 3.
+
+By default, section 1 will be used unless the file ends in C<.pm> in which
+case section 3 will be selected.
+
+=item stderr
+
+Send error messages about invalid POD to standard error instead of
+appending a POD ERRORS section to the generated *roff output.
+
+=item utf8
+
+By default, Pod::Man produces the most conservative possible *roff output
+to try to ensure that it will work with as many different *roff
+implementations as possible. Many *roff implementations cannot handle
+non-ASCII characters, so this means all non-ASCII characters are converted
+either to a *roff escape sequence that tries to create a properly accented
+character (at least for troff output) or to C<X>.
+
+If this option is set, Pod::Man will instead output UTF-8. If your *roff
+implementation can handle it, this is the best output format to use and
+avoids corruption of documents containing non-ASCII characters. However,
+be warned that *roff source with literal UTF-8 characters is not supported
+by many implementations and may even result in segfaults and other bad
+behavior.
+
+Be aware that, when using this option, the input encoding of your POD
+source must be properly declared unless it is US-ASCII or Latin-1. POD
+input without an C<=encoding> command will be assumed to be in Latin-1,
+and if it's actually in UTF-8, the output will be double-encoded. See
+L<perlpod(1)> for more information on the C<=encoding> command.
+
+=back
+
+The standard Pod::Simple method parse_file() takes one argument naming the
+POD file to read from. By default, the output is sent to C<STDOUT>, but
+this can be changed with the output_fd() method.
+
+The standard Pod::Simple method parse_from_file() takes up to two
+arguments, the first being the input file to read POD from and the second
+being the file to write the formatted output to.
+
+You can also call parse_lines() to parse an array of lines or
+parse_string_document() to parse a document already in memory. To put the
+output into a string instead of a file handle, call the output_string()
+method. See L<Pod::Simple> for the specific details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item roff font should be 1 or 2 chars, not "%s"
+
+(F) You specified a *roff font (using C<fixed>, C<fixedbold>, etc.) that
+wasn't either one or two characters. Pod::Man doesn't support *roff fonts
+longer than two characters, although some *roff extensions do (the canonical
+versions of B<nroff> and B<troff> don't either).
+
+=item Invalid quote specification "%s"
+
+(F) The quote specification given (the quotes option to the constructor) was
+invalid. A quote specification must be one, two, or four characters long.
+
+=back
+
+=head1 BUGS
+
+Encoding handling assumes that PerlIO is available and does not work
+properly if it isn't. The C<utf8> option is therefore not supported
+unless Perl is built with PerlIO support.
+
+There is currently no way to turn off the guesswork that tries to format
+unmarked text appropriately, and sometimes it isn't wanted (particularly
+when using POD to document something other than Perl). Most of the work
+toward fixing this has now been done, however, and all that's still needed
+is a user interface.
+
+The NAME section should be recognized specially and index entries emitted
+for everything in that section. This would have to be deferred until the
+next section, since extraneous things in NAME tends to confuse various man
+page processors. Currently, no index entries are emitted for anything in
+NAME.
+
+Pod::Man doesn't handle font names longer than two characters. Neither do
+most B<troff> implementations, but GNU troff does as an extension. It would
+be nice to support as an option for those who want to use it.
+
+The preamble added to each output file is rather verbose, and most of it
+is only necessary in the presence of non-ASCII characters. It would
+ideally be nice if all of those definitions were only output if needed,
+perhaps on the fly as the characters are used.
+
+Pod::Man is excessively slow.
+
+=head1 CAVEATS
+
+If Pod::Man is given the C<utf8> option, the encoding of its output file
+handle will be forced to UTF-8 if possible, overriding any existing
+encoding. This will be done even if the file handle is not created by
+Pod::Man and was passed in from outside. This maintains consistency
+regardless of PERL_UNICODE and other settings.
+
+The handling of hyphens and em dashes is somewhat fragile, and one may get
+the wrong one under some circumstances. This should only matter for
+B<troff> output.
+
+When and whether to use small caps is somewhat tricky, and Pod::Man doesn't
+necessarily get it right.
+
+Converting neutral double quotes to properly matched double quotes doesn't
+work unless there are no formatting codes between the quote marks. This
+only matters for troff output.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original
+B<pod2man> by Tom Christiansen <tchrist@mox.perl.com>. The modifications to
+work with Pod::Simple instead of Pod::Parser were originally contributed by
+Sean Burke (but I've since hacked them beyond recognition and all bugs are
+mine).
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<perlpod(1)>, L<pod2man(1)>, L<nroff(1)>, L<troff(1)>,
+L<man(1)>, L<man(7)>
+
+Ossanna, Joseph F., and Brian W. Kernighan. "Troff User's Manual,"
+Computing Science Technical Report No. 54, AT&T Bell Laboratories. This is
+the best documentation of standard B<nroff> and B<troff>. At the time of
+this writing, it's available at
+L<http://www.cs.bell-labs.com/cm/cs/cstr.html>.
+
+The man page documenting the man macro set may be L<man(5)> instead of
+L<man(7)> on your system. Also, please see L<pod2man(1)> for extensive
+documentation on writing manual pages if you've not done it before and
+aren't familiar with the conventions.
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
+Perl core distribution as of 5.6.0.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/ParseLink.pm b/Master/tlpkg/tlperl/lib/Pod/ParseLink.pm
new file mode 100644
index 00000000000..750fdfb88dc
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/ParseLink.pm
@@ -0,0 +1,192 @@
+# Pod::ParseLink -- Parse an L<> formatting code in POD text.
+#
+# Copyright 2001, 2008, 2009 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module implements parsing of the text of an L<> formatting code as
+# defined in perlpodspec. It should be suitable for any POD formatter. It
+# exports only one function, parselink(), which returns the five-item parse
+# defined in perlpodspec.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators. Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::ParseLink;
+
+require 5.004;
+
+use strict;
+use vars qw(@EXPORT @ISA $VERSION);
+
+use Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(parselink);
+
+$VERSION = '1.10';
+
+##############################################################################
+# Implementation
+##############################################################################
+
+# Parse the name and section portion of a link into a name and section.
+sub _parse_section {
+ my ($link) = @_;
+ $link =~ s/^\s+//;
+ $link =~ s/\s+$//;
+
+ # If the whole link is enclosed in quotes, interpret it all as a section
+ # even if it contains a slash.
+ return (undef, $1) if ($link =~ /^"\s*(.*?)\s*"$/);
+
+ # Split into page and section on slash, and then clean up quoting in the
+ # section. If there is no section and the name contains spaces, also
+ # guess that it's an old section link.
+ my ($page, $section) = split (/\s*\/\s*/, $link, 2);
+ $section =~ s/^"\s*(.*?)\s*"$/$1/ if $section;
+ if ($page && $page =~ / / && !defined ($section)) {
+ $section = $page;
+ $page = undef;
+ } else {
+ $page = undef unless $page;
+ $section = undef unless $section;
+ }
+ return ($page, $section);
+}
+
+# Infer link text from the page and section.
+sub _infer_text {
+ my ($page, $section) = @_;
+ my $inferred;
+ if ($page && !$section) {
+ $inferred = $page;
+ } elsif (!$page && $section) {
+ $inferred = '"' . $section . '"';
+ } elsif ($page && $section) {
+ $inferred = '"' . $section . '" in ' . $page;
+ }
+ return $inferred;
+}
+
+# Given the contents of an L<> formatting code, parse it into the link text,
+# the possibly inferred link text, the name or URL, the section, and the type
+# of link (pod, man, or url).
+sub parselink {
+ my ($link) = @_;
+ $link =~ s/\s+/ /g;
+ my $text;
+ if ($link =~ /\|/) {
+ ($text, $link) = split (/\|/, $link, 2);
+ }
+ if ($link =~ /\A\w+:[^:\s]\S*\Z/) {
+ my $inferred;
+ if (defined ($text) && length ($text) > 0) {
+ return ($text, $text, $link, undef, 'url');
+ } else {
+ return ($text, $link, $link, undef, 'url');
+ }
+ } else {
+ my ($name, $section) = _parse_section ($link);
+ my $inferred;
+ if (defined ($text) && length ($text) > 0) {
+ $inferred = $text;
+ } else {
+ $inferred = _infer_text ($name, $section);
+ }
+ my $type = ($name && $name =~ /\(\S*\)/) ? 'man' : 'pod';
+ return ($text, $inferred, $name, $section, $type);
+ }
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+# Ensure we evaluate to true.
+1;
+__END__
+
+=head1 NAME
+
+Pod::ParseLink - Parse an LE<lt>E<gt> formatting code in POD text
+
+=for stopwords
+markup Allbery URL
+
+=head1 SYNOPSIS
+
+ use Pod::ParseLink;
+ my ($text, $inferred, $name, $section, $type) = parselink ($link);
+
+=head1 DESCRIPTION
+
+This module only provides a single function, parselink(), which takes the
+text of an LE<lt>E<gt> formatting code and parses it. It returns the
+anchor text for the link (if any was given), the anchor text possibly
+inferred from the name and section, the name or URL, the section if any,
+and the type of link. The type will be one of C<url>, C<pod>, or C<man>,
+indicating a URL, a link to a POD page, or a link to a Unix manual page.
+
+Parsing is implemented per L<perlpodspec>. For backward compatibility,
+links where there is no section and name contains spaces, or links where the
+entirety of the link (except for the anchor text if given) is enclosed in
+double-quotes are interpreted as links to a section (LE<lt>/sectionE<gt>).
+
+The inferred anchor text is implemented per L<perlpodspec>:
+
+ L<name> => L<name|name>
+ L</section> => L<"section"|/section>
+ L<name/section> => L<"section" in name|name/section>
+
+The name may contain embedded EE<lt>E<gt> and ZE<lt>E<gt> formatting codes,
+and the section, anchor text, and inferred anchor text may contain any
+formatting codes. Any double quotes around the section are removed as part
+of the parsing, as is any leading or trailing whitespace.
+
+If the text of the LE<lt>E<gt> escape is entirely enclosed in double
+quotes, it's interpreted as a link to a section for backward
+compatibility.
+
+No attempt is made to resolve formatting codes. This must be done after
+calling parselink() (since EE<lt>E<gt> formatting codes can be used to
+escape characters that would otherwise be significant to the parser and
+resolving them before parsing would result in an incorrect parse of a
+formatting code like:
+
+ L<verticalE<verbar>barE<sol>slash>
+
+which should be interpreted as a link to the C<vertical|bar/slash> POD page
+and not as a link to the C<slash> section of the C<bar> POD page with an
+anchor text of C<vertical>. Note that not only the anchor text will need to
+have formatting codes expanded, but so will the target of the link (to deal
+with EE<lt>E<gt> and ZE<lt>E<gt> formatting codes), and special handling of
+the section may be necessary depending on whether the translator wants to
+consider markup in sections to be significant when resolving links. See
+L<perlpodspec> for more information.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2001, 2008, 2009 Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/ParseUtils.pm b/Master/tlpkg/tlperl/lib/Pod/ParseUtils.pm
new file mode 100644
index 00000000000..f3c7ef46779
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/ParseUtils.pm
@@ -0,0 +1,855 @@
+#############################################################################
+# Pod/ParseUtils.pm -- helpers for POD parsing and conversion
+#
+# Copyright (C) 1999-2000 by Marek Rouchal. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::ParseUtils;
+use strict;
+
+use vars qw($VERSION);
+$VERSION = '1.36'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+=head1 NAME
+
+Pod::ParseUtils - helpers for POD parsing and conversion
+
+=head1 SYNOPSIS
+
+ use Pod::ParseUtils;
+
+ my $list = new Pod::List;
+ my $link = Pod::Hyperlink->new('Pod::Parser');
+
+=head1 DESCRIPTION
+
+B<Pod::ParseUtils> contains a few object-oriented helper packages for
+POD parsing and processing (i.e. in POD formatters and translators).
+
+=cut
+
+#-----------------------------------------------------------------------------
+# Pod::List
+#
+# class to hold POD list info (=over, =item, =back)
+#-----------------------------------------------------------------------------
+
+package Pod::List;
+
+use Carp;
+
+=head2 Pod::List
+
+B<Pod::List> can be used to hold information about POD lists
+(written as =over ... =item ... =back) for further processing.
+The following methods are available:
+
+=over 4
+
+=item Pod::List-E<gt>new()
+
+Create a new list object. Properties may be specified through a hash
+reference like this:
+
+ my $list = Pod::List->new({ -start => $., -indent => 4 });
+
+See the individual methods/properties for details.
+
+=cut
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %params = @_;
+ my $self = {%params};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{-file} ||= 'unknown';
+ $self->{-start} ||= 'unknown';
+ $self->{-indent} ||= 4; # perlpod: "should be the default"
+ $self->{_items} = [];
+ $self->{-type} ||= '';
+}
+
+=item $list-E<gt>file()
+
+Without argument, retrieves the file name the list is in. This must
+have been set before by either specifying B<-file> in the B<new()>
+method or by calling the B<file()> method with a scalar argument.
+
+=cut
+
+# The POD file name the list appears in
+sub file {
+ return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item $list-E<gt>start()
+
+Without argument, retrieves the line number where the list started.
+This must have been set before by either specifying B<-start> in the
+B<new()> method or by calling the B<start()> method with a scalar
+argument.
+
+=cut
+
+# The line in the file the node appears
+sub start {
+ return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start};
+}
+
+=item $list-E<gt>indent()
+
+Without argument, retrieves the indent level of the list as specified
+in C<=over n>. This must have been set before by either specifying
+B<-indent> in the B<new()> method or by calling the B<indent()> method
+with a scalar argument.
+
+=cut
+
+# indent level
+sub indent {
+ return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent};
+}
+
+=item $list-E<gt>type()
+
+Without argument, retrieves the list type, which can be an arbitrary value,
+e.g. C<OL>, C<UL>, ... when thinking the HTML way.
+This must have been set before by either specifying
+B<-type> in the B<new()> method or by calling the B<type()> method
+with a scalar argument.
+
+=cut
+
+# The type of the list (UL, OL, ...)
+sub type {
+ return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
+}
+
+=item $list-E<gt>rx()
+
+Without argument, retrieves a regular expression for simplifying the
+individual item strings once the list type has been determined. Usage:
+E.g. when converting to HTML, one might strip the leading number in
+an ordered list as C<E<lt>OLE<gt>> already prints numbers itself.
+This must have been set before by either specifying
+B<-rx> in the B<new()> method or by calling the B<rx()> method
+with a scalar argument.
+
+=cut
+
+# The regular expression to simplify the items
+sub rx {
+ return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx};
+}
+
+=item $list-E<gt>item()
+
+Without argument, retrieves the array of the items in this list.
+The items may be represented by any scalar.
+If an argument has been given, it is pushed on the list of items.
+
+=cut
+
+# The individual =items of this list
+sub item {
+ my ($self,$item) = @_;
+ if(defined $item) {
+ push(@{$self->{_items}}, $item);
+ return $item;
+ }
+ else {
+ return @{$self->{_items}};
+ }
+}
+
+=item $list-E<gt>parent()
+
+Without argument, retrieves information about the parent holding this
+list, which is represented as an arbitrary scalar.
+This must have been set before by either specifying
+B<-parent> in the B<new()> method or by calling the B<parent()> method
+with a scalar argument.
+
+=cut
+
+# possibility for parsers/translators to store information about the
+# lists's parent object
+sub parent {
+ return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent};
+}
+
+=item $list-E<gt>tag()
+
+Without argument, retrieves information about the list tag, which can be
+any scalar.
+This must have been set before by either specifying
+B<-tag> in the B<new()> method or by calling the B<tag()> method
+with a scalar argument.
+
+=back
+
+=cut
+
+# possibility for parsers/translators to store information about the
+# list's object
+sub tag {
+ return (@_ > 1) ? ($_[0]->{-tag} = $_[1]) : $_[0]->{-tag};
+}
+
+#-----------------------------------------------------------------------------
+# Pod::Hyperlink
+#
+# class to manipulate POD hyperlinks (L<>)
+#-----------------------------------------------------------------------------
+
+package Pod::Hyperlink;
+
+=head2 Pod::Hyperlink
+
+B<Pod::Hyperlink> is a class for manipulation of POD hyperlinks. Usage:
+
+ my $link = Pod::Hyperlink->new('alternative text|page/"section in page"');
+
+The B<Pod::Hyperlink> class is mainly designed to parse the contents of the
+C<LE<lt>...E<gt>> sequence, providing a simple interface for accessing the
+different parts of a POD hyperlink for further processing. It can also be
+used to construct hyperlinks.
+
+=over 4
+
+=item Pod::Hyperlink-E<gt>new()
+
+The B<new()> method can either be passed a set of key/value pairs or a single
+scalar value, namely the contents of a C<LE<lt>...E<gt>> sequence. An object
+of the class C<Pod::Hyperlink> is returned. The value C<undef> indicates a
+failure, the error message is stored in C<$@>.
+
+=cut
+
+use Carp;
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = +{};
+ bless $self, $class;
+ $self->initialize();
+ if(defined $_[0]) {
+ if(ref($_[0])) {
+ # called with a list of parameters
+ %$self = %{$_[0]};
+ $self->_construct_text();
+ }
+ else {
+ # called with L<> contents
+ return unless($self->parse($_[0]));
+ }
+ }
+ return $self;
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{-line} ||= 'undef';
+ $self->{-file} ||= 'undef';
+ $self->{-page} ||= '';
+ $self->{-node} ||= '';
+ $self->{-alttext} ||= '';
+ $self->{-type} ||= 'undef';
+ $self->{_warnings} = [];
+}
+
+=item $link-E<gt>parse($string)
+
+This method can be used to (re)parse a (new) hyperlink, i.e. the contents
+of a C<LE<lt>...E<gt>> sequence. The result is stored in the current object.
+Warnings are stored in the B<warnings> property.
+E.g. sections like C<LE<lt>open(2)E<gt>> are deprecated, as they do not point
+to Perl documents. C<LE<lt>DBI::foo(3p)E<gt>> is wrong as well, the manpage
+section can simply be dropped.
+
+=cut
+
+sub parse {
+ my $self = shift;
+ local($_) = $_[0];
+ # syntax check the link and extract destination
+ my ($alttext,$page,$node,$type,$quoted) = (undef,'','','',0);
+
+ $self->{_warnings} = [];
+
+ # collapse newlines with whitespace
+ s/\s*\n+\s*/ /g;
+
+ # strip leading/trailing whitespace
+ if(s/^[\s\n]+//) {
+ $self->warning('ignoring leading whitespace in link');
+ }
+ if(s/[\s\n]+$//) {
+ $self->warning('ignoring trailing whitespace in link');
+ }
+ unless(length($_)) {
+ _invalid_link('empty link');
+ return;
+ }
+
+ ## Check for different possibilities. This is tedious and error-prone
+ # we match all possibilities (alttext, page, section/item)
+ #warn "DEBUG: link=$_\n";
+
+ # only page
+ # problem: a lot of people use (), or (1) or the like to indicate
+ # man page sections. But this collides with L<func()> that is supposed
+ # to point to an internal funtion...
+ my $page_rx = '[\w.-]+(?:::[\w.-]+)*(?:[(](?:\d\w*|)[)]|)';
+ # page name only
+ if(/^($page_rx)$/o) {
+ $page = $1;
+ $type = 'page';
+ }
+ # alttext, page and "section"
+ elsif(m{^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$}o) {
+ ($alttext, $page, $node) = ($1, $2, $3);
+ $type = 'section';
+ $quoted = 1; #... therefore | and / are allowed
+ }
+ # alttext and page
+ elsif(/^(.*?)\s*[|]\s*($page_rx)$/o) {
+ ($alttext, $page) = ($1, $2);
+ $type = 'page';
+ }
+ # alttext and "section"
+ elsif(m{^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$}) {
+ ($alttext, $node) = ($1,$2);
+ $type = 'section';
+ $quoted = 1;
+ }
+ # page and "section"
+ elsif(m{^($page_rx)\s*/\s*"(.+)"$}o) {
+ ($page, $node) = ($1, $2);
+ $type = 'section';
+ $quoted = 1;
+ }
+ # page and item
+ elsif(m{^($page_rx)\s*/\s*(.+)$}o) {
+ ($page, $node) = ($1, $2);
+ $type = 'item';
+ }
+ # only "section"
+ elsif(m{^/?"(.+)"$}) {
+ $node = $1;
+ $type = 'section';
+ $quoted = 1;
+ }
+ # only item
+ elsif(m{^\s*/(.+)$}) {
+ $node = $1;
+ $type = 'item';
+ }
+
+ # non-standard: Hyperlink with alt-text - doesn't remove protocol prefix, maybe it should?
+ elsif(/^ \s* (.*?) \s* [|] \s* (\w+:[^:\s] [^\s|]*?) \s* $/ix) {
+ ($alttext,$node) = ($1,$2);
+ $type = 'hyperlink';
+ }
+
+ # non-standard: Hyperlink
+ elsif(/^(\w+:[^:\s]\S*)$/i) {
+ $node = $1;
+ $type = 'hyperlink';
+ }
+ # alttext, page and item
+ elsif(m{^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$}o) {
+ ($alttext, $page, $node) = ($1, $2, $3);
+ $type = 'item';
+ }
+ # alttext and item
+ elsif(m{^(.*?)\s*[|]\s*/(.+)$}) {
+ ($alttext, $node) = ($1,$2);
+ }
+ # must be an item or a "malformed" section (without "")
+ else {
+ $node = $_;
+ $type = 'item';
+ }
+ # collapse whitespace in nodes
+ $node =~ s/\s+/ /gs;
+
+ # empty alternative text expands to node name
+ if(defined $alttext) {
+ if(!length($alttext)) {
+ $alttext = $node || $page;
+ }
+ }
+ else {
+ $alttext = '';
+ }
+
+ if($page =~ /[(]\w*[)]$/) {
+ $self->warning("(section) in '$page' deprecated");
+ }
+ if(!$quoted && $node =~ m{[|/]} && $type ne 'hyperlink') {
+ $self->warning("node '$node' contains non-escaped | or /");
+ }
+ if($alttext =~ m{[|/]}) {
+ $self->warning("alternative text '$node' contains non-escaped | or /");
+ }
+ $self->{-page} = $page;
+ $self->{-node} = $node;
+ $self->{-alttext} = $alttext;
+ #warn "DEBUG: page=$page section=$section item=$item alttext=$alttext\n";
+ $self->{-type} = $type;
+ $self->_construct_text();
+ 1;
+}
+
+sub _construct_text {
+ my $self = shift;
+ my $alttext = $self->alttext();
+ my $type = $self->type();
+ my $section = $self->node();
+ my $page = $self->page();
+ my $page_ext = '';
+ $page =~ s/([(]\w*[)])$// && ($page_ext = $1);
+ if($alttext) {
+ $self->{_text} = $alttext;
+ }
+ elsif($type eq 'hyperlink') {
+ $self->{_text} = $section;
+ }
+ else {
+ $self->{_text} = ($section || '') .
+ (($page && $section) ? ' in ' : '') .
+ "$page$page_ext";
+ }
+ # for being marked up later
+ # use the non-standard markers P<> and Q<>, so that the resulting
+ # text can be parsed by the translators. It's their job to put
+ # the correct hypertext around the linktext
+ if($alttext) {
+ $self->{_markup} = "Q<$alttext>";
+ }
+ elsif($type eq 'hyperlink') {
+ $self->{_markup} = "Q<$section>";
+ }
+ else {
+ $self->{_markup} = (!$section ? '' : "Q<$section>") .
+ ($page ? ($section ? ' in ':'') . "P<$page>$page_ext" : '');
+ }
+}
+
+=item $link-E<gt>markup($string)
+
+Set/retrieve the textual value of the link. This string contains special
+markers C<PE<lt>E<gt>> and C<QE<lt>E<gt>> that should be expanded by the
+translator's interior sequence expansion engine to the
+formatter-specific code to highlight/activate the hyperlink. The details
+have to be implemented in the translator.
+
+=cut
+
+#' retrieve/set markuped text
+sub markup {
+ return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup};
+}
+
+=item $link-E<gt>text()
+
+This method returns the textual representation of the hyperlink as above,
+but without markers (read only). Depending on the link type this is one of
+the following alternatives (the + and * denote the portions of the text
+that are marked up):
+
+ +perl+ L<perl>
+ *$|* in +perlvar+ L<perlvar/$|>
+ *OPTIONS* in +perldoc+ L<perldoc/"OPTIONS">
+ *DESCRIPTION* L<"DESCRIPTION">
+
+=cut
+
+# The complete link's text
+sub text {
+ return $_[0]->{_text};
+}
+
+=item $link-E<gt>warning()
+
+After parsing, this method returns any warnings encountered during the
+parsing process.
+
+=cut
+
+# Set/retrieve warnings
+sub warning {
+ my $self = shift;
+ if(@_) {
+ push(@{$self->{_warnings}}, @_);
+ return @_;
+ }
+ return @{$self->{_warnings}};
+}
+
+=item $link-E<gt>file()
+
+=item $link-E<gt>line()
+
+Just simple slots for storing information about the line and the file
+the link was encountered in. Has to be filled in manually.
+
+=cut
+
+# The line in the file the link appears
+sub line {
+ return (@_ > 1) ? ($_[0]->{-line} = $_[1]) : $_[0]->{-line};
+}
+
+# The POD file name the link appears in
+sub file {
+ return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item $link-E<gt>page()
+
+This method sets or returns the POD page this link points to.
+
+=cut
+
+# The POD page the link appears on
+sub page {
+ if (@_ > 1) {
+ $_[0]->{-page} = $_[1];
+ $_[0]->_construct_text();
+ }
+ return $_[0]->{-page};
+}
+
+=item $link-E<gt>node()
+
+As above, but the destination node text of the link.
+
+=cut
+
+# The link destination
+sub node {
+ if (@_ > 1) {
+ $_[0]->{-node} = $_[1];
+ $_[0]->_construct_text();
+ }
+ return $_[0]->{-node};
+}
+
+=item $link-E<gt>alttext()
+
+Sets or returns an alternative text specified in the link.
+
+=cut
+
+# Potential alternative text
+sub alttext {
+ if (@_ > 1) {
+ $_[0]->{-alttext} = $_[1];
+ $_[0]->_construct_text();
+ }
+ return $_[0]->{-alttext};
+}
+
+=item $link-E<gt>type()
+
+The node type, either C<section> or C<item>. As an unofficial type,
+there is also C<hyperlink>, derived from e.g. C<LE<lt>http://perl.comE<gt>>
+
+=cut
+
+# The type: item or headn
+sub type {
+ return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type};
+}
+
+=item $link-E<gt>link()
+
+Returns the link as contents of C<LE<lt>E<gt>>. Reciprocal to B<parse()>.
+
+=back
+
+=cut
+
+# The link itself
+sub link {
+ my $self = shift;
+ my $link = $self->page() || '';
+ if($self->node()) {
+ my $node = $self->node();
+ $node =~ s/\|/E<verbar>/g;
+ $node =~ s{/}{E<sol>}g;
+ if($self->type() eq 'section') {
+ $link .= ($link ? '/' : '') . '"' . $node . '"';
+ }
+ elsif($self->type() eq 'hyperlink') {
+ $link = $self->node();
+ }
+ else { # item
+ $link .= '/' . $node;
+ }
+ }
+ if($self->alttext()) {
+ my $text = $self->alttext();
+ $text =~ s/\|/E<verbar>/g;
+ $text =~ s{/}{E<sol>}g;
+ $link = "$text|$link";
+ }
+ return $link;
+}
+
+sub _invalid_link {
+ my ($msg) = @_;
+ # this sets @_
+ #eval { die "$msg\n" };
+ #chomp $@;
+ $@ = $msg; # this seems to work, too!
+ return;
+}
+
+#-----------------------------------------------------------------------------
+# Pod::Cache
+#
+# class to hold POD page details
+#-----------------------------------------------------------------------------
+
+package Pod::Cache;
+
+=head2 Pod::Cache
+
+B<Pod::Cache> holds information about a set of POD documents,
+especially the nodes for hyperlinks.
+The following methods are available:
+
+=over 4
+
+=item Pod::Cache-E<gt>new()
+
+Create a new cache object. This object can hold an arbitrary number of
+POD documents of class Pod::Cache::Item.
+
+=cut
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my $self = [];
+ bless $self, $class;
+ return $self;
+}
+
+=item $cache-E<gt>item()
+
+Add a new item to the cache. Without arguments, this method returns a
+list of all cache elements.
+
+=cut
+
+sub item {
+ my ($self,%param) = @_;
+ if(%param) {
+ my $item = Pod::Cache::Item->new(%param);
+ push(@$self, $item);
+ return $item;
+ }
+ else {
+ return @{$self};
+ }
+}
+
+=item $cache-E<gt>find_page($name)
+
+Look for a POD document named C<$name> in the cache. Returns the
+reference to the corresponding Pod::Cache::Item object or undef if
+not found.
+
+=back
+
+=cut
+
+sub find_page {
+ my ($self,$page) = @_;
+ foreach(@$self) {
+ if($_->page() eq $page) {
+ return $_;
+ }
+ }
+ return;
+}
+
+package Pod::Cache::Item;
+
+=head2 Pod::Cache::Item
+
+B<Pod::Cache::Item> holds information about individual POD documents,
+that can be grouped in a Pod::Cache object.
+It is intended to hold information about the hyperlink nodes of POD
+documents.
+The following methods are available:
+
+=over 4
+
+=item Pod::Cache::Item-E<gt>new()
+
+Create a new object.
+
+=cut
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %params = @_;
+ my $self = {%params};
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+sub initialize {
+ my $self = shift;
+ $self->{-nodes} = [] unless(defined $self->{-nodes});
+}
+
+=item $cacheitem-E<gt>page()
+
+Set/retrieve the POD document name (e.g. "Pod::Parser").
+
+=cut
+
+# The POD page
+sub page {
+ return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page};
+}
+
+=item $cacheitem-E<gt>description()
+
+Set/retrieve the POD short description as found in the C<=head1 NAME>
+section.
+
+=cut
+
+# The POD description, taken out of NAME if present
+sub description {
+ return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description};
+}
+
+=item $cacheitem-E<gt>path()
+
+Set/retrieve the POD file storage path.
+
+=cut
+
+# The file path
+sub path {
+ return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path};
+}
+
+=item $cacheitem-E<gt>file()
+
+Set/retrieve the POD file name.
+
+=cut
+
+# The POD file name
+sub file {
+ return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file};
+}
+
+=item $cacheitem-E<gt>nodes()
+
+Add a node (or a list of nodes) to the document's node list. Note that
+the order is kept, i.e. start with the first node and end with the last.
+If no argument is given, the current list of nodes is returned in the
+same order the nodes have been added.
+A node can be any scalar, but usually is a pair of node string and
+unique id for the C<find_node> method to work correctly.
+
+=cut
+
+# The POD nodes
+sub nodes {
+ my ($self,@nodes) = @_;
+ if(@nodes) {
+ push(@{$self->{-nodes}}, @nodes);
+ return @nodes;
+ }
+ else {
+ return @{$self->{-nodes}};
+ }
+}
+
+=item $cacheitem-E<gt>find_node($name)
+
+Look for a node or index entry named C<$name> in the object.
+Returns the unique id of the node (i.e. the second element of the array
+stored in the node array) or undef if not found.
+
+=cut
+
+sub find_node {
+ my ($self,$node) = @_;
+ my @search;
+ push(@search, @{$self->{-nodes}}) if($self->{-nodes});
+ push(@search, @{$self->{-idx}}) if($self->{-idx});
+ foreach(@search) {
+ if($_->[0] eq $node) {
+ return $_->[1]; # id
+ }
+ }
+ return;
+}
+
+=item $cacheitem-E<gt>idx()
+
+Add an index entry (or a list of them) to the document's index list. Note that
+the order is kept, i.e. start with the first node and end with the last.
+If no argument is given, the current list of index entries is returned in the
+same order the entries have been added.
+An index entry can be any scalar, but usually is a pair of string and
+unique id.
+
+=back
+
+=cut
+
+# The POD index entries
+sub idx {
+ my ($self,@idx) = @_;
+ if(@idx) {
+ push(@{$self->{-idx}}, @idx);
+ return @idx;
+ }
+ else {
+ return @{$self->{-idx}};
+ }
+}
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>, borrowing
+a lot of things from L<pod2man> and L<pod2roff> as well as other POD
+processing tools by Tom Christiansen, Brad Appleton and Russ Allbery.
+
+=head1 SEE ALSO
+
+L<pod2man>, L<pod2roff>, L<Pod::Parser>, L<Pod::Checker>,
+L<pod2html>
+
+=cut
+
+1;
diff --git a/Master/tlpkg/tlperl/lib/Pod/Parser.pm b/Master/tlpkg/tlperl/lib/Pod/Parser.pm
new file mode 100644
index 00000000000..c807f3fbade
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Parser.pm
@@ -0,0 +1,1829 @@
+#############################################################################
+# Pod/Parser.pm -- package which defines a base class for parsing POD docs.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Parser;
+use strict;
+
+## These "variables" are used as local "glob aliases" for performance
+use vars qw($VERSION @ISA %myData %myOpts @input_stack);
+$VERSION = '1.37'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Parser - base class for creating POD filters and translators
+
+=head1 SYNOPSIS
+
+ use Pod::Parser;
+
+ package MyParser;
+ @ISA = qw(Pod::Parser);
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num) = @_;
+ ## Interpret the command and its text; sample actions might be:
+ if ($command eq 'head1') { ... }
+ elsif ($command eq 'head2') { ... }
+ ## ... other commands and their actions
+ my $out_fh = $parser->output_handle();
+ my $expansion = $parser->interpolate($paragraph, $line_num);
+ print $out_fh $expansion;
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num) = @_;
+ ## Format verbatim paragraph; sample actions might be:
+ my $out_fh = $parser->output_handle();
+ print $out_fh $paragraph;
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num) = @_;
+ ## Translate/Format this block of text; sample actions might be:
+ my $out_fh = $parser->output_handle();
+ my $expansion = $parser->interpolate($paragraph, $line_num);
+ print $out_fh $expansion;
+ }
+
+ sub interior_sequence {
+ my ($parser, $seq_command, $seq_argument) = @_;
+ ## Expand an interior sequence; sample actions might be:
+ return "*$seq_argument*" if ($seq_command eq 'B');
+ return "`$seq_argument'" if ($seq_command eq 'C');
+ return "_${seq_argument}_'" if ($seq_command eq 'I');
+ ## ... other sequence commands and their resulting text
+ }
+
+ package main;
+
+ ## Create a parser object and have it parse file whose name was
+ ## given on the command-line (use STDIN if no files were given).
+ $parser = new MyParser();
+ $parser->parse_from_filehandle(\*STDIN) if (@ARGV == 0);
+ for (@ARGV) { $parser->parse_from_file($_); }
+
+=head1 REQUIRES
+
+perl5.005, Pod::InputObjects, Exporter, Symbol, Carp
+
+=head1 EXPORTS
+
+Nothing.
+
+=head1 DESCRIPTION
+
+B<Pod::Parser> is a base class for creating POD filters and translators.
+It handles most of the effort involved with parsing the POD sections
+from an input stream, leaving subclasses free to be concerned only with
+performing the actual translation of text.
+
+B<Pod::Parser> parses PODs, and makes method calls to handle the various
+components of the POD. Subclasses of B<Pod::Parser> override these methods
+to translate the POD into whatever output format they desire.
+
+=head1 QUICK OVERVIEW
+
+To create a POD filter for translating POD documentation into some other
+format, you create a subclass of B<Pod::Parser> which typically overrides
+just the base class implementation for the following methods:
+
+=over 2
+
+=item *
+
+B<command()>
+
+=item *
+
+B<verbatim()>
+
+=item *
+
+B<textblock()>
+
+=item *
+
+B<interior_sequence()>
+
+=back
+
+You may also want to override the B<begin_input()> and B<end_input()>
+methods for your subclass (to perform any needed per-file and/or
+per-document initialization or cleanup).
+
+If you need to perform any preprocessing of input before it is parsed
+you may want to override one or more of B<preprocess_line()> and/or
+B<preprocess_paragraph()>.
+
+Sometimes it may be necessary to make more than one pass over the input
+files. If this is the case you have several options. You can make the
+first pass using B<Pod::Parser> and override your methods to store the
+intermediate results in memory somewhere for the B<end_pod()> method to
+process. You could use B<Pod::Parser> for several passes with an
+appropriate state variable to control the operation for each pass. If
+your input source can't be reset to start at the beginning, you can
+store it in some other structure as a string or an array and have that
+structure implement a B<getline()> method (which is all that
+B<parse_from_filehandle()> uses to read input).
+
+Feel free to add any member data fields you need to keep track of things
+like current font, indentation, horizontal or vertical position, or
+whatever else you like. Be sure to read L<"PRIVATE METHODS AND DATA">
+to avoid name collisions.
+
+For the most part, the B<Pod::Parser> base class should be able to
+do most of the input parsing for you and leave you free to worry about
+how to interpret the commands and translate the result.
+
+Note that all we have described here in this quick overview is the
+simplest most straightforward use of B<Pod::Parser> to do stream-based
+parsing. It is also possible to use the B<Pod::Parser::parse_text> function
+to do more sophisticated tree-based parsing. See L<"TREE-BASED PARSING">.
+
+=head1 PARSING OPTIONS
+
+A I<parse-option> is simply a named option of B<Pod::Parser> with a
+value that corresponds to a certain specified behavior. These various
+behaviors of B<Pod::Parser> may be enabled/disabled by setting
+or unsetting one or more I<parse-options> using the B<parseopts()> method.
+The set of currently accepted parse-options is as follows:
+
+=over 3
+
+=item B<-want_nonPODs> (default: unset)
+
+Normally (by default) B<Pod::Parser> will only provide access to
+the POD sections of the input. Input paragraphs that are not part
+of the POD-format documentation are not made available to the caller
+(not even using B<preprocess_paragraph()>). Setting this option to a
+non-empty, non-zero value will allow B<preprocess_paragraph()> to see
+non-POD sections of the input as well as POD sections. The B<cutting()>
+method can be used to determine if the corresponding paragraph is a POD
+paragraph, or some other input paragraph.
+
+=item B<-process_cut_cmd> (default: unset)
+
+Normally (by default) B<Pod::Parser> handles the C<=cut> POD directive
+by itself and does not pass it on to the caller for processing. Setting
+this option to a non-empty, non-zero value will cause B<Pod::Parser> to
+pass the C<=cut> directive to the caller just like any other POD command
+(and hence it may be processed by the B<command()> method).
+
+B<Pod::Parser> will still interpret the C<=cut> directive to mean that
+"cutting mode" has been (re)entered, but the caller will get a chance
+to capture the actual C<=cut> paragraph itself for whatever purpose
+it desires.
+
+=item B<-warnings> (default: unset)
+
+Normally (by default) B<Pod::Parser> recognizes a bare minimum of
+pod syntax errors and warnings and issues diagnostic messages
+for errors, but not for warnings. (Use B<Pod::Checker> to do more
+thorough checking of POD syntax.) Setting this option to a non-empty,
+non-zero value will cause B<Pod::Parser> to issue diagnostics for
+the few warnings it recognizes as well as the errors.
+
+=back
+
+Please see L<"parseopts()"> for a complete description of the interface
+for the setting and unsetting of parse-options.
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Pod::InputObjects;
+use Carp;
+use Exporter;
+BEGIN {
+ if ($] < 5.006) {
+ require Symbol;
+ import Symbol;
+ }
+}
+@ISA = qw(Exporter);
+
+#############################################################################
+
+=head1 RECOMMENDED SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which most subclasses will probably
+want to override. These methods are as follows:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<command()>
+
+ $parser->command($cmd,$text,$line_num,$pod_para);
+
+This method should be overridden by subclasses to take the appropriate
+action when a POD command paragraph (denoted by a line beginning with
+"=") is encountered. When such a POD directive is seen in the input,
+this method is called and is passed:
+
+=over 3
+
+=item C<$cmd>
+
+the name of the command for this POD paragraph
+
+=item C<$text>
+
+the paragraph text for the given POD paragraph command.
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph command (see L<Pod::InputObjects>
+for details).
+
+=back
+
+B<Note> that this method I<is> called for C<=pod> paragraphs.
+
+The base class implementation of this method simply treats the raw POD
+command as normal block of paragraph text (invoking the B<textblock()>
+method with the command paragraph).
+
+=cut
+
+sub command {
+ my ($self, $cmd, $text, $line_num, $pod_para) = @_;
+ ## Just treat this like a textblock
+ $self->textblock($pod_para->raw_text(), $line_num, $pod_para);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<verbatim()>
+
+ $parser->verbatim($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a block of verbatim text is encountered. It is passed the
+following parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the verbatim paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+The base class implementation of this method simply prints the textblock
+(unmodified) to the output filehandle.
+
+=cut
+
+sub verbatim {
+ my ($self, $text, $line_num, $pod_para) = @_;
+ my $out_fh = $self->{_OUTPUT};
+ print $out_fh $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<textblock()>
+
+ $parser->textblock($text,$line_num,$pod_para);
+
+This method may be overridden by subclasses to take the appropriate
+action when a normal block of POD text is encountered (although the base
+class method will usually do what you want). It is passed the following
+parameters:
+
+=over 3
+
+=item C<$text>
+
+the block of text for the a POD paragraph
+
+=item C<$line_num>
+
+the line-number of the beginning of the paragraph
+
+=item C<$pod_para>
+
+a reference to a C<Pod::Paragraph> object which contains further
+information about the paragraph (see L<Pod::InputObjects>
+for details).
+
+=back
+
+In order to process interior sequences, subclasses implementations of
+this method will probably want to invoke either B<interpolate()> or
+B<parse_text()>, passing it the text block C<$text>, and the corresponding
+line number in C<$line_num>, and then perform any desired processing upon
+the returned result.
+
+The base class implementation of this method simply prints the text block
+as it occurred in the input stream).
+
+=cut
+
+sub textblock {
+ my ($self, $text, $line_num, $pod_para) = @_;
+ my $out_fh = $self->{_OUTPUT};
+ print $out_fh $self->interpolate($text, $line_num);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interior_sequence()>
+
+ $parser->interior_sequence($seq_cmd,$seq_arg,$pod_seq);
+
+This method should be overridden by subclasses to take the appropriate
+action when an interior sequence is encountered. An interior sequence is
+an embedded command within a block of text which appears as a command
+name (usually a single uppercase character) followed immediately by a
+string of text which is enclosed in angle brackets. This method is
+passed the sequence command C<$seq_cmd> and the corresponding text
+C<$seq_arg>. It is invoked by the B<interpolate()> method for each interior
+sequence that occurs in the string that it is passed. It should return
+the desired text string to be used in place of the interior sequence.
+The C<$pod_seq> argument is a reference to a C<Pod::InteriorSequence>
+object which contains further information about the interior sequence.
+Please see L<Pod::InputObjects> for details if you need to access this
+additional information.
+
+Subclass implementations of this method may wish to invoke the
+B<nested()> method of C<$pod_seq> to see if it is nested inside
+some other interior-sequence (and if so, which kind).
+
+The base class implementation of the B<interior_sequence()> method
+simply returns the raw text of the interior sequence (as it occurred
+in the input) to the caller.
+
+=cut
+
+sub interior_sequence {
+ my ($self, $seq_cmd, $seq_arg, $pod_seq) = @_;
+ ## Just return the raw text of the interior sequence
+ return $pod_seq->raw_text();
+}
+
+#############################################################################
+
+=head1 OPTIONAL SUBROUTINE/METHOD OVERRIDES
+
+B<Pod::Parser> provides several methods which subclasses may want to override
+to perform any special pre/post-processing. These methods do I<not> have to
+be overridden, but it may be useful for subclasses to take advantage of them.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<new()>
+
+ my $parser = Pod::Parser->new();
+
+This is the constructor for B<Pod::Parser> and its subclasses. You
+I<do not> need to override this method! It is capable of constructing
+subclass objects as well as base class objects, provided you use
+any of the following constructor invocation styles:
+
+ my $parser1 = MyParser->new();
+ my $parser2 = new MyParser();
+ my $parser3 = $parser2->new();
+
+where C<MyParser> is some subclass of B<Pod::Parser>.
+
+Using the syntax C<MyParser::new()> to invoke the constructor is I<not>
+recommended, but if you insist on being able to do this, then the
+subclass I<will> need to override the B<new()> constructor method. If
+you do override the constructor, you I<must> be sure to invoke the
+B<initialize()> method of the newly blessed object.
+
+Using any of the above invocations, the first argument to the
+constructor is always the corresponding package name (or object
+reference). No other arguments are required, but if desired, an
+associative array (or hash-table) my be passed to the B<new()>
+constructor, as in:
+
+ my $parser1 = MyParser->new( MYDATA => $value1, MOREDATA => $value2 );
+ my $parser2 = new MyParser( -myflag => 1 );
+
+All arguments passed to the B<new()> constructor will be treated as
+key/value pairs in a hash-table. The newly constructed object will be
+initialized by copying the contents of the given hash-table (which may
+have been empty). The B<new()> constructor for this class and all of its
+subclasses returns a blessed reference to the initialized object (hash-table).
+
+=cut
+
+sub new {
+ ## Determine if we were called via an object-ref or a classname
+ my ($this,%params) = @_;
+ my $class = ref($this) || $this;
+ ## Any remaining arguments are treated as initial values for the
+ ## hash that is used to represent this object.
+ my $self = { %params };
+ ## Bless ourselves into the desired class and perform any initialization
+ bless $self, $class;
+ $self->initialize();
+ return $self;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<initialize()>
+
+ $parser->initialize();
+
+This method performs any necessary object initialization. It takes no
+arguments (other than the object instance of course, which is typically
+copied to a local variable named C<$self>). If subclasses override this
+method then they I<must> be sure to invoke C<$self-E<gt>SUPER::initialize()>.
+
+=cut
+
+sub initialize {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_pod()>
+
+ $parser->begin_pod();
+
+This method is invoked at the beginning of processing for each POD
+document that is encountered in the input. Subclasses should override
+this method to perform any per-document initialization.
+
+=cut
+
+sub begin_pod {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<begin_input()>
+
+ $parser->begin_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<before>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+initializations.
+
+Note that if multiple files are parsed for a single POD document
+(perhaps the result of some future C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+initializations once per document, then you should use B<begin_pod()>.
+
+=cut
+
+sub begin_input {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_input()>
+
+ $parser->end_input();
+
+This method is invoked by B<parse_from_filehandle()> immediately I<after>
+processing input from a filehandle. The base class implementation does
+nothing, however, subclasses may override it to perform any per-file
+cleanup actions.
+
+Please note that if multiple files are parsed for a single POD document
+(perhaps the result of some kind of C<=include> directive) this method
+is invoked for every file that is parsed. If you wish to perform certain
+cleanup actions once per document, then you should use B<end_pod()>.
+
+=cut
+
+sub end_input {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<end_pod()>
+
+ $parser->end_pod();
+
+This method is invoked at the end of processing for each POD document
+that is encountered in the input. Subclasses should override this method
+to perform any per-document finalization.
+
+=cut
+
+sub end_pod {
+ #my $self = shift;
+ #return;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_line()>
+
+ $textline = $parser->preprocess_line($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform
+any kind of preprocessing for each I<line> of input (I<before> it has
+been determined whether or not it is part of a POD paragraph). The
+parameter C<$text> is the input line; and the parameter C<$line_num> is
+the line number of the corresponding text line.
+
+The value returned should correspond to the new text to use in its
+place. If the empty string or an undefined value is returned then no
+further processing will be performed for this line.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections, then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_line {
+ my ($self, $text, $line_num) = @_;
+ return $text;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<preprocess_paragraph()>
+
+ $textblock = $parser->preprocess_paragraph($text, $line_num);
+
+This method should be overridden by subclasses that wish to perform any
+kind of preprocessing for each block (paragraph) of POD documentation
+that appears in the input stream. The parameter C<$text> is the POD
+paragraph from the input file; and the parameter C<$line_num> is the
+line number for the beginning of the corresponding paragraph.
+
+The value returned should correspond to the new text to use in its
+place If the empty string is returned or an undefined value is
+returned, then the given C<$text> is ignored (not processed).
+
+This method is invoked after gathering up all the lines in a paragraph
+and after determining the cutting state of the paragraph,
+but before trying to further parse or interpret them. After
+B<preprocess_paragraph()> returns, the current cutting state (which
+is returned by C<$self-E<gt>cutting()>) is examined. If it evaluates
+to true then input text (including the given C<$text>) is cut (not
+processed) until the next POD directive is encountered.
+
+Please note that the B<preprocess_line()> method is invoked I<before>
+the B<preprocess_paragraph()> method. After all (possibly preprocessed)
+lines in a paragraph have been assembled together and either it has been
+determined that the paragraph is part of the POD documentation from one
+of the selected sections or the C<-want_nonPODs> option is true,
+then B<preprocess_paragraph()> is invoked.
+
+The base class implementation of this method returns the given text.
+
+=cut
+
+sub preprocess_paragraph {
+ my ($self, $text, $line_num) = @_;
+ return $text;
+}
+
+#############################################################################
+
+=head1 METHODS FOR PARSING AND PROCESSING
+
+B<Pod::Parser> provides several methods to process input text. These
+methods typically won't need to be overridden (and in some cases they
+can't be overridden), but subclasses may want to invoke them to exploit
+their functionality.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_text()>
+
+ $ptree1 = $parser->parse_text($text, $line_num);
+ $ptree2 = $parser->parse_text({%opts}, $text, $line_num);
+ $ptree3 = $parser->parse_text(\%opts, $text, $line_num);
+
+This method is useful if you need to perform your own interpolation
+of interior sequences and can't rely upon B<interpolate> to expand
+them in simple bottom-up order.
+
+The parameter C<$text> is a string or block of text to be parsed
+for interior sequences; and the parameter C<$line_num> is the
+line number corresponding to the beginning of C<$text>.
+
+B<parse_text()> will parse the given text into a parse-tree of "nodes."
+and interior-sequences. Each "node" in the parse tree is either a
+text-string, or a B<Pod::InteriorSequence>. The result returned is a
+parse-tree of type B<Pod::ParseTree>. Please see L<Pod::InputObjects>
+for more information about B<Pod::InteriorSequence> and B<Pod::ParseTree>.
+
+If desired, an optional hash-ref may be specified as the first argument
+to customize certain aspects of the parse-tree that is created and
+returned. The set of recognized option keywords are:
+
+=over 3
+
+=item B<-expand_seq> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain an
+unexpanded C<Pod::InteriorSequence> object for each interior-sequence
+encountered. Specifying B<-expand_seq> tells B<parse_text()> to "expand"
+every interior-sequence it sees by invoking the referenced function
+(or named method of the parser object) and using the return value as the
+expanded result.
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $sequence )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $sequence )
+
+where C<$parser> is a reference to the parser object, and C<$sequence>
+is a reference to the interior-sequence object.
+[I<NOTE>: If the B<interior_sequence()> method is specified, then it is
+invoked according to the interface specified in L<"interior_sequence()">].
+
+=item B<-expand_text> =E<gt> I<code-ref>|I<method-name>
+
+Normally, the parse-tree returned by B<parse_text()> will contain a
+text-string for each contiguous sequence of characters outside of an
+interior-sequence. Specifying B<-expand_text> tells B<parse_text()> to
+"preprocess" every such text-string it sees by invoking the referenced
+function (or named method of the parser object) and using the return value
+as the preprocessed (or "expanded") result. [Note that if the result is
+an interior-sequence, then it will I<not> be expanded as specified by the
+B<-expand_seq> option; Any such recursive expansion needs to be handled by
+the specified callback routine.]
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $text, $ptree_node )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $text, $ptree_node )
+
+where C<$parser> is a reference to the parser object, C<$text> is the
+text-string encountered, and C<$ptree_node> is a reference to the current
+node in the parse-tree (usually an interior-sequence object or else the
+top-level node of the parse-tree).
+
+=item B<-expand_ptree> =E<gt> I<code-ref>|I<method-name>
+
+Rather than returning a C<Pod::ParseTree>, pass the parse-tree as an
+argument to the referenced subroutine (or named method of the parser
+object) and return the result instead of the parse-tree object.
+
+If a subroutine reference was given, it is invoked as:
+
+ &$code_ref( $parser, $ptree )
+
+and if a method-name was given, it is invoked as:
+
+ $parser->method_name( $ptree )
+
+where C<$parser> is a reference to the parser object, and C<$ptree>
+is a reference to the parse-tree object.
+
+=back
+
+=cut
+
+sub parse_text {
+ my $self = shift;
+ local $_ = '';
+
+ ## Get options and set any defaults
+ my %opts = (ref $_[0]) ? %{ shift() } : ();
+ my $expand_seq = $opts{'-expand_seq'} || undef;
+ my $expand_text = $opts{'-expand_text'} || undef;
+ my $expand_ptree = $opts{'-expand_ptree'} || undef;
+
+ my $text = shift;
+ my $line = shift;
+ my $file = $self->input_file();
+ my $cmd = "";
+
+ ## Convert method calls into closures, for our convenience
+ my $xseq_sub = $expand_seq;
+ my $xtext_sub = $expand_text;
+ my $xptree_sub = $expand_ptree;
+ if (defined $expand_seq and $expand_seq eq 'interior_sequence') {
+ ## If 'interior_sequence' is the method to use, we have to pass
+ ## more than just the sequence object, we also need to pass the
+ ## sequence name and text.
+ $xseq_sub = sub {
+ my ($sself, $iseq) = @_;
+ my $args = join('', $iseq->parse_tree->children);
+ return $sself->interior_sequence($iseq->name, $args, $iseq);
+ };
+ }
+ ref $xseq_sub or $xseq_sub = sub { shift()->$expand_seq(@_) };
+ ref $xtext_sub or $xtext_sub = sub { shift()->$expand_text(@_) };
+ ref $xptree_sub or $xptree_sub = sub { shift()->$expand_ptree(@_) };
+
+ ## Keep track of the "current" interior sequence, and maintain a stack
+ ## of "in progress" sequences.
+ ##
+ ## NOTE that we push our own "accumulator" at the very beginning of the
+ ## stack. It's really a parse-tree, not a sequence; but it implements
+ ## the methods we need so we can use it to gather-up all the sequences
+ ## and strings we parse. Thus, by the end of our parsing, it should be
+ ## the only thing left on our stack and all we have to do is return it!
+ ##
+ my $seq = Pod::ParseTree->new();
+ my @seq_stack = ($seq);
+ my ($ldelim, $rdelim) = ('', '');
+
+ ## Iterate over all sequence starts text (NOTE: split with
+ ## capturing parens keeps the delimiters)
+ $_ = $text;
+ my @tokens = split /([A-Z]<(?:<+\s)?)/;
+ while ( @tokens ) {
+ $_ = shift @tokens;
+ ## Look for the beginning of a sequence
+ if ( /^([A-Z])(<(?:<+\s)?)$/ ) {
+ ## Push a new sequence onto the stack of those "in-progress"
+ my $ldelim_orig;
+ ($cmd, $ldelim_orig) = ($1, $2);
+ ($ldelim = $ldelim_orig) =~ s/\s+$//;
+ ($rdelim = $ldelim) =~ tr/</>/;
+ $seq = Pod::InteriorSequence->new(
+ -name => $cmd,
+ -ldelim => $ldelim_orig, -rdelim => $rdelim,
+ -file => $file, -line => $line
+ );
+ (@seq_stack > 1) and $seq->nested($seq_stack[-1]);
+ push @seq_stack, $seq;
+ }
+ ## Look for sequence ending
+ elsif ( @seq_stack > 1 ) {
+ ## Make sure we match the right kind of closing delimiter
+ my ($seq_end, $post_seq) = ('', '');
+ if ( ($ldelim eq '<' and /\A(.*?)(>)/s)
+ or /\A(.*?)(\s+$rdelim)/s )
+ {
+ ## Found end-of-sequence, capture the interior and the
+ ## closing the delimiter, and put the rest back on the
+ ## token-list
+ $post_seq = substr($_, length($1) + length($2));
+ ($_, $seq_end) = ($1, $2);
+ (length $post_seq) and unshift @tokens, $post_seq;
+ }
+ if (length) {
+ ## In the middle of a sequence, append this text to it, and
+ ## dont forget to "expand" it if that's what the caller wanted
+ $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+ $_ .= $seq_end;
+ }
+ if (length $seq_end) {
+ ## End of current sequence, record terminating delimiter
+ $seq->rdelim($seq_end);
+ ## Pop it off the stack of "in progress" sequences
+ pop @seq_stack;
+ ## Append result to its parent in current parse tree
+ $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq)
+ : $seq);
+ ## Remember the current cmd-name and left-delimiter
+ if(@seq_stack > 1) {
+ $cmd = $seq_stack[-1]->name;
+ $ldelim = $seq_stack[-1]->ldelim;
+ $rdelim = $seq_stack[-1]->rdelim;
+ } else {
+ $cmd = $ldelim = $rdelim = '';
+ }
+ }
+ }
+ elsif (length) {
+ ## In the middle of a sequence, append this text to it, and
+ ## dont forget to "expand" it if that's what the caller wanted
+ $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_);
+ }
+ ## Keep track of line count
+ $line += s/\r*\n//;
+ ## Remember the "current" sequence
+ $seq = $seq_stack[-1];
+ }
+
+ ## Handle unterminated sequences
+ my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef;
+ while (@seq_stack > 1) {
+ ($cmd, $file, $line) = ($seq->name, $seq->file_line);
+ $ldelim = $seq->ldelim;
+ ($rdelim = $ldelim) =~ tr/</>/;
+ $rdelim =~ s/^(\S+)(\s*)$/$2$1/;
+ pop @seq_stack;
+ my $errmsg = "*** ERROR: unterminated ${cmd}${ldelim}...${rdelim}".
+ " at line $line in file $file\n";
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $self->$errorsub($errmsg)
+ or carp($errmsg);
+ $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) : $seq);
+ $seq = $seq_stack[-1];
+ }
+
+ ## Return the resulting parse-tree
+ my $ptree = (pop @seq_stack)->parse_tree;
+ return $expand_ptree ? &$xptree_sub($self, $ptree) : $ptree;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<interpolate()>
+
+ $textblock = $parser->interpolate($text, $line_num);
+
+This method translates all text (including any embedded interior sequences)
+in the given text string C<$text> and returns the interpolated result. The
+parameter C<$line_num> is the line number corresponding to the beginning
+of C<$text>.
+
+B<interpolate()> merely invokes a private method to recursively expand
+nested interior sequences in bottom-up order (innermost sequences are
+expanded first). If there is a need to expand nested sequences in
+some alternate order, use B<parse_text> instead.
+
+=cut
+
+sub interpolate {
+ my($self, $text, $line_num) = @_;
+ my %parse_opts = ( -expand_seq => 'interior_sequence' );
+ my $ptree = $self->parse_text( \%parse_opts, $text, $line_num );
+ return join '', $ptree->children();
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<parse_paragraph()>
+
+ $parser->parse_paragraph($text, $line_num);
+
+This method takes the text of a POD paragraph to be processed, along
+with its corresponding line number, and invokes the appropriate method
+(one of B<command()>, B<verbatim()>, or B<textblock()>).
+
+For performance reasons, this method is invoked directly without any
+dynamic lookup; Hence subclasses may I<not> override it!
+
+=end __PRIVATE__
+
+=cut
+
+sub parse_paragraph {
+ my ($self, $text, $line_num) = @_;
+ local *myData = $self; ## alias to avoid deref-ing overhead
+ local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options
+ local $_;
+
+ ## See if we want to preprocess nonPOD paragraphs as well as POD ones.
+ my $wantNonPods = $myOpts{'-want_nonPODs'};
+
+ ## Update cutting status
+ $myData{_CUTTING} = 0 if $text =~ /^={1,2}\S/;
+
+ ## Perform any desired preprocessing if we wanted it this early
+ $wantNonPods and $text = $self->preprocess_paragraph($text, $line_num);
+
+ ## Ignore up until next POD directive if we are cutting
+ return if $myData{_CUTTING};
+
+ ## Now we know this is block of text in a POD section!
+
+ ##-----------------------------------------------------------------
+ ## This is a hook (hack ;-) for Pod::Select to do its thing without
+ ## having to override methods, but also without Pod::Parser assuming
+ ## $self is an instance of Pod::Select (if the _SELECTED_SECTIONS
+ ## field exists then we assume there is an is_selected() method for
+ ## us to invoke (calling $self->can('is_selected') could verify this
+ ## but that is more overhead than I want to incur)
+ ##-----------------------------------------------------------------
+
+ ## Ignore this block if it isnt in one of the selected sections
+ if (exists $myData{_SELECTED_SECTIONS}) {
+ $self->is_selected($text) or return ($myData{_CUTTING} = 1);
+ }
+
+ ## If we havent already, perform any desired preprocessing and
+ ## then re-check the "cutting" state
+ unless ($wantNonPods) {
+ $text = $self->preprocess_paragraph($text, $line_num);
+ return 1 unless ((defined $text) and (length $text));
+ return 1 if ($myData{_CUTTING});
+ }
+
+ ## Look for one of the three types of paragraphs
+ my ($pfx, $cmd, $arg, $sep) = ('', '', '', '');
+ my $pod_para = undef;
+ if ($text =~ /^(={1,2})(?=\S)/) {
+ ## Looks like a command paragraph. Capture the command prefix used
+ ## ("=" or "=="), as well as the command-name, its paragraph text,
+ ## and whatever sequence of characters was used to separate them
+ $pfx = $1;
+ $_ = substr($text, length $pfx);
+ ($cmd, $sep, $text) = split /(\s+)/, $_, 2;
+ ## If this is a "cut" directive then we dont need to do anything
+ ## except return to "cutting" mode.
+ if ($cmd eq 'cut') {
+ $myData{_CUTTING} = 1;
+ return unless $myOpts{'-process_cut_cmd'};
+ }
+ }
+ ## Save the attributes indicating how the command was specified.
+ $pod_para = new Pod::Paragraph(
+ -name => $cmd,
+ -text => $text,
+ -prefix => $pfx,
+ -separator => $sep,
+ -file => $myData{_INFILE},
+ -line => $line_num
+ );
+ # ## Invoke appropriate callbacks
+ # if (exists $myData{_CALLBACKS}) {
+ # ## Look through the callback list, invoke callbacks,
+ # ## then see if we need to do the default actions
+ # ## (invoke_callbacks will return true if we do).
+ # return 1 unless $self->invoke_callbacks($cmd, $text, $line_num, $pod_para);
+ # }
+
+ # If the last paragraph ended in whitespace, and we're not between verbatim blocks, carp
+ if ($myData{_WHITESPACE} and $myOpts{'-warnings'}
+ and not ($text =~ /^\s+/ and ($myData{_PREVIOUS}||"") eq "verbatim")) {
+ my $errorsub = $self->errorsub();
+ my $line = $line_num - 1;
+ my $errmsg = "*** WARNING: line containing nothing but whitespace".
+ " in paragraph at line $line in file $myData{_INFILE}\n";
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $self->$errorsub($errmsg)
+ or carp($errmsg);
+ }
+
+ if (length $cmd) {
+ ## A command paragraph
+ $self->command($cmd, $text, $line_num, $pod_para);
+ $myData{_PREVIOUS} = $cmd;
+ }
+ elsif ($text =~ /^\s+/) {
+ ## Indented text - must be a verbatim paragraph
+ $self->verbatim($text, $line_num, $pod_para);
+ $myData{_PREVIOUS} = "verbatim";
+ }
+ else {
+ ## Looks like an ordinary block of text
+ $self->textblock($text, $line_num, $pod_para);
+ $myData{_PREVIOUS} = "textblock";
+ }
+
+ # Update the whitespace for the next time around
+ $myData{_WHITESPACE} = $text =~ /^[^\S\r\n]+\Z/m ? 1 : 0;
+
+ return 1;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_filehandle()>
+
+ $parser->parse_from_filehandle($in_fh,$out_fh);
+
+This method takes an input filehandle (which is assumed to already be
+opened for reading) and reads the entire input stream looking for blocks
+(paragraphs) of POD documentation to be processed. If no first argument
+is given the default input filehandle C<STDIN> is used.
+
+The C<$in_fh> parameter may be any object that provides a B<getline()>
+method to retrieve a single line of input text (hence, an appropriate
+wrapper object could be used to parse PODs from a single string or an
+array of strings).
+
+Using C<$in_fh-E<gt>getline()>, input is read line-by-line and assembled
+into paragraphs or "blocks" (which are separated by lines containing
+nothing but whitespace). For each block of POD documentation
+encountered it will invoke a method to parse the given paragraph.
+
+If a second argument is given then it should correspond to a filehandle where
+output should be sent (otherwise the default output filehandle is
+C<STDOUT> if no output filehandle is currently in use).
+
+B<NOTE:> For performance reasons, this method caches the input stream at
+the top of the stack in a local variable. Any attempts by clients to
+change the stack contents during processing when in the midst executing
+of this method I<will not affect> the input stream used by the current
+invocation of this method.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_filehandle {
+ my $self = shift;
+ my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+ my ($in_fh, $out_fh) = @_;
+ $in_fh = \*STDIN unless ($in_fh);
+ local *myData = $self; ## alias to avoid deref-ing overhead
+ local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options
+ local $_;
+
+ ## Put this stream at the top of the stack and do beginning-of-input
+ ## processing. NOTE that $in_fh might be reset during this process.
+ my $topstream = $self->_push_input_stream($in_fh, $out_fh);
+ (exists $opts{-cutting}) and $self->cutting( $opts{-cutting} );
+
+ ## Initialize line/paragraph
+ my ($textline, $paragraph) = ('', '');
+ my ($nlines, $plines) = (0, 0);
+
+ ## Use <$fh> instead of $fh->getline where possible (for speed)
+ $_ = ref $in_fh;
+ my $tied_fh = (/^(?:GLOB|FileHandle|IO::\w+)$/ or tied $in_fh);
+
+ ## Read paragraphs line-by-line
+ while (defined ($textline = $tied_fh ? <$in_fh> : $in_fh->getline)) {
+ $textline = $self->preprocess_line($textline, ++$nlines);
+ next unless ((defined $textline) && (length $textline));
+
+ if ((! length $paragraph) && ($textline =~ /^==/)) {
+ ## '==' denotes a one-line command paragraph
+ $paragraph = $textline;
+ $plines = 1;
+ $textline = '';
+ } else {
+ ## Append this line to the current paragraph
+ $paragraph .= $textline;
+ ++$plines;
+ }
+
+ ## See if this line is blank and ends the current paragraph.
+ ## If it isnt, then keep iterating until it is.
+ next unless (($textline =~ /^([^\S\r\n]*)[\r\n]*$/)
+ && (length $paragraph));
+
+ ## Now process the paragraph
+ parse_paragraph($self, $paragraph, ($nlines - $plines) + 1);
+ $paragraph = '';
+ $plines = 0;
+ }
+ ## Dont forget about the last paragraph in the file
+ if (length $paragraph) {
+ parse_paragraph($self, $paragraph, ($nlines - $plines) + 1)
+ }
+
+ ## Now pop the input stream off the top of the input stack.
+ $self->_pop_input_stream();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<parse_from_file()>
+
+ $parser->parse_from_file($filename,$outfile);
+
+This method takes a filename and does the following:
+
+=over 2
+
+=item *
+
+opens the input and output files for reading
+(creating the appropriate filehandles)
+
+=item *
+
+invokes the B<parse_from_filehandle()> method passing it the
+corresponding input and output filehandles.
+
+=item *
+
+closes the input and output files.
+
+=back
+
+If the special input filename "-" or "<&STDIN" is given then the STDIN
+filehandle is used for input (and no open or close is performed). If no
+input filename is specified then "-" is implied. Filehandle references,
+or objects that support the regular IO operations (like C<E<lt>$fhE<gt>>
+or C<$fh-<Egt>getline>) are also accepted; the handles must already be
+opened.
+
+If a second argument is given then it should be the name of the desired
+output file. If the special output filename "-" or ">&STDOUT" is given
+then the STDOUT filehandle is used for output (and no open or close is
+performed). If the special output filename ">&STDERR" is given then the
+STDERR filehandle is used for output (and no open or close is
+performed). If no output filehandle is currently in use and no output
+filename is specified, then "-" is implied.
+Alternatively, filehandle references or objects that support the regular
+IO operations (like C<print>, e.g. L<IO::String>) are also accepted;
+the object must already be opened.
+
+This method does I<not> usually need to be overridden by subclasses.
+
+=cut
+
+sub parse_from_file {
+ my $self = shift;
+ my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : ();
+ my ($infile, $outfile) = @_;
+ my ($in_fh, $out_fh);
+ if ($] < 5.006) {
+ ($in_fh, $out_fh) = (gensym(), gensym());
+ }
+ my ($close_input, $close_output) = (0, 0);
+ local *myData = $self;
+ local *_;
+
+ ## Is $infile a filename or a (possibly implied) filehandle
+ if (defined $infile && ref $infile) {
+ if (ref($infile) =~ /^(SCALAR|ARRAY|HASH|CODE|REF)$/) {
+ croak "Input from $1 reference not supported!\n";
+ }
+ ## Must be a filehandle-ref (or else assume its a ref to an object
+ ## that supports the common IO read operations).
+ $myData{_INFILE} = ${$infile};
+ $in_fh = $infile;
+ }
+ elsif (!defined($infile) || !length($infile) || ($infile eq '-')
+ || ($infile =~ /^<&(?:STDIN|0)$/i))
+ {
+ ## Not a filename, just a string implying STDIN
+ $infile ||= '-';
+ $myData{_INFILE} = '<standard input>';
+ $in_fh = \*STDIN;
+ }
+ else {
+ ## We have a filename, open it for reading
+ $myData{_INFILE} = $infile;
+ open($in_fh, "< $infile") or
+ croak "Can't open $infile for reading: $!\n";
+ $close_input = 1;
+ }
+
+ ## NOTE: we need to be *very* careful when "defaulting" the output
+ ## file. We only want to use a default if this is the beginning of
+ ## the entire document (but *not* if this is an included file). We
+ ## determine this by seeing if the input stream stack has been set-up
+ ## already
+
+ ## Is $outfile a filename, a (possibly implied) filehandle, maybe a ref?
+ if (ref $outfile) {
+ ## we need to check for ref() first, as other checks involve reading
+ if (ref($outfile) =~ /^(ARRAY|HASH|CODE)$/) {
+ croak "Output to $1 reference not supported!\n";
+ }
+ elsif (ref($outfile) eq 'SCALAR') {
+# # NOTE: IO::String isn't a part of the perl distribution,
+# # so probably we shouldn't support this case...
+# require IO::String;
+# $myData{_OUTFILE} = "$outfile";
+# $out_fh = IO::String->new($outfile);
+ croak "Output to SCALAR reference not supported!\n";
+ }
+ else {
+ ## Must be a filehandle-ref (or else assume its a ref to an
+ ## object that supports the common IO write operations).
+ $myData{_OUTFILE} = ${$outfile};
+ $out_fh = $outfile;
+ }
+ }
+ elsif (!defined($outfile) || !length($outfile) || ($outfile eq '-')
+ || ($outfile =~ /^>&?(?:STDOUT|1)$/i))
+ {
+ if (defined $myData{_TOP_STREAM}) {
+ $out_fh = $myData{_OUTPUT};
+ }
+ else {
+ ## Not a filename, just a string implying STDOUT
+ $outfile ||= '-';
+ $myData{_OUTFILE} = '<standard output>';
+ $out_fh = \*STDOUT;
+ }
+ }
+ elsif ($outfile =~ /^>&(STDERR|2)$/i) {
+ ## Not a filename, just a string implying STDERR
+ $myData{_OUTFILE} = '<standard error>';
+ $out_fh = \*STDERR;
+ }
+ else {
+ ## We have a filename, open it for writing
+ $myData{_OUTFILE} = $outfile;
+ (-d $outfile) and croak "$outfile is a directory, not POD input!\n";
+ open($out_fh, "> $outfile") or
+ croak "Can't open $outfile for writing: $!\n";
+ $close_output = 1;
+ }
+
+ ## Whew! That was a lot of work to set up reasonably/robust behavior
+ ## in the case of a non-filename for reading and writing. Now we just
+ ## have to parse the input and close the handles when we're finished.
+ $self->parse_from_filehandle(\%opts, $in_fh, $out_fh);
+
+ $close_input and
+ close($in_fh) || croak "Can't close $infile after reading: $!\n";
+ $close_output and
+ close($out_fh) || croak "Can't close $outfile after writing: $!\n";
+}
+
+#############################################################################
+
+=head1 ACCESSOR METHODS
+
+Clients of B<Pod::Parser> should use the following methods to access
+instance data fields:
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<errorsub()>
+
+ $parser->errorsub("method_name");
+ $parser->errorsub(\&warn_user);
+ $parser->errorsub(sub { print STDERR, @_ });
+
+Specifies the method or subroutine to use when printing error messages
+about POD syntax. The supplied method/subroutine I<must> return TRUE upon
+successful printing of the message. If C<undef> is given, then the B<carp>
+builtin is used to issue error messages (this is the default behavior).
+
+ my $errorsub = $parser->errorsub()
+ my $errmsg = "This is an error message!\n"
+ (ref $errorsub) and &{$errorsub}($errmsg)
+ or (defined $errorsub) and $parser->$errorsub($errmsg)
+ or carp($errmsg);
+
+Returns a method name, or else a reference to the user-supplied subroutine
+used to print error messages. Returns C<undef> if the B<carp> builtin
+is used to issue error messages (this is the default behavior).
+
+=cut
+
+sub errorsub {
+ return (@_ > 1) ? ($_[0]->{_ERRORSUB} = $_[1]) : $_[0]->{_ERRORSUB};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<cutting()>
+
+ $boolean = $parser->cutting();
+
+Returns the current C<cutting> state: a boolean-valued scalar which
+evaluates to true if text from the input file is currently being "cut"
+(meaning it is I<not> considered part of the POD document).
+
+ $parser->cutting($boolean);
+
+Sets the current C<cutting> state to the given value and returns the
+result.
+
+=cut
+
+sub cutting {
+ return (@_ > 1) ? ($_[0]->{_CUTTING} = $_[1]) : $_[0]->{_CUTTING};
+}
+
+##---------------------------------------------------------------------------
+
+##---------------------------------------------------------------------------
+
+=head1 B<parseopts()>
+
+When invoked with no additional arguments, B<parseopts> returns a hashtable
+of all the current parsing options.
+
+ ## See if we are parsing non-POD sections as well as POD ones
+ my %opts = $parser->parseopts();
+ $opts{'-want_nonPODs}' and print "-want_nonPODs\n";
+
+When invoked using a single string, B<parseopts> treats the string as the
+name of a parse-option and returns its corresponding value if it exists
+(returns C<undef> if it doesn't).
+
+ ## Did we ask to see '=cut' paragraphs?
+ my $want_cut = $parser->parseopts('-process_cut_cmd');
+ $want_cut and print "-process_cut_cmd\n";
+
+When invoked with multiple arguments, B<parseopts> treats them as
+key/value pairs and the specified parse-option names are set to the
+given values. Any unspecified parse-options are unaffected.
+
+ ## Set them back to the default
+ $parser->parseopts(-warnings => 0);
+
+When passed a single hash-ref, B<parseopts> uses that hash to completely
+reset the existing parse-options, all previous parse-option values
+are lost.
+
+ ## Reset all options to default
+ $parser->parseopts( { } );
+
+See L<"PARSING OPTIONS"> for more information on the name and meaning of each
+parse-option currently recognized.
+
+=cut
+
+sub parseopts {
+ local *myData = shift;
+ local *myOpts = ($myData{_PARSEOPTS} ||= {});
+ return %myOpts if (@_ == 0);
+ if (@_ == 1) {
+ local $_ = shift;
+ return ref($_) ? $myData{_PARSEOPTS} = $_ : $myOpts{$_};
+ }
+ my @newOpts = (%myOpts, @_);
+ $myData{_PARSEOPTS} = { @newOpts };
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_file()>
+
+ $fname = $parser->output_file();
+
+Returns the name of the output file being written.
+
+=cut
+
+sub output_file {
+ return $_[0]->{_OUTFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<output_handle()>
+
+ $fhandle = $parser->output_handle();
+
+Returns the output filehandle object.
+
+=cut
+
+sub output_handle {
+ return $_[0]->{_OUTPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_file()>
+
+ $fname = $parser->input_file();
+
+Returns the name of the input file being read.
+
+=cut
+
+sub input_file {
+ return $_[0]->{_INFILE};
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<input_handle()>
+
+ $fhandle = $parser->input_handle();
+
+Returns the current input filehandle object.
+
+=cut
+
+sub input_handle {
+ return $_[0]->{_INPUT};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<input_streams()>
+
+ $listref = $parser->input_streams();
+
+Returns a reference to an array which corresponds to the stack of all
+the input streams that are currently in the middle of being parsed.
+
+While parsing an input stream, it is possible to invoke
+B<parse_from_file()> or B<parse_from_filehandle()> to parse a new input
+stream and then return to parsing the previous input stream. Each input
+stream to be parsed is pushed onto the end of this input stack
+before any of its input is read. The input stream that is currently
+being parsed is always at the end (or top) of the input stack. When an
+input stream has been exhausted, it is popped off the end of the
+input stack.
+
+Each element on this input stack is a reference to C<Pod::InputSource>
+object. Please see L<Pod::InputObjects> for more details.
+
+This method might be invoked when printing diagnostic messages, for example,
+to obtain the name and line number of the all input files that are currently
+being processed.
+
+=end __PRIVATE__
+
+=cut
+
+sub input_streams {
+ return $_[0]->{_INPUT_STREAMS};
+}
+
+##---------------------------------------------------------------------------
+
+=begin __PRIVATE__
+
+=head1 B<top_stream()>
+
+ $hashref = $parser->top_stream();
+
+Returns a reference to the hash-table that represents the element
+that is currently at the top (end) of the input stream stack
+(see L<"input_streams()">). The return value will be the C<undef>
+if the input stack is empty.
+
+This method might be used when printing diagnostic messages, for example,
+to obtain the name and line number of the current input file.
+
+=end __PRIVATE__
+
+=cut
+
+sub top_stream {
+ return $_[0]->{_TOP_STREAM} || undef;
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Parser> makes use of several internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions for client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Parser> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Parser> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_push_input_stream()>
+
+ $hashref = $parser->_push_input_stream($in_fh,$out_fh);
+
+This method will push the given input stream on the input stack and
+perform any necessary beginning-of-document or beginning-of-file
+processing. The argument C<$in_fh> is the input stream filehandle to
+push, and C<$out_fh> is the corresponding output filehandle to use (if
+it is not given or is undefined, then the current output stream is used,
+which defaults to standard output if it doesnt exist yet).
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack. I<Please Note> that it is
+possible for this method to use default values for the input and output
+file handles. If this happens, you will need to look at the C<INPUT>
+and C<OUTPUT> instance data members to determine their new values.
+
+=end _PRIVATE_
+
+=cut
+
+sub _push_input_stream {
+ my ($self, $in_fh, $out_fh) = @_;
+ local *myData = $self;
+
+ ## Initialize stuff for the entire document if this is *not*
+ ## an included file.
+ ##
+ ## NOTE: we need to be *very* careful when "defaulting" the output
+ ## filehandle. We only want to use a default value if this is the
+ ## beginning of the entire document (but *not* if this is an included
+ ## file).
+ unless (defined $myData{_TOP_STREAM}) {
+ $out_fh = \*STDOUT unless (defined $out_fh);
+ $myData{_CUTTING} = 1; ## current "cutting" state
+ $myData{_INPUT_STREAMS} = []; ## stack of all input streams
+ }
+
+ ## Initialize input indicators
+ $myData{_OUTFILE} = '(unknown)' unless (defined $myData{_OUTFILE});
+ $myData{_OUTPUT} = $out_fh if (defined $out_fh);
+ $in_fh = \*STDIN unless (defined $in_fh);
+ $myData{_INFILE} = '(unknown)' unless (defined $myData{_INFILE});
+ $myData{_INPUT} = $in_fh;
+ my $input_top = $myData{_TOP_STREAM}
+ = new Pod::InputSource(
+ -name => $myData{_INFILE},
+ -handle => $in_fh,
+ -was_cutting => $myData{_CUTTING}
+ );
+ local *input_stack = $myData{_INPUT_STREAMS};
+ push(@input_stack, $input_top);
+
+ ## Perform beginning-of-document and/or beginning-of-input processing
+ $self->begin_pod() if (@input_stack == 1);
+ $self->begin_input();
+
+ return $input_top;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_pop_input_stream()>
+
+ $hashref = $parser->_pop_input_stream();
+
+This takes no arguments. It will perform any necessary end-of-file or
+end-of-document processing and then pop the current input stream from
+the top of the input stack.
+
+The value returned will be reference to the hash-table that represents
+the new top of the input stream stack.
+
+=end _PRIVATE_
+
+=cut
+
+sub _pop_input_stream {
+ my ($self) = @_;
+ local *myData = $self;
+ local *input_stack = $myData{_INPUT_STREAMS};
+
+ ## Perform end-of-input and/or end-of-document processing
+ $self->end_input() if (@input_stack > 0);
+ $self->end_pod() if (@input_stack == 1);
+
+ ## Restore cutting state to whatever it was before we started
+ ## parsing this file.
+ my $old_top = pop(@input_stack);
+ $myData{_CUTTING} = $old_top->was_cutting();
+
+ ## Dont forget to reset the input indicators
+ my $input_top = undef;
+ if (@input_stack > 0) {
+ $input_top = $myData{_TOP_STREAM} = $input_stack[-1];
+ $myData{_INFILE} = $input_top->name();
+ $myData{_INPUT} = $input_top->handle();
+ } else {
+ delete $myData{_TOP_STREAM};
+ delete $myData{_INPUT_STREAMS};
+ }
+
+ return $input_top;
+}
+
+#############################################################################
+
+=head1 TREE-BASED PARSING
+
+If straightforward stream-based parsing wont meet your needs (as is
+likely the case for tasks such as translating PODs into structured
+markup languages like HTML and XML) then you may need to take the
+tree-based approach. Rather than doing everything in one pass and
+calling the B<interpolate()> method to expand sequences into text, it
+may be desirable to instead create a parse-tree using the B<parse_text()>
+method to return a tree-like structure which may contain an ordered
+list of children (each of which may be a text-string, or a similar
+tree-like structure).
+
+Pay special attention to L<"METHODS FOR PARSING AND PROCESSING"> and
+to the objects described in L<Pod::InputObjects>. The former describes
+the gory details and parameters for how to customize and extend the
+parsing behavior of B<Pod::Parser>. B<Pod::InputObjects> provides
+several objects that may all be used interchangeably as parse-trees. The
+most obvious one is the B<Pod::ParseTree> object. It defines the basic
+interface and functionality that all things trying to be a POD parse-tree
+should do. A B<Pod::ParseTree> is defined such that each "node" may be a
+text-string, or a reference to another parse-tree. Each B<Pod::Paragraph>
+object and each B<Pod::InteriorSequence> object also supports the basic
+parse-tree interface.
+
+The B<parse_text()> method takes a given paragraph of text, and
+returns a parse-tree that contains one or more children, each of which
+may be a text-string, or an InteriorSequence object. There are also
+callback-options that may be passed to B<parse_text()> to customize
+the way it expands or transforms interior-sequences, as well as the
+returned result. These callbacks can be used to create a parse-tree
+with custom-made objects (which may or may not support the parse-tree
+interface, depending on how you choose to do it).
+
+If you wish to turn an entire POD document into a parse-tree, that process
+is fairly straightforward. The B<parse_text()> method is the key to doing
+this successfully. Every paragraph-callback (i.e. the polymorphic methods
+for B<command()>, B<verbatim()>, and B<textblock()> paragraphs) takes
+a B<Pod::Paragraph> object as an argument. Each paragraph object has a
+B<parse_tree()> method that can be used to get or set a corresponding
+parse-tree. So for each of those paragraph-callback methods, simply call
+B<parse_text()> with the options you desire, and then use the returned
+parse-tree to assign to the given paragraph object.
+
+That gives you a parse-tree for each paragraph - so now all you need is
+an ordered list of paragraphs. You can maintain that yourself as a data
+element in the object/hash. The most straightforward way would be simply
+to use an array-ref, with the desired set of custom "options" for each
+invocation of B<parse_text>. Let's assume the desired option-set is
+given by the hash C<%options>. Then we might do something like the
+following:
+
+ package MyPodParserTree;
+
+ @ISA = qw( Pod::Parser );
+
+ ...
+
+ sub begin_pod {
+ my $self = shift;
+ $self->{'-paragraphs'} = []; ## initialize paragraph list
+ }
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({%options}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ push @{ $self->{'-paragraphs'} }, $pod_para;
+ }
+
+ ...
+
+ package main;
+ ...
+ my $parser = new MyPodParserTree(...);
+ $parser->parse_from_file(...);
+ my $paragraphs_ref = $parser->{'-paragraphs'};
+
+Of course, in this module-author's humble opinion, I'd be more inclined to
+use the existing B<Pod::ParseTree> object than a simple array. That way
+everything in it, paragraphs and sequences, all respond to the same core
+interface for all parse-tree nodes. The result would look something like:
+
+ package MyPodParserTree2;
+
+ ...
+
+ sub begin_pod {
+ my $self = shift;
+ $self->{'-ptree'} = new Pod::ParseTree; ## initialize parse-tree
+ }
+
+ sub parse_tree {
+ ## convenience method to get/set the parse-tree for the entire POD
+ (@_ > 1) and $_[0]->{'-ptree'} = $_[1];
+ return $_[0]->{'-ptree'};
+ }
+
+ sub command {
+ my ($parser, $command, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ sub verbatim {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ sub textblock {
+ my ($parser, $paragraph, $line_num, $pod_para) = @_;
+ my $ptree = $parser->parse_text({<<options>>}, $paragraph, ...);
+ $pod_para->parse_tree( $ptree );
+ $parser->parse_tree()->append( $pod_para );
+ }
+
+ ...
+
+ package main;
+ ...
+ my $parser = new MyPodParserTree2(...);
+ $parser->parse_from_file(...);
+ my $ptree = $parser->parse_tree;
+ ...
+
+Now you have the entire POD document as one great big parse-tree. You
+can even use the B<-expand_seq> option to B<parse_text> to insert
+whole different kinds of objects. Just don't expect B<Pod::Parser>
+to know what to do with them after that. That will need to be in your
+code. Or, alternatively, you can insert any object you like so long as
+it conforms to the B<Pod::ParseTree> interface.
+
+One could use this to create subclasses of B<Pod::Paragraphs> and
+B<Pod::InteriorSequences> for specific commands (or to create your own
+custom node-types in the parse-tree) and add some kind of B<emit()>
+method to each custom node/subclass object in the tree. Then all you'd
+need to do is recursively walk the tree in the desired order, processing
+the children (most likely from left to right) by formatting them if
+they are text-strings, or by calling their B<emit()> method if they
+are objects/references.
+
+=head1 CAVEATS
+
+Please note that POD has the notion of "paragraphs": this is something
+starting I<after> a blank (read: empty) line, with the single exception
+of the file start, which is also starting a paragraph. That means that
+especially a command (e.g. C<=head1>) I<must> be preceded with a blank
+line; C<__END__> is I<not> a blank line.
+
+=head1 SEE ALSO
+
+L<Pod::InputObjects>, L<Pod::Select>
+
+B<Pod::InputObjects> defines POD input objects corresponding to
+command paragraphs, parse-trees, and interior-sequences.
+
+B<Pod::Select> is a subclass of B<Pod::Parser> which provides the ability
+to selectively include and/or exclude sections of a POD document from being
+translated based upon the current heading, subheading, subsubheading, etc.
+
+=for __PRIVATE__
+B<Pod::Callbacks> is a subclass of B<Pod::Parser> which gives its users
+the ability the employ I<callback functions> instead of, or in addition
+to, overriding methods of the base class.
+
+=for __PRIVATE__
+B<Pod::Select> and B<Pod::Callbacks> do not override any
+methods nor do they define any new methods with the same name. Because
+of this, they may I<both> be used (in combination) as a base class of
+the same subclass in order to combine their functionality without
+causing any namespace clashes due to multiple inheritance.
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=head1 LICENSE
+
+Pod-Parser is free software; you can redistribute it and/or modify it
+under the terms of the Artistic License distributed with Perl version
+5.000 or (at your option) any later version. Please refer to the
+Artistic License that came with your Perl distribution for more
+details. If your version of Perl was not distributed under the
+terms of the Artistic License, than you may distribute PodParser
+under the same terms as Perl itself.
+
+=cut
+
+1;
+# vim: ts=4 sw=4 et
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc.pm
new file mode 100644
index 00000000000..654785a1f70
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc.pm
@@ -0,0 +1,1966 @@
+
+require 5;
+use 5.006; # we use some open(X, "<", $y) syntax
+package Pod::Perldoc;
+use strict;
+use warnings;
+use Config '%Config';
+
+use Fcntl; # for sysopen
+use File::Spec::Functions qw(catfile catdir splitdir);
+
+use vars qw($VERSION @Pagers $Bindir $Pod2man
+ $Temp_Files_Created $Temp_File_Lifetime
+);
+$VERSION = '3.15_02';
+#..........................................................................
+
+BEGIN { # Make a DEBUG constant very first thing...
+ unless(defined &DEBUG) {
+ if(($ENV{'PERLDOCDEBUG'} || '') =~ m/^(\d+)/) { # untaint
+ eval("sub DEBUG () {$1}");
+ die "WHAT? Couldn't eval-up a DEBUG constant!? $@" if $@;
+ } else {
+ *DEBUG = sub () {0};
+ }
+ }
+}
+
+use Pod::Perldoc::GetOptsOO; # uses the DEBUG.
+
+#..........................................................................
+
+sub TRUE () {1}
+sub FALSE () {return}
+sub BE_LENIENT () {1}
+
+BEGIN {
+ *IS_VMS = $^O eq 'VMS' ? \&TRUE : \&FALSE unless defined &IS_VMS;
+ *IS_MSWin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &IS_MSWin32;
+ *IS_Dos = $^O eq 'dos' ? \&TRUE : \&FALSE unless defined &IS_Dos;
+ *IS_OS2 = $^O eq 'os2' ? \&TRUE : \&FALSE unless defined &IS_OS2;
+ *IS_Cygwin = $^O eq 'cygwin' ? \&TRUE : \&FALSE unless defined &IS_Cygwin;
+ *IS_Linux = $^O eq 'linux' ? \&TRUE : \&FALSE unless defined &IS_Linux;
+ *IS_HPUX = $^O =~ m/hpux/ ? \&TRUE : \&FALSE unless defined &IS_HPUX;
+}
+
+$Temp_File_Lifetime ||= 60 * 60 * 24 * 5;
+ # If it's older than five days, it's quite unlikely
+ # that anyone's still looking at it!!
+ # (Currently used only by the MSWin cleanup routine)
+
+
+#..........................................................................
+{ my $pager = $Config{'pager'};
+ push @Pagers, $pager if -x (split /\s+/, $pager)[0] or IS_VMS;
+}
+$Bindir = $Config{'scriptdirexp'};
+$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' );
+
+# End of class-init stuff
+#
+###########################################################################
+#
+# Option accessors...
+
+foreach my $subname (map "opt_$_", split '', q{mhlDriFfXqnTdULv}) {
+ no strict 'refs';
+ *$subname = do{ use strict 'refs'; sub () { shift->_elem($subname, @_) } };
+}
+
+# And these are so that GetOptsOO knows they take options:
+sub opt_f_with { shift->_elem('opt_f', @_) }
+sub opt_q_with { shift->_elem('opt_q', @_) }
+sub opt_d_with { shift->_elem('opt_d', @_) }
+sub opt_L_with { shift->_elem('opt_L', @_) }
+sub opt_v_with { shift->_elem('opt_v', @_) }
+
+sub opt_w_with { # Specify an option for the formatter subclass
+ my($self, $value) = @_;
+ if($value =~ m/^([-_a-zA-Z][-_a-zA-Z0-9]*)(?:[=\:](.*?))?$/s) {
+ my $option = $1;
+ my $option_value = defined($2) ? $2 : "TRUE";
+ $option =~ tr/\-/_/s; # tolerate "foo-bar" for "foo_bar"
+ $self->add_formatter_option( $option, $option_value );
+ } else {
+ warn "\"$value\" isn't a good formatter option name. I'm ignoring it!\n";
+ }
+ return;
+}
+
+sub opt_M_with { # specify formatter class name(s)
+ my($self, $classes) = @_;
+ return unless defined $classes and length $classes;
+ DEBUG > 4 and print "Considering new formatter classes -M$classes\n";
+ my @classes_to_add;
+ foreach my $classname (split m/[,;]+/s, $classes) {
+ next unless $classname =~ m/\S/;
+ if( $classname =~ m/^(\w+(::\w+)+)$/s ) {
+ # A mildly restrictive concept of what modulenames are valid.
+ push @classes_to_add, $1; # untaint
+ } else {
+ warn "\"$classname\" isn't a valid classname. Ignoring.\n";
+ }
+ }
+
+ unshift @{ $self->{'formatter_classes'} }, @classes_to_add;
+
+ DEBUG > 3 and print(
+ "Adding @classes_to_add to the list of formatter classes, "
+ . "making them @{ $self->{'formatter_classes'} }.\n"
+ );
+
+ return;
+}
+
+sub opt_V { # report version and exit
+ print join '',
+ "Perldoc v$VERSION, under perl v$] for $^O",
+
+ (defined(&Win32::BuildNumber) and defined &Win32::BuildNumber())
+ ? (" (win32 build ", &Win32::BuildNumber(), ")") : (),
+
+ (chr(65) eq 'A') ? () : " (non-ASCII)",
+
+ "\n",
+ ;
+ exit;
+}
+
+sub opt_t { # choose plaintext as output format
+ my $self = shift;
+ $self->opt_o_with('text') if @_ and $_[0];
+ return $self->_elem('opt_t', @_);
+}
+
+sub opt_u { # choose raw pod as output format
+ my $self = shift;
+ $self->opt_o_with('pod') if @_ and $_[0];
+ return $self->_elem('opt_u', @_);
+}
+
+sub opt_n_with {
+ # choose man as the output format, and specify the proggy to run
+ my $self = shift;
+ $self->opt_o_with('man') if @_ and $_[0];
+ $self->_elem('opt_n', @_);
+}
+
+sub opt_o_with { # "o" for output format
+ my($self, $rest) = @_;
+ return unless defined $rest and length $rest;
+ if($rest =~ m/^(\w+)$/s) {
+ $rest = $1; #untaint
+ } else {
+ warn "\"$rest\" isn't a valid output format. Skipping.\n";
+ return;
+ }
+
+ $self->aside("Noting \"$rest\" as desired output format...\n");
+
+ # Figure out what class(es) that could actually mean...
+
+ my @classes;
+ foreach my $prefix ("Pod::Perldoc::To", "Pod::Simple::", "Pod::") {
+ # Messy but smart:
+ foreach my $stem (
+ $rest, # Yes, try it first with the given capitalization
+ "\L$rest", "\L\u$rest", "\U$rest" # And then try variations
+
+ ) {
+ push @classes, $prefix . $stem;
+ #print "Considering $prefix$stem\n";
+ }
+
+ # Tidier, but misses too much:
+ #push @classes, $prefix . ucfirst(lc($rest));
+ }
+ $self->opt_M_with( join ";", @classes );
+ return;
+}
+
+###########################################################################
+# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+
+sub run { # to be called by the "perldoc" executable
+ my $class = shift;
+ if(DEBUG > 3) {
+ print "Parameters to $class\->run:\n";
+ my @x = @_;
+ while(@x) {
+ $x[1] = '<undef>' unless defined $x[1];
+ $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY';
+ print " [$x[0]] => [$x[1]]\n";
+ splice @x,0,2;
+ }
+ print "\n";
+ }
+ return $class -> new(@_) -> process() || 0;
+}
+
+# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
+###########################################################################
+
+sub new { # yeah, nothing fancy
+ my $class = shift;
+ my $new = bless {@_}, (ref($class) || $class);
+ DEBUG > 1 and print "New $class object $new\n";
+ $new->init();
+ $new;
+}
+
+#..........................................................................
+
+sub aside { # If we're in -D or DEBUG mode, say this.
+ my $self = shift;
+ if( DEBUG or $self->opt_D ) {
+ my $out = join( '',
+ DEBUG ? do {
+ my $callsub = (caller(1))[3];
+ my $package = quotemeta(__PACKAGE__ . '::');
+ $callsub =~ s/^$package/'/os;
+ # the o is justified, as $package really won't change.
+ $callsub . ": ";
+ } : '',
+ @_,
+ );
+ if(DEBUG) { print $out } else { print STDERR $out }
+ }
+ return;
+}
+
+#..........................................................................
+
+sub usage {
+ my $self = shift;
+ warn "@_\n" if @_;
+
+ # Erase evidence of previous errors (if any), so exit status is simple.
+ $! = 0;
+
+ die <<EOF;
+perldoc [options] PageName|ModuleName|ProgramName...
+perldoc [options] -f BuiltinFunction
+perldoc [options] -q FAQRegex
+perldoc [options] -v PerlVariable
+
+Options:
+ -h Display this help message
+ -V report version
+ -r Recursive search (slow)
+ -i Ignore case
+ -t Display pod using pod2text instead of pod2man and nroff
+ (-t is the default on win32 unless -n is specified)
+ -u Display unformatted pod text
+ -m Display module's file in its entirety
+ -n Specify replacement for nroff
+ -l Display the module's file name
+ -F Arguments are file names, not modules
+ -D Verbosely describe what's going on
+ -T Send output to STDOUT without any pager
+ -d output_filename_to_send_to
+ -o output_format_name
+ -M FormatterModuleNameToUse
+ -w formatter_option:option_value
+ -L translation_code Choose doc translation (if any)
+ -X use index if present (looks for pod.idx at $Config{archlib})
+ -q Search the text of questions (not answers) in perlfaq[1-9]
+ -f Search Perl built-in functions
+ -v Search predefined Perl variables
+
+PageName|ModuleName...
+ is the name of a piece of documentation that you want to look at. You
+ may either give a descriptive name of the page (as in the case of
+ `perlfunc') the name of a module, either like `Term::Info' or like
+ `Term/Info', or the name of a program, like `perldoc'.
+
+BuiltinFunction
+ is the name of a perl function. Will extract documentation from
+ `perlfunc'.
+
+FAQRegex
+ is a regex. Will search perlfaq[1-9] for and extract any
+ questions that match.
+
+Any switches in the PERLDOC environment variable will be used before the
+command line arguments. The optional pod index file contains a list of
+filenames, one per line.
+ [Perldoc v$VERSION]
+EOF
+
+}
+
+#..........................................................................
+
+sub usage_brief {
+ my $me = $0; # Editing $0 is unportable
+
+ $me =~ s,.*[/\\],,; # get basename
+
+ die <<"EOUSAGE";
+Usage: $me [-h] [-V] [-r] [-i] [-D] [-t] [-u] [-m] [-n nroffer_program] [-l] [-T] [-d output_filename] [-o output_format] [-M FormatterModuleNameToUse] [-w formatter_option:option_value] [-L translation_code] [-F] [-X] PageName|ModuleName|ProgramName
+ $me -f PerlFunc
+ $me -q FAQKeywords
+ $me -v PerlVar
+
+The -h option prints more help. Also try "perldoc perldoc" to get
+acquainted with the system. [Perldoc v$VERSION]
+EOUSAGE
+
+}
+
+#..........................................................................
+
+sub pagers { @{ shift->{'pagers'} } }
+
+#..........................................................................
+
+sub _elem { # handy scalar meta-accessor: shift->_elem("foo", @_)
+ if(@_ > 2) { return $_[0]{ $_[1] } = $_[2] }
+ else { return $_[0]{ $_[1] } }
+}
+#..........................................................................
+###########################################################################
+#
+# Init formatter switches, and start it off with __bindir and all that
+# other stuff that ToMan.pm needs.
+#
+
+sub init {
+ my $self = shift;
+
+ # Make sure creat()s are neither too much nor too little
+ eval { umask(0077) }; # doubtless someone has no mask
+
+ $self->{'args'} ||= \@ARGV;
+ $self->{'found'} ||= [];
+ $self->{'temp_file_list'} ||= [];
+
+
+ $self->{'target'} = undef;
+
+ $self->init_formatter_class_list;
+
+ $self->{'pagers' } = [@Pagers] unless exists $self->{'pagers'};
+ $self->{'bindir' } = $Bindir unless exists $self->{'bindir'};
+ $self->{'pod2man'} = $Pod2man unless exists $self->{'pod2man'};
+
+ push @{ $self->{'formatter_switches'} = [] }, (
+ # Yeah, we could use a hashref, but maybe there's some class where options
+ # have to be ordered; so we'll use an arrayref.
+
+ [ '__bindir' => $self->{'bindir' } ],
+ [ '__pod2man' => $self->{'pod2man'} ],
+ );
+
+ DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+ join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+ $self->{'translators'} = [];
+ $self->{'extra_search_dirs'} = [];
+
+ return;
+}
+
+#..........................................................................
+
+sub init_formatter_class_list {
+ my $self = shift;
+ $self->{'formatter_classes'} ||= [];
+
+ # Remember, no switches have been read yet, when
+ # we've started this routine.
+
+ $self->opt_M_with('Pod::Perldoc::ToPod'); # the always-there fallthru
+ $self->opt_o_with('text');
+ $self->opt_o_with('man') unless IS_MSWin32 || IS_Dos
+ || !($ENV{TERM} && (
+ ($ENV{TERM} || '') !~ /dumb|emacs|none|unknown/i
+ ));
+
+ return;
+}
+
+#..........................................................................
+
+sub process {
+ # if this ever returns, its retval will be used for exit(RETVAL)
+
+ my $self = shift;
+ DEBUG > 1 and print " Beginning process.\n";
+ DEBUG > 1 and print " Args: @{$self->{'args'}}\n\n";
+ if(DEBUG > 3) {
+ print "Object contents:\n";
+ my @x = %$self;
+ while(@x) {
+ $x[1] = '<undef>' unless defined $x[1];
+ $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY';
+ print " [$x[0]] => [$x[1]]\n";
+ splice @x,0,2;
+ }
+ print "\n";
+ }
+
+ # TODO: make it deal with being invoked as various different things
+ # such as perlfaq".
+
+ return $self->usage_brief unless @{ $self->{'args'} };
+ $self->pagers_guessing;
+ $self->options_reading;
+ $self->aside(sprintf "$0 => %s v%s\n", ref($self), $self->VERSION);
+ $self->drop_privs_maybe;
+ $self->options_processing;
+
+ # Hm, we have @pages and @found, but we only really act on one
+ # file per call, with the exception of the opt_q hack, and with
+ # -l things
+
+ $self->aside("\n");
+
+ my @pages;
+ $self->{'pages'} = \@pages;
+ if( $self->opt_f) { @pages = ("perlfunc") }
+ elsif( $self->opt_q) { @pages = ("perlfaq1" .. "perlfaq9") }
+ elsif( $self->opt_v) { @pages = ("perlvar") }
+ else { @pages = @{$self->{'args'}};
+ # @pages = __FILE__
+ # if @pages == 1 and $pages[0] eq 'perldoc';
+ }
+
+ return $self->usage_brief unless @pages;
+
+ $self->find_good_formatter_class();
+ $self->formatter_sanity_check();
+
+ $self->maybe_diddle_INC();
+ # for when we're apparently in a module or extension directory
+
+ my @found = $self->grand_search_init(\@pages);
+ exit (IS_VMS ? 98962 : 1) unless @found;
+
+ if ($self->opt_l) {
+ DEBUG and print "We're in -l mode, so byebye after this:\n";
+ print join("\n", @found), "\n";
+ return;
+ }
+
+ $self->tweak_found_pathnames(\@found);
+ $self->assert_closing_stdout;
+ return $self->page_module_file(@found) if $self->opt_m;
+ DEBUG > 2 and print "Found: [@found]\n";
+
+ return $self->render_and_page(\@found);
+}
+
+#..........................................................................
+{
+
+my( %class_seen, %class_loaded );
+sub find_good_formatter_class {
+ my $self = $_[0];
+ my @class_list = @{ $self->{'formatter_classes'} || [] };
+ die "WHAT? Nothing in the formatter class list!?" unless @class_list;
+
+ my $good_class_found;
+ foreach my $c (@class_list) {
+ DEBUG > 4 and print "Trying to load $c...\n";
+ if($class_loaded{$c}) {
+ DEBUG > 4 and print "OK, the already-loaded $c it is!\n";
+ $good_class_found = $c;
+ last;
+ }
+
+ if($class_seen{$c}) {
+ DEBUG > 4 and print
+ "I've tried $c before, and it's no good. Skipping.\n";
+ next;
+ }
+
+ $class_seen{$c} = 1;
+
+ if( $c->can('parse_from_file') ) {
+ DEBUG > 4 and print
+ "Interesting, the formatter class $c is already loaded!\n";
+
+ } elsif(
+ (IS_VMS or IS_MSWin32 or IS_Dos or IS_OS2)
+ # the alway case-insensitive fs's
+ and $class_seen{lc("~$c")}++
+ ) {
+ DEBUG > 4 and print
+ "We already used something quite like \"\L$c\E\", so no point using $c\n";
+ # This avoids redefining the package.
+ } else {
+ DEBUG > 4 and print "Trying to eval 'require $c'...\n";
+
+ local $^W = $^W;
+ if(DEBUG() or $self->opt_D) {
+ # feh, let 'em see it
+ } else {
+ $^W = 0;
+ # The average user just has no reason to be seeing
+ # $^W-suppressable warnings from the the require!
+ }
+
+ eval "require $c";
+ if($@) {
+ DEBUG > 4 and print "Couldn't load $c: $!\n";
+ next;
+ }
+ }
+
+ if( $c->can('parse_from_file') ) {
+ DEBUG > 4 and print "Settling on $c\n";
+ my $v = $c->VERSION;
+ $v = ( defined $v and length $v ) ? " version $v" : '';
+ $self->aside("Formatter class $c$v successfully loaded!\n");
+ $good_class_found = $c;
+ last;
+ } else {
+ DEBUG > 4 and print "Class $c isn't a formatter?! Skipping.\n";
+ }
+ }
+
+ die "Can't find any loadable formatter class in @class_list?!\nAborting"
+ unless $good_class_found;
+
+ $self->{'formatter_class'} = $good_class_found;
+ $self->aside("Will format with the class $good_class_found\n");
+
+ return;
+}
+
+}
+#..........................................................................
+
+sub formatter_sanity_check {
+ my $self = shift;
+ my $formatter_class = $self->{'formatter_class'}
+ || die "NO FORMATTER CLASS YET!?";
+
+ if(!$self->opt_T # so -T can FORCE sending to STDOUT
+ and $formatter_class->can('is_pageable')
+ and !$formatter_class->is_pageable
+ and !$formatter_class->can('page_for_perldoc')
+ ) {
+ my $ext =
+ ($formatter_class->can('output_extension')
+ && $formatter_class->output_extension
+ ) || '';
+ $ext = ".$ext" if length $ext;
+
+ die
+ "When using Perldoc to format with $formatter_class, you have to\n"
+ . "specify -T or -dsomefile$ext\n"
+ . "See `perldoc perldoc' for more information on those switches.\n"
+ ;
+ }
+}
+
+#..........................................................................
+
+sub render_and_page {
+ my($self, $found_list) = @_;
+
+ $self->maybe_generate_dynamic_pod($found_list);
+
+ my($out, $formatter) = $self->render_findings($found_list);
+
+ if($self->opt_d) {
+ printf "Perldoc (%s) output saved to %s\n",
+ $self->{'formatter_class'} || ref($self),
+ $out;
+ print "But notice that it's 0 bytes long!\n" unless -s $out;
+
+
+ } elsif( # Allow the formatter to "page" itself, if it wants.
+ $formatter->can('page_for_perldoc')
+ and do {
+ $self->aside("Going to call $formatter\->page_for_perldoc(\"$out\")\n");
+ if( $formatter->page_for_perldoc($out, $self) ) {
+ $self->aside("page_for_perldoc returned true, so NOT paging with $self.\n");
+ 1;
+ } else {
+ $self->aside("page_for_perldoc returned false, so paging with $self instead.\n");
+ '';
+ }
+ }
+ ) {
+ # Do nothing, since the formatter has "paged" it for itself.
+
+ } else {
+ # Page it normally (internally)
+
+ if( -s $out ) { # Usual case:
+ $self->page($out, $self->{'output_to_stdout'}, $self->pagers);
+
+ } else {
+ # Odd case:
+ $self->aside("Skipping $out (from $$found_list[0] "
+ . "via $$self{'formatter_class'}) as it is 0-length.\n");
+
+ push @{ $self->{'temp_file_list'} }, $out;
+ $self->unlink_if_temp_file($out);
+ }
+ }
+
+ $self->after_rendering(); # any extra cleanup or whatever
+
+ return;
+}
+
+#..........................................................................
+
+sub options_reading {
+ my $self = shift;
+
+ if( defined $ENV{"PERLDOC"} and length $ENV{"PERLDOC"} ) {
+ require Text::ParseWords;
+ $self->aside("Noting env PERLDOC setting of $ENV{'PERLDOC'}\n");
+ # Yes, appends to the beginning
+ unshift @{ $self->{'args'} },
+ Text::ParseWords::shellwords( $ENV{"PERLDOC"} )
+ ;
+ DEBUG > 1 and print " Args now: @{$self->{'args'}}\n\n";
+ } else {
+ DEBUG > 1 and print " Okay, no PERLDOC setting in ENV.\n";
+ }
+
+ DEBUG > 1
+ and print " Args right before switch processing: @{$self->{'args'}}\n";
+
+ Pod::Perldoc::GetOptsOO::getopts( $self, $self->{'args'}, 'YES' )
+ or return $self->usage;
+
+ DEBUG > 1
+ and print " Args after switch processing: @{$self->{'args'}}\n";
+
+ return $self->usage if $self->opt_h;
+
+ return;
+}
+
+#..........................................................................
+
+sub options_processing {
+ my $self = shift;
+
+ if ($self->opt_X) {
+ my $podidx = "$Config{'archlib'}/pod.idx";
+ $podidx = "" unless -f $podidx && -r _ && -M _ <= 7;
+ $self->{'podidx'} = $podidx;
+ }
+
+ $self->{'output_to_stdout'} = 1 if $self->opt_T or ! -t STDOUT;
+
+ $self->options_sanity;
+
+ $self->opt_n("nroff") unless $self->opt_n;
+ $self->add_formatter_option( '__nroffer' => $self->opt_n );
+
+ # Get language from PERLDOC_POD2 environment variable
+ if ( ! $self->opt_L && $ENV{PERLDOC_POD2} ) {
+ if ( $ENV{PERLDOC_POD2} eq '1' ) {
+ $self->_elem('opt_L',(split(/\_/, $ENV{LC_ALL} || $ENV{LC_LANG} || $ENV{LANG}))[0] );
+ }
+ else {
+ $self->_elem('opt_L', $ENV{PERLDOC_POD2});
+ }
+ };
+
+ # Adjust for using translation packages
+ $self->add_translator(split(/\s+/,$self->opt_L)) if $self->opt_L;
+
+ return;
+}
+
+#..........................................................................
+
+sub options_sanity {
+ my $self = shift;
+
+ # The opts-counting stuff interacts quite badly with
+ # the $ENV{"PERLDOC"} stuff. I.e., if I have $ENV{"PERLDOC"}
+ # set to -t, and I specify -u on the command line, I don't want
+ # to be hectored at that -u and -t don't make sense together.
+
+ #my $opts = grep $_ && 1, # yes, the count of the set ones
+ # $self->opt_t, $self->opt_u, $self->opt_m, $self->opt_l
+ #;
+ #
+ #$self->usage("only one of -t, -u, -m or -l") if $opts > 1;
+
+
+ # Any sanity-checking need doing here?
+
+ # But does not make sense to set either -f or -q in $ENV{"PERLDOC"}
+ if( $self->opt_f or $self->opt_q ) {
+ $self->usage("Only one of -f -or -q") if $self->opt_f and $self->opt_q;
+ warn
+ "Perldoc is only really meant for reading one word at a time.\n",
+ "So these parameters are being ignored: ",
+ join(' ', @{$self->{'args'}}),
+ "\n"
+ if @{$self->{'args'}}
+ }
+ return;
+}
+
+#..........................................................................
+
+sub grand_search_init {
+ my($self, $pages, @found) = @_;
+
+ foreach (@$pages) {
+ if ($self->{'podidx'} && open(PODIDX, $self->{'podidx'})) {
+ my $searchfor = catfile split '::', $_;
+ $self->aside( "Searching for '$searchfor' in $self->{'podidx'}\n" );
+ local $_;
+ while (<PODIDX>) {
+ chomp;
+ push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i;
+ }
+ close(PODIDX) or die "Can't close $$self{'podidx'}: $!";
+ next;
+ }
+
+ $self->aside( "Searching for $_\n" );
+
+ if ($self->opt_F) {
+ next unless -r;
+ push @found, $_ if $self->opt_m or $self->containspod($_);
+ next;
+ }
+
+ my @searchdirs;
+
+ # prepend extra search directories (including language specific)
+ push @searchdirs, @{ $self->{'extra_search_dirs'} };
+
+ # We must look both in @INC for library modules and in $bindir
+ # for executables, like h2xs or perldoc itself.
+ push @searchdirs, ($self->{'bindir'}, @INC);
+ unless ($self->opt_m) {
+ if (IS_VMS) {
+ my($i,$trn);
+ for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) {
+ push(@searchdirs,$trn);
+ }
+ push(@searchdirs,'perl_root:[lib.pod]') # installed pods
+ }
+ else {
+ push(@searchdirs, grep(-d, split($Config{path_sep},
+ $ENV{'PATH'})));
+ }
+ }
+ my @files = $self->searchfor(0,$_,@searchdirs);
+ if (@files) {
+ $self->aside( "Found as @files\n" );
+ }
+ # add "perl" prefix, so "perldoc foo" may find perlfoo.pod
+ elsif (BE_LENIENT and !/\W/ and @files = $self->searchfor(0, "perl$_", @searchdirs)) {
+ $self->aside( "Loosely found as @files\n" );
+ }
+ else {
+ # no match, try recursive search
+ @searchdirs = grep(!/^\.\z/s,@INC);
+ @files= $self->searchfor(1,$_,@searchdirs) if $self->opt_r;
+ if (@files) {
+ $self->aside( "Loosely found as @files\n" );
+ }
+ else {
+ print STDERR "No " .
+ ($self->opt_m ? "module" : "documentation") . " found for \"$_\".\n";
+ if ( @{ $self->{'found'} } ) {
+ print STDERR "However, try\n";
+ for my $dir (@{ $self->{'found'} }) {
+ opendir(DIR, $dir) or die "opendir $dir: $!";
+ while (my $file = readdir(DIR)) {
+ next if ($file =~ /^\./s);
+ $file =~ s/\.(pm|pod)\z//; # XXX: badfs
+ print STDERR "\tperldoc $_\::$file\n";
+ }
+ closedir(DIR) or die "closedir $dir: $!";
+ }
+ }
+ }
+ }
+ push(@found,@files);
+ }
+ return @found;
+}
+
+#..........................................................................
+
+sub maybe_generate_dynamic_pod {
+ my($self, $found_things) = @_;
+ my @dynamic_pod;
+
+ $self->search_perlfunc($found_things, \@dynamic_pod) if $self->opt_f;
+
+ $self->search_perlvar($found_things, \@dynamic_pod) if $self->opt_v;
+
+ $self->search_perlfaqs($found_things, \@dynamic_pod) if $self->opt_q;
+
+ if( ! $self->opt_f and ! $self->opt_q and ! $self->opt_v ) {
+ DEBUG > 4 and print "That's a non-dynamic pod search.\n";
+ } elsif ( @dynamic_pod ) {
+ $self->aside("Hm, I found some Pod from that search!\n");
+ my ($buffd, $buffer) = $self->new_tempfile('pod', 'dyn');
+
+ push @{ $self->{'temp_file_list'} }, $buffer;
+ # I.e., it MIGHT be deleted at the end.
+
+ my $in_list = $self->opt_f || $self->opt_v;
+
+ print $buffd "=over 8\n\n" if $in_list;
+ print $buffd @dynamic_pod or die "Can't print $buffer: $!";
+ print $buffd "=back\n" if $in_list;
+
+ close $buffd or die "Can't close $buffer: $!";
+
+ @$found_things = $buffer;
+ # Yes, so found_things never has more than one thing in
+ # it, by time we leave here
+
+ $self->add_formatter_option('__filter_nroff' => 1);
+
+ } else {
+ @$found_things = ();
+ $self->aside("I found no Pod from that search!\n");
+ }
+
+ return;
+}
+
+#..........................................................................
+
+sub add_formatter_option { # $self->add_formatter_option('key' => 'value');
+ my $self = shift;
+ push @{ $self->{'formatter_switches'} }, [ @_ ] if @_;
+
+ DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+ join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+ return;
+}
+
+#.........................................................................
+
+sub new_translator { # $tr = $self->new_translator($lang);
+ my $self = shift;
+ my $lang = shift;
+
+ my $pack = 'POD2::' . uc($lang);
+ eval "require $pack";
+ if ( !$@ && $pack->can('new') ) {
+ return $pack->new();
+ }
+
+ eval { require POD2::Base };
+ return if $@;
+
+ return POD2::Base->new({ lang => $lang });
+}
+
+#.........................................................................
+
+sub add_translator { # $self->add_translator($lang);
+ my $self = shift;
+ for my $lang (@_) {
+ my $tr = $self->new_translator($lang);
+ if ( defined $tr ) {
+ push @{ $self->{'translators'} }, $tr;
+ push @{ $self->{'extra_search_dirs'} }, $tr->pod_dirs;
+
+ $self->aside( "translator for '$lang' loaded\n" );
+ } else {
+ # non-installed or bad translator package
+ warn "Perldoc cannot load translator package for '$lang': ignored\n";
+ }
+
+ }
+ return;
+}
+
+#..........................................................................
+
+sub search_perlvar {
+ my($self, $found_things, $pod) = @_;
+
+ my $opt = $self->opt_v;
+
+ if ( $opt !~ /^ (?: [\@\%\$]\S+ | [A-Z]\w* ) $/x ) {
+ die "'$opt' does not look like a Perl variable\n";
+ }
+
+ DEBUG > 2 and print "Search: @$found_things\n";
+
+ my $perlvar = shift @$found_things;
+ open(PVAR, "<", $perlvar) # "Funk is its own reward"
+ or die("Can't open $perlvar: $!");
+
+ if ( $opt =~ /^\$\d+$/ ) { # handle $1, $2, ..., $9
+ $opt = '$<I<digits>>';
+ }
+ my $search_re = quotemeta($opt);
+
+ DEBUG > 2 and
+ print "Going to perlvar-scan for $search_re in $perlvar\n";
+
+ # Skip introduction
+ local $_;
+ while (<PVAR>) {
+ last if /^=over 8/;
+ }
+
+ # Look for our variable
+ my $found = 0;
+ my $inheader = 1;
+ my $inlist = 0;
+ while (<PVAR>) { # "The Mothership Connection is here!"
+ last if /^=head2 Error Indicators/;
+ # \b at the end of $` and friends borks things!
+ if ( m/^=item\s+$search_re\s/ ) {
+ $found = 1;
+ }
+ elsif (/^=item/) {
+ last if $found && !$inheader && !$inlist;
+ }
+ elsif (!/^\s+$/) { # not a blank line
+ if ( $found ) {
+ $inheader = 0; # don't accept more =item (unless inlist)
+ }
+ else {
+ @$pod = (); # reset
+ $inheader = 1; # start over
+ next;
+ }
+ }
+
+ if (/^=over/) {
+ ++$inlist;
+ }
+ elsif (/^=back/) {
+ last if $found && !$inheader && !$inlist;
+ --$inlist;
+ }
+ push @$pod, $_;
+# ++$found if /^\w/; # found descriptive text
+ }
+ @$pod = () unless $found;
+ if (!@$pod) {
+ die "No documentation for perl variable '$opt' found\n";
+ }
+ close PVAR or die "Can't open $perlvar: $!";
+
+ return;
+}
+
+#..........................................................................
+
+sub search_perlfunc {
+ my($self, $found_things, $pod) = @_;
+
+ DEBUG > 2 and print "Search: @$found_things\n";
+
+ my $perlfunc = shift @$found_things;
+ open(PFUNC, "<", $perlfunc) # "Funk is its own reward"
+ or die("Can't open $perlfunc: $!");
+
+ # Functions like -r, -e, etc. are listed under `-X'.
+ my $search_re = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/)
+ ? '(?:I<)?-X' : quotemeta($self->opt_f) ;
+
+ DEBUG > 2 and
+ print "Going to perlfunc-scan for $search_re in $perlfunc\n";
+
+ my $re = 'Alphabetical Listing of Perl Functions';
+
+ # Check available translator or backup to default (english)
+ if ( $self->opt_L && defined $self->{'translators'}->[0] ) {
+ my $tr = $self->{'translators'}->[0];
+ $re = $tr->search_perlfunc_re if $tr->can('search_perlfunc_re');
+ }
+
+ # Skip introduction
+ local $_;
+ while (<PFUNC>) {
+ last if /^=head2 $re/;
+ }
+
+ # Look for our function
+ my $found = 0;
+ my $inlist = 0;
+ while (<PFUNC>) { # "The Mothership Connection is here!"
+ if ( m/^=item\s+$search_re\b/ ) {
+ $found = 1;
+ }
+ elsif (/^=item/) {
+ last if $found > 1 and not $inlist;
+ }
+ next unless $found;
+ if (/^=over/) {
+ ++$inlist;
+ }
+ elsif (/^=back/) {
+ last if $found > 1 and not $inlist;
+ --$inlist;
+ }
+ push @$pod, $_;
+ ++$found if /^\w/; # found descriptive text
+ }
+ if (!@$pod) {
+ die sprintf
+ "No documentation for perl function `%s' found\n",
+ $self->opt_f
+ ;
+ }
+ close PFUNC or die "Can't open $perlfunc: $!";
+
+ return;
+}
+
+#..........................................................................
+
+sub search_perlfaqs {
+ my( $self, $found_things, $pod) = @_;
+
+ my $found = 0;
+ my %found_in;
+ my $search_key = $self->opt_q;
+
+ my $rx = eval { qr/$search_key/ }
+ or die <<EOD;
+Invalid regular expression '$search_key' given as -q pattern:
+$@
+Did you mean \\Q$search_key ?
+
+EOD
+
+ local $_;
+ foreach my $file (@$found_things) {
+ die "invalid file spec: $!" if $file =~ /[<>|]/;
+ open(INFAQ, "<", $file) # XXX 5.6ism
+ or die "Can't read-open $file: $!\nAborting";
+ while (<INFAQ>) {
+ if ( m/^=head2\s+.*(?:$search_key)/i ) {
+ $found = 1;
+ push @$pod, "=head1 Found in $file\n\n" unless $found_in{$file}++;
+ }
+ elsif (/^=head[12]/) {
+ $found = 0;
+ }
+ next unless $found;
+ push @$pod, $_;
+ }
+ close(INFAQ);
+ }
+ die("No documentation for perl FAQ keyword `$search_key' found\n")
+ unless @$pod;
+
+ return;
+}
+
+
+#..........................................................................
+
+sub render_findings {
+ # Return the filename to open
+
+ my($self, $found_things) = @_;
+
+ my $formatter_class = $self->{'formatter_class'}
+ || die "No formatter class set!?";
+ my $formatter = $formatter_class->can('new')
+ ? $formatter_class->new
+ : $formatter_class
+ ;
+
+ if(! @$found_things) {
+ die "Nothing found?!";
+ # should have been caught before here
+ } elsif(@$found_things > 1) {
+ warn
+ "Perldoc is only really meant for reading one document at a time.\n",
+ "So these parameters are being ignored: ",
+ join(' ', @$found_things[1 .. $#$found_things] ),
+ "\n"
+ }
+
+ my $file = $found_things->[0];
+
+ DEBUG > 3 and printf "Formatter switches now: [%s]\n",
+ join ' ', map "[@$_]", @{ $self->{'formatter_switches'} };
+
+ # Set formatter options:
+ if( ref $formatter ) {
+ foreach my $f (@{ $self->{'formatter_switches'} || [] }) {
+ my($switch, $value, $silent_fail) = @$f;
+ if( $formatter->can($switch) ) {
+ eval { $formatter->$switch( defined($value) ? $value : () ) };
+ warn "Got an error when setting $formatter_class\->$switch:\n$@\n"
+ if $@;
+ } else {
+ if( $silent_fail or $switch =~ m/^__/s ) {
+ DEBUG > 2 and print "Formatter $formatter_class doesn't support $switch\n";
+ } else {
+ warn "$formatter_class doesn't recognize the $switch switch.\n";
+ }
+ }
+ }
+ }
+
+ $self->{'output_is_binary'} =
+ $formatter->can('write_with_binmode') && $formatter->write_with_binmode;
+
+ my ($out_fh, $out) = $self->new_output_file(
+ ( $formatter->can('output_extension') && $formatter->output_extension )
+ || undef,
+ $self->useful_filename_bit,
+ );
+
+ # Now, finally, do the formatting!
+ {
+ local $^W = $^W;
+ if(DEBUG() or $self->opt_D) {
+ # feh, let 'em see it
+ } else {
+ $^W = 0;
+ # The average user just has no reason to be seeing
+ # $^W-suppressable warnings from the formatting!
+ }
+
+ eval { $formatter->parse_from_file( $file, $out_fh ) };
+ }
+
+ warn "Error while formatting with $formatter_class:\n $@\n" if $@;
+ DEBUG > 2 and print "Back from formatting with $formatter_class\n";
+
+ close $out_fh
+ or warn "Can't close $out: $!\n(Did $formatter already close it?)";
+ sleep 0; sleep 0; sleep 0;
+ # Give the system a few timeslices to meditate on the fact
+ # that the output file does in fact exist and is closed.
+
+ $self->unlink_if_temp_file($file);
+
+ unless( -s $out ) {
+ if( $formatter->can( 'if_zero_length' ) ) {
+ # Basically this is just a hook for Pod::Simple::Checker; since
+ # what other class could /happily/ format an input file with Pod
+ # as a 0-length output file?
+ $formatter->if_zero_length( $file, $out, $out_fh );
+ } else {
+ warn "Got a 0-length file from $$found_things[0] via $formatter_class!?\n"
+ }
+ }
+
+ DEBUG and print "Finished writing to $out.\n";
+ return($out, $formatter) if wantarray;
+ return $out;
+}
+
+#..........................................................................
+
+sub unlink_if_temp_file {
+ # Unlink the specified file IFF it's in the list of temp files.
+ # Really only used in the case of -f / -q things when we can
+ # throw away the dynamically generated source pod file once
+ # we've formatted it.
+ #
+ my($self, $file) = @_;
+ return unless defined $file and length $file;
+
+ my $temp_file_list = $self->{'temp_file_list'} || return;
+ if(grep $_ eq $file, @$temp_file_list) {
+ $self->aside("Unlinking $file\n");
+ unlink($file) or warn "Odd, couldn't unlink $file: $!";
+ } else {
+ DEBUG > 1 and print "$file isn't a temp file, so not unlinking.\n";
+ }
+ return;
+}
+
+#..........................................................................
+
+sub MSWin_temp_cleanup {
+
+ # Nothing particularly MSWin-specific in here, but I don't know if any
+ # other OS needs its temp dir policed like MSWin does!
+
+ my $self = shift;
+
+ my $tempdir = $ENV{'TEMP'};
+ return unless defined $tempdir and length $tempdir
+ and -e $tempdir and -d _ and -w _;
+
+ $self->aside(
+ "Considering whether any old files of mine in $tempdir need unlinking.\n"
+ );
+
+ opendir(TMPDIR, $tempdir) || return;
+ my @to_unlink;
+
+ my $limit = time() - $Temp_File_Lifetime;
+
+ DEBUG > 5 and printf "Looking for things pre-dating %s (%x)\n",
+ ($limit) x 2;
+
+ my $filespec;
+
+ while(defined($filespec = readdir(TMPDIR))) {
+ if(
+ $filespec =~ m{^perldoc_[a-zA-Z0-9]+_T([a-fA-F0-9]{7,})_[a-fA-F0-9]{3,}}s
+ ) {
+ if( hex($1) < $limit ) {
+ push @to_unlink, "$tempdir/$filespec";
+ $self->aside( "Will unlink my old temp file $to_unlink[-1]\n" );
+ } else {
+ DEBUG > 5 and
+ printf " $tempdir/$filespec is too recent (after %x)\n", $limit;
+ }
+ } else {
+ DEBUG > 5 and
+ print " $tempdir/$filespec doesn't look like a perldoc temp file.\n";
+ }
+ }
+ closedir(TMPDIR);
+ $self->aside(sprintf "Unlinked %s items of mine in %s\n",
+ scalar(unlink(@to_unlink)),
+ $tempdir
+ );
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub MSWin_perldoc_tempfile {
+ my($self, $suffix, $infix) = @_;
+
+ my $tempdir = $ENV{'TEMP'};
+ return unless defined $tempdir and length $tempdir
+ and -e $tempdir and -d _ and -w _;
+
+ my $spec;
+
+ do {
+ $spec = sprintf "%s\\perldoc_%s_T%x_%x%02x.%s", # used also in MSWin_temp_cleanup
+ # Yes, we embed the create-time in the filename!
+ $tempdir,
+ $infix || 'x',
+ time(),
+ $$,
+ defined( &Win32::GetTickCount )
+ ? (Win32::GetTickCount() & 0xff)
+ : int(rand 256)
+ # Under MSWin, $$ values get reused quickly! So if we ran
+ # perldoc foo and then perldoc bar before there was time for
+ # time() to increment time."_$$" would likely be the same
+ # for each process! So we tack on the tick count's lower
+ # bits (or, in a pinch, rand)
+ ,
+ $suffix || 'txt';
+ ;
+ } while( -e $spec );
+
+ my $counter = 0;
+
+ while($counter < 50) {
+ my $fh;
+ # If we are running before perl5.6.0, we can't autovivify
+ if ($] < 5.006) {
+ require Symbol;
+ $fh = Symbol::gensym();
+ }
+ DEBUG > 3 and print "About to try making temp file $spec\n";
+ return($fh, $spec) if open($fh, ">", $spec); # XXX 5.6ism
+ $self->aside("Can't create temp file $spec: $!\n");
+ }
+
+ $self->aside("Giving up on making a temp file!\n");
+ die "Can't make a tempfile!?";
+}
+
+#..........................................................................
+
+
+sub after_rendering {
+ my $self = $_[0];
+ $self->after_rendering_VMS if IS_VMS;
+ $self->after_rendering_MSWin32 if IS_MSWin32;
+ $self->after_rendering_Dos if IS_Dos;
+ $self->after_rendering_OS2 if IS_OS2;
+ return;
+}
+
+sub after_rendering_VMS { return }
+sub after_rendering_Dos { return }
+sub after_rendering_OS2 { return }
+
+sub after_rendering_MSWin32 {
+ shift->MSWin_temp_cleanup() if $Temp_Files_Created;
+}
+
+#..........................................................................
+# : : : : : : : : :
+#..........................................................................
+
+
+sub minus_f_nocase { # i.e., do like -f, but without regard to case
+
+ my($self, $dir, $file) = @_;
+ my $path = catfile($dir,$file);
+ return $path if -f $path and -r _;
+
+ if(!$self->opt_i
+ or IS_VMS or IS_MSWin32
+ or IS_Dos or IS_OS2
+ ) {
+ # On a case-forgiving file system, or if case is important,
+ # that is it, all we can do.
+ warn "Ignored $path: unreadable\n" if -f _;
+ return '';
+ }
+
+ local *DIR;
+ my @p = ($dir);
+ my($p,$cip);
+ foreach $p (splitdir $file){
+ my $try = catfile @p, $p;
+ $self->aside("Scrutinizing $try...\n");
+ stat $try;
+ if (-d _) {
+ push @p, $p;
+ if ( $p eq $self->{'target'} ) {
+ my $tmp_path = catfile @p;
+ my $path_f = 0;
+ for (@{ $self->{'found'} }) {
+ $path_f = 1 if $_ eq $tmp_path;
+ }
+ push (@{ $self->{'found'} }, $tmp_path) unless $path_f;
+ $self->aside( "Found as $tmp_path but directory\n" );
+ }
+ }
+ elsif (-f _ && -r _) {
+ return $try;
+ }
+ elsif (-f _) {
+ warn "Ignored $try: unreadable\n";
+ }
+ elsif (-d catdir(@p)) { # at least we see the containing directory!
+ my $found = 0;
+ my $lcp = lc $p;
+ my $p_dirspec = catdir(@p);
+ opendir DIR, $p_dirspec or die "opendir $p_dirspec: $!";
+ while(defined( $cip = readdir(DIR) )) {
+ if (lc $cip eq $lcp){
+ $found++;
+ last; # XXX stop at the first? what if there's others?
+ }
+ }
+ closedir DIR or die "closedir $p_dirspec: $!";
+ return "" unless $found;
+
+ push @p, $cip;
+ my $p_filespec = catfile(@p);
+ return $p_filespec if -f $p_filespec and -r _;
+ warn "Ignored $p_filespec: unreadable\n" if -f _;
+ }
+ }
+ return "";
+}
+
+#..........................................................................
+
+sub pagers_guessing {
+ my $self = shift;
+
+ my @pagers;
+ push @pagers, $self->pagers;
+ $self->{'pagers'} = \@pagers;
+
+ if (IS_MSWin32) {
+ push @pagers, qw( more< less notepad );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ }
+ elsif (IS_VMS) {
+ push @pagers, qw( most more less type/page );
+ }
+ elsif (IS_Dos) {
+ push @pagers, qw( less.exe more.com< );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ }
+ else {
+ if (IS_OS2) {
+ unshift @pagers, 'less', 'cmd /c more <';
+ }
+ push @pagers, qw( more less pg view cat );
+ unshift @pagers, $ENV{PAGER} if $ENV{PAGER};
+ }
+
+ if (IS_Cygwin) {
+ if (($pagers[0] eq 'less') || ($pagers[0] eq '/usr/bin/less')) {
+ unshift @pagers, '/usr/bin/less -isrR';
+ }
+ }
+
+ unshift @pagers, $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
+
+ return;
+}
+
+#..........................................................................
+
+sub page_module_file {
+ my($self, @found) = @_;
+
+ # Security note:
+ # Don't ever just pass this off to anything like MSWin's "start.exe",
+ # since we might be calling on a .pl file, and we wouldn't want that
+ # to actually /execute/ the file that we just want to page thru!
+ # Also a consideration if one were to use a web browser as a pager;
+ # doing so could trigger the browser's MIME mapping for whatever
+ # it thinks .pm/.pl/whatever is. Probably just a (useless and
+ # annoying) "Save as..." dialog, but potentially executing the file
+ # in question -- particularly in the case of MSIE and it's, ahem,
+ # occasionally hazy distinction between OS-local extension
+ # associations, and browser-specific MIME mappings.
+
+ if ($self->{'output_to_stdout'}) {
+ $self->aside("Sending unpaged output to STDOUT.\n");
+ local $_;
+ my $any_error = 0;
+ foreach my $output (@found) {
+ unless( open(TMP, "<", $output) ) { # XXX 5.6ism
+ warn("Can't open $output: $!");
+ $any_error = 1;
+ next;
+ }
+ while (<TMP>) {
+ print or die "Can't print to stdout: $!";
+ }
+ close TMP or die "Can't close while $output: $!";
+ $self->unlink_if_temp_file($output);
+ }
+ return $any_error; # successful
+ }
+
+ foreach my $pager ( $self->pagers ) {
+ $self->aside("About to try calling $pager @found\n");
+ if (system($pager, @found) == 0) {
+ $self->aside("Yay, it worked.\n");
+ return 0;
+ }
+ $self->aside("That didn't work.\n");
+
+ # Odd -- when it fails, under Win32, this seems to neither
+ # return with a fail nor return with a success!!
+ # That's discouraging!
+ }
+
+ $self->aside(
+ sprintf "Can't manage to find a way to page [%s] via pagers [%s]\n",
+ join(' ', @found),
+ join(' ', $self->pagers),
+ );
+
+ if (IS_VMS) {
+ DEBUG > 1 and print "Bailing out in a VMSish way.\n";
+ eval q{
+ use vmsish qw(status exit);
+ exit $?;
+ 1;
+ } or die;
+ }
+
+ return 1;
+ # i.e., an UNSUCCESSFUL return value!
+}
+
+#..........................................................................
+
+sub check_file {
+ my($self, $dir, $file) = @_;
+
+ unless( ref $self ) {
+ # Should never get called:
+ $Carp::Verbose = 1;
+ require Carp;
+ Carp::croak( join '',
+ "Crazy ", __PACKAGE__, " error:\n",
+ "check_file must be an object_method!\n",
+ "Aborting"
+ );
+ }
+
+ if(length $dir and not -d $dir) {
+ DEBUG > 3 and print " No dir $dir -- skipping.\n";
+ return "";
+ }
+
+ if ($self->opt_m) {
+ return $self->minus_f_nocase($dir,$file);
+ }
+
+ else {
+ my $path = $self->minus_f_nocase($dir,$file);
+ if( length $path and $self->containspod($path) ) {
+ DEBUG > 3 and print
+ " The file $path indeed looks promising!\n";
+ return $path;
+ }
+ }
+ DEBUG > 3 and print " No good: $file in $dir\n";
+
+ return "";
+}
+
+#..........................................................................
+
+sub containspod {
+ my($self, $file, $readit) = @_;
+ return 1 if !$readit && $file =~ /\.pod\z/i;
+
+
+ # Under cygwin the /usr/bin/perl is legal executable, but
+ # you cannot open a file with that name. It must be spelled
+ # out as "/usr/bin/perl.exe".
+ #
+ # The following if-case under cygwin prevents error
+ #
+ # $ perldoc perl
+ # Cannot open /usr/bin/perl: no such file or directory
+ #
+ # This would work though
+ #
+ # $ perldoc perl.pod
+
+ if ( IS_Cygwin and -x $file and -f "$file.exe" )
+ {
+ warn "Cygwin $file.exe search skipped\n" if DEBUG or $self->opt_D;
+ return 0;
+ }
+
+ local($_);
+ open(TEST,"<", $file) or die "Can't open $file: $!"; # XXX 5.6ism
+ while (<TEST>) {
+ if (/^=head/) {
+ close(TEST) or die "Can't close $file: $!";
+ return 1;
+ }
+ }
+ close(TEST) or die "Can't close $file: $!";
+ return 0;
+}
+
+#..........................................................................
+
+sub maybe_diddle_INC {
+ my $self = shift;
+
+ # Does this look like a module or extension directory?
+
+ if (-f "Makefile.PL" || -f "Build.PL") {
+
+ # Add "." and "lib" to @INC (if they exist)
+ eval q{ use lib qw(. lib); 1; } or die;
+
+ # don't add if superuser
+ if ($< && $> && -d "blib") { # don't be looking too hard now!
+ eval q{ use blib; 1 };
+ warn $@ if $@ && $self->opt_D;
+ }
+ }
+
+ return;
+}
+
+#..........................................................................
+
+sub new_output_file {
+ my $self = shift;
+ my $outspec = $self->opt_d; # Yes, -d overrides all else!
+ # So don't call this twice per format-job!
+
+ return $self->new_tempfile(@_) unless defined $outspec and length $outspec;
+
+ # Otherwise open a write-handle on opt_d!f
+
+ my $fh;
+ # If we are running before perl5.6.0, we can't autovivify
+ if ($] < 5.006) {
+ require Symbol;
+ $fh = Symbol::gensym();
+ }
+ DEBUG > 3 and print "About to try writing to specified output file $outspec\n";
+ die "Can't write-open $outspec: $!"
+ unless open($fh, ">", $outspec); # XXX 5.6ism
+
+ DEBUG > 3 and print "Successfully opened $outspec\n";
+ binmode($fh) if $self->{'output_is_binary'};
+ return($fh, $outspec);
+}
+
+#..........................................................................
+
+sub useful_filename_bit {
+ # This tries to provide a meaningful bit of text to do with the query,
+ # such as can be used in naming the file -- since if we're going to be
+ # opening windows on temp files (as a "pager" may well do!) then it's
+ # better if the temp file's name (which may well be used as the window
+ # title) isn't ALL just random garbage!
+ # In other words "perldoc_LWPSimple_2371981429" is a better temp file
+ # name than "perldoc_2371981429". So this routine is what tries to
+ # provide the "LWPSimple" bit.
+ #
+ my $self = shift;
+ my $pages = $self->{'pages'} || return undef;
+ return undef unless @$pages;
+
+ my $chunk = $pages->[0];
+ return undef unless defined $chunk;
+ $chunk =~ s/:://g;
+ $chunk =~ s/\.\w+$//g; # strip any extension
+ if( $chunk =~ m/([^\#\\:\/\$]+)$/s ) { # get basename, if it's a file
+ $chunk = $1;
+ } else {
+ return undef;
+ }
+ $chunk =~ s/[^a-zA-Z0-9]+//g; # leave ONLY a-zA-Z0-9 things!
+ $chunk = substr($chunk, -10) if length($chunk) > 10;
+ return $chunk;
+}
+
+#..........................................................................
+
+sub new_tempfile { # $self->new_tempfile( [$suffix, [$infix] ] )
+ my $self = shift;
+
+ ++$Temp_Files_Created;
+
+ if( IS_MSWin32 ) {
+ my @out = $self->MSWin_perldoc_tempfile(@_);
+ return @out if @out;
+ # otherwise fall thru to the normal stuff below...
+ }
+
+ require File::Temp;
+ return File::Temp::tempfile(UNLINK => 1);
+}
+
+#..........................................................................
+
+sub page { # apply a pager to the output file
+ my ($self, $output, $output_to_stdout, @pagers) = @_;
+ if ($output_to_stdout) {
+ $self->aside("Sending unpaged output to STDOUT.\n");
+ open(TMP, "<", $output) or die "Can't open $output: $!"; # XXX 5.6ism
+ local $_;
+ while (<TMP>) {
+ print or die "Can't print to stdout: $!";
+ }
+ close TMP or die "Can't close while $output: $!";
+ $self->unlink_if_temp_file($output);
+ } else {
+ # On VMS, quoting prevents logical expansion, and temp files with no
+ # extension get the wrong default extension (such as .LIS for TYPE)
+
+ $output = VMS::Filespec::rmsexpand($output, '.') if IS_VMS;
+
+ $output =~ s{/}{\\}g if IS_MSWin32 || IS_Dos;
+ # Altho "/" under MSWin is in theory good as a pathsep,
+ # many many corners of the OS don't like it. So we
+ # have to force it to be "\" to make everyone happy.
+
+ foreach my $pager (@pagers) {
+ $self->aside("About to try calling $pager $output\n");
+ if (IS_VMS) {
+ last if system("$pager $output") == 0;
+ } else {
+ last if system("$pager \"$output\"") == 0;
+ }
+ }
+ }
+ return;
+}
+
+#..........................................................................
+
+sub searchfor {
+ my($self, $recurse,$s,@dirs) = @_;
+ $s =~ s!::!/!g;
+ $s = VMS::Filespec::unixify($s) if IS_VMS;
+ return $s if -f $s && $self->containspod($s);
+ $self->aside( "Looking for $s in @dirs\n" );
+ my $ret;
+ my $i;
+ my $dir;
+ $self->{'target'} = (splitdir $s)[-1]; # XXX: why not use File::Basename?
+ for ($i=0; $i<@dirs; $i++) {
+ $dir = $dirs[$i];
+ next unless -d $dir;
+ ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if IS_VMS;
+ if ( (! $self->opt_m && ( $ret = $self->check_file($dir,"$s.pod")))
+ or ( $ret = $self->check_file($dir,"$s.pm"))
+ or ( $ret = $self->check_file($dir,$s))
+ or ( IS_VMS and
+ $ret = $self->check_file($dir,"$s.com"))
+ or ( IS_OS2 and
+ $ret = $self->check_file($dir,"$s.cmd"))
+ or ( (IS_MSWin32 or IS_Dos or IS_OS2) and
+ $ret = $self->check_file($dir,"$s.bat"))
+ or ( $ret = $self->check_file("$dir/pod","$s.pod"))
+ or ( $ret = $self->check_file("$dir/pod",$s))
+ or ( $ret = $self->check_file("$dir/pods","$s.pod"))
+ or ( $ret = $self->check_file("$dir/pods",$s))
+ ) {
+ DEBUG > 1 and print " Found $ret\n";
+ return $ret;
+ }
+
+ if ($recurse) {
+ opendir(D,$dir) or die "Can't opendir $dir: $!";
+ my @newdirs = map catfile($dir, $_), grep {
+ not /^\.\.?\z/s and
+ not /^auto\z/s and # save time! don't search auto dirs
+ -d catfile($dir, $_)
+ } readdir D;
+ closedir(D) or die "Can't closedir $dir: $!";
+ next unless @newdirs;
+ # what a wicked map!
+ @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if IS_VMS;
+ $self->aside( "Also looking in @newdirs\n" );
+ push(@dirs,@newdirs);
+ }
+ }
+ return ();
+}
+
+#..........................................................................
+{
+ my $already_asserted;
+ sub assert_closing_stdout {
+ my $self = shift;
+
+ return if $already_asserted;
+
+ eval q~ END { close(STDOUT) || die "Can't close STDOUT: $!" } ~;
+ # What for? to let the pager know that nothing more will come?
+
+ die $@ if $@;
+ $already_asserted = 1;
+ return;
+ }
+}
+
+#..........................................................................
+
+sub tweak_found_pathnames {
+ my($self, $found) = @_;
+ if (IS_MSWin32) {
+ foreach (@$found) { s,/,\\,g }
+ }
+ return;
+}
+
+#..........................................................................
+# : : : : : : : : :
+#..........................................................................
+
+sub am_taint_checking {
+ my $self = shift;
+ die "NO ENVIRONMENT?!?!" unless keys %ENV; # reset iterator along the way
+ my($k,$v) = each %ENV;
+ return is_tainted($v);
+}
+
+#..........................................................................
+
+sub is_tainted { # just a function
+ my $arg = shift;
+ my $nada = substr($arg, 0, 0); # zero-length!
+ local $@; # preserve the caller's version of $@
+ eval { eval "# $nada" };
+ return length($@) != 0;
+}
+
+#..........................................................................
+
+sub drop_privs_maybe {
+ my $self = shift;
+
+ # Attempt to drop privs if we should be tainting and aren't
+ if (!(IS_VMS || IS_MSWin32 || IS_Dos
+ || IS_OS2
+ )
+ && ($> == 0 || $< == 0)
+ && !$self->am_taint_checking()
+ ) {
+ my $id = eval { getpwnam("nobody") };
+ $id = eval { getpwnam("nouser") } unless defined $id;
+ $id = -2 unless defined $id;
+ #
+ # According to Stevens' APUE and various
+ # (BSD, Solaris, HP-UX) man pages, setting
+ # the real uid first and effective uid second
+ # is the way to go if one wants to drop privileges,
+ # because if one changes into an effective uid of
+ # non-zero, one cannot change the real uid any more.
+ #
+ # Actually, it gets even messier. There is
+ # a third uid, called the saved uid, and as
+ # long as that is zero, one can get back to
+ # uid of zero. Setting the real-effective *twice*
+ # helps in *most* systems (FreeBSD and Solaris)
+ # but apparently in HP-UX even this doesn't help:
+ # the saved uid stays zero (apparently the only way
+ # in HP-UX to change saved uid is to call setuid()
+ # when the effective uid is zero).
+ #
+ eval {
+ $< = $id; # real uid
+ $> = $id; # effective uid
+ $< = $id; # real uid
+ $> = $id; # effective uid
+ };
+ if( !$@ && $< && $> ) {
+ DEBUG and print "OK, I dropped privileges.\n";
+ } elsif( $self->opt_U ) {
+ DEBUG and print "Couldn't drop privileges, but in -U mode, so feh."
+ } else {
+ DEBUG and print "Hm, couldn't drop privileges. Ah well.\n";
+ # We used to die here; but that seemed pointless.
+ }
+ }
+ return;
+}
+
+#..........................................................................
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc - Look up Perl documentation in Pod format.
+
+=head1 SYNOPSIS
+
+ use Pod::Perldoc ();
+
+ Pod::Perldoc->run();
+
+=head1 DESCRIPTION
+
+The guts of L<perldoc> utility.
+
+=head1 SEE ALSO
+
+L<perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002-2007 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
+#
+#
+# Perldoc -- look up a piece of documentation in .pod format that
+# is embedded in the perl installation tree.
+#
+#~~~~~~
+#
+# See ChangeLog in CPAN dist for Pod::Perldoc for later notes.
+#
+# Version 3.01: Sun Nov 10 21:38:09 MST 2002
+# Sean M. Burke <sburke@cpan.org>
+# Massive refactoring and code-tidying.
+# Now it's a module(-family)!
+# Formatter-specific stuff pulled out into Pod::Perldoc::To(Whatever).pm
+# Added -T, -d, -o, -M, -w.
+# Added some improved MSWin funk.
+#
+#~~~~~~
+#
+# Version 2.05: Sat Oct 12 16:09:00 CEST 2002
+# Hugo van der Sanden <hv@crypt.org>
+# Made -U the default, based on patch from Simon Cozens
+# Version 2.04: Sun Aug 18 13:27:12 BST 2002
+# Randy W. Sims <RandyS@ThePierianSpring.org>
+# allow -n to enable nroff under Win32
+# Version 2.03: Sun Apr 23 16:56:34 BST 2000
+# Hugo van der Sanden <hv@crypt.org>
+# don't die when 'use blib' fails
+# Version 2.02: Mon Mar 13 18:03:04 MST 2000
+# Tom Christiansen <tchrist@perl.com>
+# Added -U insecurity option
+# Version 2.01: Sat Mar 11 15:22:33 MST 2000
+# Tom Christiansen <tchrist@perl.com>, querulously.
+# Security and correctness patches.
+# What a twisted bit of distasteful spaghetti code.
+# Version 2.0: ????
+#
+#~~~~~~
+#
+# Version 1.15: Tue Aug 24 01:50:20 EST 1999
+# Charles Wilson <cwilson@ece.gatech.edu>
+# changed /pod/ directory to /pods/ for cygwin
+# to support cygwin/win32
+# Version 1.14: Wed Jul 15 01:50:20 EST 1998
+# Robin Barker <rmb1@cise.npl.co.uk>
+# -strict, -w cleanups
+# Version 1.13: Fri Feb 27 16:20:50 EST 1997
+# Gurusamy Sarathy <gsar@activestate.com>
+# -doc tweaks for -F and -X options
+# Version 1.12: Sat Apr 12 22:41:09 EST 1997
+# Gurusamy Sarathy <gsar@activestate.com>
+# -various fixes for win32
+# Version 1.11: Tue Dec 26 09:54:33 EST 1995
+# Kenneth Albanowski <kjahds@kjahds.com>
+# -added Charles Bailey's further VMS patches, and -u switch
+# -added -t switch, with pod2text support
+#
+# Version 1.10: Thu Nov 9 07:23:47 EST 1995
+# Kenneth Albanowski <kjahds@kjahds.com>
+# -added VMS support
+# -added better error recognition (on no found pages, just exit. On
+# missing nroff/pod2man, just display raw pod.)
+# -added recursive/case-insensitive matching (thanks, Andreas). This
+# slows things down a bit, unfortunately. Give a precise name, and
+# it'll run faster.
+#
+# Version 1.01: Tue May 30 14:47:34 EDT 1995
+# Andy Dougherty <doughera@lafcol.lafayette.edu>
+# -added pod documentation.
+# -added PATH searching.
+# -added searching pod/ subdirectory (mainly to pick up perlfunc.pod
+# and friends.
+#
+#~~~~~~~
+#
+# TODO:
+#
+# Cache the directories read during sloppy match
+# (To disk, or just in-memory?)
+#
+# Backport this to perl 5.005?
+#
+# Implement at least part of the "perlman" interface described
+# in Programming Perl 3e?
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/BaseTo.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/BaseTo.pm
new file mode 100644
index 00000000000..29a3b7d108e
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/BaseTo.pm
@@ -0,0 +1,81 @@
+
+require 5;
+package Pod::Perldoc::BaseTo;
+use strict;
+use warnings;
+
+sub is_pageable { '' }
+sub write_with_binmode { 1 }
+
+sub output_extension { 'txt' } # override in subclass!
+
+# sub new { my $self = shift; ... }
+# sub parse_from_file( my($class, $in, $out) = ...; ... }
+
+#sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub _perldoc_elem {
+ my($self, $name) = splice @_,0,2;
+ if(@_) {
+ $self->{$name} = $_[0];
+ } else {
+ $self->{$name};
+ }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::BaseTo - Base for Pod::Perldoc formatters
+
+=head1 SYNOPSIS
+
+ package Pod::Perldoc::ToMyFormat;
+
+ use base qw( Pod::Perldoc::BaseTo );
+ ...
+
+=head1 DESCRIPTION
+
+This package is meant as a base of Pod::Perldoc formatters,
+like L<Pod::Perldoc::ToText>, L<Pod::Perldoc::ToMan>, etc.
+
+It provides default implementations for the methods
+
+ is_pageable
+ write_with_binmode
+ output_extension
+ _perldoc_elem
+
+The concrete formatter must implement
+
+ new
+ parse_from_file
+
+=head1 SEE ALSO
+
+L<perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002-2007 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/GetOptsOO.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/GetOptsOO.pm
new file mode 100644
index 00000000000..fa83fb74ccf
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/GetOptsOO.pm
@@ -0,0 +1,148 @@
+
+require 5;
+package Pod::Perldoc::GetOptsOO;
+use strict;
+
+# Rather like Getopt::Std's getopts
+# Call Pod::Perldoc::GetOptsOO::getopts($object, \@ARGV, $truth)
+# Given -n, if there's a opt_n_with, it'll call $object->opt_n_with( ARGUMENT )
+# (e.g., "-n foo" => $object->opt_n_with('foo'). Ditto "-nfoo")
+# Otherwise (given -n) if there's an opt_n, we'll call it $object->opt_n($truth)
+# (Truth defaults to 1)
+# Otherwise we try calling $object->handle_unknown_option('n')
+# (and we increment the error count by the return value of it)
+# If there's no handle_unknown_option, then we just warn, and then increment
+# the error counter
+#
+# The return value of Pod::Perldoc::GetOptsOO::getopts is true if no errors,
+# otherwise it's false.
+#
+## sburke@cpan.org 2002-10-31
+
+BEGIN { # Make a DEBUG constant ASAP
+ *DEBUG = defined( &Pod::Perldoc::DEBUG )
+ ? \&Pod::Perldoc::DEBUG
+ : sub(){10};
+}
+
+
+sub getopts {
+ my($target, $args, $truth) = @_;
+
+ $args ||= \@ARGV;
+
+ $target->aside(
+ "Starting switch processing. Scanning arguments [@$args]\n"
+ ) if $target->can('aside');
+
+ return unless @$args;
+
+ $truth = 1 unless @_ > 2;
+
+ DEBUG > 3 and print " Truth is $truth\n";
+
+
+ my $error_count = 0;
+
+ while( @$args and ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) {
+ my($first,$rest) = ($1,$2);
+ if ($_ eq '--') { # early exit if "--"
+ shift @$args;
+ last;
+ }
+ my $method = "opt_${first}_with";
+ if( $target->can($method) ) { # it's argumental
+ if($rest eq '') { # like -f bar
+ shift @$args;
+ warn "Option $first needs a following argument!\n" unless @$args;
+ $rest = shift @$args;
+ } else { # like -fbar (== -f bar)
+ shift @$args;
+ }
+
+ DEBUG > 3 and print " $method => $rest\n";
+ $target->$method( $rest );
+
+ # Otherwise, it's not argumental...
+ } else {
+
+ if( $target->can( $method = "opt_$first" ) ) {
+ DEBUG > 3 and print " $method is true ($truth)\n";
+ $target->$method( $truth );
+
+ # Otherwise it's an unknown option...
+
+ } elsif( $target->can('handle_unknown_option') ) {
+ DEBUG > 3
+ and print " calling handle_unknown_option('$first')\n";
+
+ $error_count += (
+ $target->handle_unknown_option( $first ) || 0
+ );
+
+ } else {
+ ++$error_count;
+ warn "Unknown option: $first\n";
+ }
+
+ if($rest eq '') { # like -f
+ shift @$args
+ } else { # like -fbar (== -f -bar )
+ DEBUG > 2 and print " Setting args->[0] to \"-$rest\"\n";
+ $args->[0] = "-$rest";
+ }
+ }
+ }
+
+
+ $target->aside(
+ "Ending switch processing. Args are [@$args] with $error_count errors.\n"
+ ) if $target->can('aside');
+
+ $error_count == 0;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::GetOptsOO - Customized option parser for Pod::Perldoc
+
+=head1 SYNOPSIS
+
+ use Pod::Perldoc::GetOptsOO ();
+
+ Pod::Perldoc::GetOptsOO::getopts( $obj, \@args, $truth )
+ or die "wrong usage";
+
+
+=head1 DESCRIPTION
+
+Implements a customized option parser used for
+L<Pod::Perldoc>.
+
+=head1 SEE ALSO
+
+ Pod::Perldoc
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002-2007 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToChecker.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToChecker.pm
new file mode 100644
index 00000000000..10870109e60
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToChecker.pm
@@ -0,0 +1,75 @@
+
+require 5;
+package Pod::Perldoc::ToChecker;
+use strict;
+use warnings;
+use vars qw(@ISA);
+
+# Pick our superclass...
+#
+eval 'require Pod::Simple::Checker';
+if($@) {
+ require Pod::Checker;
+ @ISA = ('Pod::Checker');
+} else {
+ @ISA = ('Pod::Simple::Checker');
+}
+
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' }
+
+sub if_zero_length {
+ my( $self, $file, $tmp, $tmpfd ) = @_;
+ print "No Pod errors in $file\n";
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToChecker - let Perldoc check Pod for errors
+
+=head1 SYNOPSIS
+
+ % perldoc -o checker SomeFile.pod
+ No Pod errors in SomeFile.pod
+ (or an error report)
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::Checker as a "formatter" class (or if that is
+not available, then Pod::Checker), to check for errors in a given
+Pod file.
+
+This is actually a Pod::Simple::Checker (or Pod::Checker) subclass, and
+inherits all its options.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::Checker>, L<Pod::Simple>, L<Pod::Checker>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToMan.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToMan.pm
new file mode 100644
index 00000000000..09b0e817377
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToMan.pm
@@ -0,0 +1,190 @@
+
+require 5;
+package Pod::Perldoc::ToMan;
+use strict;
+use warnings;
+
+# This class is unlike ToText.pm et al, because we're NOT paging thru
+# the output in our particular format -- we make the output and
+# then we run nroff (or whatever) on it, and then page thru the
+# (plaintext) output of THAT!
+
+use base qw(Pod::Perldoc::BaseTo);
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' }
+
+sub __filter_nroff { shift->_perldoc_elem('__filter_nroff' , @_) }
+sub __nroffer { shift->_perldoc_elem('__nroffer' , @_) }
+sub __bindir { shift->_perldoc_elem('__bindir' , @_) }
+sub __pod2man { shift->_perldoc_elem('__pod2man' , @_) }
+sub __output_file { shift->_perldoc_elem('__output_file' , @_) }
+
+sub center { shift->_perldoc_elem('center' , @_) }
+sub date { shift->_perldoc_elem('date' , @_) }
+sub fixed { shift->_perldoc_elem('fixed' , @_) }
+sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) }
+sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) }
+sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
+sub quotes { shift->_perldoc_elem('quotes' , @_) }
+sub release { shift->_perldoc_elem('release' , @_) }
+sub section { shift->_perldoc_elem('section' , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+use File::Spec::Functions qw(catfile);
+
+sub parse_from_file {
+ my $self = shift;
+ my($file, $outfh) = @_;
+
+ my $render = $self->{'__nroffer'} || die "no nroffer set!?";
+
+ # turn the switches into CLIs
+ my $switches = join ' ',
+ map qq{"--$_=$self->{$_}"},
+ grep !m/^_/s,
+ keys %$self
+ ;
+
+ my $pod2man =
+ catfile(
+ ($self->{'__bindir'} || die "no bindir set?!" ),
+ ($self->{'__pod2man'} || die "no pod2man set?!" ),
+ )
+ ;
+ unless(-e $pod2man) {
+ # This is rarely needed, I think.
+ $pod2man = $self->{'__pod2man'} || die "no pod2man set?!";
+ die "Can't find a pod2man?! (". $self->{'__pod2man'} .")\nAborting"
+ unless -e $pod2man;
+ }
+
+ my $command = "$pod2man $switches --lax $file | $render -man";
+ # no temp file, just a pipe!
+
+ # Thanks to Brendan O'Dea for contributing the following block
+ if(Pod::Perldoc::IS_Linux and -t STDOUT
+ and my ($cols) = `stty -a` =~ m/\bcolumns\s+(\d+)/
+ ) {
+ my $c = $cols * 39 / 40;
+ $cols = $c > $cols - 2 ? $c : $cols -2;
+ $command .= ' -rLL=' . (int $c) . 'n' if $cols > 80;
+ }
+
+ if(Pod::Perldoc::IS_Cygwin) {
+ $command .= ' -c';
+ }
+
+ # I hear persistent reports that adding a -c switch to $render
+ # solves many people's problems. But I also hear that some mans
+ # don't have a -c switch, so that unconditionally adding it here
+ # would presumably be a Bad Thing -- sburke@cpan.org
+
+ $command .= " | col -x" if Pod::Perldoc::IS_HPUX;
+
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "About to run $command\n";
+ ;
+
+ my $rslt = `$command`;
+
+ my $err;
+
+ if( $self->{'__filter_nroff'} ) {
+ defined(&Pod::Perldoc::DEBUG)
+ and &Pod::Perldoc::DEBUG()
+ and print "filter_nroff is set, so filtering...\n";
+ $rslt = $self->___Do_filter_nroff($rslt);
+ } else {
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "filter_nroff isn't set, so not filtering.\n";
+ }
+
+ if (($err = $?)) {
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "Nonzero exit ($?) while running $command.\n",
+ "Falling back to Pod::Perldoc::ToPod\n ",
+ ;
+ # A desperate fallthru:
+ require Pod::Perldoc::ToPod;
+ return Pod::Perldoc::ToPod->new->parse_from_file(@_);
+
+ } else {
+ print $outfh $rslt
+ or die "Can't print to $$self{__output_file}: $!";
+ }
+
+ return;
+}
+
+
+sub ___Do_filter_nroff {
+ my $self = shift;
+ my @data = split /\n{2,}/, shift;
+
+ shift @data while @data and $data[0] !~ /\S/; # Go to header
+ shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header
+ pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like
+ # 28/Jan/99 perl 5.005, patch 53 1
+ join "\n\n", @data;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
+
+=head1 SYNOPSIS
+
+ perldoc -o man Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Man and C<nroff> for reading Pod pages.
+
+The following options are supported: center, date, fixed, fixedbold,
+fixeditalic, fixedbolditalic, quotes, release, section
+
+(Those options are explained in L<Pod::Man>.)
+
+For example:
+
+ perldoc -o man -w center:Pod Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different pod-to-nroff formatter class
+in the future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToNroff>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002,3,4 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToNroff.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToNroff.pm
new file mode 100644
index 00000000000..991c1e3269c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToNroff.pm
@@ -0,0 +1,103 @@
+
+require 5;
+package Pod::Perldoc::ToNroff;
+use strict;
+use warnings;
+
+# This is unlike ToMan.pm in that it emits the raw nroff source!
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable { 1 } # well, if you ask for it...
+sub write_with_binmode { 0 }
+sub output_extension { 'man' }
+
+use Pod::Man ();
+
+sub center { shift->_perldoc_elem('center' , @_) }
+sub date { shift->_perldoc_elem('date' , @_) }
+sub fixed { shift->_perldoc_elem('fixed' , @_) }
+sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) }
+sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) }
+sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) }
+sub quotes { shift->_perldoc_elem('quotes' , @_) }
+sub release { shift->_perldoc_elem('release' , @_) }
+sub section { shift->_perldoc_elem('section' , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+ my $self = shift;
+ my $file = $_[0];
+
+ my @options =
+ map {; $_, $self->{$_} }
+ grep !m/^_/s,
+ keys %$self
+ ;
+
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "About to call new Pod::Man ",
+ $Pod::Man::VERSION ? "(v$Pod::Man::VERSION) " : '',
+ "with options: ",
+ @options ? "[@options]" : "(nil)", "\n";
+ ;
+
+ Pod::Man->new(@options)->parse_from_file(@_);
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff
+
+=head1 SYNOPSIS
+
+ perldoc -o nroff -d something.3 Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Man as a formatter class.
+
+The following options are supported: center, date, fixed, fixedbold,
+fixeditalic, fixedbolditalic, quotes, release, section
+
+Those options are explained in L<Pod::Man>.
+
+For example:
+
+ perldoc -o nroff -w center:Pod -d something.3 Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different pod-to-nroff formatter class
+in the future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Man>, L<Pod::Perldoc>, L<Pod::Perldoc::ToMan>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToPod.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToPod.pm
new file mode 100644
index 00000000000..c3173d43702
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToPod.pm
@@ -0,0 +1,93 @@
+
+# This class is just a hack to act as a "formatter" for
+# actually unformatted Pod.
+#
+# Note that this isn't the same as just passing thru whatever
+# we're given -- we pass thru only the pod source, and suppress
+# the Perl code (or whatever non-pod stuff is in the source file).
+
+
+require 5;
+package Pod::Perldoc::ToPod;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'pod' }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+ my( $self, $in, $outfh ) = @_;
+
+ open(IN, "<", $in) or die "Can't read-open $in: $!\nAborting";
+
+ my $cut_mode = 1;
+
+ # A hack for finding things between =foo and =cut, inclusive
+ local $_;
+ while (<IN>) {
+ if( m/^=(\w+)/s ) {
+ if($cut_mode = ($1 eq 'cut')) {
+ print $outfh "\n=cut\n\n";
+ # Pass thru the =cut line with some harmless
+ # (and occasionally helpful) padding
+ }
+ }
+ next if $cut_mode;
+ print $outfh $_ or die "Can't print to $outfh: $!";
+ }
+
+ close IN or die "Can't close $in: $!";
+ return;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod!
+
+=head1 SYNOPSIS
+
+ perldoc -opod Some::Modulename
+
+(That's currently the same as the following:)
+
+ perldoc -u Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to display Pod source as
+itself! Pretty Zen, huh?
+
+Currently this class works by just filtering out the non-Pod stuff from
+a given input file.
+
+=head1 SEE ALSO
+
+L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToRtf.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToRtf.pm
new file mode 100644
index 00000000000..14d419fc313
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToRtf.pm
@@ -0,0 +1,88 @@
+
+require 5;
+package Pod::Perldoc::ToRtf;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use base qw( Pod::Simple::RTF );
+
+$VERSION # so that ->VERSION is happy
+# stop CPAN from seeing this
+ =
+$Pod::Simple::RTF::VERSION;
+
+
+sub is_pageable { 0 }
+sub write_with_binmode { 0 }
+sub output_extension { 'rtf' }
+
+sub page_for_perldoc {
+ my($self, $tempfile, $perldoc) = @_;
+ return unless $perldoc->IS_MSWin32;
+
+ my $rtf_pager = $ENV{'RTFREADER'} || 'write.exe';
+
+ $perldoc->aside( "About to launch <\"$rtf_pager\" \"$tempfile\">\n" );
+
+ return 1 if system( qq{"$rtf_pager"}, qq{"$tempfile"} ) == 0;
+ return 0;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF
+
+=head1 SYNOPSIS
+
+ perldoc -o rtf Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::RTF as a formatter class.
+
+This is actually a Pod::Simple::RTF subclass, and inherits
+all its options.
+
+You have to have Pod::Simple::RTF installed (from the Pod::Simple dist),
+or this module won't work.
+
+If Perldoc is running under MSWin and uses this class as a formatter,
+the output will be opened with F<write.exe> or whatever program is
+specified in the environment variable C<RTFREADER>. For example, to
+specify that RTF files should be opened the same as they are when you
+double-click them, you would do C<set RTFREADER=start.exe> in your
+F<autoexec.bat>.
+
+Handy tip: put C<set PERLDOC=-ortf> in your F<autoexec.bat>
+and that will set this class as the default formatter to run when
+you do C<perldoc whatever>.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::RTF>, L<Pod::Simple>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToText.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToText.pm
new file mode 100644
index 00000000000..7d1784cd59a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToText.pm
@@ -0,0 +1,95 @@
+
+require 5;
+package Pod::Perldoc::ToText;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' }
+
+use Pod::Text ();
+
+sub alt { shift->_perldoc_elem('alt' , @_) }
+sub indent { shift->_perldoc_elem('indent' , @_) }
+sub loose { shift->_perldoc_elem('loose' , @_) }
+sub quotes { shift->_perldoc_elem('quotes' , @_) }
+sub sentence { shift->_perldoc_elem('sentence', @_) }
+sub width { shift->_perldoc_elem('width' , @_) }
+
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+sub parse_from_file {
+ my $self = shift;
+
+ my @options =
+ map {; $_, $self->{$_} }
+ grep !m/^_/s,
+ keys %$self
+ ;
+
+ defined(&Pod::Perldoc::DEBUG)
+ and Pod::Perldoc::DEBUG()
+ and print "About to call new Pod::Text ",
+ $Pod::Text::VERSION ? "(v$Pod::Text::VERSION) " : '',
+ "with options: ",
+ @options ? "[@options]" : "(nil)", "\n";
+ ;
+
+ Pod::Text->new(@options)->parse_from_file(@_);
+}
+
+1;
+
+=head1 NAME
+
+Pod::Perldoc::ToText - let Perldoc render Pod as plaintext
+
+=head1 SYNOPSIS
+
+ perldoc -o text Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Text as a formatter class.
+
+It supports the following options, which are explained in
+L<Pod::Text>: alt, indent, loose, quotes, sentence, width
+
+For example:
+
+ perldoc -o text -w indent:5 Some::Modulename
+
+=head1 CAVEAT
+
+This module may change to use a different text formatter class in the
+future, and this may change what options are supported.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToTk.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToTk.pm
new file mode 100644
index 00000000000..1562ec8bb3f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToTk.pm
@@ -0,0 +1,132 @@
+
+require 5;
+package Pod::Perldoc::ToTk;
+use strict;
+use warnings;
+
+use base qw(Pod::Perldoc::BaseTo);
+
+sub is_pageable { 1 }
+sub write_with_binmode { 0 }
+sub output_extension { 'txt' } # doesn't matter
+sub if_zero_length { } # because it will be 0-length!
+sub new { return bless {}, ref($_[0]) || $_[0] }
+
+# TODO: document these and their meanings...
+sub tree { shift->_perldoc_elem('tree' , @_) }
+sub tk_opt { shift->_perldoc_elem('tk_opt' , @_) }
+sub forky { shift->_perldoc_elem('forky' , @_) }
+
+use Pod::Perldoc ();
+use File::Spec::Functions qw(catfile);
+
+use Tk;
+die join '', __PACKAGE__, " doesn't work nice with Tk.pm verison $Tk::VERSION"
+ if $Tk::VERSION eq '800.003';
+
+BEGIN { eval { require Tk::FcyEntry; }; };
+use Tk::Pod;
+
+# The following was adapted from "tkpod" in the Tk-Pod dist.
+
+sub parse_from_file {
+
+ my($self, $Input_File) = @_;
+ if($self->{'forky'}) {
+ return if fork; # i.e., parent process returns
+ }
+
+ $Input_File =~ s{\\}{/}g
+ if Pod::Perldoc::IS_MSWin32 or Pod::Perldoc::IS_Dos
+ # and maybe OS/2
+ ;
+
+ my($tk_opt, $tree);
+ $tree = $self->{'tree' };
+ $tk_opt = $self->{'tk_opt'};
+
+ #require Tk::ErrorDialog;
+
+ # Add 'Tk' subdirectories to search path so, e.g.,
+ # 'Scrolled' will find doc in 'Tk/Scrolled'
+
+ if( $tk_opt ) {
+ push @INC, grep -d $_, map catfile($_,'Tk'), @INC;
+ }
+
+ my $mw = MainWindow->new();
+ #eval 'use blib "/home/e/eserte/src/perl/Tk-App";require Tk::App::Debug';
+ $mw->withdraw;
+
+ # CDE use Font Settings if available
+ my $ufont = $mw->optionGet('userFont','UserFont'); # fixed width
+ my $sfont = $mw->optionGet('systemFont','SystemFont'); # proportional
+ if (defined($ufont) and defined($sfont)) {
+ foreach ($ufont, $sfont) { s/:$//; };
+ $mw->optionAdd('*Font', $sfont);
+ $mw->optionAdd('*Entry.Font', $ufont);
+ $mw->optionAdd('*Text.Font', $ufont);
+ }
+
+ $mw->optionAdd('*Menu.tearOff', $Tk::platform ne 'MSWin32' ? 1 : 0);
+
+ $mw->Pod(
+ '-file' => $Input_File,
+ (($Tk::Pod::VERSION >= 4) ? ('-tree' => $tree) : ())
+ )->focusNext;
+
+ # xxx dirty but it works. A simple $mw->destroy if $mw->children
+ # does not work because Tk::ErrorDialogs could be created.
+ # (they are withdrawn after Ok instead of destory'ed I guess)
+
+ if ($mw->children) {
+ $mw->repeat(1000, sub {
+ # ErrorDialog is withdrawn not deleted :-(
+ foreach ($mw->children) {
+ return if "$_" =~ /^Tk::Pod/ # ->isa('Tk::Pod')
+ }
+ $mw->destroy;
+ });
+ } else {
+ $mw->destroy;
+ }
+ #$mw->WidgetDump;
+ MainLoop();
+
+ exit if $self->{'forky'}; # we were the child! so exit now!
+ return;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod
+
+=head1 SYNOPSIS
+
+ perldoc -o tk Some::Modulename &
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Tk::Pod as a formatter class.
+
+You have to have installed Tk::Pod first, or this class won't load.
+
+=head1 SEE ALSO
+
+L<Tk::Pod>, L<Pod::Perldoc>
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke C<sburke@cpan.org>, with significant portions copied from
+F<tkpod> in the Tk::Pod dist, by Nick Ing-Simmons, Slaven Rezic, et al.
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToXml.pm b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToXml.pm
new file mode 100644
index 00000000000..439e736c20e
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Perldoc/ToXml.pm
@@ -0,0 +1,66 @@
+
+require 5;
+package Pod::Perldoc::ToXml;
+use strict;
+use warnings;
+use vars qw($VERSION);
+
+use base qw( Pod::Simple::XMLOutStream );
+
+$VERSION # so that ->VERSION is happy
+# stop CPAN from seeing this
+ =
+$Pod::Simple::XMLOutStream::VERSION;
+
+
+sub is_pageable { 0 }
+sub write_with_binmode { 0 }
+sub output_extension { 'xml' }
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Perldoc::ToXml - let Perldoc render Pod as XML
+
+=head1 SYNOPSIS
+
+ perldoc -o xml -d out.xml Some::Modulename
+
+=head1 DESCRIPTION
+
+This is a "plug-in" class that allows Perldoc to use
+Pod::Simple::XMLOutStream as a formatter class.
+
+This is actually a Pod::Simple::XMLOutStream subclass, and inherits
+all its options.
+
+You have to have installed Pod::Simple::XMLOutStream (from the Pod::Simple
+dist), or this class won't work.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple::XMLOutStream>, L<Pod::Simple>, L<Pod::Perldoc>
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Current maintainer: Adriano R. Ferreira <ferreira@cpan.org>
+
+Past contributions from:
+Sean M. Burke <sburke@cpan.org>
+
+=cut
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/PlainText.pm b/Master/tlpkg/tlperl/lib/Pod/PlainText.pm
new file mode 100644
index 00000000000..0dce1799b2b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/PlainText.pm
@@ -0,0 +1,738 @@
+# Pod::PlainText -- Convert POD data to formatted ASCII text.
+# $Id: Text.pm,v 2.1 1999/09/20 11:53:33 eagle Exp $
+#
+# Copyright 1999-2000 by Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module is intended to be a replacement for Pod::Text, and attempts to
+# match its output except for some specific circumstances where other
+# decisions seemed to produce better output. It uses Pod::Parser and is
+# designed to be very easy to subclass.
+
+############################################################################
+# Modules and declarations
+############################################################################
+
+package Pod::PlainText;
+use strict;
+
+require 5.005;
+
+use Carp qw(carp croak);
+use Pod::Select ();
+
+use vars qw(@ISA %ESCAPES $VERSION);
+
+# We inherit from Pod::Select instead of Pod::Parser so that we can be used
+# by Pod::Usage.
+@ISA = qw(Pod::Select);
+
+$VERSION = '2.04';
+
+BEGIN {
+ if ($] < 5.006) {
+ require Symbol;
+ import Symbol;
+ }
+}
+
+############################################################################
+# Table of supported E<> escapes
+############################################################################
+
+# This table is taken near verbatim from Pod::PlainText in Pod::Parser,
+# which got it near verbatim from the original Pod::Text. It is therefore
+# credited to Tom Christiansen, and I'm glad I didn't have to write it. :)
+%ESCAPES = (
+ 'amp' => '&', # ampersand
+ 'lt' => '<', # left chevron, less-than
+ 'gt' => '>', # right chevron, greater-than
+ 'quot' => '"', # double quote
+
+ "Aacute" => "\xC1", # capital A, acute accent
+ "aacute" => "\xE1", # small a, acute accent
+ "Acirc" => "\xC2", # capital A, circumflex accent
+ "acirc" => "\xE2", # small a, circumflex accent
+ "AElig" => "\xC6", # capital AE diphthong (ligature)
+ "aelig" => "\xE6", # small ae diphthong (ligature)
+ "Agrave" => "\xC0", # capital A, grave accent
+ "agrave" => "\xE0", # small a, grave accent
+ "Aring" => "\xC5", # capital A, ring
+ "aring" => "\xE5", # small a, ring
+ "Atilde" => "\xC3", # capital A, tilde
+ "atilde" => "\xE3", # small a, tilde
+ "Auml" => "\xC4", # capital A, dieresis or umlaut mark
+ "auml" => "\xE4", # small a, dieresis or umlaut mark
+ "Ccedil" => "\xC7", # capital C, cedilla
+ "ccedil" => "\xE7", # small c, cedilla
+ "Eacute" => "\xC9", # capital E, acute accent
+ "eacute" => "\xE9", # small e, acute accent
+ "Ecirc" => "\xCA", # capital E, circumflex accent
+ "ecirc" => "\xEA", # small e, circumflex accent
+ "Egrave" => "\xC8", # capital E, grave accent
+ "egrave" => "\xE8", # small e, grave accent
+ "ETH" => "\xD0", # capital Eth, Icelandic
+ "eth" => "\xF0", # small eth, Icelandic
+ "Euml" => "\xCB", # capital E, dieresis or umlaut mark
+ "euml" => "\xEB", # small e, dieresis or umlaut mark
+ "Iacute" => "\xCD", # capital I, acute accent
+ "iacute" => "\xED", # small i, acute accent
+ "Icirc" => "\xCE", # capital I, circumflex accent
+ "icirc" => "\xEE", # small i, circumflex accent
+ "Igrave" => "\xCD", # capital I, grave accent
+ "igrave" => "\xED", # small i, grave accent
+ "Iuml" => "\xCF", # capital I, dieresis or umlaut mark
+ "iuml" => "\xEF", # small i, dieresis or umlaut mark
+ "Ntilde" => "\xD1", # capital N, tilde
+ "ntilde" => "\xF1", # small n, tilde
+ "Oacute" => "\xD3", # capital O, acute accent
+ "oacute" => "\xF3", # small o, acute accent
+ "Ocirc" => "\xD4", # capital O, circumflex accent
+ "ocirc" => "\xF4", # small o, circumflex accent
+ "Ograve" => "\xD2", # capital O, grave accent
+ "ograve" => "\xF2", # small o, grave accent
+ "Oslash" => "\xD8", # capital O, slash
+ "oslash" => "\xF8", # small o, slash
+ "Otilde" => "\xD5", # capital O, tilde
+ "otilde" => "\xF5", # small o, tilde
+ "Ouml" => "\xD6", # capital O, dieresis or umlaut mark
+ "ouml" => "\xF6", # small o, dieresis or umlaut mark
+ "szlig" => "\xDF", # small sharp s, German (sz ligature)
+ "THORN" => "\xDE", # capital THORN, Icelandic
+ "thorn" => "\xFE", # small thorn, Icelandic
+ "Uacute" => "\xDA", # capital U, acute accent
+ "uacute" => "\xFA", # small u, acute accent
+ "Ucirc" => "\xDB", # capital U, circumflex accent
+ "ucirc" => "\xFB", # small u, circumflex accent
+ "Ugrave" => "\xD9", # capital U, grave accent
+ "ugrave" => "\xF9", # small u, grave accent
+ "Uuml" => "\xDC", # capital U, dieresis or umlaut mark
+ "uuml" => "\xFC", # small u, dieresis or umlaut mark
+ "Yacute" => "\xDD", # capital Y, acute accent
+ "yacute" => "\xFD", # small y, acute accent
+ "yuml" => "\xFF", # small y, dieresis or umlaut mark
+
+ "lchevron" => "\xAB", # left chevron (double less than)
+ "rchevron" => "\xBB", # right chevron (double greater than)
+);
+
+
+############################################################################
+# Initialization
+############################################################################
+
+# Initialize the object. Must be sure to call our parent initializer.
+sub initialize {
+ my $self = shift;
+
+ $$self{alt} = 0 unless defined $$self{alt};
+ $$self{indent} = 4 unless defined $$self{indent};
+ $$self{loose} = 0 unless defined $$self{loose};
+ $$self{sentence} = 0 unless defined $$self{sentence};
+ $$self{width} = 76 unless defined $$self{width};
+
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{MARGIN} = $$self{indent}; # Current left margin in spaces.
+
+ return $self->SUPER::initialize;
+}
+
+
+############################################################################
+# Core overrides
+############################################################################
+
+# Called for each command paragraph. Gets the command, the associated
+# paragraph, the line number, and a Pod::Paragraph object. Just dispatches
+# the command to a method named the same as the command. =cut is handled
+# internally by Pod::Parser.
+sub command {
+ my $self = shift;
+ my $command = shift;
+ return if $command eq 'pod';
+ return if ($$self{EXCLUDE} && $command ne 'end');
+ if (defined $$self{ITEM}) {
+ $self->item ("\n");
+ local $_ = "\n";
+ $self->output($_) if($command eq 'back');
+ }
+ $command = 'cmd_' . $command;
+ return $self->$command (@_);
+}
+
+# Called for a verbatim paragraph. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Just output it verbatim, but with tabs converted
+# to spaces.
+sub verbatim {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ $self->item if defined $$self{ITEM};
+ local $_ = shift;
+ return if /^\s*$/;
+ s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme;
+ return $self->output($_);
+}
+
+# Called for a regular text block. Gets the paragraph, the line number, and
+# a Pod::Paragraph object. Perform interpolation and output the results.
+sub textblock {
+ my $self = shift;
+ return if $$self{EXCLUDE};
+ if($$self{VERBATIM}) {
+ $self->output($_[0]);
+ return;
+ }
+ local $_ = shift;
+ my $line = shift;
+
+ # Perform a little magic to collapse multiple L<> references. This is
+ # here mostly for backwards-compatibility. We'll just rewrite the whole
+ # thing into actual text at this part, bypassing the whole internal
+ # sequence parsing thing.
+ s{
+ (
+ L< # A link of the form L</something>.
+ /
+ (
+ [:\w]+ # The item has to be a simple word...
+ (\(\))? # ...or simple function.
+ )
+ >
+ (
+ ,?\s+(and\s+)? # Allow lots of them, conjuncted.
+ L<
+ /
+ (
+ [:\w]+
+ (\(\))?
+ )
+ >
+ )+
+ )
+ } {
+ local $_ = $1;
+ s%L</([^>]+)>%$1%g;
+ my @items = split /(?:,?\s+(?:and\s+)?)/;
+ my $string = "the ";
+ my $i;
+ for ($i = 0; $i < @items; $i++) {
+ $string .= $items[$i];
+ $string .= ", " if @items > 2 && $i != $#items;
+ $string .= " and " if ($i == $#items - 1);
+ }
+ $string .= " entries elsewhere in this document";
+ $string;
+ }gex;
+
+ # Now actually interpolate and output the paragraph.
+ $_ = $self->interpolate ($_, $line);
+ s/\s*$/\n/s;
+ if (defined $$self{ITEM}) {
+ $self->item ($_ . "\n");
+ } else {
+ $self->output ($self->reformat ($_ . "\n"));
+ }
+}
+
+# Called for an interior sequence. Gets the command, argument, and a
+# Pod::InteriorSequence object and is expected to return the resulting text.
+# Calls code, bold, italic, file, and link to handle those types of
+# sequences, and handles S<>, E<>, X<>, and Z<> directly.
+sub interior_sequence {
+ my $self = shift;
+ my $command = shift;
+ local $_ = shift;
+ return '' if ($command eq 'X' || $command eq 'Z');
+
+ # Expand escapes into the actual character now, carping if invalid.
+ if ($command eq 'E') {
+ return $ESCAPES{$_} if defined $ESCAPES{$_};
+ carp "Unknown escape: E<$_>";
+ return "E<$_>";
+ }
+
+ # For all the other sequences, empty content produces no output.
+ return if $_ eq '';
+
+ # For S<>, compress all internal whitespace and then map spaces to \01.
+ # When we output the text, we'll map this back.
+ if ($command eq 'S') {
+ s/\s{2,}/ /g;
+ tr/ /\01/;
+ return $_;
+ }
+
+ # Anything else needs to get dispatched to another method.
+ if ($command eq 'B') { return $self->seq_b ($_) }
+ elsif ($command eq 'C') { return $self->seq_c ($_) }
+ elsif ($command eq 'F') { return $self->seq_f ($_) }
+ elsif ($command eq 'I') { return $self->seq_i ($_) }
+ elsif ($command eq 'L') { return $self->seq_l ($_) }
+ else { carp "Unknown sequence $command<$_>" }
+}
+
+# Called for each paragraph that's actually part of the POD. We take
+# advantage of this opportunity to untabify the input.
+sub preprocess_paragraph {
+ my $self = shift;
+ local $_ = shift;
+ 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me;
+ return $_;
+}
+
+
+############################################################################
+# Command paragraphs
+############################################################################
+
+# All command paragraphs take the paragraph and the line number.
+
+# First level heading.
+sub cmd_head1 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//s;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n==== $_ ====\n\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output ($_ . "\n");
+ }
+}
+
+# Second level heading.
+sub cmd_head2 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//s;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n== $_ ==\n\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output (' ' x ($$self{indent} / 2) . $_ . "\n");
+ }
+}
+
+# third level heading - not strictly perlpodspec compliant
+sub cmd_head3 {
+ my $self = shift;
+ local $_ = shift;
+ s/\s+$//s;
+ $_ = $self->interpolate ($_, shift);
+ if ($$self{alt}) {
+ $self->output ("\n= $_ =\n");
+ } else {
+ $_ .= "\n" if $$self{loose};
+ $self->output (' ' x ($$self{indent}) . $_ . "\n");
+ }
+}
+
+# fourth level heading - not strictly perlpodspec compliant
+# just like head3
+*cmd_head4 = \&cmd_head3;
+
+# Start a list.
+sub cmd_over {
+ my $self = shift;
+ local $_ = shift;
+ unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} }
+ push (@{ $$self{INDENTS} }, $$self{MARGIN});
+ $$self{MARGIN} += ($_ + 0);
+}
+
+# End a list.
+sub cmd_back {
+ my $self = shift;
+ $$self{MARGIN} = pop @{ $$self{INDENTS} };
+ unless (defined $$self{MARGIN}) {
+ carp 'Unmatched =back';
+ $$self{MARGIN} = $$self{indent};
+ }
+}
+
+# An individual list item.
+sub cmd_item {
+ my $self = shift;
+ if (defined $$self{ITEM}) { $self->item }
+ local $_ = shift;
+ s/\s+$//s;
+ $$self{ITEM} = $self->interpolate ($_);
+}
+
+# Begin a block for a particular translator. Setting VERBATIM triggers
+# special handling in textblock().
+sub cmd_begin {
+ my $self = shift;
+ local $_ = shift;
+ my ($kind) = /^(\S+)/ or return;
+ if ($kind eq 'text') {
+ $$self{VERBATIM} = 1;
+ } else {
+ $$self{EXCLUDE} = 1;
+ }
+}
+
+# End a block for a particular translator. We assume that all =begin/=end
+# pairs are properly closed.
+sub cmd_end {
+ my $self = shift;
+ $$self{EXCLUDE} = 0;
+ $$self{VERBATIM} = 0;
+}
+
+# One paragraph for a particular translator. Ignore it unless it's intended
+# for text, in which case we treat it as a verbatim text block.
+sub cmd_for {
+ my $self = shift;
+ local $_ = shift;
+ my $line = shift;
+ return unless s/^text\b[ \t]*\n?//;
+ $self->verbatim ($_, $line);
+}
+
+
+############################################################################
+# Interior sequences
+############################################################################
+
+# The simple formatting ones. These are here mostly so that subclasses can
+# override them and do more complicated things.
+sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] }
+sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" }
+sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] }
+sub seq_i { return '*' . $_[1] . '*' }
+
+# The complicated one. Handle links. Since this is plain text, we can't
+# actually make any real links, so this is all to figure out what text we
+# print out.
+sub seq_l {
+ my $self = shift;
+ local $_ = shift;
+
+ # Smash whitespace in case we were split across multiple lines.
+ s/\s+/ /g;
+
+ # If we were given any explicit text, just output it.
+ if (/^([^|]+)\|/) { return $1 }
+
+ # Okay, leading and trailing whitespace isn't important; get rid of it.
+ s/^\s+//;
+ s/\s+$//;
+
+ # Default to using the whole content of the link entry as a section
+ # name. Note that L<manpage/> forces a manpage interpretation, as does
+ # something looking like L<manpage(section)>. The latter is an
+ # enhancement over the original Pod::Text.
+ my ($manpage, $section) = ('', $_);
+ if (/^(?:https?|ftp|news):/) {
+ # a URL
+ return $_;
+ } elsif (/^"\s*(.*?)\s*"$/) {
+ $section = '"' . $1 . '"';
+ } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) {
+ ($manpage, $section) = ($_, '');
+ } elsif (m{/}) {
+ ($manpage, $section) = split (/\s*\/\s*/, $_, 2);
+ }
+
+ my $text = '';
+ # Now build the actual output text.
+ if (!length $section) {
+ $text = "the $manpage manpage" if length $manpage;
+ } elsif ($section =~ /^[:\w]+(?:\(\))?/) {
+ $text .= 'the ' . $section . ' entry';
+ $text .= (length $manpage) ? " in the $manpage manpage"
+ : ' elsewhere in this document';
+ } else {
+ $section =~ s/^\"\s*//;
+ $section =~ s/\s*\"$//;
+ $text .= 'the section on "' . $section . '"';
+ $text .= " in the $manpage manpage" if length $manpage;
+ }
+ return $text;
+}
+
+
+############################################################################
+# List handling
+############################################################################
+
+# This method is called whenever an =item command is complete (in other
+# words, we've seen its associated paragraph or know for certain that it
+# doesn't have one). It gets the paragraph associated with the item as an
+# argument. If that argument is empty, just output the item tag; if it
+# contains a newline, output the item tag followed by the newline.
+# Otherwise, see if there's enough room for us to output the item tag in the
+# margin of the text or if we have to put it on a separate line.
+sub item {
+ my $self = shift;
+ local $_ = shift;
+ my $tag = $$self{ITEM};
+ unless (defined $tag) {
+ carp 'item called without tag';
+ return;
+ }
+ undef $$self{ITEM};
+ my $indent = $$self{INDENTS}[-1];
+ unless (defined $indent) { $indent = $$self{indent} }
+ my $space = ' ' x $indent;
+ $space =~ s/^ /:/ if $$self{alt};
+ if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) {
+ my $margin = $$self{MARGIN};
+ $$self{MARGIN} = $indent;
+ my $output = $self->reformat ($tag);
+ $output =~ s/\n*$/\n/;
+ $self->output ($output);
+ $$self{MARGIN} = $margin;
+ $self->output ($self->reformat ($_)) if /\S/;
+ } else {
+ $_ = $self->reformat ($_);
+ s/^ /:/ if ($$self{alt} && $indent > 0);
+ my $tagspace = ' ' x length $tag;
+ s/^($space)$tagspace/$1$tag/ or carp 'Bizarre space in item';
+ $self->output ($_);
+ }
+}
+
+
+############################################################################
+# Output formatting
+############################################################################
+
+# Wrap a line, indenting by the current left margin. We can't use
+# Text::Wrap because it plays games with tabs. We can't use formline, even
+# though we'd really like to, because it screws up non-printing characters.
+# So we have to do the wrapping ourselves.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{width} - $$self{MARGIN};
+ while (length > $width) {
+ if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ return $output;
+}
+
+# Reformat a paragraph of text for the current margin. Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+ my $self = shift;
+ local $_ = shift;
+
+ # If we're trying to preserve two spaces after sentences, do some
+ # munging to support that. Otherwise, smash all repeated whitespace.
+ if ($$self{sentence}) {
+ s/ +$//mg;
+ s/\.\n/. \n/g;
+ s/\n/ /g;
+ s/ +/ /g;
+ } else {
+ s/\s+/ /g;
+ }
+ return $self->wrap($_);
+}
+
+# Output text to the output device.
+sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] }
+
+
+############################################################################
+# Backwards compatibility
+############################################################################
+
+# The old Pod::Text module did everything in a pod2text() function. This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+ my @args;
+
+ # This is really ugly; I hate doing option parsing in the middle of a
+ # module. But the old Pod::Text module supported passing flags to its
+ # entry function, so handle -a and -<number>.
+ while ($_[0] =~ /^-/) {
+ my $flag = shift;
+ if ($flag eq '-a') { push (@args, alt => 1) }
+ elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+ else {
+ unshift (@_, $flag);
+ last;
+ }
+ }
+
+ # Now that we know what arguments we're using, create the parser.
+ my $parser = Pod::PlainText->new (@args);
+
+ # If two arguments were given, the second argument is going to be a file
+ # handle. That means we want to call parse_from_filehandle(), which
+ # means we need to turn the first argument into a file handle. Magic
+ # open will handle the <&STDIN case automagically.
+ if (defined $_[1]) {
+ my $infh;
+ if ($] < 5.006) {
+ $infh = gensym();
+ }
+ unless (open ($infh, $_[0])) {
+ croak ("Can't open $_[0] for reading: $!\n");
+ }
+ $_[0] = $infh;
+ return $parser->parse_from_filehandle (@_);
+ } else {
+ return $parser->parse_from_file (@_);
+ }
+}
+
+
+############################################################################
+# Module return value and documentation
+############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::PlainText - Convert POD data to formatted ASCII text
+
+=head1 SYNOPSIS
+
+ use Pod::PlainText;
+ my $parser = Pod::PlainText->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::PlainText is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII. It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Parser, Pod::PlainText supports the same methods and
+interfaces. See L<Pod::Parser> for all the details; briefly, one creates a
+new parser with C<Pod::PlainText-E<gt>new()> and then calls either
+parse_from_filehandle() or parse_from_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser. The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin. Defaults to false.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks. Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=headN> headings.
+If set to false (the default), no blank line is printed after C<=headN>.
+This is the default because it's the expected formatting for manual pages;
+if you're formatting arbitrary text documents, setting this to true may
+result in more pleasing output.
+
+=item sentence
+
+If set to a true value, Pod::PlainText will assume that each sentence ends in two
+spaces, and will try to preserve that spacing. If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space. Defaults to true.
+
+=item width
+
+The column at which to wrap text on the right-hand side. Defaults to 76.
+
+=back
+
+The standard Pod::Parser method parse_from_filehandle() takes up to two
+arguments, the first being the file handle to read POD from and the second
+being the file handle to write the formatted output to. The first defaults
+to STDIN if not given, and the second defaults to STDOUT. The method
+parse_from_file() is almost identical, except that its two arguments are the
+input and output disk files instead. See L<Pod::Parser> for the specific
+details.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+(W) Something has gone wrong in internal C<=item> processing. This message
+indicates a bug in Pod::PlainText; you should never see it.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::PlainText was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Unknown escape: %s
+
+(W) The POD source contained an C<EE<lt>E<gt>> escape that Pod::PlainText didn't
+know about.
+
+=item Unknown sequence: %s
+
+(W) The POD source contained a non-standard internal sequence (something of
+the form C<XE<lt>E<gt>>) that Pod::PlainText didn't know about.
+
+=item Unmatched =back
+
+(W) Pod::PlainText encountered a C<=back> command that didn't correspond to an
+C<=over> command.
+
+=back
+
+=head1 RESTRICTIONS
+
+Embedded Ctrl-As (octal 001) in the input will be mapped to spaces on
+output, due to an internal implementation detail.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen. It has a revamped interface, since it now uses Pod::Parser,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available. Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all. This rewrite doesn't even try to do that, but a
+subclass of it does. Look for L<Pod::Text::Termcap|Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+L<Pod::Parser|Pod::Parser>, L<Pod::Text::Termcap|Pod::Text::Termcap>,
+pod2text(1)
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Russ Allbery E<lt>rra@stanford.eduE<gt>, based I<very> heavily on the
+original Pod::Text by Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> and
+its conversion to Pod::Parser by Brad Appleton
+E<lt>bradapp@enteract.comE<gt>.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Plainer.pm b/Master/tlpkg/tlperl/lib/Pod/Plainer.pm
new file mode 100644
index 00000000000..d9e57bee1e6
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Plainer.pm
@@ -0,0 +1,100 @@
+package Pod::Plainer;
+use 5.006;
+use strict;
+use warnings;
+use if $] >= 5.011, 'deprecate';
+use Pod::Parser;
+our @ISA = qw(Pod::Parser);
+our $VERSION = '1.02';
+
+our %E = qw( < lt > gt );
+
+sub escape_ltgt {
+ (undef, my $text) = @_;
+ $text =~ s/([<>])/E<$E{$1}>/g;
+ $text
+}
+
+sub simple_delimiters {
+ (undef, my $seq) = @_;
+ $seq -> left_delimiter( '<' );
+ $seq -> right_delimiter( '>' );
+ $seq;
+}
+
+sub textblock {
+ my($parser,$text,$line) = @_;
+ print {$parser->output_handle()}
+ $parser->parse_text(
+ { -expand_text => q(escape_ltgt),
+ -expand_seq => q(simple_delimiters) },
+ $text, $line ) -> raw_text();
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Plainer - Perl extension for converting Pod to old-style Pod.
+
+=head1 SYNOPSIS
+
+ use Pod::Plainer;
+
+ my $parser = Pod::Plainer -> new ();
+ $parser -> parse_from_filehandle(\*STDIN);
+
+=head1 DESCRIPTION
+
+Pod::Plainer uses Pod::Parser which takes Pod with the (new)
+'CE<lt>E<lt> .. E<gt>E<gt>' constructs
+and returns the old(er) style with just 'CE<lt>E<gt>';
+'<' and '>' are replaced by 'EE<lt>ltE<gt>' and 'EE<lt>gtE<gt>'.
+
+This can be used to pre-process Pod before using tools which do not
+recognise the new style Pods.
+
+=head2 METHODS
+
+=over
+
+=item escape_ltgt
+
+Replace '<' and '>' by 'EE<lt>ltE<gt>' and 'EE<lt>gtE<gt>'.
+
+=item simple_delimiters
+
+Replace delimiters by 'E<lt>' and 'E<gt>'.
+
+=item textblock
+
+Redefine C<textblock> from L<Pod::Parser> to use C<escape_ltgt>
+and C<simple_delimiters>.
+
+=back
+
+=head2 EXPORT
+
+None by default.
+
+=head1 AUTHOR
+
+Robin Barker, rmbarker@cpan.org
+
+=head1 SEE ALSO
+
+See L<Pod::Parser>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2009 by Robin Barker
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.10.1 or,
+at your option, any later version of Perl 5 you may have available.
+
+=cut
+
+$Id: Plainer.pm 253 2010-02-11 16:28:10Z rmb1 $
diff --git a/Master/tlpkg/tlperl/lib/Pod/Select.pm b/Master/tlpkg/tlperl/lib/Pod/Select.pm
new file mode 100644
index 00000000000..4724cb79cf9
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Select.pm
@@ -0,0 +1,746 @@
+#############################################################################
+# Pod/Select.pm -- function to select portions of POD docs
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Select;
+use strict;
+
+use vars qw($VERSION @ISA @EXPORT $MAX_HEADING_LEVEL %myData @section_headings @selected_sections);
+$VERSION = '1.36'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+#############################################################################
+
+=head1 NAME
+
+Pod::Select, podselect() - extract selected sections of POD from input
+
+=head1 SYNOPSIS
+
+ use Pod::Select;
+
+ ## Select all the POD sections for each file in @filelist
+ ## and print the result on standard output.
+ podselect(@filelist);
+
+ ## Same as above, but write to tmp.out
+ podselect({-output => "tmp.out"}, @filelist):
+
+ ## Select from the given filelist, only those POD sections that are
+ ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+ podselect({-sections => ["NAME|SYNOPSIS", "OPTIONS"]}, @filelist):
+
+ ## Select the "DESCRIPTION" section of the PODs from STDIN and write
+ ## the result to STDERR.
+ podselect({-output => ">&STDERR", -sections => ["DESCRIPTION"]}, \*STDIN);
+
+or
+
+ use Pod::Select;
+
+ ## Create a parser object for selecting POD sections from the input
+ $parser = new Pod::Select();
+
+ ## Select all the POD sections for each file in @filelist
+ ## and print the result to tmp.out.
+ $parser->parse_from_file("<&STDIN", "tmp.out");
+
+ ## Select from the given filelist, only those POD sections that are
+ ## within a 1st level section named any of: NAME, SYNOPSIS, OPTIONS.
+ $parser->select("NAME|SYNOPSIS", "OPTIONS");
+ for (@filelist) { $parser->parse_from_file($_); }
+
+ ## Select the "DESCRIPTION" and "SEE ALSO" sections of the PODs from
+ ## STDIN and write the result to STDERR.
+ $parser->select("DESCRIPTION");
+ $parser->add_selection("SEE ALSO");
+ $parser->parse_from_filehandle(\*STDIN, \*STDERR);
+
+=head1 REQUIRES
+
+perl5.005, Pod::Parser, Exporter, Carp
+
+=head1 EXPORTS
+
+podselect()
+
+=head1 DESCRIPTION
+
+B<podselect()> is a function which will extract specified sections of
+pod documentation from an input stream. This ability is provided by the
+B<Pod::Select> module which is a subclass of B<Pod::Parser>.
+B<Pod::Select> provides a method named B<select()> to specify the set of
+POD sections to select for processing/printing. B<podselect()> merely
+creates a B<Pod::Select> object and then invokes the B<podselect()>
+followed by B<parse_from_file()>.
+
+=head1 SECTION SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"section specifications" to restrict the text processed to only the
+desired set of sections and their corresponding subsections. A section
+specification is a string containing one or more Perl-style regular
+expressions separated by forward slashes ("/"). If you need to use a
+forward slash literally within a section title you can escape it with a
+backslash ("\/").
+
+The formal syntax of a section specification is:
+
+=over 4
+
+=item *
+
+I<head1-title-regex>/I<head2-title-regex>/...
+
+=back
+
+Any omitted or empty regular expressions will default to ".*".
+Please note that each regular expression given is implicitly
+anchored by adding "^" and "$" to the beginning and end. Also, if a
+given regular expression starts with a "!" character, then the
+expression is I<negated> (so C<!foo> would match anything I<except>
+C<foo>).
+
+Some example section specifications follow.
+
+=over 4
+
+=item *
+
+Match the C<NAME> and C<SYNOPSIS> sections and all of their subsections:
+
+C<NAME|SYNOPSIS>
+
+=item *
+
+Match only the C<Question> and C<Answer> subsections of the C<DESCRIPTION>
+section:
+
+C<DESCRIPTION/Question|Answer>
+
+=item *
+
+Match the C<Comments> subsection of I<all> sections:
+
+C</Comments>
+
+=item *
+
+Match all subsections of C<DESCRIPTION> I<except> for C<Comments>:
+
+C<DESCRIPTION/!Comments>
+
+=item *
+
+Match the C<DESCRIPTION> section but do I<not> match any of its subsections:
+
+C<DESCRIPTION/!.+>
+
+=item *
+
+Match all top level sections but none of their subsections:
+
+C</!.+>
+
+=back
+
+=begin _NOT_IMPLEMENTED_
+
+=head1 RANGE SPECIFICATIONS
+
+B<podselect()> and B<Pod::Select::select()> may be given one or more
+"range specifications" to restrict the text processed to only the
+desired ranges of paragraphs in the desired set of sections. A range
+specification is a string containing a single Perl-style regular
+expression (a regex), or else two Perl-style regular expressions
+(regexs) separated by a ".." (Perl's "range" operator is "..").
+The regexs in a range specification are delimited by forward slashes
+("/"). If you need to use a forward slash literally within a regex you
+can escape it with a backslash ("\/").
+
+The formal syntax of a range specification is:
+
+=over 4
+
+=item *
+
+/I<start-range-regex>/[../I<end-range-regex>/]
+
+=back
+
+Where each the item inside square brackets (the ".." followed by the
+end-range-regex) is optional. Each "range-regex" is of the form:
+
+ =cmd-expr text-expr
+
+Where I<cmd-expr> is intended to match the name of one or more POD
+commands, and I<text-expr> is intended to match the paragraph text for
+the command. If a range-regex is supposed to match a POD command, then
+the first character of the regex (the one after the initial '/')
+absolutely I<must> be a single '=' character; it may not be anything
+else (not even a regex meta-character) if it is supposed to match
+against the name of a POD command.
+
+If no I<=cmd-expr> is given then the text-expr will be matched against
+plain textblocks unless it is preceded by a space, in which case it is
+matched against verbatim text-blocks. If no I<text-expr> is given then
+only the command-portion of the paragraph is matched against.
+
+Note that these two expressions are each implicitly anchored. This
+means that when matching against the command-name, there will be an
+implicit '^' and '$' around the given I<=cmd-expr>; and when matching
+against the paragraph text there will be an implicit '\A' and '\Z'
+around the given I<text-expr>.
+
+Unlike with section-specs, the '!' character does I<not> have any special
+meaning (negation or otherwise) at the beginning of a range-spec!
+
+Some example range specifications follow.
+
+=over 4
+
+=item
+Match all C<=for html> paragraphs:
+
+C</=for html/>
+
+=item
+Match all paragraphs between C<=begin html> and C<=end html>
+(note that this will I<not> work correctly if such sections
+are nested):
+
+C</=begin html/../=end html/>
+
+=item
+Match all paragraphs between the given C<=item> name until the end of the
+current section:
+
+C</=item mine/../=head\d/>
+
+=item
+Match all paragraphs between the given C<=item> until the next item, or
+until the end of the itemized list (note that this will I<not> work as
+desired if the item contains an itemized list nested within it):
+
+C</=item mine/../=(item|back)/>
+
+=back
+
+=end _NOT_IMPLEMENTED_
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Carp;
+use Pod::Parser 1.04;
+
+@ISA = qw(Pod::Parser);
+@EXPORT = qw(&podselect);
+
+## Maximum number of heading levels supported for '=headN' directives
+*MAX_HEADING_LEVEL = \3;
+
+#############################################################################
+
+=head1 OBJECT METHODS
+
+The following methods are provided in this module. Each one takes a
+reference to the object itself as an implicit first parameter.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+## =begin _PRIVATE_
+##
+## =head1 B<_init_headings()>
+##
+## Initialize the current set of active section headings.
+##
+## =cut
+##
+## =end _PRIVATE_
+
+sub _init_headings {
+ my $self = shift;
+ local *myData = $self;
+
+ ## Initialize current section heading titles if necessary
+ unless (defined $myData{_SECTION_HEADINGS}) {
+ local *section_headings = $myData{_SECTION_HEADINGS} = [];
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $section_headings[$i] = '';
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<curr_headings()>
+
+ ($head1, $head2, $head3, ...) = $parser->curr_headings();
+ $head1 = $parser->curr_headings(1);
+
+This method returns a list of the currently active section headings and
+subheadings in the document being parsed. The list of headings returned
+corresponds to the most recently parsed paragraph of the input.
+
+If an argument is given, it must correspond to the desired section
+heading number, in which case only the specified section heading is
+returned. If there is no current section heading at the specified
+level, then C<undef> is returned.
+
+=cut
+
+sub curr_headings {
+ my $self = shift;
+ $self->_init_headings() unless (defined $self->{_SECTION_HEADINGS});
+ my @headings = @{ $self->{_SECTION_HEADINGS} };
+ return (@_ > 0 and $_[0] =~ /^\d+$/) ? $headings[$_[0] - 1] : @headings;
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<select()>
+
+ $parser->select($section_spec1,$section_spec2,...);
+
+This method is used to select the particular sections and subsections of
+POD documentation that are to be printed and/or processed. The existing
+set of selected sections is I<replaced> with the given set of sections.
+See B<add_selection()> for adding to the current set of selected
+sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+If no C<$section_spec> arguments are given, then the existing set of
+selected sections is cleared out (which means C<all> sections will be
+processed).
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub select {
+ my ($self, @sections) = @_;
+ local *myData = $self;
+ local $_;
+
+### NEED TO DISCERN A SECTION-SPEC FROM A RANGE-SPEC (look for m{^/.+/$}?)
+
+ ##---------------------------------------------------------------------
+ ## The following is a blatant hack for backward compatibility, and for
+ ## implementing add_selection(). If the *first* *argument* is the
+ ## string "+", then the remaining section specifications are *added*
+ ## to the current set of selections; otherwise the given section
+ ## specifications will *replace* the current set of selections.
+ ##
+ ## This should probably be fixed someday, but for the present time,
+ ## it seems incredibly unlikely that "+" would ever correspond to
+ ## a legitimate section heading
+ ##---------------------------------------------------------------------
+ my $add = ($sections[0] eq '+') ? shift(@sections) : '';
+
+ ## Reset the set of sections to use
+ unless (@sections) {
+ delete $myData{_SELECTED_SECTIONS} unless ($add);
+ return;
+ }
+ $myData{_SELECTED_SECTIONS} = []
+ unless ($add && exists $myData{_SELECTED_SECTIONS});
+ local *selected_sections = $myData{_SELECTED_SECTIONS};
+
+ ## Compile each spec
+ for my $spec (@sections) {
+ if ( defined($_ = _compile_section_spec($spec)) ) {
+ ## Store them in our sections array
+ push(@selected_sections, $_);
+ }
+ else {
+ carp qq{Ignoring section spec "$spec"!\n};
+ }
+ }
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<add_selection()>
+
+ $parser->add_selection($section_spec1,$section_spec2,...);
+
+This method is used to add to the currently selected sections and
+subsections of POD documentation that are to be printed and/or
+processed. See <select()> for replacing the currently selected sections.
+
+Each of the C<$section_spec> arguments should be a section specification
+as described in L<"SECTION SPECIFICATIONS">. The section specifications
+are parsed by this method and the resulting regular expressions are
+stored in the invoking object.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub add_selection {
+ my $self = shift;
+ return $self->select('+', @_);
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<clear_selections()>
+
+ $parser->clear_selections();
+
+This method takes no arguments, it has the exact same effect as invoking
+<select()> with no arguments.
+
+=cut
+
+sub clear_selections {
+ my $self = shift;
+ return $self->select();
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<match_section()>
+
+ $boolean = $parser->match_section($heading1,$heading2,...);
+
+Returns a value of true if the given section and subsection heading
+titles match any of the currently selected section specifications in
+effect from prior calls to B<select()> and B<add_selection()> (or if
+there are no explicitly selected/deselected sections).
+
+The arguments C<$heading1>, C<$heading2>, etc. are the heading titles of
+the corresponding sections, subsections, etc. to try and match. If
+C<$headingN> is omitted then it defaults to the current corresponding
+section heading title in the input.
+
+This method should I<not> normally be overridden by subclasses.
+
+=cut
+
+sub match_section {
+ my $self = shift;
+ my (@headings) = @_;
+ local *myData = $self;
+
+ ## Return true if no restrictions were explicitly specified
+ my $selections = (exists $myData{_SELECTED_SECTIONS})
+ ? $myData{_SELECTED_SECTIONS} : undef;
+ return 1 unless ((defined $selections) && @{$selections});
+
+ ## Default any unspecified sections to the current one
+ my @current_headings = $self->curr_headings();
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ (defined $headings[$i]) or $headings[$i] = $current_headings[$i];
+ }
+
+ ## Look for a match against the specified section expressions
+ for my $section_spec ( @{$selections} ) {
+ ##------------------------------------------------------
+ ## Each portion of this spec must match in order for
+ ## the spec to be matched. So we will start with a
+ ## match-value of 'true' and logically 'and' it with
+ ## the results of matching a given element of the spec.
+ ##------------------------------------------------------
+ my $match = 1;
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ my $regex = $section_spec->[$i];
+ my $negated = ($regex =~ s/^\!//);
+ $match &= ($negated ? ($headings[$i] !~ /${regex}/)
+ : ($headings[$i] =~ /${regex}/));
+ last unless ($match);
+ }
+ return 1 if ($match);
+ }
+ return 0; ## no match
+}
+
+##---------------------------------------------------------------------------
+
+=head1 B<is_selected()>
+
+ $boolean = $parser->is_selected($paragraph);
+
+This method is used to determine if the block of text given in
+C<$paragraph> falls within the currently selected set of POD sections
+and subsections to be printed or processed. This method is also
+responsible for keeping track of the current input section and
+subsections. It is assumed that C<$paragraph> is the most recently read
+(but not yet processed) input paragraph.
+
+The value returned will be true if the C<$paragraph> and the rest of the
+text in the same section as C<$paragraph> should be selected (included)
+for processing; otherwise a false value is returned.
+
+=cut
+
+sub is_selected {
+ my ($self, $paragraph) = @_;
+ local $_;
+ local *myData = $self;
+
+ $self->_init_headings() unless (defined $myData{_SECTION_HEADINGS});
+
+ ## Keep track of current sections levels and headings
+ $_ = $paragraph;
+ if (/^=((?:sub)*)(?:head(?:ing)?|sec(?:tion)?)(\d*)\s+(.*?)\s*$/)
+ {
+ ## This is a section heading command
+ my ($level, $heading) = ($2, $3);
+ $level = 1 + (length($1) / 3) if ((! length $level) || (length $1));
+ ## Reset the current section heading at this level
+ $myData{_SECTION_HEADINGS}->[$level - 1] = $heading;
+ ## Reset subsection headings of this one to empty
+ for (my $i = $level; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $myData{_SECTION_HEADINGS}->[$i] = '';
+ }
+ }
+
+ return $self->match_section();
+}
+
+#############################################################################
+
+=head1 EXPORTED FUNCTIONS
+
+The following functions are exported by this module. Please note that
+these are functions (not methods) and therefore C<do not> take an
+implicit first argument.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=head1 B<podselect()>
+
+ podselect(\%options,@filelist);
+
+B<podselect> will print the raw (untranslated) POD paragraphs of all
+POD sections in the given input files specified by C<@filelist>
+according to the given options.
+
+If any argument to B<podselect> is a reference to a hash
+(associative array) then the values with the following keys are
+processed as follows:
+
+=over 4
+
+=item B<-output>
+
+A string corresponding to the desired output file (or ">&STDOUT"
+or ">&STDERR"). The default is to use standard output.
+
+=item B<-sections>
+
+A reference to an array of sections specifications (as described in
+L<"SECTION SPECIFICATIONS">) which indicate the desired set of POD
+sections and subsections to be selected from input. If no section
+specifications are given, then all sections of the PODs are used.
+
+=begin _NOT_IMPLEMENTED_
+
+=item B<-ranges>
+
+A reference to an array of range specifications (as described in
+L<"RANGE SPECIFICATIONS">) which indicate the desired range of POD
+paragraphs to be selected from the desired input sections. If no range
+specifications are given, then all paragraphs of the desired sections
+are used.
+
+=end _NOT_IMPLEMENTED_
+
+=back
+
+All other arguments should correspond to the names of input files
+containing POD sections. A file name of "-" or "<&STDIN" will
+be interpreted to mean standard input (which is the default if no
+filenames are given).
+
+=cut
+
+sub podselect {
+ my(@argv) = @_;
+ my %defaults = ();
+ my $pod_parser = new Pod::Select(%defaults);
+ my $num_inputs = 0;
+ my $output = '>&STDOUT';
+ my %opts;
+ local $_;
+ for (@argv) {
+ if (ref($_)) {
+ next unless (ref($_) eq 'HASH');
+ %opts = (%defaults, %{$_});
+
+ ##-------------------------------------------------------------
+ ## Need this for backward compatibility since we formerly used
+ ## options that were all uppercase words rather than ones that
+ ## looked like Unix command-line options.
+ ## to be uppercase keywords)
+ ##-------------------------------------------------------------
+ %opts = map {
+ my ($key, $val) = (lc $_, $opts{$_});
+ $key =~ s/^(?=\w)/-/;
+ $key =~ /^-se[cl]/ and $key = '-sections';
+ #! $key eq '-range' and $key .= 's';
+ ($key => $val);
+ } (keys %opts);
+
+ ## Process the options
+ (exists $opts{'-output'}) and $output = $opts{'-output'};
+
+ ## Select the desired sections
+ $pod_parser->select(@{ $opts{'-sections'} })
+ if ( (defined $opts{'-sections'})
+ && ((ref $opts{'-sections'}) eq 'ARRAY') );
+
+ #! ## Select the desired paragraph ranges
+ #! $pod_parser->select(@{ $opts{'-ranges'} })
+ #! if ( (defined $opts{'-ranges'})
+ #! && ((ref $opts{'-ranges'}) eq 'ARRAY') );
+ }
+ else {
+ $pod_parser->parse_from_file($_, $output);
+ ++$num_inputs;
+ }
+ }
+ $pod_parser->parse_from_file('-') unless ($num_inputs > 0);
+}
+
+#############################################################################
+
+=head1 PRIVATE METHODS AND DATA
+
+B<Pod::Select> makes uses a number of internal methods and data fields
+which clients should not need to see or use. For the sake of avoiding
+name collisions with client data and methods, these methods and fields
+are briefly discussed here. Determined hackers may obtain further
+information about them by reading the B<Pod::Select> source code.
+
+Private data fields are stored in the hash-object whose reference is
+returned by the B<new()> constructor for this class. The names of all
+private methods and data-fields used by B<Pod::Select> begin with a
+prefix of "_" and match the regular expression C</^_\w+$/>.
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head1 B<_compile_section_spec()>
+
+ $listref = $parser->_compile_section_spec($section_spec);
+
+This function (note it is a function and I<not> a method) takes a
+section specification (as described in L<"SECTION SPECIFICATIONS">)
+given in C<$section_sepc>, and compiles it into a list of regular
+expressions. If C<$section_spec> has no syntax errors, then a reference
+to the list (array) of corresponding regular expressions is returned;
+otherwise C<undef> is returned and an error message is printed (using
+B<carp>) for each invalid regex.
+
+=end _PRIVATE_
+
+=cut
+
+sub _compile_section_spec {
+ my ($section_spec) = @_;
+ my (@regexs, $negated);
+
+ ## Compile the spec into a list of regexs
+ local $_ = $section_spec;
+ s{\\\\}{\001}g; ## handle escaped backward slashes
+ s{\\/}{\002}g; ## handle escaped forward slashes
+
+ ## Parse the regexs for the heading titles
+ @regexs = split(/\//, $_, $MAX_HEADING_LEVEL);
+
+ ## Set default regex for ommitted levels
+ for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) {
+ $regexs[$i] = '.*' unless ((defined $regexs[$i])
+ && (length $regexs[$i]));
+ }
+ ## Modify the regexs as needed and validate their syntax
+ my $bad_regexs = 0;
+ for (@regexs) {
+ $_ .= '.+' if ($_ eq '!');
+ s{\001}{\\\\}g; ## restore escaped backward slashes
+ s{\002}{\\/}g; ## restore escaped forward slashes
+ $negated = s/^\!//; ## check for negation
+ eval "m{$_}"; ## check regex syntax
+ if ($@) {
+ ++$bad_regexs;
+ carp qq{Bad regular expression /$_/ in "$section_spec": $@\n};
+ }
+ else {
+ ## Add the forward and rear anchors (and put the negator back)
+ $_ = '^' . $_ unless (/^\^/);
+ $_ = $_ . '$' unless (/\$$/);
+ $_ = '!' . $_ if ($negated);
+ }
+ }
+ return (! $bad_regexs) ? [ @regexs ] : undef;
+}
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SECTION_HEADINGS}
+
+A reference to an array of the current section heading titles for each
+heading level (note that the first heading level title is at index 0).
+
+=end _PRIVATE_
+
+=cut
+
+##---------------------------------------------------------------------------
+
+=begin _PRIVATE_
+
+=head2 $self->{_SELECTED_SECTIONS}
+
+A reference to an array of references to arrays. Each subarray is a list
+of anchored regular expressions (preceded by a "!" if the expression is to
+be negated). The index of the expression in the subarray should correspond
+to the index of the heading title in C<$self-E<gt>{_SECTION_HEADINGS}>
+that it is to be matched against.
+
+=end _PRIVATE_
+
+=cut
+
+#############################################################################
+
+=head1 SEE ALSO
+
+L<Pod::Parser>
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<pod2text> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=cut
+
+1;
+# vim: ts=4 sw=4 et
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple.pm b/Master/tlpkg/tlperl/lib/Pod/Simple.pm
new file mode 100644
index 00000000000..51f9a698019
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple.pm
@@ -0,0 +1,1535 @@
+
+require 5;
+package Pod::Simple;
+use strict;
+use Carp ();
+BEGIN { *DEBUG = sub () {0} unless defined &DEBUG }
+use integer;
+use Pod::Escapes 1.04 ();
+use Pod::Simple::LinkSection ();
+use Pod::Simple::BlackBox ();
+#use utf8;
+
+use vars qw(
+ $VERSION @ISA
+ @Known_formatting_codes @Known_directives
+ %Known_formatting_codes %Known_directives
+ $NL
+);
+
+@ISA = ('Pod::Simple::BlackBox');
+$VERSION = '3.14';
+
+@Known_formatting_codes = qw(I B C L E F S X Z);
+%Known_formatting_codes = map(($_=>1), @Known_formatting_codes);
+@Known_directives = qw(head1 head2 head3 head4 item over back);
+%Known_directives = map(($_=>'Plain'), @Known_directives);
+$NL = $/ unless defined $NL;
+
+#-----------------------------------------------------------------------------
+# Set up some constants:
+
+BEGIN {
+ if(defined &ASCII) { }
+ elsif(chr(65) eq 'A') { *ASCII = sub () {1} }
+ else { *ASCII = sub () {''} }
+
+ unless(defined &MANY_LINES) { *MANY_LINES = sub () {20} }
+ DEBUG > 4 and print "MANY_LINES is ", MANY_LINES(), "\n";
+ unless(MANY_LINES() >= 1) {
+ die "MANY_LINES is too small (", MANY_LINES(), ")!\nAborting";
+ }
+ if(defined &UNICODE) { }
+ elsif($] >= 5.008) { *UNICODE = sub() {1} }
+ else { *UNICODE = sub() {''} }
+}
+if(DEBUG > 2) {
+ print "# We are ", ASCII ? '' : 'not ', "in ASCII-land\n";
+ print "# We are under a Unicode-safe Perl.\n";
+}
+
+# Design note:
+# This is a parser for Pod. It is not a parser for the set of Pod-like
+# languages which happens to contain Pod -- it is just for Pod, plus possibly
+# some extensions.
+
+# @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
+#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+__PACKAGE__->_accessorize(
+ 'nbsp_for_S', # Whether to map S<...>'s to \xA0 characters
+ 'source_filename', # Filename of the source, for use in warnings
+ 'source_dead', # Whether to consider this parser's source dead
+
+ 'output_fh', # The filehandle we're writing to, if applicable.
+ # Used only in some derived classes.
+
+ 'hide_line_numbers', # For some dumping subclasses: whether to pointedly
+ # suppress the start_line attribute
+
+ 'line_count', # the current line number
+ 'pod_para_count', # count of pod paragraphs seen so far
+
+ 'no_whining', # whether to suppress whining
+ 'no_errata_section', # whether to suppress the errata section
+ 'complain_stderr', # whether to complain to stderr
+
+ 'doc_has_started', # whether we've fired the open-Document event yet
+
+ 'bare_output', # For some subclasses: whether to prepend
+ # header-code and postpend footer-code
+
+ 'nix_X_codes', # whether to ignore X<...> codes
+ 'merge_text', # whether to avoid breaking a single piece of
+ # text up into several events
+
+ 'preserve_whitespace', # whether to try to keep whitespace as-is
+ 'strip_verbatim_indent', # What indent to strip from verbatim
+
+ 'content_seen', # whether we've seen any real Pod content
+ 'errors_seen', # TODO: document. whether we've seen any errors (fatal or not)
+
+ 'codes_in_verbatim', # for PseudoPod extensions
+
+ 'code_handler', # coderef to call when a code (non-pod) line is seen
+ 'cut_handler', # coderef to call when a =cut line is seen
+ #Called like:
+ # $code_handler->($line, $self->{'line_count'}, $self) if $code_handler;
+ # $cut_handler->($line, $self->{'line_count'}, $self) if $cut_handler;
+
+);
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub any_errata_seen { # good for using as an exit() value...
+ return shift->{'errors_seen'} || 0;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+# Pull in some functions that, for some reason, I expect to see here too:
+BEGIN {
+ *pretty = \&Pod::Simple::BlackBox::pretty;
+ *stringify_lol = \&Pod::Simple::BlackBox::stringify_lol;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub version_report {
+ my $class = ref($_[0]) || $_[0];
+ if($class eq __PACKAGE__) {
+ return "$class $VERSION";
+ } else {
+ my $v = $class->VERSION;
+ return "$class $v (" . __PACKAGE__ . " $VERSION)";
+ }
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+#sub curr_open { # read-only list accessor
+# return @{ $_[0]{'curr_open'} || return() };
+#}
+#sub _curr_open_listref { $_[0]{'curr_open'} ||= [] }
+
+
+sub output_string {
+ # Works by faking out output_fh. Simplifies our code.
+ #
+ my $this = shift;
+ return $this->{'output_string'} unless @_; # GET.
+
+ require Pod::Simple::TiedOutFH;
+ my $x = (defined($_[0]) and ref($_[0])) ? $_[0] : \( $_[0] );
+ $$x = '' unless defined $$x;
+ DEBUG > 4 and print "# Output string set to $x ($$x)\n";
+ $this->{'output_fh'} = Pod::Simple::TiedOutFH->handle_on($_[0]);
+ return
+ $this->{'output_string'} = $_[0];
+ #${ ${ $this->{'output_fh'} } };
+}
+
+sub abandon_output_string { $_[0]->abandon_output_fh; delete $_[0]{'output_string'} }
+sub abandon_output_fh { $_[0]->output_fh(undef) }
+# These don't delete the string or close the FH -- they just delete our
+# references to it/them.
+# TODO: document these
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub new {
+ # takes no parameters
+ my $class = ref($_[0]) || $_[0];
+ #Carp::croak(__PACKAGE__ . " is a virtual base class -- see perldoc "
+ # . __PACKAGE__ );
+ return bless {
+ 'accept_codes' => { map( ($_=>$_), @Known_formatting_codes ) },
+ 'accept_directives' => { %Known_directives },
+ 'accept_targets' => {},
+ }, $class;
+}
+
+
+
+# TODO: an option for whether to interpolate E<...>'s, or just resolve to codes.
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _handle_element_start { # OVERRIDE IN DERIVED CLASS
+ my($self, $element_name, $attr_hash_r) = @_;
+ return;
+}
+
+sub _handle_element_end { # OVERRIDE IN DERIVED CLASS
+ my($self, $element_name) = @_;
+ return;
+}
+
+sub _handle_text { # OVERRIDE IN DERIVED CLASS
+ my($self, $text) = @_;
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#
+# And now directives (not targets)
+
+sub accept_directive_as_verbatim { shift->_accept_directives('Verbatim', @_) }
+sub accept_directive_as_data { shift->_accept_directives('Data', @_) }
+sub accept_directive_as_processed { shift->_accept_directives('Plain', @_) }
+
+sub _accept_directives {
+ my($this, $type) = splice @_,0,2;
+ foreach my $d (@_) {
+ next unless defined $d and length $d;
+ Carp::croak "\"$d\" isn't a valid directive name"
+ unless $d =~ m/^[a-zA-Z][a-zA-Z0-9]*$/s;
+ Carp::croak "\"$d\" is already a reserved Pod directive name"
+ if exists $Known_directives{$d};
+ $this->{'accept_directives'}{$d} = $type;
+ DEBUG > 2 and print "Learning to accept \"=$d\" as directive of type $type\n";
+ }
+ DEBUG > 6 and print "$this\'s accept_directives : ",
+ pretty($this->{'accept_directives'}), "\n";
+
+ return sort keys %{ $this->{'accept_directives'} } if wantarray;
+ return;
+}
+
+#--------------------------------------------------------------------------
+# TODO: document these:
+
+sub unaccept_directive { shift->unaccept_directives(@_) };
+
+sub unaccept_directives {
+ my $this = shift;
+ foreach my $d (@_) {
+ next unless defined $d and length $d;
+ Carp::croak "\"$d\" isn't a valid directive name"
+ unless $d =~ m/^[a-zA-Z][a-zA-Z0-9]*$/s;
+ Carp::croak "But you must accept \"$d\" directives -- it's a builtin!"
+ if exists $Known_directives{$d};
+ delete $this->{'accept_directives'}{$d};
+ DEBUG > 2 and print "OK, won't accept \"=$d\" as directive.\n";
+ }
+ return sort keys %{ $this->{'accept_directives'} } if wantarray;
+ return
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#
+# And now targets (not directives)
+
+sub accept_target { shift->accept_targets(@_) } # alias
+sub accept_target_as_text { shift->accept_targets_as_text(@_) } # alias
+
+
+sub accept_targets { shift->_accept_targets('1', @_) }
+
+sub accept_targets_as_text { shift->_accept_targets('force_resolve', @_) }
+ # forces them to be processed, even when there's no ":".
+
+sub _accept_targets {
+ my($this, $type) = splice @_,0,2;
+ foreach my $t (@_) {
+ next unless defined $t and length $t;
+ # TODO: enforce some limitations on what a target name can be?
+ $this->{'accept_targets'}{$t} = $type;
+ DEBUG > 2 and print "Learning to accept \"$t\" as target of type $type\n";
+ }
+ return sort keys %{ $this->{'accept_targets'} } if wantarray;
+ return;
+}
+
+#--------------------------------------------------------------------------
+sub unaccept_target { shift->unaccept_targets(@_) }
+
+sub unaccept_targets {
+ my $this = shift;
+ foreach my $t (@_) {
+ next unless defined $t and length $t;
+ # TODO: enforce some limitations on what a target name can be?
+ delete $this->{'accept_targets'}{$t};
+ DEBUG > 2 and print "OK, won't accept \"$t\" as target.\n";
+ }
+ return sort keys %{ $this->{'accept_targets'} } if wantarray;
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#
+# And now codes (not targets or directives)
+
+sub accept_code { shift->accept_codes(@_) } # alias
+
+sub accept_codes { # Add some codes
+ my $this = shift;
+
+ foreach my $new_code (@_) {
+ next unless defined $new_code and length $new_code;
+ if(ASCII) {
+ # A good-enough check that it's good as an XML Name symbol:
+ Carp::croak "\"$new_code\" isn't a valid element name"
+ if $new_code =~
+ m/[\x00-\x2C\x2F\x39\x3B-\x40\x5B-\x5E\x60\x7B-\x7F]/
+ # Characters under 0x80 that aren't legal in an XML Name.
+ or $new_code =~ m/^[-\.0-9]/s
+ or $new_code =~ m/:[-\.0-9]/s;
+ # The legal under-0x80 Name characters that
+ # an XML Name still can't start with.
+ }
+
+ $this->{'accept_codes'}{$new_code} = $new_code;
+
+ # Yes, map to itself -- just so that when we
+ # see "=extend W [whatever] thatelementname", we say that W maps
+ # to whatever $this->{accept_codes}{thatelementname} is,
+ # i.e., "thatelementname". Then when we go re-mapping,
+ # a "W" in the treelet turns into "thatelementname". We only
+ # remap once.
+ # If we say we accept "W", then a "W" in the treelet simply turns
+ # into "W".
+ }
+
+ return;
+}
+
+#--------------------------------------------------------------------------
+sub unaccept_code { shift->unaccept_codes(@_) }
+
+sub unaccept_codes { # remove some codes
+ my $this = shift;
+
+ foreach my $new_code (@_) {
+ next unless defined $new_code and length $new_code;
+ if(ASCII) {
+ # A good-enough check that it's good as an XML Name symbol:
+ Carp::croak "\"$new_code\" isn't a valid element name"
+ if $new_code =~
+ m/[\x00-\x2C\x2F\x39\x3B-\x40\x5B-\x5E\x60\x7B-\x7F]/
+ # Characters under 0x80 that aren't legal in an XML Name.
+ or $new_code =~ m/^[-\.0-9]/s
+ or $new_code =~ m/:[-\.0-9]/s;
+ # The legal under-0x80 Name characters that
+ # an XML Name still can't start with.
+ }
+
+ Carp::croak "But you must accept \"$new_code\" codes -- it's a builtin!"
+ if grep $new_code eq $_, @Known_formatting_codes;
+
+ delete $this->{'accept_codes'}{$new_code};
+
+ DEBUG > 2 and print "OK, won't accept the code $new_code<...>.\n";
+ }
+
+ return;
+}
+
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub parse_string_document {
+ my $self = shift;
+ my @lines;
+ foreach my $line_group (@_) {
+ next unless defined $line_group and length $line_group;
+ pos($line_group) = 0;
+ while($line_group =~
+ m/([^\n\r]*)((?:\r?\n)?)/g
+ ) {
+ #print(">> $1\n"),
+ $self->parse_lines($1)
+ if length($1) or length($2)
+ or pos($line_group) != length($line_group);
+ # I.e., unless it's a zero-length "empty line" at the very
+ # end of "foo\nbar\n" (i.e., between the \n and the EOS).
+ }
+ }
+ $self->parse_lines(undef); # to signal EOF
+ return $self;
+}
+
+sub _init_fh_source {
+ my($self, $source) = @_;
+
+ #DEBUG > 1 and print "Declaring $source as :raw for starters\n";
+ #$self->_apply_binmode($source, ':raw');
+ #binmode($source, ":raw");
+
+ return;
+}
+
+#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.
+#
+
+sub parse_file {
+ my($self, $source) = (@_);
+
+ if(!defined $source) {
+ Carp::croak("Can't use empty-string as a source for parse_file");
+ } elsif(ref(\$source) eq 'GLOB') {
+ $self->{'source_filename'} = '' . ($source);
+ } elsif(ref $source) {
+ $self->{'source_filename'} = '' . ($source);
+ } elsif(!length $source) {
+ Carp::croak("Can't use empty-string as a source for parse_file");
+ } else {
+ {
+ local *PODSOURCE;
+ open(PODSOURCE, "<$source") || Carp::croak("Can't open $source: $!");
+ $self->{'source_filename'} = $source;
+ $source = *PODSOURCE{IO};
+ }
+ $self->_init_fh_source($source);
+ }
+ # By here, $source is a FH.
+
+ $self->{'source_fh'} = $source;
+
+ my($i, @lines);
+ until( $self->{'source_dead'} ) {
+ splice @lines;
+ for($i = MANY_LINES; $i--;) { # read those many lines at a time
+ local $/ = $NL;
+ push @lines, scalar(<$source>); # readline
+ last unless defined $lines[-1];
+ # but pass thru the undef, which will set source_dead to true
+ }
+ $self->parse_lines(@lines);
+ }
+ delete($self->{'source_fh'}); # so it can be GC'd
+ return $self;
+}
+
+#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.
+
+sub parse_from_file {
+ # An emulation of Pod::Parser's interface, for the sake of Perldoc.
+ # Basically just a wrapper around parse_file.
+
+ my($self, $source, $to) = @_;
+ $self = $self->new unless ref($self); # so we tolerate being a class method
+
+ if(!defined $source) { $source = *STDIN{IO}
+ } elsif(ref(\$source) eq 'GLOB') { # stet
+ } elsif(ref($source) ) { # stet
+ } elsif(!length $source
+ or $source eq '-' or $source =~ m/^<&(STDIN|0)$/i
+ ) {
+ $source = *STDIN{IO};
+ }
+
+ if(!defined $to) { $self->output_fh( *STDOUT{IO} );
+ } elsif(ref(\$to) eq 'GLOB') { $self->output_fh( $to );
+ } elsif(ref($to)) { $self->output_fh( $to );
+ } elsif(!length $to
+ or $to eq '-' or $to =~ m/^>&?(?:STDOUT|1)$/i
+ ) {
+ $self->output_fh( *STDOUT{IO} );
+ } else {
+ require Symbol;
+ my $out_fh = Symbol::gensym();
+ DEBUG and print "Write-opening to $to\n";
+ open($out_fh, ">$to") or Carp::croak "Can't write-open $to: $!";
+ binmode($out_fh)
+ if $self->can('write_with_binmode') and $self->write_with_binmode;
+ $self->output_fh($out_fh);
+ }
+
+ return $self->parse_file($source);
+}
+
+#-----------------------------------------------------------------------------
+
+sub whine {
+ #my($self,$line,$complaint) = @_;
+ my $self = shift(@_);
+ ++$self->{'errors_seen'};
+ if($self->{'no_whining'}) {
+ DEBUG > 9 and print "Discarding complaint (at line $_[0]) $_[1]\n because no_whining is on.\n";
+ return;
+ }
+ return $self->_complain_warn(@_) if $self->{'complain_stderr'};
+ return $self->_complain_errata(@_);
+}
+
+sub scream { # like whine, but not suppressable
+ #my($self,$line,$complaint) = @_;
+ my $self = shift(@_);
+ ++$self->{'errors_seen'};
+ return $self->_complain_warn(@_) if $self->{'complain_stderr'};
+ return $self->_complain_errata(@_);
+}
+
+sub _complain_warn {
+ my($self,$line,$complaint) = @_;
+ return printf STDERR "%s around line %s: %s\n",
+ $self->{'source_filename'} || 'Pod input', $line, $complaint;
+}
+
+sub _complain_errata {
+ my($self,$line,$complaint) = @_;
+ if( $self->{'no_errata_section'} ) {
+ DEBUG > 9 and print "Discarding erratum (at line $line) $complaint\n because no_errata_section is on.\n";
+ } else {
+ DEBUG > 9 and print "Queuing erratum (at line $line) $complaint\n";
+ push @{$self->{'errata'}{$line}}, $complaint
+ # for a report to be generated later!
+ }
+ return 1;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _get_initial_item_type {
+ # A hack-wrapper here for when you have like "=over\n\n=item 456\n\n"
+ my($self, $para) = @_;
+ return $para->[1]{'~type'} if $para->[1]{'~type'};
+
+ return $para->[1]{'~type'} = 'text'
+ if join("\n", @{$para}[2 .. $#$para]) =~ m/^\s*(\d+)\.?\s*$/s and $1 ne '1';
+ # Else fall thru to the general case:
+ return $self->_get_item_type($para);
+}
+
+
+
+sub _get_item_type { # mutates the item!!
+ my($self, $para) = @_;
+ return $para->[1]{'~type'} if $para->[1]{'~type'};
+
+
+ # Otherwise we haven't yet been to this node. Maybe alter it...
+
+ my $content = join "\n", @{$para}[2 .. $#$para];
+
+ if($content =~ m/^\s*\*\s*$/s or $content =~ m/^\s*$/s) {
+ # Like: "=item *", "=item * ", "=item"
+ splice @$para, 2; # so it ends up just being ['=item', { attrhash } ]
+ $para->[1]{'~orig_content'} = $content;
+ return $para->[1]{'~type'} = 'bullet';
+
+ } elsif($content =~ m/^\s*\*\s+(.+)/s) { # tolerance
+
+ # Like: "=item * Foo bar baz";
+ $para->[1]{'~orig_content'} = $content;
+ $para->[1]{'~_freaky_para_hack'} = $1;
+ DEBUG > 2 and print " Tolerating $$para[2] as =item *\\n\\n$1\n";
+ splice @$para, 2; # so it ends up just being ['=item', { attrhash } ]
+ return $para->[1]{'~type'} = 'bullet';
+
+ } elsif($content =~ m/^\s*(\d+)\.?\s*$/s) {
+ # Like: "=item 1.", "=item 123412"
+
+ $para->[1]{'~orig_content'} = $content;
+ $para->[1]{'number'} = $1; # Yes, stores the number there!
+
+ splice @$para, 2; # so it ends up just being ['=item', { attrhash } ]
+ return $para->[1]{'~type'} = 'number';
+
+ } else {
+ # It's anything else.
+ return $para->[1]{'~type'} = 'text';
+
+ }
+}
+
+#-----------------------------------------------------------------------------
+
+sub _make_treelet {
+ my $self = shift; # and ($para, $start_line)
+ my $treelet;
+ if(!@_) {
+ return [''];
+ } if(ref $_[0] and ref $_[0][0] and $_[0][0][0] eq '~Top') {
+ # Hack so we can pass in fake-o pre-cooked paragraphs:
+ # just have the first line be a reference to a ['~Top', {}, ...]
+ # We use this feechure in gen_errata and stuff.
+
+ DEBUG and print "Applying precooked treelet hack to $_[0][0]\n";
+ $treelet = $_[0][0];
+ splice @$treelet, 0, 2; # lop the top off
+ return $treelet;
+ } else {
+ $treelet = $self->_treelet_from_formatting_codes(@_);
+ }
+
+ if( $self->_remap_sequences($treelet) ) {
+ $self->_treat_Zs($treelet); # Might as well nix these first
+ $self->_treat_Ls($treelet); # L has to precede E and S
+ $self->_treat_Es($treelet);
+ $self->_treat_Ss($treelet); # S has to come after E
+
+ $self->_wrap_up($treelet); # Nix X's and merge texties
+
+ } else {
+ DEBUG and print "Formatless treelet gets fast-tracked.\n";
+ # Very common case!
+ }
+
+ splice @$treelet, 0, 2; # lop the top off
+
+ return $treelet;
+}
+
+#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.
+
+sub _wrap_up {
+ my($self, @stack) = @_;
+ my $nixx = $self->{'nix_X_codes'};
+ my $merge = $self->{'merge_text' };
+ return unless $nixx or $merge;
+
+ DEBUG > 2 and print "\nStarting _wrap_up traversal.\n",
+ $merge ? (" Merge mode on\n") : (),
+ $nixx ? (" Nix-X mode on\n") : (),
+ ;
+
+
+ my($i, $treelet);
+ while($treelet = shift @stack) {
+ DEBUG > 3 and print " Considering children of this $treelet->[0] node...\n";
+ for($i = 2; $i < @$treelet; ++$i) { # iterate over children
+ DEBUG > 3 and print " Considering child at $i ", pretty($treelet->[$i]), "\n";
+ if($nixx and ref $treelet->[$i] and $treelet->[$i][0] eq 'X') {
+ DEBUG > 3 and print " Nixing X node at $i\n";
+ splice(@$treelet, $i, 1); # just nix this node (and its descendants)
+ # no need to back-update the counter just yet
+ redo;
+
+ } elsif($merge and $i != 2 and # non-initial
+ !ref $treelet->[$i] and !ref $treelet->[$i - 1]
+ ) {
+ DEBUG > 3 and print " Merging ", $i-1,
+ ":[$treelet->[$i-1]] and $i\:[$treelet->[$i]]\n";
+ $treelet->[$i-1] .= ( splice(@$treelet, $i, 1) )[0];
+ DEBUG > 4 and print " Now: ", $i-1, ":[$treelet->[$i-1]]\n";
+ --$i;
+ next;
+ # since we just pulled the possibly last node out from under
+ # ourselves, we can't just redo()
+
+ } elsif( ref $treelet->[$i] ) {
+ DEBUG > 4 and print " Enqueuing ", pretty($treelet->[$i]), " for traversal.\n";
+ push @stack, $treelet->[$i];
+
+ if($treelet->[$i][0] eq 'L') {
+ my $thing;
+ foreach my $attrname ('section', 'to') {
+ if(defined($thing = $treelet->[$i][1]{$attrname}) and ref $thing) {
+ unshift @stack, $thing;
+ DEBUG > 4 and print " +Enqueuing ",
+ pretty( $treelet->[$i][1]{$attrname} ),
+ " as an attribute value to tweak.\n";
+ }
+ }
+ }
+ }
+ }
+ }
+ DEBUG > 2 and print "End of _wrap_up traversal.\n\n";
+
+ return;
+}
+
+#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.
+
+sub _remap_sequences {
+ my($self,@stack) = @_;
+
+ if(@stack == 1 and @{ $stack[0] } == 3 and !ref $stack[0][2]) {
+ # VERY common case: abort it.
+ DEBUG and print "Skipping _remap_sequences: formatless treelet.\n";
+ return 0;
+ }
+
+ my $map = ($self->{'accept_codes'} || die "NO accept_codes in $self?!?");
+
+ my $start_line = $stack[0][1]{'start_line'};
+ DEBUG > 2 and printf
+ "\nAbout to start _remap_sequences on treelet from line %s.\n",
+ $start_line || '[?]'
+ ;
+ DEBUG > 3 and print " Map: ",
+ join('; ', map "$_=" . (
+ ref($map->{$_}) ? join(",", @{$map->{$_}}) : $map->{$_}
+ ),
+ sort keys %$map ),
+ ("B~C~E~F~I~L~S~X~Z" eq join '~', sort keys %$map)
+ ? " (all normal)\n" : "\n"
+ ;
+
+ # A recursive algorithm implemented iteratively! Whee!
+
+ my($is, $was, $i, $treelet); # scratch
+ while($treelet = shift @stack) {
+ DEBUG > 3 and print " Considering children of this $treelet->[0] node...\n";
+ for($i = 2; $i < @$treelet; ++$i) { # iterate over children
+ next unless ref $treelet->[$i]; # text nodes are uninteresting
+
+ DEBUG > 4 and print " Noting child $i : $treelet->[$i][0]<...>\n";
+
+ $is = $treelet->[$i][0] = $map->{ $was = $treelet->[$i][0] };
+ if( DEBUG > 3 ) {
+ if(!defined $is) {
+ print " Code $was<> is UNKNOWN!\n";
+ } elsif($is eq $was) {
+ DEBUG > 4 and print " Code $was<> stays the same.\n";
+ } else {
+ print " Code $was<> maps to ",
+ ref($is)
+ ? ( "tags ", map("$_<", @$is), '...', map('>', @$is), "\n" )
+ : "tag $is<...>.\n";
+ }
+ }
+
+ if(!defined $is) {
+ $self->whine($start_line, "Deleting unknown formatting code $was<>");
+ $is = $treelet->[$i][0] = '1'; # But saving the children!
+ # I could also insert a leading "$was<" and tailing ">" as
+ # children of this node, but something about that seems icky.
+ }
+ if(ref $is) {
+ my @dynasty = @$is;
+ DEBUG > 4 and print " Renaming $was node to $dynasty[-1]\n";
+ $treelet->[$i][0] = pop @dynasty;
+ my $nugget;
+ while(@dynasty) {
+ DEBUG > 4 and printf
+ " Grafting a new %s node between %s and %s\n",
+ $dynasty[-1], $treelet->[0], $treelet->[$i][0],
+ ;
+
+ #$nugget = ;
+ splice @$treelet, $i, 1, [pop(@dynasty), {}, $treelet->[$i]];
+ # relace node with a new parent
+ }
+ } elsif($is eq '0') {
+ splice(@$treelet, $i, 1); # just nix this node (and its descendants)
+ --$i; # back-update the counter
+ } elsif($is eq '1') {
+ splice(@$treelet, $i, 1 # replace this node with its children!
+ => splice @{ $treelet->[$i] },2
+ # (not catching its first two (non-child) items)
+ );
+ --$i; # back up for new stuff
+ } else {
+ # otherwise it's unremarkable
+ unshift @stack, $treelet->[$i]; # just recurse
+ }
+ }
+ }
+
+ DEBUG > 2 and print "End of _remap_sequences traversal.\n\n";
+
+ if(@_ == 2 and @{ $_[1] } == 3 and !ref $_[1][2]) {
+ DEBUG and print "Noting that the treelet is now formatless.\n";
+ return 0;
+ }
+ return 1;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub _ponder_extend {
+
+ # "Go to an extreme, move back to a more comfortable place"
+ # -- /Oblique Strategies/, Brian Eno and Peter Schmidt
+
+ my($self, $para) = @_;
+ my $content = join ' ', splice @$para, 2;
+ $content =~ s/^\s+//s;
+ $content =~ s/\s+$//s;
+
+ DEBUG > 2 and print "Ogling extensor: =extend $content\n";
+
+ if($content =~
+ m/^
+ (\S+) # 1 : new item
+ \s+
+ (\S+) # 2 : fallback(s)
+ (?:\s+(\S+))? # 3 : element name(s)
+ \s*
+ $
+ /xs
+ ) {
+ my $new_letter = $1;
+ my $fallbacks_one = $2;
+ my $elements_one;
+ $elements_one = defined($3) ? $3 : $1;
+
+ DEBUG > 2 and print "Extensor has good syntax.\n";
+
+ unless($new_letter =~ m/^[A-Z]$/s or $new_letter) {
+ DEBUG > 2 and print " $new_letter isn't a valid thing to entend.\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "You can extend only formatting codes A-Z, not like \"$new_letter\""
+ );
+ return;
+ }
+
+ if(grep $new_letter eq $_, @Known_formatting_codes) {
+ DEBUG > 2 and print " $new_letter isn't a good thing to extend, because known.\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "You can't extend an established code like \"$new_letter\""
+ );
+
+ #TODO: or allow if last bit is same?
+
+ return;
+ }
+
+ unless($fallbacks_one =~ m/^[A-Z](,[A-Z])*$/s # like "B", "M,I", etc.
+ or $fallbacks_one eq '0' or $fallbacks_one eq '1'
+ ) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Format for second =extend parameter must be like"
+ . " M or 1 or 0 or M,N or M,N,O but you have it like "
+ . $fallbacks_one
+ );
+ return;
+ }
+
+ unless($elements_one =~ m/^[^ ,]+(,[^ ,]+)*$/s) { # like "B", "M,I", etc.
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Format for third =extend parameter: like foo or bar,Baz,qu:ux but not like "
+ . $elements_one
+ );
+ return;
+ }
+
+ my @fallbacks = split ',', $fallbacks_one, -1;
+ my @elements = split ',', $elements_one, -1;
+
+ foreach my $f (@fallbacks) {
+ next if exists $Known_formatting_codes{$f} or $f eq '0' or $f eq '1';
+ DEBUG > 2 and print " Can't fall back on unknown code $f\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Can't use unknown formatting code '$f' as a fallback for '$new_letter'"
+ );
+ return;
+ }
+
+ DEBUG > 3 and printf "Extensor: Fallbacks <%s> Elements <%s>.\n",
+ @fallbacks, @elements;
+
+ my $canonical_form;
+ foreach my $e (@elements) {
+ if(exists $self->{'accept_codes'}{$e}) {
+ DEBUG > 1 and print " Mapping '$new_letter' to known extension '$e'\n";
+ $canonical_form = $e;
+ last; # first acceptable elementname wins!
+ } else {
+ DEBUG > 1 and print " Can't map '$new_letter' to unknown extension '$e'\n";
+ }
+ }
+
+
+ if( defined $canonical_form ) {
+ # We found a good N => elementname mapping
+ $self->{'accept_codes'}{$new_letter} = $canonical_form;
+ DEBUG > 2 and print
+ "Extensor maps $new_letter => known element $canonical_form.\n";
+ } else {
+ # We have to use the fallback(s), which might be '0', or '1'.
+ $self->{'accept_codes'}{$new_letter}
+ = (@fallbacks == 1) ? $fallbacks[0] : \@fallbacks;
+ DEBUG > 2 and print
+ "Extensor maps $new_letter => fallbacks @fallbacks.\n";
+ }
+
+ } else {
+ DEBUG > 2 and print "Extensor has bad syntax.\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Unknown =extend syntax: $content"
+ )
+ }
+ return;
+}
+
+
+#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.
+
+sub _treat_Zs { # Nix Z<...>'s
+ my($self,@stack) = @_;
+
+ my($i, $treelet);
+ my $start_line = $stack[0][1]{'start_line'};
+
+ # A recursive algorithm implemented iteratively! Whee!
+
+ while($treelet = shift @stack) {
+ for($i = 2; $i < @$treelet; ++$i) { # iterate over children
+ next unless ref $treelet->[$i]; # text nodes are uninteresting
+ unless($treelet->[$i][0] eq 'Z') {
+ unshift @stack, $treelet->[$i]; # recurse
+ next;
+ }
+
+ DEBUG > 1 and print "Nixing Z node @{$treelet->[$i]}\n";
+
+ # bitch UNLESS it's empty
+ unless( @{$treelet->[$i]} == 2
+ or (@{$treelet->[$i]} == 3 and $treelet->[$i][2] eq '')
+ ) {
+ $self->whine( $start_line, "A non-empty Z<>" );
+ } # but kill it anyway
+
+ splice(@$treelet, $i, 1); # thereby just nix this node.
+ --$i;
+
+ }
+ }
+
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+# Quoting perlpodspec:
+
+# In parsing an L<...> code, Pod parsers must distinguish at least four
+# attributes:
+
+############# Not used. Expressed via the element children plus
+############# the value of the "content-implicit" flag.
+# First:
+# The link-text. If there is none, this must be undef. (E.g., in "L<Perl
+# Functions|perlfunc>", the link-text is "Perl Functions". In
+# "L<Time::HiRes>" and even "L<|Time::HiRes>", there is no link text. Note
+# that link text may contain formatting.)
+#
+
+############# The element children
+# Second:
+# The possibly inferred link-text -- i.e., if there was no real link text,
+# then this is the text that we'll infer in its place. (E.g., for
+# "L<Getopt::Std>", the inferred link text is "Getopt::Std".)
+#
+
+############# The "to" attribute (which might be text, or a treelet)
+# Third:
+# The name or URL, or undef if none. (E.g., in "L<Perl
+# Functions|perlfunc>", the name -- also sometimes called the page -- is
+# "perlfunc". In "L</CAVEATS>", the name is undef.)
+#
+
+############# The "section" attribute (which might be next, or a treelet)
+# Fourth:
+# The section (AKA "item" in older perlpods), or undef if none. E.g., in
+# Getopt::Std/DESCRIPTION, "DESCRIPTION" is the section. (Note that this
+# is not the same as a manpage section like the "5" in "man 5 crontab".
+# "Section Foo" in the Pod sense means the part of the text that's
+# introduced by the heading or item whose text is "Foo".)
+#
+# Pod parsers may also note additional attributes including:
+#
+
+############# The "type" attribute.
+# Fifth:
+# A flag for whether item 3 (if present) is a URL (like
+# "http://lists.perl.org" is), in which case there should be no section
+# attribute; a Pod name (like "perldoc" and "Getopt::Std" are); or
+# possibly a man page name (like "crontab(5)" is).
+#
+
+############# Not implemented, I guess.
+# Sixth:
+# The raw original L<...> content, before text is split on "|", "/", etc,
+# and before E<...> codes are expanded.
+
+
+# For L<...> codes without a "name|" part, only E<...> and Z<> codes may
+# occur -- no other formatting codes. That is, authors should not use
+# "L<B<Foo::Bar>>".
+#
+# Note, however, that formatting codes and Z<>'s can occur in any and all
+# parts of an L<...> (i.e., in name, section, text, and url).
+
+sub _treat_Ls { # Process our dear dear friends, the L<...> sequences
+
+ # L<name>
+ # L<name/"sec"> or L<name/sec>
+ # L</"sec"> or L</sec> or L<"sec">
+ # L<text|name>
+ # L<text|name/"sec"> or L<text|name/sec>
+ # L<text|/"sec"> or L<text|/sec> or L<text|"sec">
+ # L<scheme:...>
+ # L<text|scheme:...>
+
+ my($self,@stack) = @_;
+
+ my($i, $treelet);
+ my $start_line = $stack[0][1]{'start_line'};
+
+ # A recursive algorithm implemented iteratively! Whee!
+
+ while($treelet = shift @stack) {
+ for(my $i = 2; $i < @$treelet; ++$i) {
+ # iterate over children of current tree node
+ next unless ref $treelet->[$i]; # text nodes are uninteresting
+ unless($treelet->[$i][0] eq 'L') {
+ unshift @stack, $treelet->[$i]; # recurse
+ next;
+ }
+
+
+ # By here, $treelet->[$i] is definitely an L node
+ my $ell = $treelet->[$i];
+ DEBUG > 1 and print "Ogling L node $ell\n";
+
+ # bitch if it's empty
+ if( @{$ell} == 2
+ or (@{$ell} == 3 and $ell->[2] eq '')
+ ) {
+ $self->whine( $start_line, "An empty L<>" );
+ $treelet->[$i] = 'L<>'; # just make it a text node
+ next; # and move on
+ }
+
+ # Catch URLs:
+
+ # there are a number of possible cases:
+ # 1) text node containing url: http://foo.com
+ # -> [ 'http://foo.com' ]
+ # 2) text node containing url and text: foo|http://foo.com
+ # -> [ 'foo|http://foo.com' ]
+ # 3) text node containing url start: mailto:xE<at>foo.com
+ # -> [ 'mailto:x', [ E ... ], 'foo.com' ]
+ # 4) text node containing url start and text: foo|mailto:xE<at>foo.com
+ # -> [ 'foo|mailto:x', [ E ... ], 'foo.com' ]
+ # 5) other nodes containing text and url start: OE<39>Malley|http://foo.com
+ # -> [ 'O', [ E ... ], 'Malley', '|http://foo.com' ]
+ # ... etc.
+
+ # anything before the url is part of the text.
+ # anything after it is part of the url.
+ # the url text node itself may contain parts of both.
+
+ if (my ($url_index, $text_part, $url_part) =
+ # grep is no good here; we want to bail out immediately so that we can
+ # use $1, $2, etc. without having to do the match twice.
+ sub {
+ for (2..$#$ell) {
+ next if ref $ell->[$_];
+ next unless $ell->[$_] =~ m/^(?:([^|]*)\|)?(\w+:[^:\s]\S*)$/s;
+ return ($_, $1, $2);
+ }
+ return;
+ }->()
+ ) {
+ $ell->[1]{'type'} = 'url';
+
+ my @text = @{$ell}[2..$url_index-1];
+ push @text, $text_part if defined $text_part;
+
+ my @url = @{$ell}[$url_index+1..$#$ell];
+ unshift @url, $url_part;
+
+ unless (@text) {
+ $ell->[1]{'content-implicit'} = 'yes';
+ @text = @url;
+ }
+
+ $ell->[1]{to} = Pod::Simple::LinkSection->new(
+ @url == 1
+ ? $url[0]
+ : [ '', {}, @url ],
+ );
+
+ splice @$ell, 2, $#$ell, @text;
+
+ next;
+ }
+
+ # Catch some very simple and/or common cases
+ if(@{$ell} == 3 and ! ref $ell->[2]) {
+ my $it = $ell->[2];
+ if($it =~ m/^[-a-zA-Z0-9]+\([-a-zA-Z0-9]+\)$/s) { # man sections
+ # Hopefully neither too broad nor too restrictive a RE
+ DEBUG > 1 and print "Catching \"$it\" as manpage link.\n";
+ $ell->[1]{'type'} = 'man';
+ # This's the only place where man links can get made.
+ $ell->[1]{'content-implicit'} = 'yes';
+ $ell->[1]{'to' } =
+ Pod::Simple::LinkSection->new( $it ); # treelet!
+
+ next;
+ }
+ if($it =~ m/^[^\/\|,\$\%\@\ \"\<\>\:\#\&\*\{\}\[\]\(\)]+(\:\:[^\/\|,\$\%\@\ \"\<\>\:\#\&\*\{\}\[\]\(\)]+)*$/s) {
+ # Extremely forgiving idea of what constitutes a bare
+ # modulename link like L<Foo::Bar> or even L<Thing::1.0::Docs::Tralala>
+ DEBUG > 1 and print "Catching \"$it\" as ho-hum L<Modulename> link.\n";
+ $ell->[1]{'type'} = 'pod';
+ $ell->[1]{'content-implicit'} = 'yes';
+ $ell->[1]{'to' } =
+ Pod::Simple::LinkSection->new( $it ); # treelet!
+ next;
+ }
+ # else fall thru...
+ }
+
+
+
+ # ...Uhoh, here's the real L<...> parsing stuff...
+ # "With the ill behavior, with the ill behavior, with the ill behavior..."
+
+ DEBUG > 1 and print "Running a real parse on this non-trivial L\n";
+
+
+ my $link_text; # set to an arrayref if found
+ my @ell_content = @$ell;
+ splice @ell_content,0,2; # Knock off the 'L' and {} bits
+
+ DEBUG > 3 and print " Ell content to start: ",
+ pretty(@ell_content), "\n";
+
+
+ # Look for the "|" -- only in CHILDREN (not all underlings!)
+ # Like L<I like the strictness|strict>
+ DEBUG > 3 and
+ print " Peering at L content for a '|' ...\n";
+ for(my $j = 0; $j < @ell_content; ++$j) {
+ next if ref $ell_content[$j];
+ DEBUG > 3 and
+ print " Peering at L-content text bit \"$ell_content[$j]\" for a '|'.\n";
+
+ if($ell_content[$j] =~ m/^([^\|]*)\|(.*)$/s) {
+ my @link_text = ($1); # might be 0-length
+ $ell_content[$j] = $2; # might be 0-length
+
+ DEBUG > 3 and
+ print " FOUND a '|' in it. Splitting into [$1] + [$2]\n";
+
+ unshift @link_text, splice @ell_content, 0, $j;
+ # leaving only things at J and after
+ @ell_content = grep ref($_)||length($_), @ell_content ;
+ $link_text = [grep ref($_)||length($_), @link_text ];
+ DEBUG > 3 and printf
+ " So link text is %s\n and remaining ell content is %s\n",
+ pretty($link_text), pretty(@ell_content);
+ last;
+ }
+ }
+
+
+ # Now look for the "/" -- only in CHILDREN (not all underlings!)
+ # And afterward, anything left in @ell_content will be the raw name
+ # Like L<Foo::Bar/Object Methods>
+ my $section_name; # set to arrayref if found
+ DEBUG > 3 and print " Peering at L-content for a '/' ...\n";
+ for(my $j = 0; $j < @ell_content; ++$j) {
+ next if ref $ell_content[$j];
+ DEBUG > 3 and
+ print " Peering at L-content text bit \"$ell_content[$j]\" for a '/'.\n";
+
+ if($ell_content[$j] =~ m/^([^\/]*)\/(.*)$/s) {
+ my @section_name = ($2); # might be 0-length
+ $ell_content[$j] = $1; # might be 0-length
+
+ DEBUG > 3 and
+ print " FOUND a '/' in it.",
+ " Splitting to page [...$1] + section [$2...]\n";
+
+ push @section_name, splice @ell_content, 1+$j;
+ # leaving only things before and including J
+
+ @ell_content = grep ref($_)||length($_), @ell_content ;
+ @section_name = grep ref($_)||length($_), @section_name ;
+
+ # Turn L<.../"foo"> into L<.../foo>
+ if(@section_name
+ and !ref($section_name[0]) and !ref($section_name[-1])
+ and $section_name[ 0] =~ m/^\"/s
+ and $section_name[-1] =~ m/\"$/s
+ and !( # catch weird degenerate case of L<"> !
+ @section_name == 1 and $section_name[0] eq '"'
+ )
+ ) {
+ $section_name[ 0] =~ s/^\"//s;
+ $section_name[-1] =~ s/\"$//s;
+ DEBUG > 3 and
+ print " Quotes removed: ", pretty(@section_name), "\n";
+ } else {
+ DEBUG > 3 and
+ print " No need to remove quotes in ", pretty(@section_name), "\n";
+ }
+
+ $section_name = \@section_name;
+ last;
+ }
+ }
+
+ # Turn L<"Foo Bar"> into L</Foo Bar>
+ if(!$section_name and @ell_content
+ and !ref($ell_content[0]) and !ref($ell_content[-1])
+ and $ell_content[ 0] =~ m/^\"/s
+ and $ell_content[-1] =~ m/\"$/s
+ and !( # catch weird degenerate case of L<"> !
+ @ell_content == 1 and $ell_content[0] eq '"'
+ )
+ ) {
+ $section_name = [splice @ell_content];
+ $section_name->[ 0] =~ s/^\"//s;
+ $section_name->[-1] =~ s/\"$//s;
+ }
+
+ # Turn L<Foo Bar> into L</Foo Bar>.
+ if(!$section_name and !$link_text and @ell_content
+ and grep !ref($_) && m/ /s, @ell_content
+ ) {
+ $section_name = [splice @ell_content];
+ # That's support for the now-deprecated syntax.
+ # (Maybe generate a warning eventually?)
+ # Note that it deliberately won't work on L<...|Foo Bar>
+ }
+
+
+ # Now make up the link_text
+ # L<Foo> -> L<Foo|Foo>
+ # L</Bar> -> L<"Bar"|Bar>
+ # L<Foo/Bar> -> L<"Bar" in Foo/Foo>
+ unless($link_text) {
+ $ell->[1]{'content-implicit'} = 'yes';
+ $link_text = [];
+ push @$link_text, '"', @$section_name, '"' if $section_name;
+
+ if(@ell_content) {
+ $link_text->[-1] .= ' in ' if $section_name;
+ push @$link_text, @ell_content;
+ }
+ }
+
+
+ # And the E resolver will have to deal with all our treeletty things:
+
+ if(@ell_content == 1 and !ref($ell_content[0])
+ and $ell_content[0] =~ m/^[-a-zA-Z0-9]+\([-a-zA-Z0-9]+\)$/s
+ ) {
+ $ell->[1]{'type'} = 'man';
+ DEBUG > 3 and print "Considering this ($ell_content[0]) a man link.\n";
+ } else {
+ $ell->[1]{'type'} = 'pod';
+ DEBUG > 3 and print "Considering this a pod link (not man or url).\n";
+ }
+
+ if( defined $section_name ) {
+ $ell->[1]{'section'} = Pod::Simple::LinkSection->new(
+ ['', {}, @$section_name]
+ );
+ DEBUG > 3 and print "L-section content: ", pretty($ell->[1]{'section'}), "\n";
+ }
+
+ if( @ell_content ) {
+ $ell->[1]{'to'} = Pod::Simple::LinkSection->new(
+ ['', {}, @ell_content]
+ );
+ DEBUG > 3 and print "L-to content: ", pretty($ell->[1]{'to'}), "\n";
+ }
+
+ # And update children to be the link-text:
+ @$ell = (@$ell[0,1], defined($link_text) ? splice(@$link_text) : '');
+
+ DEBUG > 2 and print "End of L-parsing for this node $treelet->[$i]\n";
+
+ unshift @stack, $treelet->[$i]; # might as well recurse
+ }
+ }
+
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub _treat_Es {
+ my($self,@stack) = @_;
+
+ my($i, $treelet, $content, $replacer, $charnum);
+ my $start_line = $stack[0][1]{'start_line'};
+
+ # A recursive algorithm implemented iteratively! Whee!
+
+
+ # Has frightening side effects on L nodes' attributes.
+
+ #my @ells_to_tweak;
+
+ while($treelet = shift @stack) {
+ for(my $i = 2; $i < @$treelet; ++$i) { # iterate over children
+ next unless ref $treelet->[$i]; # text nodes are uninteresting
+ if($treelet->[$i][0] eq 'L') {
+ # SPECIAL STUFF for semi-processed L<>'s
+
+ my $thing;
+ foreach my $attrname ('section', 'to') {
+ if(defined($thing = $treelet->[$i][1]{$attrname}) and ref $thing) {
+ unshift @stack, $thing;
+ DEBUG > 2 and print " Enqueuing ",
+ pretty( $treelet->[$i][1]{$attrname} ),
+ " as an attribute value to tweak.\n";
+ }
+ }
+
+ unshift @stack, $treelet->[$i]; # recurse
+ next;
+ } elsif($treelet->[$i][0] ne 'E') {
+ unshift @stack, $treelet->[$i]; # recurse
+ next;
+ }
+
+ DEBUG > 1 and print "Ogling E node ", pretty($treelet->[$i]), "\n";
+
+ # bitch if it's empty
+ if( @{$treelet->[$i]} == 2
+ or (@{$treelet->[$i]} == 3 and $treelet->[$i][2] eq '')
+ ) {
+ $self->whine( $start_line, "An empty E<>" );
+ $treelet->[$i] = 'E<>'; # splice in a literal
+ next;
+ }
+
+ # bitch if content is weird
+ unless(@{$treelet->[$i]} == 3 and !ref($content = $treelet->[$i][2])) {
+ $self->whine( $start_line, "An E<...> surrounding strange content" );
+ $replacer = $treelet->[$i]; # scratch
+ splice(@$treelet, $i, 1, # fake out a literal
+ 'E<',
+ splice(@$replacer,2), # promote its content
+ '>'
+ );
+ # Don't need to do --$i, as the 'E<' we just added isn't interesting.
+ next;
+ }
+
+ DEBUG > 1 and print "Ogling E<$content>\n";
+
+ $charnum = Pod::Escapes::e2charnum($content);
+ DEBUG > 1 and print " Considering E<$content> with char ",
+ defined($charnum) ? $charnum : "undef", ".\n";
+
+ if(!defined( $charnum )) {
+ DEBUG > 1 and print "I don't know how to deal with E<$content>.\n";
+ $self->whine( $start_line, "Unknown E content in E<$content>" );
+ $replacer = "E<$content>"; # better than nothing
+ } elsif($charnum >= 255 and !UNICODE) {
+ $replacer = ASCII ? "\xA4" : "?";
+ DEBUG > 1 and print "This Perl version can't handle ",
+ "E<$content> (chr $charnum), so replacing with $replacer\n";
+ } else {
+ $replacer = Pod::Escapes::e2char($content);
+ DEBUG > 1 and print " Replacing E<$content> with $replacer\n";
+ }
+
+ splice(@$treelet, $i, 1, $replacer); # no need to back up $i, tho
+ }
+ }
+
+ return;
+}
+
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub _treat_Ss {
+ my($self,$treelet) = @_;
+
+ _change_S_to_nbsp($treelet,0) if $self->{'nbsp_for_S'};
+
+ # TODO: or a change_nbsp_to_S
+ # Normalizing nbsp's to S is harder: for each text node, make S content
+ # out of anything matching m/([^ \xA0]*(?:\xA0+[^ \xA0]*)+)/
+
+
+ return;
+}
+
+
+sub _change_S_to_nbsp { # a recursive function
+ # Sanely assumes that the top node in the excursion won't be an S node.
+ my($treelet, $in_s) = @_;
+
+ my $is_s = ('S' eq $treelet->[0]);
+ $in_s ||= $is_s; # So in_s is on either by this being an S element,
+ # or by an ancestor being an S element.
+
+ for(my $i = 2; $i < @$treelet; ++$i) {
+ if(ref $treelet->[$i]) {
+ if( _change_S_to_nbsp( $treelet->[$i], $in_s ) ) {
+ my $to_pull_up = $treelet->[$i];
+ splice @$to_pull_up,0,2; # ...leaving just its content
+ splice @$treelet, $i, 1, @$to_pull_up; # Pull up content
+ $i += @$to_pull_up - 1; # Make $i skip the pulled-up stuff
+ }
+ } else {
+ $treelet->[$i] =~ s/\s/\xA0/g if ASCII and $in_s;
+ # (If not in ASCIIland, we can't assume that \xA0 == nbsp.)
+
+ # Note that if you apply nbsp_for_S to text, and so turn
+ # "foo S<bar baz> quux" into "foo bar&#160;faz quux", you
+ # end up with something that fails to say "and don't hyphenate
+ # any part of 'bar baz'". However, hyphenation is such a vexing
+ # problem anyway, that most Pod renderers just don't render it
+ # at all. But if you do want to implement hyphenation, I guess
+ # that you'd better have nbsp_for_S off.
+ }
+ }
+
+ return $is_s;
+}
+
+#-----------------------------------------------------------------------------
+
+sub _accessorize { # A simple-minded method-maker
+ no strict 'refs';
+ foreach my $attrname (@_) {
+ next if $attrname =~ m/::/; # a hack
+ *{caller() . '::' . $attrname} = sub {
+ use strict;
+ $Carp::CarpLevel = 1, Carp::croak(
+ "Accessor usage: \$obj->$attrname() or \$obj->$attrname(\$new_value)"
+ ) unless (@_ == 1 or @_ == 2) and ref $_[0];
+ (@_ == 1) ? $_[0]->{$attrname}
+ : ($_[0]->{$attrname} = $_[1]);
+ };
+ }
+ # Ya know, they say accessories make the ensemble!
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+#=============================================================================
+
+sub filter {
+ my($class, $source) = @_;
+ my $new = $class->new;
+ $new->output_fh(*STDOUT{IO});
+
+ if(ref($source || '') eq 'SCALAR') {
+ $new->parse_string_document( $$source );
+ } elsif(ref($source)) { # it's a file handle
+ $new->parse_file($source);
+ } else { # it's a filename
+ $new->parse_file($source);
+ }
+
+ return $new;
+}
+
+
+#-----------------------------------------------------------------------------
+
+sub _out {
+ # For use in testing: Class->_out($source)
+ # returns the transformation of $source
+
+ my $class = shift(@_);
+
+ my $mutor = shift(@_) if @_ and ref($_[0] || '') eq 'CODE';
+
+ DEBUG and print "\n\n", '#' x 76,
+ "\nAbout to parse source: {{\n$_[0]\n}}\n\n";
+
+
+ my $parser = ref $class && $class->isa(__PACKAGE__) ? $class : $class->new;
+ $parser->hide_line_numbers(1);
+
+ my $out = '';
+ $parser->output_string( \$out );
+ DEBUG and print " _out to ", \$out, "\n";
+
+ $mutor->($parser) if $mutor;
+
+ $parser->parse_string_document( $_[0] );
+ # use Data::Dumper; print Dumper($parser), "\n";
+ return $out;
+}
+
+
+sub _duo {
+ # For use in testing: Class->_duo($source1, $source2)
+ # returns the parse trees of $source1 and $source2.
+ # Good in things like: &ok( Class->duo(... , ...) );
+
+ my $class = shift(@_);
+
+ Carp::croak "But $class->_duo is useful only in list context!"
+ unless wantarray;
+
+ my $mutor = shift(@_) if @_ and ref($_[0] || '') eq 'CODE';
+
+ Carp::croak "But $class->_duo takes two parameters, not: @_"
+ unless @_ == 2;
+
+ my(@out);
+
+ while( @_ ) {
+ my $parser = $class->new;
+
+ push @out, '';
+ $parser->output_string( \( $out[-1] ) );
+
+ DEBUG and print " _duo out to ", $parser->output_string(),
+ " = $parser->{'output_string'}\n";
+
+ $parser->hide_line_numbers(1);
+ $mutor->($parser) if $mutor;
+ $parser->parse_string_document( shift( @_ ) );
+ # use Data::Dumper; print Dumper($parser), "\n";
+ }
+
+ return @out;
+}
+
+
+
+#-----------------------------------------------------------------------------
+1;
+__END__
+
+TODO:
+A start_formatting_code and end_formatting_code methods, which in the
+base class call start_L, end_L, start_C, end_C, etc., if they are
+defined.
+
+have the POD FORMATTING ERRORS section note the localtime, and the
+version of Pod::Simple.
+
+option to delete all E<shy>s?
+option to scream if under-0x20 literals are found in the input, or
+under-E<32> E codes are found in the tree. And ditto \x7f-\x9f
+
+Option to turn highbit characters into their compromised form? (applies
+to E parsing too)
+
+TODO: BOM/encoding things.
+
+TODO: ascii-compat things in the XML classes?
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple.pod b/Master/tlpkg/tlperl/lib/Pod/Simple.pod
new file mode 100644
index 00000000000..d3f168d7e0a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple.pod
@@ -0,0 +1,274 @@
+
+=head1 NAME
+
+Pod::Simple - framework for parsing Pod
+
+=head1 SYNOPSIS
+
+ TODO
+
+=head1 DESCRIPTION
+
+Pod::Simple is a Perl library for parsing text in the Pod ("plain old
+documentation") markup language that is typically used for writing
+documentation for Perl and for Perl modules. The Pod format is explained
+L<perlpod>; the most common formatter is called C<perldoc>.
+
+Pod formatters can use Pod::Simple to parse Pod documents and render them into
+plain text, HTML, or any number of other formats. Typically, such formatters
+will be subclasses of Pod::Simple, and so they will inherit its methods, like
+C<parse_file>.
+
+If you're reading this document just because you have a Pod-processing
+subclass that you want to use, this document (plus the documentation for the
+subclass) is probably all you need to read.
+
+If you're reading this document because you want to write a formatter
+subclass, continue reading it and then read L<Pod::Simple::Subclassing>, and
+then possibly even read L<perlpodspec> (some of which is for parser-writers,
+but much of which is notes to formatter-writers).
+
+=head1 MAIN METHODS
+
+=over
+
+=item C<< $parser = I<SomeClass>->new(); >>
+
+This returns a new parser object, where I<C<SomeClass>> is a subclass
+of Pod::Simple.
+
+=item C<< $parser->output_fh( *OUT ); >>
+
+This sets the filehandle that C<$parser>'s output will be written to.
+You can pass C<*STDOUT>, otherwise you should probably do something
+like this:
+
+ my $outfile = "output.txt";
+ open TXTOUT, ">$outfile" or die "Can't write to $outfile: $!";
+ $parser->output_fh(*TXTOUT);
+
+...before you call one of the C<< $parser->parse_I<whatever> >> methods.
+
+=item C<< $parser->output_string( \$somestring ); >>
+
+This sets the string that C<$parser>'s output will be sent to,
+instead of any filehandle.
+
+
+=item C<< $parser->parse_file( I<$some_filename> ); >>
+
+=item C<< $parser->parse_file( *INPUT_FH ); >>
+
+This reads the Pod content of the file (or filehandle) that you specify,
+and processes it with that C<$parser> object, according to however
+C<$parser>'s class works, and according to whatever parser options you
+have set up for this C<$parser> object.
+
+=item C<< $parser->parse_string_document( I<$all_content> ); >>
+
+This works just like C<parse_file> except that it reads the Pod
+content not from a file, but from a string that you have already
+in memory.
+
+=item C<< $parser->parse_lines( I<...@lines...>, undef ); >>
+
+This processes the lines in C<@lines> (where each list item must be a
+defined value, and must contain exactly one line of content -- so no
+items like C<"foo\nbar"> are allowed). The final C<undef> is used to
+indicate the end of document being parsed.
+
+The other C<parser_I<whatever>> methods are meant to be called only once
+per C<$parser> object; but C<parse_lines> can be called as many times per
+C<$parser> object as you want, as long as the last call (and only
+the last call) ends with an C<undef> value.
+
+
+=item C<< $parser->content_seen >>
+
+This returns true only if there has been any real content seen
+for this document.
+
+
+=item C<< I<SomeClass>->filter( I<$filename> ); >>
+
+=item C<< I<SomeClass>->filter( I<*INPUT_FH> ); >>
+
+=item C<< I<SomeClass>->filter( I<\$document_content> ); >>
+
+This is a shortcut method for creating a new parser object, setting the
+output handle to STDOUT, and then processing the specified file (or
+filehandle, or in-memory document). This is handy for one-liners like
+this:
+
+ perl -MPod::Simple::Text -e "Pod::Simple::Text->filter('thingy.pod')"
+
+=back
+
+
+
+=head1 SECONDARY METHODS
+
+Some of these methods might be of interest to general users, as
+well as of interest to formatter-writers.
+
+Note that the general pattern here is that the accessor-methods
+read the attribute's value with C<< $value = $parser->I<attribute> >>
+and set the attribute's value with
+C<< $parser->I<attribute>(I<newvalue>) >>. For each accessor, I typically
+only mention one syntax or another, based on which I think you are actually
+most likely to use.
+
+
+=over
+
+=item C<< $parser->no_whining( I<SOMEVALUE> ) >>
+
+If you set this attribute to a true value, you will suppress the
+parser's complaints about irregularities in the Pod coding. By default,
+this attribute's value is false, meaning that irregularities will
+be reported.
+
+Note that turning this attribute to true won't suppress one or two kinds
+of complaints about rarely occurring unrecoverable errors.
+
+
+=item C<< $parser->no_errata_section( I<SOMEVALUE> ) >>
+
+If you set this attribute to a true value, you will stop the parser from
+generating a "POD ERRORS" section at the end of the document. By
+default, this attribute's value is false, meaning that an errata section
+will be generated, as necessary.
+
+
+=item C<< $parser->complain_stderr( I<SOMEVALUE> ) >>
+
+If you set this attribute to a true value, it will send reports of
+parsing errors to STDERR. By default, this attribute's value is false,
+meaning that no output is sent to STDERR.
+
+Setting C<complain_stderr> also sets C<no_errata_section>.
+
+
+=item C<< $parser->source_filename >>
+
+This returns the filename that this parser object was set to read from.
+
+
+=item C<< $parser->doc_has_started >>
+
+This returns true if C<$parser> has read from a source, and has seen
+Pod content in it.
+
+
+=item C<< $parser->source_dead >>
+
+This returns true if C<$parser> has read from a source, and come to the
+end of that source.
+
+=item C<< $parser->strip_verbatim_indent( I<SOMEVALUE> ) >>
+
+The perlpod spec for a Verbatim paragraph is "It should be reproduced
+exactly...", which means that the whitespace you've used to indent your
+verbatim blocks will be preserved in the output. This can be annoying for
+outputs such as HTML, where that whitespace will remain in front of every
+line. It's an unfortunate case where syntax is turned into semantics.
+
+If the POD your parsing adheres to a consistent indentation policy, you can
+have such indentation stripped from the beginning of every line of your
+verbatim blocks. This method tells Pod::Simple what to strip. For two-space
+indents, you'd use:
+
+ $parser->strip_verbatim_indent(' ');
+
+For tab indents, you'd use a tab character:
+
+ $parser->strip_verbatim_indent("\t");
+
+If the POD is inconsistent about the indentation of verbatim blocks, but you
+have figured out a heuristic to determine how much a particular verbatim block
+is indented, you can pass a code reference instead. The code reference will be
+executed with one argument, an array reference of all the lines in the
+verbatim block, and should return the value to be stripped from each line. For
+example, if you decide that you're fine to use the first line of the verbatim
+block to set the standard for indentation of the rest of the block, you can
+look at the first line and return the appropriate value, like so:
+
+ $new->strip_verbatim_indent(sub {
+ my $lines = shift;
+ (my $indent = $lines->[0]) =~ s/\S.*//;
+ return $indent;
+ });
+
+If you'd rather treat each line individually, you can do that, too, by just
+transforming them in-place in the code reference and returning C<undef>. Say
+that you don't want I<any> lines indented. You can do something like this:
+
+ $new->strip_verbatim_indent(sub {
+ my $lines = shift;
+ sub { s/^\s+// for @{ $lines },
+ return undef;
+ });
+
+=back
+
+=head1 CAVEATS
+
+This is just a beta release -- there are a good number of things still
+left to do. Notably, support for EBCDIC platforms is still half-done,
+an untested.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple::Subclassing>
+
+L<perlpod|perlpod>
+
+L<perlpodspec|perlpodspec>
+
+L<Pod::Escapes|Pod::Escapes>
+
+L<perldoc>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/BlackBox.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/BlackBox.pm
new file mode 100644
index 00000000000..9917898cff7
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/BlackBox.pm
@@ -0,0 +1,1930 @@
+
+package Pod::Simple::BlackBox;
+#
+# "What's in the box?" "Pain."
+#
+###########################################################################
+#
+# This is where all the scary things happen: parsing lines into
+# paragraphs; and then into directives, verbatims, and then also
+# turning formatting sequences into treelets.
+#
+# Are you really sure you want to read this code?
+#
+#-----------------------------------------------------------------------------
+#
+# The basic work of this module Pod::Simple::BlackBox is doing the dirty work
+# of parsing Pod into treelets (generally one per non-verbatim paragraph), and
+# to call the proper callbacks on the treelets.
+#
+# Every node in a treelet is a ['name', {attrhash}, ...children...]
+
+use integer; # vroom!
+use strict;
+use Carp ();
+use vars qw($VERSION );
+$VERSION = '3.14';
+#use constant DEBUG => 7;
+BEGIN {
+ require Pod::Simple;
+ *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub parse_line { shift->parse_lines(@_) } # alias
+
+# - - - Turn back now! Run away! - - -
+
+sub parse_lines { # Usage: $parser->parse_lines(@lines)
+ # an undef means end-of-stream
+ my $self = shift;
+
+ my $code_handler = $self->{'code_handler'};
+ my $cut_handler = $self->{'cut_handler'};
+ $self->{'line_count'} ||= 0;
+
+ my $scratch;
+
+ DEBUG > 4 and
+ print "# Parsing starting at line ", $self->{'line_count'}, ".\n";
+
+ DEBUG > 5 and
+ print "# About to parse lines: ",
+ join(' ', map defined($_) ? "[$_]" : "EOF", @_), "\n";
+
+ my $paras = ($self->{'paras'} ||= []);
+ # paragraph buffer. Because we need to defer processing of =over
+ # directives and verbatim paragraphs. We call _ponder_paragraph_buffer
+ # to process this.
+
+ $self->{'pod_para_count'} ||= 0;
+
+ my $line;
+ foreach my $source_line (@_) {
+ if( $self->{'source_dead'} ) {
+ DEBUG > 4 and print "# Source is dead.\n";
+ last;
+ }
+
+ unless( defined $source_line ) {
+ DEBUG > 4 and print "# Undef-line seen.\n";
+
+ push @$paras, ['~end', {'start_line' => $self->{'line_count'}}];
+ push @$paras, $paras->[-1], $paras->[-1];
+ # So that it definitely fills the buffer.
+ $self->{'source_dead'} = 1;
+ $self->_ponder_paragraph_buffer;
+ next;
+ }
+
+
+ if( $self->{'line_count'}++ ) {
+ ($line = $source_line) =~ tr/\n\r//d;
+ # If we don't have two vars, we'll end up with that there
+ # tr/// modding the (potentially read-only) original source line!
+
+ } else {
+ DEBUG > 2 and print "First line: [$source_line]\n";
+
+ if( ($line = $source_line) =~ s/^\xEF\xBB\xBF//s ) {
+ DEBUG and print "UTF-8 BOM seen. Faking a '=encode utf8'.\n";
+ $self->_handle_encoding_line( "=encode utf8" );
+ $line =~ tr/\n\r//d;
+
+ } elsif( $line =~ s/^\xFE\xFF//s ) {
+ DEBUG and print "Big-endian UTF-16 BOM seen. Aborting parsing.\n";
+ $self->scream(
+ $self->{'line_count'},
+ "UTF16-BE Byte Encoding Mark found; but Pod::Simple v$Pod::Simple::VERSION doesn't implement UTF16 yet."
+ );
+ splice @_;
+ push @_, undef;
+ next;
+
+ # TODO: implement somehow?
+
+ } elsif( $line =~ s/^\xFF\xFE//s ) {
+ DEBUG and print "Little-endian UTF-16 BOM seen. Aborting parsing.\n";
+ $self->scream(
+ $self->{'line_count'},
+ "UTF16-LE Byte Encoding Mark found; but Pod::Simple v$Pod::Simple::VERSION doesn't implement UTF16 yet."
+ );
+ splice @_;
+ push @_, undef;
+ next;
+
+ # TODO: implement somehow?
+
+ } else {
+ DEBUG > 2 and print "First line is BOM-less.\n";
+ ($line = $source_line) =~ tr/\n\r//d;
+ }
+ }
+
+
+ DEBUG > 5 and print "# Parsing line: [$line]\n";
+
+ if(!$self->{'in_pod'}) {
+ if($line =~ m/^=([a-zA-Z]+)/s) {
+ if($1 eq 'cut') {
+ $self->scream(
+ $self->{'line_count'},
+ "=cut found outside a pod block. Skipping to next block."
+ );
+
+ ## Before there were errata sections in the world, it was
+ ## least-pessimal to abort processing the file. But now we can
+ ## just barrel on thru (but still not start a pod block).
+ #splice @_;
+ #push @_, undef;
+
+ next;
+ } else {
+ $self->{'in_pod'} = $self->{'start_of_pod_block'}
+ = $self->{'last_was_blank'} = 1;
+ # And fall thru to the pod-mode block further down
+ }
+ } else {
+ DEBUG > 5 and print "# It's a code-line.\n";
+ $code_handler->(map $_, $line, $self->{'line_count'}, $self)
+ if $code_handler;
+ # Note: this may cause code to be processed out of order relative
+ # to pods, but in order relative to cuts.
+
+ # Note also that we haven't yet applied the transcoding to $line
+ # by time we call $code_handler!
+
+ if( $line =~ m/^#\s*line\s+(\d+)\s*(?:\s"([^"]+)")?\s*$/ ) {
+ # That RE is from perlsyn, section "Plain Old Comments (Not!)",
+ #$fname = $2 if defined $2;
+ #DEBUG > 1 and defined $2 and print "# Setting fname to \"$fname\"\n";
+ DEBUG > 1 and print "# Setting nextline to $1\n";
+ $self->{'line_count'} = $1 - 1;
+ }
+
+ next;
+ }
+ }
+
+ # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+ # Else we're in pod mode:
+
+ # Apply any necessary transcoding:
+ $self->{'_transcoder'} && $self->{'_transcoder'}->($line);
+
+ # HERE WE CATCH =encoding EARLY!
+ if( $line =~ m/^=encoding\s+\S+\s*$/s ) {
+ $line = $self->_handle_encoding_line( $line );
+ }
+
+ if($line =~ m/^=cut/s) {
+ # here ends the pod block, and therefore the previous pod para
+ DEBUG > 1 and print "Noting =cut at line ${$self}{'line_count'}\n";
+ $self->{'in_pod'} = 0;
+ # ++$self->{'pod_para_count'};
+ $self->_ponder_paragraph_buffer();
+ # by now it's safe to consider the previous paragraph as done.
+ $cut_handler->(map $_, $line, $self->{'line_count'}, $self)
+ if $cut_handler;
+
+ # TODO: add to docs: Note: this may cause cuts to be processed out
+ # of order relative to pods, but in order relative to code.
+
+ } elsif($line =~ m/^\s*$/s) { # it's a blank line
+ if(!$self->{'start_of_pod_block'} and @$paras and $paras->[-1][0] eq '~Verbatim') {
+ DEBUG > 1 and print "Saving blank line at line ${$self}{'line_count'}\n";
+ push @{$paras->[-1]}, $line;
+ } # otherwise it's not interesting
+
+ if(!$self->{'start_of_pod_block'} and !$self->{'last_was_blank'}) {
+ DEBUG > 1 and print "Noting para ends with blank line at ${$self}{'line_count'}\n";
+ }
+
+ $self->{'last_was_blank'} = 1;
+
+ } elsif($self->{'last_was_blank'}) { # A non-blank line starting a new para...
+
+ if($line =~ m/^(=[a-zA-Z][a-zA-Z0-9]*)(?:\s+|$)(.*)/s) {
+ # THIS IS THE ONE PLACE WHERE WE CONSTRUCT NEW DIRECTIVE OBJECTS
+ my $new = [$1, {'start_line' => $self->{'line_count'}}, $2];
+ # Note that in "=head1 foo", the WS is lost.
+ # Example: ['=head1', {'start_line' => 123}, ' foo']
+
+ ++$self->{'pod_para_count'};
+
+ $self->_ponder_paragraph_buffer();
+ # by now it's safe to consider the previous paragraph as done.
+
+ push @$paras, $new; # the new incipient paragraph
+ DEBUG > 1 and print "Starting new ${$paras}[-1][0] para at line ${$self}{'line_count'}\n";
+
+ } elsif($line =~ m/^\s/s) {
+
+ if(!$self->{'start_of_pod_block'} and @$paras and $paras->[-1][0] eq '~Verbatim') {
+ DEBUG > 1 and print "Resuming verbatim para at line ${$self}{'line_count'}\n";
+ push @{$paras->[-1]}, $line;
+ } else {
+ ++$self->{'pod_para_count'};
+ $self->_ponder_paragraph_buffer();
+ # by now it's safe to consider the previous paragraph as done.
+ DEBUG > 1 and print "Starting verbatim para at line ${$self}{'line_count'}\n";
+ push @$paras, ['~Verbatim', {'start_line' => $self->{'line_count'}}, $line];
+ }
+ } else {
+ ++$self->{'pod_para_count'};
+ $self->_ponder_paragraph_buffer();
+ # by now it's safe to consider the previous paragraph as done.
+ push @$paras, ['~Para', {'start_line' => $self->{'line_count'}}, $line];
+ DEBUG > 1 and print "Starting plain para at line ${$self}{'line_count'}\n";
+ }
+ $self->{'last_was_blank'} = $self->{'start_of_pod_block'} = 0;
+
+ } else {
+ # It's a non-blank line /continuing/ the current para
+ if(@$paras) {
+ DEBUG > 2 and print "Line ${$self}{'line_count'} continues current paragraph\n";
+ push @{$paras->[-1]}, $line;
+ } else {
+ # Unexpected case!
+ die "Continuing a paragraph but \@\$paras is empty?";
+ }
+ $self->{'last_was_blank'} = $self->{'start_of_pod_block'} = 0;
+ }
+
+ } # ends the big while loop
+
+ DEBUG > 1 and print(pretty(@$paras), "\n");
+ return $self;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _handle_encoding_line {
+ my($self, $line) = @_;
+
+ # The point of this routine is to set $self->{'_transcoder'} as indicated.
+
+ return $line unless $line =~ m/^=encoding\s+(\S+)\s*$/s;
+ DEBUG > 1 and print "Found an encoding line \"=encoding $1\"\n";
+
+ my $e = $1;
+ my $orig = $e;
+ push @{ $self->{'encoding_command_reqs'} }, "=encoding $orig";
+
+ my $enc_error;
+
+ # Cf. perldoc Encode and perldoc Encode::Supported
+
+ require Pod::Simple::Transcode;
+
+ if( $self->{'encoding'} ) {
+ my $norm_current = $self->{'encoding'};
+ my $norm_e = $e;
+ foreach my $that ($norm_current, $norm_e) {
+ $that = lc($that);
+ $that =~ s/[-_]//g;
+ }
+ if($norm_current eq $norm_e) {
+ DEBUG > 1 and print "The '=encoding $orig' line is ",
+ "redundant. ($norm_current eq $norm_e). Ignoring.\n";
+ $enc_error = '';
+ # But that doesn't necessarily mean that the earlier one went okay
+ } else {
+ $enc_error = "Encoding is already set to " . $self->{'encoding'};
+ DEBUG > 1 and print $enc_error;
+ }
+ } elsif (
+ # OK, let's turn on the encoding
+ do {
+ DEBUG > 1 and print " Setting encoding to $e\n";
+ $self->{'encoding'} = $e;
+ 1;
+ }
+ and $e eq 'HACKRAW'
+ ) {
+ DEBUG and print " Putting in HACKRAW (no-op) encoding mode.\n";
+
+ } elsif( Pod::Simple::Transcode::->encoding_is_available($e) ) {
+
+ die($enc_error = "WHAT? _transcoder is already set?!")
+ if $self->{'_transcoder'}; # should never happen
+ require Pod::Simple::Transcode;
+ $self->{'_transcoder'} = Pod::Simple::Transcode::->make_transcoder($e);
+ eval {
+ my @x = ('', "abc", "123");
+ $self->{'_transcoder'}->(@x);
+ };
+ $@ && die( $enc_error =
+ "Really unexpected error setting up encoding $e: $@\nAborting"
+ );
+
+ } else {
+ my @supported = Pod::Simple::Transcode::->all_encodings;
+
+ # Note unsupported, and complain
+ DEBUG and print " Encoding [$e] is unsupported.",
+ "\nSupporteds: @supported\n";
+ my $suggestion = '';
+
+ # Look for a near match:
+ my $norm = lc($e);
+ $norm =~ tr[-_][]d;
+ my $n;
+ foreach my $enc (@supported) {
+ $n = lc($enc);
+ $n =~ tr[-_][]d;
+ next unless $n eq $norm;
+ $suggestion = " (Maybe \"$e\" should be \"$enc\"?)";
+ last;
+ }
+ my $encmodver = Pod::Simple::Transcode::->encmodver;
+ $enc_error = join '' =>
+ "This document probably does not appear as it should, because its ",
+ "\"=encoding $e\" line calls for an unsupported encoding.",
+ $suggestion, " [$encmodver\'s supported encodings are: @supported]"
+ ;
+
+ $self->scream( $self->{'line_count'}, $enc_error );
+ }
+ push @{ $self->{'encoding_command_statuses'} }, $enc_error;
+
+ return '=encoding ALREADYDONE';
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _handle_encoding_second_level {
+ # By time this is called, the encoding (if well formed) will already
+ # have been acted one.
+ my($self, $para) = @_;
+ my @x = @$para;
+ my $content = join ' ', splice @x, 2;
+ $content =~ s/^\s+//s;
+ $content =~ s/\s+$//s;
+
+ DEBUG > 2 and print "Ogling encoding directive: =encoding $content\n";
+
+ if($content eq 'ALREADYDONE') {
+ # It's already been handled. Check for errors.
+ if(! $self->{'encoding_command_statuses'} ) {
+ DEBUG > 2 and print " CRAZY ERROR: It wasn't really handled?!\n";
+ } elsif( $self->{'encoding_command_statuses'}[-1] ) {
+ $self->whine( $para->[1]{'start_line'},
+ sprintf "Couldn't do %s: %s",
+ $self->{'encoding_command_reqs' }[-1],
+ $self->{'encoding_command_statuses'}[-1],
+ );
+ } else {
+ DEBUG > 2 and print " (Yup, it was successfully handled already.)\n";
+ }
+
+ } else {
+ # Otherwise it's a syntax error
+ $self->whine( $para->[1]{'start_line'},
+ "Invalid =encoding syntax: $content"
+ );
+ }
+
+ return;
+}
+
+#~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`
+
+{
+my $m = -321; # magic line number
+
+sub _gen_errata {
+ my $self = $_[0];
+ # Return 0 or more fake-o paragraphs explaining the accumulated
+ # errors on this document.
+
+ return() unless $self->{'errata'} and keys %{$self->{'errata'}};
+
+ my @out;
+
+ foreach my $line (sort {$a <=> $b} keys %{$self->{'errata'}}) {
+ push @out,
+ ['=item', {'start_line' => $m}, "Around line $line:"],
+ map( ['~Para', {'start_line' => $m, '~cooked' => 1},
+ #['~Top', {'start_line' => $m},
+ $_
+ #]
+ ],
+ @{$self->{'errata'}{$line}}
+ )
+ ;
+ }
+
+ # TODO: report of unknown entities? unrenderable characters?
+
+ unshift @out,
+ ['=head1', {'start_line' => $m, 'errata' => 1}, 'POD ERRORS'],
+ ['~Para', {'start_line' => $m, '~cooked' => 1, 'errata' => 1},
+ "Hey! ",
+ ['B', {},
+ 'The above document had some coding errors, which are explained below:'
+ ]
+ ],
+ ['=over', {'start_line' => $m, 'errata' => 1}, ''],
+ ;
+
+ push @out,
+ ['=back', {'start_line' => $m, 'errata' => 1}, ''],
+ ;
+
+ DEBUG and print "\n<<\n", pretty(\@out), "\n>>\n\n";
+
+ return @out;
+}
+
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+##############################################################################
+##
+## stop reading now stop reading now stop reading now stop reading now stop
+##
+## HERE IT BECOMES REALLY SCARY
+##
+## stop reading now stop reading now stop reading now stop reading now stop
+##
+##############################################################################
+
+sub _ponder_paragraph_buffer {
+
+ # Para-token types as found in the buffer.
+ # ~Verbatim, ~Para, ~end, =head1..4, =for, =begin, =end,
+ # =over, =back, =item
+ # and the null =pod (to be complained about if over one line)
+ #
+ # "~data" paragraphs are something we generate at this level, depending on
+ # a currently open =over region
+
+ # Events fired: Begin and end for:
+ # directivename (like head1 .. head4), item, extend,
+ # for (from =begin...=end, =for),
+ # over-bullet, over-number, over-text, over-block,
+ # item-bullet, item-number, item-text,
+ # Document,
+ # Data, Para, Verbatim
+ # B, C, longdirname (TODO -- wha?), etc. for all directives
+ #
+
+ my $self = $_[0];
+ my $paras;
+ return unless @{$paras = $self->{'paras'}};
+ my $curr_open = ($self->{'curr_open'} ||= []);
+
+ my $scratch;
+
+ DEBUG > 10 and print "# Paragraph buffer: <<", pretty($paras), ">>\n";
+
+ # We have something in our buffer. So apparently the document has started.
+ unless($self->{'doc_has_started'}) {
+ $self->{'doc_has_started'} = 1;
+
+ my $starting_contentless;
+ $starting_contentless =
+ (
+ !@$curr_open
+ and @$paras and ! grep $_->[0] ne '~end', @$paras
+ # i.e., if the paras is all ~ends
+ )
+ ;
+ DEBUG and print "# Starting ",
+ $starting_contentless ? 'contentless' : 'contentful',
+ " document\n"
+ ;
+
+ $self->_handle_element_start(
+ ($scratch = 'Document'),
+ {
+ 'start_line' => $paras->[0][1]{'start_line'},
+ $starting_contentless ? ( 'contentless' => 1 ) : (),
+ },
+ );
+ }
+
+ my($para, $para_type);
+ while(@$paras) {
+ last if @$paras == 1 and
+ ( $paras->[0][0] eq '=over' or $paras->[0][0] eq '~Verbatim'
+ or $paras->[0][0] eq '=item' )
+ ;
+ # Those're the three kinds of paragraphs that require lookahead.
+ # Actually, an "=item Foo" inside an <over type=text> region
+ # and any =item inside an <over type=block> region (rare)
+ # don't require any lookahead, but all others (bullets
+ # and numbers) do.
+
+# TODO: winge about many kinds of directives in non-resolving =for regions?
+# TODO: many? like what? =head1 etc?
+
+ $para = shift @$paras;
+ $para_type = $para->[0];
+
+ DEBUG > 1 and print "Pondering a $para_type paragraph, given the stack: (",
+ $self->_dump_curr_open(), ")\n";
+
+ if($para_type eq '=for') {
+ next if $self->_ponder_for($para,$curr_open,$paras);
+
+ } elsif($para_type eq '=begin') {
+ next if $self->_ponder_begin($para,$curr_open,$paras);
+
+ } elsif($para_type eq '=end') {
+ next if $self->_ponder_end($para,$curr_open,$paras);
+
+ } elsif($para_type eq '~end') { # The virtual end-document signal
+ next if $self->_ponder_doc_end($para,$curr_open,$paras);
+ }
+
+
+ # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+ #~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+ if(grep $_->[1]{'~ignore'}, @$curr_open) {
+ DEBUG > 1 and
+ print "Skipping $para_type paragraph because in ignore mode.\n";
+ next;
+ }
+ #~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+ # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+ if($para_type eq '=pod') {
+ $self->_ponder_pod($para,$curr_open,$paras);
+
+ } elsif($para_type eq '=over') {
+ next if $self->_ponder_over($para,$curr_open,$paras);
+
+ } elsif($para_type eq '=back') {
+ next if $self->_ponder_back($para,$curr_open,$paras);
+
+ } else {
+
+ # All non-magical codes!!!
+
+ # Here we start using $para_type for our own twisted purposes, to
+ # mean how it should get treated, not as what the element name
+ # should be.
+
+ DEBUG > 1 and print "Pondering non-magical $para_type\n";
+
+ my $i;
+
+ # Enforce some =headN discipline
+ if($para_type =~ m/^=head\d$/s
+ and ! $self->{'accept_heads_anywhere'}
+ and @$curr_open
+ and $curr_open->[-1][0] eq '=over'
+ ) {
+ DEBUG > 2 and print "'=$para_type' inside an '=over'!\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "You forgot a '=back' before '$para_type'"
+ );
+ unshift @$paras, ['=back', {}, ''], $para; # close the =over
+ next;
+ }
+
+
+ if($para_type eq '=item') {
+
+ my $over;
+ unless(@$curr_open and ($over = $curr_open->[-1])->[0] eq '=over') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "'=item' outside of any '=over'"
+ );
+ unshift @$paras,
+ ['=over', {'start_line' => $para->[1]{'start_line'}}, ''],
+ $para
+ ;
+ next;
+ }
+
+
+ my $over_type = $over->[1]{'~type'};
+
+ if(!$over_type) {
+ # Shouldn't happen1
+ die "Typeless over in stack, starting at line "
+ . $over->[1]{'start_line'};
+
+ } elsif($over_type eq 'block') {
+ unless($curr_open->[-1][1]{'~bitched_about'}) {
+ $curr_open->[-1][1]{'~bitched_about'} = 1;
+ $self->whine(
+ $curr_open->[-1][1]{'start_line'},
+ "You can't have =items (as at line "
+ . $para->[1]{'start_line'}
+ . ") unless the first thing after the =over is an =item"
+ );
+ }
+ # Just turn it into a paragraph and reconsider it
+ $para->[0] = '~Para';
+ unshift @$paras, $para;
+ next;
+
+ } elsif($over_type eq 'text') {
+ my $item_type = $self->_get_item_type($para);
+ # That kills the content of the item if it's a number or bullet.
+ DEBUG and print " Item is of type ", $para->[0], " under $over_type\n";
+
+ if($item_type eq 'text') {
+ # Nothing special needs doing for 'text'
+ } elsif($item_type eq 'number' or $item_type eq 'bullet') {
+ die "Unknown item type $item_type"
+ unless $item_type eq 'number' or $item_type eq 'bullet';
+ # Undo our clobbering:
+ push @$para, $para->[1]{'~orig_content'};
+ delete $para->[1]{'number'};
+ # Only a PROPER item-number element is allowed
+ # to have a number attribute.
+ } else {
+ die "Unhandled item type $item_type"; # should never happen
+ }
+
+ # =item-text thingies don't need any assimilation, it seems.
+
+ } elsif($over_type eq 'number') {
+ my $item_type = $self->_get_item_type($para);
+ # That kills the content of the item if it's a number or bullet.
+ DEBUG and print " Item is of type ", $para->[0], " under $over_type\n";
+
+ my $expected_value = ++ $curr_open->[-1][1]{'~counter'};
+
+ if($item_type eq 'bullet') {
+ # Hm, it's not numeric. Correct for this.
+ $para->[1]{'number'} = $expected_value;
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item $expected_value'"
+ );
+ push @$para, $para->[1]{'~orig_content'};
+ # restore the bullet, blocking the assimilation of next para
+
+ } elsif($item_type eq 'text') {
+ # Hm, it's not numeric. Correct for this.
+ $para->[1]{'number'} = $expected_value;
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item $expected_value'"
+ );
+ # Text content will still be there and will block next ~Para
+
+ } elsif($item_type ne 'number') {
+ die "Unknown item type $item_type"; # should never happen
+
+ } elsif($expected_value == $para->[1]{'number'}) {
+ DEBUG > 1 and print " Numeric item has the expected value of $expected_value\n";
+
+ } else {
+ DEBUG > 1 and print " Numeric item has ", $para->[1]{'number'},
+ " instead of the expected value of $expected_value\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "You have '=item " . $para->[1]{'number'} .
+ "' instead of the expected '=item $expected_value'"
+ );
+ $para->[1]{'number'} = $expected_value; # correcting!!
+ }
+
+ if(@$para == 2) {
+ # For the cases where we /didn't/ push to @$para
+ if($paras->[0][0] eq '~Para') {
+ DEBUG and print "Assimilating following ~Para content into $over_type item\n";
+ push @$para, splice @{shift @$paras},2;
+ } else {
+ DEBUG and print "Can't assimilate following ", $paras->[0][0], "\n";
+ push @$para, ''; # Just so it's not contentless
+ }
+ }
+
+
+ } elsif($over_type eq 'bullet') {
+ my $item_type = $self->_get_item_type($para);
+ # That kills the content of the item if it's a number or bullet.
+ DEBUG and print " Item is of type ", $para->[0], " under $over_type\n";
+
+ if($item_type eq 'bullet') {
+ # as expected!
+
+ if( $para->[1]{'~_freaky_para_hack'} ) {
+ DEBUG and print "Accomodating '=item * Foo' tolerance hack.\n";
+ push @$para, delete $para->[1]{'~_freaky_para_hack'};
+ }
+
+ } elsif($item_type eq 'number') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item *'"
+ );
+ push @$para, $para->[1]{'~orig_content'};
+ # and block assimilation of the next paragraph
+ delete $para->[1]{'number'};
+ # Only a PROPER item-number element is allowed
+ # to have a number attribute.
+ } elsif($item_type eq 'text') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item *'"
+ );
+ # But doesn't need processing. But it'll block assimilation
+ # of the next para.
+ } else {
+ die "Unhandled item type $item_type"; # should never happen
+ }
+
+ if(@$para == 2) {
+ # For the cases where we /didn't/ push to @$para
+ if($paras->[0][0] eq '~Para') {
+ DEBUG and print "Assimilating following ~Para content into $over_type item\n";
+ push @$para, splice @{shift @$paras},2;
+ } else {
+ DEBUG and print "Can't assimilate following ", $paras->[0][0], "\n";
+ push @$para, ''; # Just so it's not contentless
+ }
+ }
+
+ } else {
+ die "Unhandled =over type \"$over_type\"?";
+ # Shouldn't happen!
+ }
+
+ $para_type = 'Plain';
+ $para->[0] .= '-' . $over_type;
+ # Whew. Now fall thru and process it.
+
+
+ } elsif($para_type eq '=extend') {
+ # Well, might as well implement it here.
+ $self->_ponder_extend($para);
+ next; # and skip
+ } elsif($para_type eq '=encoding') {
+ # Not actually acted on here, but we catch errors here.
+ $self->_handle_encoding_second_level($para);
+
+ next; # and skip
+ } elsif($para_type eq '~Verbatim') {
+ $para->[0] = 'Verbatim';
+ $para_type = '?Verbatim';
+ } elsif($para_type eq '~Para') {
+ $para->[0] = 'Para';
+ $para_type = '?Plain';
+ } elsif($para_type eq 'Data') {
+ $para->[0] = 'Data';
+ $para_type = '?Data';
+ } elsif( $para_type =~ s/^=//s
+ and defined( $para_type = $self->{'accept_directives'}{$para_type} )
+ ) {
+ DEBUG > 1 and print " Pondering known directive ${$para}[0] as $para_type\n";
+ } else {
+ # An unknown directive!
+ DEBUG > 1 and printf "Unhandled directive %s (Handled: %s)\n",
+ $para->[0], join(' ', sort keys %{$self->{'accept_directives'}} )
+ ;
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Unknown directive: $para->[0]"
+ );
+
+ # And maybe treat it as text instead of just letting it go?
+ next;
+ }
+
+ if($para_type =~ s/^\?//s) {
+ if(! @$curr_open) { # usual case
+ DEBUG and print "Treating $para_type paragraph as such because stack is empty.\n";
+ } else {
+ my @fors = grep $_->[0] eq '=for', @$curr_open;
+ DEBUG > 1 and print "Containing fors: ",
+ join(',', map $_->[1]{'target'}, @fors), "\n";
+
+ if(! @fors) {
+ DEBUG and print "Treating $para_type paragraph as such because stack has no =for's\n";
+
+ #} elsif(grep $_->[1]{'~resolve'}, @fors) {
+ #} elsif(not grep !$_->[1]{'~resolve'}, @fors) {
+ } elsif( $fors[-1][1]{'~resolve'} ) {
+ # Look to the immediately containing for
+
+ if($para_type eq 'Data') {
+ DEBUG and print "Treating Data paragraph as Plain/Verbatim because the containing =for ($fors[-1][1]{'target'}) is a resolver\n";
+ $para->[0] = 'Para';
+ $para_type = 'Plain';
+ } else {
+ DEBUG and print "Treating $para_type paragraph as such because the containing =for ($fors[-1][1]{'target'}) is a resolver\n";
+ }
+ } else {
+ DEBUG and print "Treating $para_type paragraph as Data because the containing =for ($fors[-1][1]{'target'}) is a non-resolver\n";
+ $para->[0] = $para_type = 'Data';
+ }
+ }
+ }
+
+ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ if($para_type eq 'Plain') {
+ $self->_ponder_Plain($para);
+ } elsif($para_type eq 'Verbatim') {
+ $self->_ponder_Verbatim($para);
+ } elsif($para_type eq 'Data') {
+ $self->_ponder_Data($para);
+ } else {
+ die "\$para type is $para_type -- how did that happen?";
+ # Shouldn't happen.
+ }
+
+ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ $para->[0] =~ s/^[~=]//s;
+
+ DEBUG and print "\n", pretty($para), "\n";
+
+ # traverse the treelet (which might well be just one string scalar)
+ $self->{'content_seen'} ||= 1;
+ $self->_traverse_treelet_bit(@$para);
+ }
+ }
+
+ return;
+}
+
+###########################################################################
+# The sub-ponderers...
+
+
+
+sub _ponder_for {
+ my ($self,$para,$curr_open,$paras) = @_;
+
+ # Fake it out as a begin/end
+ my $target;
+
+ if(grep $_->[1]{'~ignore'}, @$curr_open) {
+ DEBUG > 1 and print "Ignoring ignorable =for\n";
+ return 1;
+ }
+
+ for(my $i = 2; $i < @$para; ++$i) {
+ if($para->[$i] =~ s/^\s*(\S+)\s*//s) {
+ $target = $1;
+ last;
+ }
+ }
+ unless(defined $target) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=for without a target?"
+ );
+ return 1;
+ }
+ DEBUG > 1 and
+ print "Faking out a =for $target as a =begin $target / =end $target\n";
+
+ $para->[0] = 'Data';
+
+ unshift @$paras,
+ ['=begin',
+ {'start_line' => $para->[1]{'start_line'}, '~really' => '=for'},
+ $target,
+ ],
+ $para,
+ ['=end',
+ {'start_line' => $para->[1]{'start_line'}, '~really' => '=for'},
+ $target,
+ ],
+ ;
+
+ return 1;
+}
+
+sub _ponder_begin {
+ my ($self,$para,$curr_open,$paras) = @_;
+ my $content = join ' ', splice @$para, 2;
+ $content =~ s/^\s+//s;
+ $content =~ s/\s+$//s;
+ unless(length($content)) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=begin without a target?"
+ );
+ DEBUG and print "Ignoring targetless =begin\n";
+ return 1;
+ }
+
+ my ($target, $title) = $content =~ m/^(\S+)\s*(.*)$/;
+ $para->[1]{'title'} = $title if ($title);
+ $para->[1]{'target'} = $target; # without any ':'
+ $content = $target; # strip off the title
+
+ $content =~ s/^:!/!:/s;
+ my $neg; # whether this is a negation-match
+ $neg = 1 if $content =~ s/^!//s;
+ my $to_resolve; # whether to process formatting codes
+ $to_resolve = 1 if $content =~ s/^://s;
+
+ my $dont_ignore; # whether this target matches us
+
+ foreach my $target_name (
+ split(',', $content, -1),
+ $neg ? () : '*'
+ ) {
+ DEBUG > 2 and
+ print " Considering whether =begin $content matches $target_name\n";
+ next unless $self->{'accept_targets'}{$target_name};
+
+ DEBUG > 2 and
+ print " It DOES match the acceptable target $target_name!\n";
+ $to_resolve = 1
+ if $self->{'accept_targets'}{$target_name} eq 'force_resolve';
+ $dont_ignore = 1;
+ $para->[1]{'target_matching'} = $target_name;
+ last; # stop looking at other target names
+ }
+
+ if($neg) {
+ if( $dont_ignore ) {
+ $dont_ignore = '';
+ delete $para->[1]{'target_matching'};
+ DEBUG > 2 and print " But the leading ! means that this is a NON-match!\n";
+ } else {
+ $dont_ignore = 1;
+ $para->[1]{'target_matching'} = '!';
+ DEBUG > 2 and print " But the leading ! means that this IS a match!\n";
+ }
+ }
+
+ $para->[0] = '=for'; # Just what we happen to call these, internally
+ $para->[1]{'~really'} ||= '=begin';
+ $para->[1]{'~ignore'} = (! $dont_ignore) || 0;
+ $para->[1]{'~resolve'} = $to_resolve || 0;
+
+ DEBUG > 1 and print " Making note to ", $dont_ignore ? 'not ' : '',
+ "ignore contents of this region\n";
+ DEBUG > 1 and $dont_ignore and print " Making note to treat contents as ",
+ ($to_resolve ? 'verbatim/plain' : 'data'), " paragraphs\n";
+ DEBUG > 1 and print " (Stack now: ", $self->_dump_curr_open(), ")\n";
+
+ push @$curr_open, $para;
+ if(!$dont_ignore or scalar grep $_->[1]{'~ignore'}, @$curr_open) {
+ DEBUG > 1 and print "Ignoring ignorable =begin\n";
+ } else {
+ $self->{'content_seen'} ||= 1;
+ $self->_handle_element_start((my $scratch='for'), $para->[1]);
+ }
+
+ return 1;
+}
+
+sub _ponder_end {
+ my ($self,$para,$curr_open,$paras) = @_;
+ my $content = join ' ', splice @$para, 2;
+ $content =~ s/^\s+//s;
+ $content =~ s/\s+$//s;
+ DEBUG and print "Ogling '=end $content' directive\n";
+
+ unless(length($content)) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "'=end' without a target?" . (
+ ( @$curr_open and $curr_open->[-1][0] eq '=for' )
+ ? ( " (Should be \"=end " . $curr_open->[-1][1]{'target'} . '")' )
+ : ''
+ )
+ );
+ DEBUG and print "Ignoring targetless =end\n";
+ return 1;
+ }
+
+ unless($content =~ m/^\S+$/) { # i.e., unless it's one word
+ $self->whine(
+ $para->[1]{'start_line'},
+ "'=end $content' is invalid. (Stack: "
+ . $self->_dump_curr_open() . ')'
+ );
+ DEBUG and print "Ignoring mistargetted =end $content\n";
+ return 1;
+ }
+
+ unless(@$curr_open and $curr_open->[-1][0] eq '=for') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=end $content without matching =begin. (Stack: "
+ . $self->_dump_curr_open() . ')'
+ );
+ DEBUG and print "Ignoring mistargetted =end $content\n";
+ return 1;
+ }
+
+ unless($content eq $curr_open->[-1][1]{'target'}) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=end $content doesn't match =begin "
+ . $curr_open->[-1][1]{'target'}
+ . ". (Stack: "
+ . $self->_dump_curr_open() . ')'
+ );
+ DEBUG and print "Ignoring mistargetted =end $content at line $para->[1]{'start_line'}\n";
+ return 1;
+ }
+
+ # Else it's okay to close...
+ if(grep $_->[1]{'~ignore'}, @$curr_open) {
+ DEBUG > 1 and print "Not firing any event for this =end $content because in an ignored region\n";
+ # And that may be because of this to-be-closed =for region, or some
+ # other one, but it doesn't matter.
+ } else {
+ $curr_open->[-1][1]{'start_line'} = $para->[1]{'start_line'};
+ # what's that for?
+
+ $self->{'content_seen'} ||= 1;
+ $self->_handle_element_end( my $scratch = 'for' );
+ }
+ DEBUG > 1 and print "Popping $curr_open->[-1][0] $curr_open->[-1][1]{'target'} because of =end $content\n";
+ pop @$curr_open;
+
+ return 1;
+}
+
+sub _ponder_doc_end {
+ my ($self,$para,$curr_open,$paras) = @_;
+ if(@$curr_open) { # Deal with things left open
+ DEBUG and print "Stack is nonempty at end-document: (",
+ $self->_dump_curr_open(), ")\n";
+
+ DEBUG > 9 and print "Stack: ", pretty($curr_open), "\n";
+ unshift @$paras, $self->_closers_for_all_curr_open;
+ # Make sure there is exactly one ~end in the parastack, at the end:
+ @$paras = grep $_->[0] ne '~end', @$paras;
+ push @$paras, $para, $para;
+ # We need two -- once for the next cycle where we
+ # generate errata, and then another to be at the end
+ # when that loop back around to process the errata.
+ return 1;
+
+ } else {
+ DEBUG and print "Okay, stack is empty now.\n";
+ }
+
+ # Try generating errata section, if applicable
+ unless($self->{'~tried_gen_errata'}) {
+ $self->{'~tried_gen_errata'} = 1;
+ my @extras = $self->_gen_errata();
+ if(@extras) {
+ unshift @$paras, @extras;
+ DEBUG and print "Generated errata... relooping...\n";
+ return 1; # I.e., loop around again to process these fake-o paragraphs
+ }
+ }
+
+ splice @$paras; # Well, that's that for this paragraph buffer.
+ DEBUG and print "Throwing end-document event.\n";
+
+ $self->_handle_element_end( my $scratch = 'Document' );
+ return 1; # Hasta la byebye
+}
+
+sub _ponder_pod {
+ my ($self,$para,$curr_open,$paras) = @_;
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=pod directives shouldn't be over one line long! Ignoring all "
+ . (@$para - 2) . " lines of content"
+ ) if @$para > 3;
+ # Content is always ignored.
+ return;
+}
+
+sub _ponder_over {
+ my ($self,$para,$curr_open,$paras) = @_;
+ return 1 unless @$paras;
+ my $list_type;
+
+ if($paras->[0][0] eq '=item') { # most common case
+ $list_type = $self->_get_initial_item_type($paras->[0]);
+
+ } elsif($paras->[0][0] eq '=back') {
+ # Ignore empty lists. TODO: make this an option?
+ shift @$paras;
+ return 1;
+
+ } elsif($paras->[0][0] eq '~end') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=over is the last thing in the document?!"
+ );
+ return 1; # But feh, ignore it.
+ } else {
+ $list_type = 'block';
+ }
+ $para->[1]{'~type'} = $list_type;
+ push @$curr_open, $para;
+ # yes, we reuse the paragraph as a stack item
+
+ my $content = join ' ', splice @$para, 2;
+ my $overness;
+ if($content =~ m/^\s*$/s) {
+ $para->[1]{'indent'} = 4;
+ } elsif($content =~ m/^\s*((?:\d*\.)?\d+)\s*$/s) {
+ no integer;
+ $para->[1]{'indent'} = $1;
+ if($1 == 0) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Can't have a 0 in =over $content"
+ );
+ $para->[1]{'indent'} = 4;
+ }
+ } else {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=over should be: '=over' or '=over positive_number'"
+ );
+ $para->[1]{'indent'} = 4;
+ }
+ DEBUG > 1 and print "=over found of type $list_type\n";
+
+ $self->{'content_seen'} ||= 1;
+ $self->_handle_element_start((my $scratch = 'over-' . $list_type), $para->[1]);
+
+ return;
+}
+
+sub _ponder_back {
+ my ($self,$para,$curr_open,$paras) = @_;
+ # TODO: fire off </item-number> or </item-bullet> or </item-text> ??
+
+ my $content = join ' ', splice @$para, 2;
+ if($content =~ m/\S/) {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "=back doesn't take any parameters, but you said =back $content"
+ );
+ }
+
+ if(@$curr_open and $curr_open->[-1][0] eq '=over') {
+ DEBUG > 1 and print "=back happily closes matching =over\n";
+ # Expected case: we're closing the most recently opened thing
+ #my $over = pop @$curr_open;
+ $self->{'content_seen'} ||= 1;
+ $self->_handle_element_end( my $scratch =
+ 'over-' . ( (pop @$curr_open)->[1]{'~type'} )
+ );
+ } else {
+ DEBUG > 1 and print "=back found without a matching =over. Stack: (",
+ join(', ', map $_->[0], @$curr_open), ").\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ '=back without =over'
+ );
+ return 1; # and ignore it
+ }
+}
+
+sub _ponder_item {
+ my ($self,$para,$curr_open,$paras) = @_;
+ my $over;
+ unless(@$curr_open and ($over = $curr_open->[-1])->[0] eq '=over') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "'=item' outside of any '=over'"
+ );
+ unshift @$paras,
+ ['=over', {'start_line' => $para->[1]{'start_line'}}, ''],
+ $para
+ ;
+ return 1;
+ }
+
+
+ my $over_type = $over->[1]{'~type'};
+
+ if(!$over_type) {
+ # Shouldn't happen1
+ die "Typeless over in stack, starting at line "
+ . $over->[1]{'start_line'};
+
+ } elsif($over_type eq 'block') {
+ unless($curr_open->[-1][1]{'~bitched_about'}) {
+ $curr_open->[-1][1]{'~bitched_about'} = 1;
+ $self->whine(
+ $curr_open->[-1][1]{'start_line'},
+ "You can't have =items (as at line "
+ . $para->[1]{'start_line'}
+ . ") unless the first thing after the =over is an =item"
+ );
+ }
+ # Just turn it into a paragraph and reconsider it
+ $para->[0] = '~Para';
+ unshift @$paras, $para;
+ return 1;
+
+ } elsif($over_type eq 'text') {
+ my $item_type = $self->_get_item_type($para);
+ # That kills the content of the item if it's a number or bullet.
+ DEBUG and print " Item is of type ", $para->[0], " under $over_type\n";
+
+ if($item_type eq 'text') {
+ # Nothing special needs doing for 'text'
+ } elsif($item_type eq 'number' or $item_type eq 'bullet') {
+ die "Unknown item type $item_type"
+ unless $item_type eq 'number' or $item_type eq 'bullet';
+ # Undo our clobbering:
+ push @$para, $para->[1]{'~orig_content'};
+ delete $para->[1]{'number'};
+ # Only a PROPER item-number element is allowed
+ # to have a number attribute.
+ } else {
+ die "Unhandled item type $item_type"; # should never happen
+ }
+
+ # =item-text thingies don't need any assimilation, it seems.
+
+ } elsif($over_type eq 'number') {
+ my $item_type = $self->_get_item_type($para);
+ # That kills the content of the item if it's a number or bullet.
+ DEBUG and print " Item is of type ", $para->[0], " under $over_type\n";
+
+ my $expected_value = ++ $curr_open->[-1][1]{'~counter'};
+
+ if($item_type eq 'bullet') {
+ # Hm, it's not numeric. Correct for this.
+ $para->[1]{'number'} = $expected_value;
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item $expected_value'"
+ );
+ push @$para, $para->[1]{'~orig_content'};
+ # restore the bullet, blocking the assimilation of next para
+
+ } elsif($item_type eq 'text') {
+ # Hm, it's not numeric. Correct for this.
+ $para->[1]{'number'} = $expected_value;
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item $expected_value'"
+ );
+ # Text content will still be there and will block next ~Para
+
+ } elsif($item_type ne 'number') {
+ die "Unknown item type $item_type"; # should never happen
+
+ } elsif($expected_value == $para->[1]{'number'}) {
+ DEBUG > 1 and print " Numeric item has the expected value of $expected_value\n";
+
+ } else {
+ DEBUG > 1 and print " Numeric item has ", $para->[1]{'number'},
+ " instead of the expected value of $expected_value\n";
+ $self->whine(
+ $para->[1]{'start_line'},
+ "You have '=item " . $para->[1]{'number'} .
+ "' instead of the expected '=item $expected_value'"
+ );
+ $para->[1]{'number'} = $expected_value; # correcting!!
+ }
+
+ if(@$para == 2) {
+ # For the cases where we /didn't/ push to @$para
+ if($paras->[0][0] eq '~Para') {
+ DEBUG and print "Assimilating following ~Para content into $over_type item\n";
+ push @$para, splice @{shift @$paras},2;
+ } else {
+ DEBUG and print "Can't assimilate following ", $paras->[0][0], "\n";
+ push @$para, ''; # Just so it's not contentless
+ }
+ }
+
+
+ } elsif($over_type eq 'bullet') {
+ my $item_type = $self->_get_item_type($para);
+ # That kills the content of the item if it's a number or bullet.
+ DEBUG and print " Item is of type ", $para->[0], " under $over_type\n";
+
+ if($item_type eq 'bullet') {
+ # as expected!
+
+ if( $para->[1]{'~_freaky_para_hack'} ) {
+ DEBUG and print "Accomodating '=item * Foo' tolerance hack.\n";
+ push @$para, delete $para->[1]{'~_freaky_para_hack'};
+ }
+
+ } elsif($item_type eq 'number') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item *'"
+ );
+ push @$para, $para->[1]{'~orig_content'};
+ # and block assimilation of the next paragraph
+ delete $para->[1]{'number'};
+ # Only a PROPER item-number element is allowed
+ # to have a number attribute.
+ } elsif($item_type eq 'text') {
+ $self->whine(
+ $para->[1]{'start_line'},
+ "Expected '=item *'"
+ );
+ # But doesn't need processing. But it'll block assimilation
+ # of the next para.
+ } else {
+ die "Unhandled item type $item_type"; # should never happen
+ }
+
+ if(@$para == 2) {
+ # For the cases where we /didn't/ push to @$para
+ if($paras->[0][0] eq '~Para') {
+ DEBUG and print "Assimilating following ~Para content into $over_type item\n";
+ push @$para, splice @{shift @$paras},2;
+ } else {
+ DEBUG and print "Can't assimilate following ", $paras->[0][0], "\n";
+ push @$para, ''; # Just so it's not contentless
+ }
+ }
+
+ } else {
+ die "Unhandled =over type \"$over_type\"?";
+ # Shouldn't happen!
+ }
+ $para->[0] .= '-' . $over_type;
+
+ return;
+}
+
+sub _ponder_Plain {
+ my ($self,$para) = @_;
+ DEBUG and print " giving plain treatment...\n";
+ unless( @$para == 2 or ( @$para == 3 and $para->[2] eq '' )
+ or $para->[1]{'~cooked'}
+ ) {
+ push @$para,
+ @{$self->_make_treelet(
+ join("\n", splice(@$para, 2)),
+ $para->[1]{'start_line'}
+ )};
+ }
+ # Empty paragraphs don't need a treelet for any reason I can see.
+ # And precooked paragraphs already have a treelet.
+ return;
+}
+
+sub _ponder_Verbatim {
+ my ($self,$para) = @_;
+ DEBUG and print " giving verbatim treatment...\n";
+
+ $para->[1]{'xml:space'} = 'preserve';
+
+ my $indent = $self->strip_verbatim_indent;
+ if ($indent && ref $indent eq 'CODE') {
+ my @shifted = (shift @{$para}, shift @{$para});
+ $indent = $indent->($para);
+ unshift @{$para}, @shifted;
+ }
+
+ for(my $i = 2; $i < @$para; $i++) {
+ foreach my $line ($para->[$i]) { # just for aliasing
+ # Strip indentation.
+ $line =~ s/^\E$indent// if $indent
+ && !($self->{accept_codes} && $self->{accept_codes}{VerbatimFormatted});
+ while( $line =~
+ # Sort of adapted from Text::Tabs -- yes, it's hardwired in that
+ # tabs are at every EIGHTH column. For portability, it has to be
+ # one setting everywhere, and 8th wins.
+ s/^([^\t]*)(\t+)/$1.(" " x ((length($2)<<3)-(length($1)&7)))/e
+ ) {}
+
+ # TODO: whinge about (or otherwise treat) unindented or overlong lines
+
+ }
+ }
+
+ # Now the VerbatimFormatted hoodoo...
+ if( $self->{'accept_codes'} and
+ $self->{'accept_codes'}{'VerbatimFormatted'}
+ ) {
+ while(@$para > 3 and $para->[-1] !~ m/\S/) { pop @$para }
+ # Kill any number of terminal newlines
+ $self->_verbatim_format($para);
+ } elsif ($self->{'codes_in_verbatim'}) {
+ push @$para,
+ @{$self->_make_treelet(
+ join("\n", splice(@$para, 2)),
+ $para->[1]{'start_line'}, $para->[1]{'xml:space'}
+ )};
+ $para->[-1] =~ s/\n+$//s; # Kill any number of terminal newlines
+ } else {
+ push @$para, join "\n", splice(@$para, 2) if @$para > 3;
+ $para->[-1] =~ s/\n+$//s; # Kill any number of terminal newlines
+ }
+ return;
+}
+
+sub _ponder_Data {
+ my ($self,$para) = @_;
+ DEBUG and print " giving data treatment...\n";
+ $para->[1]{'xml:space'} = 'preserve';
+ push @$para, join "\n", splice(@$para, 2) if @$para > 3;
+ return;
+}
+
+
+
+
+###########################################################################
+
+sub _traverse_treelet_bit { # for use only by the routine above
+ my($self, $name) = splice @_,0,2;
+
+ my $scratch;
+ $self->_handle_element_start(($scratch=$name), shift @_);
+
+ foreach my $x (@_) {
+ if(ref($x)) {
+ &_traverse_treelet_bit($self, @$x);
+ } else {
+ $self->_handle_text($x);
+ }
+ }
+
+ $self->_handle_element_end($scratch=$name);
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _closers_for_all_curr_open {
+ my $self = $_[0];
+ my @closers;
+ foreach my $still_open (@{ $self->{'curr_open'} || return }) {
+ my @copy = @$still_open;
+ $copy[1] = {%{ $copy[1] }};
+ #$copy[1]{'start_line'} = -1;
+ if($copy[0] eq '=for') {
+ $copy[0] = '=end';
+ } elsif($copy[0] eq '=over') {
+ $copy[0] = '=back';
+ } else {
+ die "I don't know how to auto-close an open $copy[0] region";
+ }
+
+ unless( @copy > 2 ) {
+ push @copy, $copy[1]{'target'};
+ $copy[-1] = '' unless defined $copy[-1];
+ # since =over's don't have targets
+ }
+
+ DEBUG and print "Queuing up fake-o event: ", pretty(\@copy), "\n";
+ unshift @closers, \@copy;
+ }
+ return @closers;
+}
+
+#--------------------------------------------------------------------------
+
+sub _verbatim_format {
+ my($it, $p) = @_;
+
+ my $formatting;
+
+ for(my $i = 2; $i < @$p; $i++) { # work backwards over the lines
+ DEBUG and print "_verbatim_format appends a newline to $i: $p->[$i]\n";
+ $p->[$i] .= "\n";
+ # Unlike with simple Verbatim blocks, we don't end up just doing
+ # a join("\n", ...) on the contents, so we have to append a
+ # newline to ever line, and then nix the last one later.
+ }
+
+ if( DEBUG > 4 ) {
+ print "<<\n";
+ for(my $i = $#$p; $i >= 2; $i--) { # work backwards over the lines
+ print "_verbatim_format $i: $p->[$i]";
+ }
+ print ">>\n";
+ }
+
+ for(my $i = $#$p; $i > 2; $i--) {
+ # work backwards over the lines, except the first (#2)
+
+ #next unless $p->[$i] =~ m{^#:([ \^\/\%]*)\n?$}s
+ # and $p->[$i-1] !~ m{^#:[ \^\/\%]*\n?$}s;
+ # look at a formatty line preceding a nonformatty one
+ DEBUG > 5 and print "Scrutinizing line $i: $$p[$i]\n";
+ if($p->[$i] =~ m{^#:([ \^\/\%]*)\n?$}s) {
+ DEBUG > 5 and print " It's a formatty line. ",
+ "Peeking at previous line ", $i-1, ": $$p[$i-1]: \n";
+
+ if( $p->[$i-1] =~ m{^#:[ \^\/\%]*\n?$}s ) {
+ DEBUG > 5 and print " Previous line is formatty! Skipping this one.\n";
+ next;
+ } else {
+ DEBUG > 5 and print " Previous line is non-formatty! Yay!\n";
+ }
+ } else {
+ DEBUG > 5 and print " It's not a formatty line. Ignoring\n";
+ next;
+ }
+
+ # A formatty line has to have #: in the first two columns, and uses
+ # "^" to mean bold, "/" to mean underline, and "%" to mean bold italic.
+ # Example:
+ # What do you want? i like pie. [or whatever]
+ # #:^^^^^^^^^^^^^^^^^ /////////////
+
+
+ DEBUG > 4 and print "_verbatim_format considers:\n<$p->[$i-1]>\n<$p->[$i]>\n";
+
+ $formatting = ' ' . $1;
+ $formatting =~ s/\s+$//s; # nix trailing whitespace
+ unless(length $formatting and $p->[$i-1] =~ m/\S/) { # no-op
+ splice @$p,$i,1; # remove this line
+ $i--; # don't consider next line
+ next;
+ }
+
+ if( length($formatting) >= length($p->[$i-1]) ) {
+ $formatting = substr($formatting, 0, length($p->[$i-1]) - 1) . ' ';
+ } else {
+ $formatting .= ' ' x (length($p->[$i-1]) - length($formatting));
+ }
+ # Make $formatting and the previous line be exactly the same length,
+ # with $formatting having a " " as the last character.
+
+ DEBUG > 4 and print "Formatting <$formatting> on <", $p->[$i-1], ">\n";
+
+
+ my @new_line;
+ while( $formatting =~ m{\G(( +)|(\^+)|(\/+)|(\%+))}g ) {
+ #print "Format matches $1\n";
+
+ if($2) {
+ #print "SKIPPING <$2>\n";
+ push @new_line,
+ substr($p->[$i-1], pos($formatting)-length($1), length($1));
+ } else {
+ #print "SNARING $+\n";
+ push @new_line, [
+ (
+ $3 ? 'VerbatimB' :
+ $4 ? 'VerbatimI' :
+ $5 ? 'VerbatimBI' : die("Should never get called")
+ ), {},
+ substr($p->[$i-1], pos($formatting)-length($1), length($1))
+ ];
+ #print "Formatting <$new_line[-1][-1]> as $new_line[-1][0]\n";
+ }
+ }
+ my @nixed =
+ splice @$p, $i-1, 2, @new_line; # replace myself and the next line
+ DEBUG > 10 and print "Nixed count: ", scalar(@nixed), "\n";
+
+ DEBUG > 6 and print "New version of the above line is these tokens (",
+ scalar(@new_line), "):",
+ map( ref($_)?"<@$_> ":"<$_>", @new_line ), "\n";
+ $i--; # So the next line we scrutinize is the line before the one
+ # that we just went and formatted
+ }
+
+ $p->[0] = 'VerbatimFormatted';
+
+ # Collapse adjacent text nodes, just for kicks.
+ for( my $i = 2; $i > $#$p; $i++ ) { # work forwards over the tokens except for the last
+ if( !ref($p->[$i]) and !ref($p->[$i + 1]) ) {
+ DEBUG > 5 and print "_verbatim_format merges {$p->[$i]} and {$p->[$i+1]}\n";
+ $p->[$i] .= splice @$p, $i+1, 1; # merge
+ --$i; # and back up
+ }
+ }
+
+ # Now look for the last text token, and remove the terminal newline
+ for( my $i = $#$p; $i >= 2; $i-- ) {
+ # work backwards over the tokens, even the first
+ if( !ref($p->[$i]) ) {
+ if($p->[$i] =~ s/\n$//s) {
+ DEBUG > 5 and print "_verbatim_format killed the terminal newline on #$i: {$p->[$i]}, after {$p->[$i-1]}\n";
+ } else {
+ DEBUG > 5 and print
+ "No terminal newline on #$i: {$p->[$i]}, after {$p->[$i-1]} !?\n";
+ }
+ last; # we only want the next one
+ }
+ }
+
+ return;
+}
+
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+
+sub _treelet_from_formatting_codes {
+ # Given a paragraph, returns a treelet. Full of scary tokenizing code.
+ # Like [ '~Top', {'start_line' => $start_line},
+ # "I like ",
+ # [ 'B', {}, "pie" ],
+ # "!"
+ # ]
+
+ my($self, $para, $start_line, $preserve_space) = @_;
+
+ my $treelet = ['~Top', {'start_line' => $start_line},];
+
+ unless ($preserve_space || $self->{'preserve_whitespace'}) {
+ $para =~ s/\s+/ /g; # collapse and trim all whitespace first.
+ $para =~ s/ $//;
+ $para =~ s/^ //;
+ }
+
+ # Only apparent problem the above code is that N<< >> turns into
+ # N<< >>. But then, word wrapping does that too! So don't do that!
+
+ my @stack;
+ my @lineage = ($treelet);
+
+ DEBUG > 4 and print "Paragraph:\n$para\n\n";
+
+ # Here begins our frightening tokenizer RE. The following regex matches
+ # text in four main parts:
+ #
+ # * Start-codes. The first alternative matches C< or C<<, the latter
+ # followed by some whitespace. $1 will hold the entire start code
+ # (including any space following a multiple-angle-bracket delimiter),
+ # and $2 will hold only the additional brackets past the first in a
+ # multiple-bracket delimiter. length($2) + 1 will be the number of
+ # closing brackets we have to find.
+ #
+ # * Closing brackets. Match some amount of whitespace followed by
+ # multiple close brackets. The logic to see if this closes anything
+ # is down below. Note that in order to parse C<< >> correctly, we
+ # have to use look-behind (?<=\s\s), since the match of the starting
+ # code will have consumed the whitespace.
+ #
+ # * A single closing bracket, to close a simple code like C<>.
+ #
+ # * Something that isn't a start or end code. We have to be careful
+ # about accepting whitespace, since perlpodspec says that any whitespace
+ # before a multiple-bracket closing delimiter should be ignored.
+ #
+ while($para =~
+ m/\G
+ (?:
+ # Match starting codes, including the whitespace following a
+ # multiple-delimiter start code. $1 gets the whole start code and
+ # $2 gets all but one of the <s in the multiple-bracket case.
+ ([A-Z]<(?:(<+)\s+)?)
+ |
+ # Match multiple-bracket end codes. $3 gets the whitespace that
+ # should be discarded before an end bracket but kept in other cases
+ # and $4 gets the end brackets themselves.
+ (\s+|(?<=\s\s))(>{2,})
+ |
+ (\s?>) # $5: simple end-codes
+ |
+ ( # $6: stuff containing no start-codes or end-codes
+ (?:
+ [^A-Z\s>]
+ |
+ (?:
+ [A-Z](?!<)
+ )
+ |
+ # whitespace is ok, but we don't want to eat the whitespace before
+ # a multiple-bracket end code.
+ # NOTE: we may still have problems with e.g. S<< >>
+ (?:
+ \s(?!\s*>{2,})
+ )
+ )+
+ )
+ )
+ /xgo
+ ) {
+ DEBUG > 4 and print "\nParagraphic tokenstack = (@stack)\n";
+ if(defined $1) {
+ if(defined $2) {
+ DEBUG > 3 and print "Found complex start-text code \"$1\"\n";
+ push @stack, length($2) + 1;
+ # length of the necessary complex end-code string
+ } else {
+ DEBUG > 3 and print "Found simple start-text code \"$1\"\n";
+ push @stack, 0; # signal that we're looking for simple
+ }
+ push @lineage, [ substr($1,0,1), {}, ]; # new node object
+ push @{ $lineage[-2] }, $lineage[-1];
+
+ } elsif(defined $4) {
+ DEBUG > 3 and print "Found apparent complex end-text code \"$3$4\"\n";
+ # This is where it gets messy...
+ if(! @stack) {
+ # We saw " >>>>" but needed nothing. This is ALL just stuff then.
+ DEBUG > 4 and print " But it's really just stuff.\n";
+ push @{ $lineage[-1] }, $3, $4;
+ next;
+ } elsif(!$stack[-1]) {
+ # We saw " >>>>" but needed only ">". Back pos up.
+ DEBUG > 4 and print " And that's more than we needed to close simple.\n";
+ push @{ $lineage[-1] }, $3; # That was a for-real space, too.
+ pos($para) = pos($para) - length($4) + 1;
+ } elsif($stack[-1] == length($4)) {
+ # We found " >>>>", and it was exactly what we needed. Commonest case.
+ DEBUG > 4 and print " And that's exactly what we needed to close complex.\n";
+ } elsif($stack[-1] < length($4)) {
+ # We saw " >>>>" but needed only " >>". Back pos up.
+ DEBUG > 4 and print " And that's more than we needed to close complex.\n";
+ pos($para) = pos($para) - length($4) + $stack[-1];
+ } else {
+ # We saw " >>>>" but needed " >>>>>>". So this is all just stuff!
+ DEBUG > 4 and print " But it's really just stuff, because we needed more.\n";
+ push @{ $lineage[-1] }, $3, $4;
+ next;
+ }
+ #print "\nHOOBOY ", scalar(@{$lineage[-1]}), "!!!\n";
+
+ push @{ $lineage[-1] }, '' if 2 == @{ $lineage[-1] };
+ # Keep the element from being childless
+
+ pop @stack;
+ pop @lineage;
+
+ } elsif(defined $5) {
+ DEBUG > 3 and print "Found apparent simple end-text code \"$5\"\n";
+
+ if(@stack and ! $stack[-1]) {
+ # We're indeed expecting a simple end-code
+ DEBUG > 4 and print " It's indeed an end-code.\n";
+
+ if(length($5) == 2) { # There was a space there: " >"
+ push @{ $lineage[-1] }, ' ';
+ } elsif( 2 == @{ $lineage[-1] } ) { # Closing a childless element
+ push @{ $lineage[-1] }, ''; # keep it from being really childless
+ }
+
+ pop @stack;
+ pop @lineage;
+ } else {
+ DEBUG > 4 and print " It's just stuff.\n";
+ push @{ $lineage[-1] }, $5;
+ }
+
+ } elsif(defined $6) {
+ DEBUG > 3 and print "Found stuff \"$6\"\n";
+ push @{ $lineage[-1] }, $6;
+
+ } else {
+ # should never ever ever ever happen
+ DEBUG and print "AYYAYAAAAA at line ", __LINE__, "\n";
+ die "SPORK 512512!";
+ }
+ }
+
+ if(@stack) { # Uhoh, some sequences weren't closed.
+ my $x= "...";
+ while(@stack) {
+ push @{ $lineage[-1] }, '' if 2 == @{ $lineage[-1] };
+ # Hmmmmm!
+
+ my $code = (pop @lineage)->[0];
+ my $ender_length = pop @stack;
+ if($ender_length) {
+ --$ender_length;
+ $x = $code . ("<" x $ender_length) . " $x " . (">" x $ender_length);
+ } else {
+ $x = $code . "<$x>";
+ }
+ }
+ DEBUG > 1 and print "Unterminated $x sequence\n";
+ $self->whine($start_line,
+ "Unterminated $x sequence",
+ );
+ }
+
+ return $treelet;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub text_content_of_treelet { # method: $parser->text_content_of_treelet($lol)
+ return stringify_lol($_[1]);
+}
+
+sub stringify_lol { # function: stringify_lol($lol)
+ my $string_form = '';
+ _stringify_lol( $_[0] => \$string_form );
+ return $string_form;
+}
+
+sub _stringify_lol { # the real recursor
+ my($lol, $to) = @_;
+ for(my $i = 2; $i < @$lol; ++$i) {
+ if( ref($lol->[$i] || '') and UNIVERSAL::isa($lol->[$i], 'ARRAY') ) {
+ _stringify_lol( $lol->[$i], $to); # recurse!
+ } else {
+ $$to .= $lol->[$i];
+ }
+ }
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _dump_curr_open { # return a string representation of the stack
+ my $curr_open = $_[0]{'curr_open'};
+
+ return '[empty]' unless @$curr_open;
+ return join '; ',
+ map {;
+ ($_->[0] eq '=for')
+ ? ( ($_->[1]{'~really'} || '=over')
+ . ' ' . $_->[1]{'target'})
+ : $_->[0]
+ }
+ @$curr_open
+ ;
+}
+
+###########################################################################
+my %pretty_form = (
+ "\a" => '\a', # ding!
+ "\b" => '\b', # BS
+ "\e" => '\e', # ESC
+ "\f" => '\f', # FF
+ "\t" => '\t', # tab
+ "\cm" => '\cm',
+ "\cj" => '\cj',
+ "\n" => '\n', # probably overrides one of either \cm or \cj
+ '"' => '\"',
+ '\\' => '\\\\',
+ '$' => '\\$',
+ '@' => '\\@',
+ '%' => '\\%',
+ '#' => '\\#',
+);
+
+sub pretty { # adopted from Class::Classless
+ # Not the most brilliant routine, but passable.
+ # Don't give it a cyclic data structure!
+ my @stuff = @_; # copy
+ my $x;
+ my $out =
+ # join ",\n" .
+ join ", ",
+ map {;
+ if(!defined($_)) {
+ "undef";
+ } elsif(ref($_) eq 'ARRAY' or ref($_) eq 'Pod::Simple::LinkSection') {
+ $x = "[ " . pretty(@$_) . " ]" ;
+ $x;
+ } elsif(ref($_) eq 'SCALAR') {
+ $x = "\\" . pretty($$_) ;
+ $x;
+ } elsif(ref($_) eq 'HASH') {
+ my $hr = $_;
+ $x = "{" . join(", ",
+ map(pretty($_) . '=>' . pretty($hr->{$_}),
+ sort keys %$hr ) ) . "}" ;
+ $x;
+ } elsif(!length($_)) { q{''} # empty string
+ } elsif(
+ $_ eq '0' # very common case
+ or(
+ m/^-?(?:[123456789]\d*|0)(?:\.\d+)?$/s
+ and $_ ne '-0' # the strange case that that RE lets thru
+ )
+ ) { $_;
+ } else {
+ if( chr(65) eq 'A' ) {
+ s<([^\x20\x21\x23\x27-\x3F\x41-\x5B\x5D-\x7E])>
+ #<$pretty_form{$1} || '\\x'.(unpack("H2",$1))>eg;
+ <$pretty_form{$1} || '\\x{'.sprintf("%x", ord($1)).'}'>eg;
+ } else {
+ # We're in some crazy non-ASCII world!
+ s<([^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])>
+ #<$pretty_form{$1} || '\\x'.(unpack("H2",$1))>eg;
+ <$pretty_form{$1} || '\\x{'.sprintf("%x", ord($1)).'}'>eg;
+ }
+ qq{"$_"};
+ }
+ } @stuff;
+ # $out =~ s/\n */ /g if length($out) < 75;
+ return $out;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+# A rather unsubtle method of blowing away all the state information
+# from a parser object so it can be reused. Provided as a utility for
+# backward compatibilty in Pod::Man, etc. but not recommended for
+# general use.
+
+sub reinit {
+ my $self = shift;
+ foreach (qw(source_dead source_filename doc_has_started
+start_of_pod_block content_seen last_was_blank paras curr_open
+line_count pod_para_count in_pod ~tried_gen_errata errata errors_seen
+Title)) {
+
+ delete $self->{$_};
+ }
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Checker.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Checker.pm
new file mode 100644
index 00000000000..26a60237236
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Checker.pm
@@ -0,0 +1,196 @@
+
+# A quite dimwitted pod2plaintext that need only know how to format whatever
+# text comes out of Pod::BlackBox's _gen_errata
+
+require 5;
+package Pod::Simple::Checker;
+use strict;
+use Carp ();
+use Pod::Simple::Methody ();
+use Pod::Simple ();
+use vars qw( @ISA $VERSION );
+$VERSION = '3.14';
+@ISA = ('Pod::Simple::Methody');
+BEGIN { *DEBUG = defined(&Pod::Simple::DEBUG)
+ ? \&Pod::Simple::DEBUG
+ : sub() {0}
+ }
+
+use Text::Wrap 98.112902 (); # was 2001.0131, but I don't think we need that
+$Text::Wrap::wrap = 'overflow';
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub any_errata_seen { # read-only accessor
+ return $_[1]->{'Errata_seen'};
+}
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ $new->nix_X_codes(1);
+ $new->nbsp_for_S(1);
+ $new->{'Thispara'} = '';
+ $new->{'Indent'} = 0;
+ $new->{'Indentstring'} = ' ';
+ $new->{'Errata_seen'} = 0;
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub handle_text { $_[0]{'Errata_seen'} and $_[0]{'Thispara'} .= $_[1] }
+
+sub start_Para { $_[0]{'Thispara'} = '' }
+
+sub start_head1 {
+ if($_[0]{'Errata_seen'}) {
+ $_[0]{'Thispara'} = '';
+ } else {
+ if($_[1]{'errata'}) { # start of errata!
+ $_[0]{'Errata_seen'} = 1;
+ $_[0]{'Thispara'} = $_[0]{'source_filename'} ?
+ "$_[0]{'source_filename'} -- " : ''
+ }
+ }
+}
+sub start_head2 { $_[0]{'Thispara'} = '' }
+sub start_head3 { $_[0]{'Thispara'} = '' }
+sub start_head4 { $_[0]{'Thispara'} = '' }
+
+sub start_Verbatim { $_[0]{'Thispara'} = '' }
+sub start_item_bullet { $_[0]{'Thispara'} = '* ' }
+sub start_item_number { $_[0]{'Thispara'} = "$_[1]{'number'}. " }
+sub start_item_text { $_[0]{'Thispara'} = '' }
+
+sub start_over_bullet { ++$_[0]{'Indent'} }
+sub start_over_number { ++$_[0]{'Indent'} }
+sub start_over_text { ++$_[0]{'Indent'} }
+sub start_over_block { ++$_[0]{'Indent'} }
+
+sub end_over_bullet { --$_[0]{'Indent'} }
+sub end_over_number { --$_[0]{'Indent'} }
+sub end_over_text { --$_[0]{'Indent'} }
+sub end_over_block { --$_[0]{'Indent'} }
+
+
+# . . . . . Now the actual formatters:
+
+sub end_head1 { $_[0]->emit_par(-4) }
+sub end_head2 { $_[0]->emit_par(-3) }
+sub end_head3 { $_[0]->emit_par(-2) }
+sub end_head4 { $_[0]->emit_par(-1) }
+sub end_Para { $_[0]->emit_par( 0) }
+sub end_item_bullet { $_[0]->emit_par( 0) }
+sub end_item_number { $_[0]->emit_par( 0) }
+sub end_item_text { $_[0]->emit_par(-2) }
+
+sub emit_par {
+ return unless $_[0]{'Errata_seen'};
+ my($self, $tweak_indent) = splice(@_,0,2);
+ my $indent = ' ' x ( 2 * $self->{'Indent'} + ($tweak_indent||0) );
+ # Yes, 'STRING' x NEGATIVE gives '', same as 'STRING' x 0
+
+ $self->{'Thispara'} =~ tr{\xAD}{}d if Pod::Simple::ASCII;
+ my $out = Text::Wrap::wrap($indent, $indent, $self->{'Thispara'} .= "\n");
+ $out =~ tr{\xA0}{ } if Pod::Simple::ASCII;
+ print {$self->{'output_fh'}} $out,
+ #"\n"
+ ;
+ $self->{'Thispara'} = '';
+
+ return;
+}
+
+# . . . . . . . . . . And then off by its lonesome:
+
+sub end_Verbatim {
+ return unless $_[0]{'Errata_seen'};
+ my $self = shift;
+ if(Pod::Simple::ASCII) {
+ $self->{'Thispara'} =~ tr{\xA0}{ };
+ $self->{'Thispara'} =~ tr{\xAD}{}d;
+ }
+
+ my $i = ' ' x ( 2 * $self->{'Indent'} + 4);
+
+ $self->{'Thispara'} =~ s/^/$i/mg;
+
+ print { $self->{'output_fh'} } '',
+ $self->{'Thispara'},
+ "\n\n"
+ ;
+ $self->{'Thispara'} = '';
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::Checker -- check the Pod syntax of a document
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::Checker -e \
+ "exit Pod::Simple::Checker->filter(shift)->any_errata_seen" \
+ thingy.pod
+
+=head1 DESCRIPTION
+
+This class is for checking the syntactic validity of Pod.
+It works by basically acting like a simple-minded version of
+L<Pod::Simple::Text> that formats only the "Pod Errors" section
+(if Pod::Simple even generates one for the given document).
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::Text>, L<Pod::Checker>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Debug.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Debug.pm
new file mode 100644
index 00000000000..1349be32cb6
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Debug.pm
@@ -0,0 +1,178 @@
+
+require 5;
+package Pod::Simple::Debug;
+use strict;
+use vars qw($VERSION );
+$VERSION = '3.14';
+
+sub import {
+ my($value,$variable);
+
+ if(@_ == 2) {
+ $value = $_[1];
+ } elsif(@_ == 3) {
+ ($variable, $value) = @_[1,2];
+
+ ($variable, $value) = ($value, $variable)
+ if defined $value and ref($value) eq 'SCALAR'
+ and not(defined $variable and ref($variable) eq 'SCALAR')
+ ; # tolerate getting it backwards
+
+ unless( defined $variable and ref($variable) eq 'SCALAR') {
+ require Carp;
+ Carp::croak("Usage:\n use Pod::Simple::Debug (NUMVAL)\nor"
+ . "\n use Pod::Simple::Debug (\\\$var, STARTNUMVAL)\nAborting");
+ }
+ } else {
+ require Carp;
+ Carp::croak("Usage:\n use Pod::Simple::Debug (NUMVAL)\nor"
+ . "\n use Pod::Simple::Debug (\\\$var, STARTNUMVAL)\nAborting");
+ }
+
+ if( defined &Pod::Simple::DEBUG ) {
+ require Carp;
+ Carp::croak("It's too late to call Pod::Simple::Debug -- "
+ . "Pod::Simple has already loaded\nAborting");
+ }
+
+ $value = 0 unless defined $value;
+
+ unless($value =~ m/^-?\d+$/) {
+ require Carp;
+ Carp::croak( "$value isn't a numeric value."
+ . "\nUsage:\n use Pod::Simple::Debug (NUMVAL)\nor"
+ . "\n use Pod::Simple::Debug (\\\$var, STARTNUMVAL)\nAborting");
+ }
+
+ if( defined $variable ) {
+ # make a not-really-constant
+ *Pod::Simple::DEBUG = sub () { $$variable } ;
+ $$variable = $value;
+ print "# Starting Pod::Simple::DEBUG = non-constant $variable with val $value\n";
+ } else {
+ *Pod::Simple::DEBUG = eval " sub () { $value } ";
+ print "# Starting Pod::Simple::DEBUG = $value\n";
+ }
+
+ require Pod::Simple;
+ return;
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::Debug -- put Pod::Simple into trace/debug mode
+
+=head1 SYNOPSIS
+
+ use Pod::Simple::Debug (5); # or some integer
+
+Or:
+
+ my $debuglevel;
+ use Pod::Simple::Debug (\$debuglevel, 0);
+ ...some stuff that uses Pod::Simple to do stuff, but which
+ you don't want debug output from...
+
+ $debug_level = 4;
+ ...some stuff that uses Pod::Simple to do stuff, but which
+ you DO want debug output from...
+
+ $debug_level = 0;
+
+=head1 DESCRIPTION
+
+This is an internal module for controlling the debug level (a.k.a. trace
+level) of Pod::Simple. This is of interest only to Pod::Simple
+developers.
+
+
+=head1 CAVEATS
+
+Note that you should load this module I<before> loading Pod::Simple (or
+any Pod::Simple-based class). If you try loading Pod::Simple::Debug
+after &Pod::Simple::DEBUG is already defined, Pod::Simple::Debug will
+throw a fatal error to the effect that
+"it's s too late to call Pod::Simple::Debug".
+
+Note that the C<use Pod::Simple::Debug (\$x, I<somenum>)> mode will make
+Pod::Simple (et al) run rather slower, since &Pod::Simple::DEBUG won't
+be a constant sub anymore, and so Pod::Simple (et al) won't compile with
+constant-folding.
+
+
+=head1 GUTS
+
+Doing this:
+
+ use Pod::Simple::Debug (5); # or some integer
+
+is basically equivalent to:
+
+ BEGIN { sub Pod::Simple::DEBUG () {5} } # or some integer
+ use Pod::Simple ();
+
+And this:
+
+ use Pod::Simple::Debug (\$debug_level,0); # or some integer
+
+is basically equivalent to this:
+
+ my $debug_level;
+ BEGIN { $debug_level = 0 }
+ BEGIN { sub Pod::Simple::DEBUG () { $debug_level }
+ use Pod::Simple ();
+
+=head1 SEE ALSO
+
+L<Pod::Simple>
+
+The article "Constants in Perl", in I<The Perl Journal> issue
+21. See L<http://interglacial.com/tpj/21/>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsText.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsText.pm
new file mode 100644
index 00000000000..91554341e35
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsText.pm
@@ -0,0 +1,155 @@
+
+require 5;
+package Pod::Simple::DumpAsText;
+$VERSION = '3.14';
+use Pod::Simple ();
+BEGIN {@ISA = ('Pod::Simple')}
+
+use strict;
+
+use Carp ();
+
+BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG }
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ $new->accept_codes('VerbatimFormatted');
+ return $new;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _handle_element_start {
+ # ($self, $element_name, $attr_hash_r)
+ my $fh = $_[0]{'output_fh'};
+ my($key, $value);
+ DEBUG and print "++ $_[1]\n";
+
+ print $fh ' ' x ($_[0]{'indent'} || 0), "++", $_[1], "\n";
+ $_[0]{'indent'}++;
+ while(($key,$value) = each %{$_[2]}) {
+ unless($key =~ m/^~/s) {
+ next if $key eq 'start_line' and $_[0]{'hide_line_numbers'};
+ _perly_escape($key);
+ _perly_escape($value);
+ printf $fh qq{%s \\ "%s" => "%s"\n},
+ ' ' x ($_[0]{'indent'} || 0), $key, $value;
+ }
+ }
+ return;
+}
+
+sub _handle_text {
+ DEBUG and print "== \"$_[1]\"\n";
+
+ if(length $_[1]) {
+ my $indent = ' ' x $_[0]{'indent'};
+ my $text = $_[1];
+ _perly_escape($text);
+ $text =~ # A not-totally-brilliant wrapping algorithm:
+ s/(
+ [^\n]{55} # Snare some characters from a line
+ [^\n\ ]{0,50} # and finish any current word
+ )
+ \x20{1,10}(?!\n) # capture some spaces not at line-end
+ /$1"\n$indent . "/gx # => line-break here
+ ;
+
+ print {$_[0]{'output_fh'}} $indent, '* "', $text, "\"\n";
+ }
+ return;
+}
+
+sub _handle_element_end {
+ DEBUG and print "-- $_[1]\n";
+ print {$_[0]{'output_fh'}}
+ ' ' x --$_[0]{'indent'}, "--", $_[1], "\n";
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub _perly_escape {
+ foreach my $x (@_) {
+ $x =~ s/([^\x00-\xFF])/sprintf'\x{%X}',ord($1)/eg;
+ # Escape things very cautiously:
+ $x =~ s/([^-\n\t \&\<\>\'!\#\%\(\)\*\+,\.\/\:\;=\?\~\[\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/sprintf'\x%02X',ord($1)/eg;
+ }
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::DumpAsText -- dump Pod-parsing events as text
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::DumpAsText -e \
+ "exit Pod::Simple::DumpAsText->filter(shift)->any_errata_seen" \
+ thingy.pod
+
+=head1 DESCRIPTION
+
+This class is for dumping, as text, the events gotten from parsing a Pod
+document. This class is of interest to people writing Pod formatters
+based on Pod::Simple. It is useful for seeing exactly what events you
+get out of some Pod that you feed in.
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+=head1 SEE ALSO
+
+L<Pod::Simple::DumpAsXML>
+
+L<Pod::Simple>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsXML.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsXML.pm
new file mode 100644
index 00000000000..d83f8d33f55
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/DumpAsXML.pm
@@ -0,0 +1,170 @@
+
+require 5;
+package Pod::Simple::DumpAsXML;
+$VERSION = '3.14';
+use Pod::Simple ();
+BEGIN {@ISA = ('Pod::Simple')}
+
+use strict;
+
+use Carp ();
+
+BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG }
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ $new->accept_codes('VerbatimFormatted');
+ return $new;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _handle_element_start {
+ # ($self, $element_name, $attr_hash_r)
+ my $fh = $_[0]{'output_fh'};
+ my($key, $value);
+ DEBUG and print "++ $_[1]\n";
+
+ print $fh ' ' x ($_[0]{'indent'} || 0), "<", $_[1];
+
+ foreach my $key (sort keys %{$_[2]}) {
+ unless($key =~ m/^~/s) {
+ next if $key eq 'start_line' and $_[0]{'hide_line_numbers'};
+ _xml_escape($value = $_[2]{$key});
+ print $fh ' ', $key, '="', $value, '"';
+ }
+ }
+
+
+ print $fh ">\n";
+ $_[0]{'indent'}++;
+ return;
+}
+
+sub _handle_text {
+ DEBUG and print "== \"$_[1]\"\n";
+ if(length $_[1]) {
+ my $indent = ' ' x $_[0]{'indent'};
+ my $text = $_[1];
+ _xml_escape($text);
+ $text =~ # A not-totally-brilliant wrapping algorithm:
+ s/(
+ [^\n]{55} # Snare some characters from a line
+ [^\n\ ]{0,50} # and finish any current word
+ )
+ \x20{1,10}(?!\n) # capture some spaces not at line-end
+ /$1\n$indent/gx # => line-break here
+ ;
+
+ print {$_[0]{'output_fh'}} $indent, $text, "\n";
+ }
+ return;
+}
+
+sub _handle_element_end {
+ DEBUG and print "-- $_[1]\n";
+ print {$_[0]{'output_fh'}}
+ ' ' x --$_[0]{'indent'}, "</", $_[1], ">\n";
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub _xml_escape {
+ foreach my $x (@_) {
+ # Escape things very cautiously:
+ $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg;
+ # Yes, stipulate the list without a range, so that this can work right on
+ # all charsets that this module happens to run under.
+ # Altho, hmm, what about that ord? Presumably that won't work right
+ # under non-ASCII charsets. Something should be done about that.
+ }
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::DumpAsXML -- turn Pod into XML
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::DumpAsXML -e \
+ "exit Pod::Simple::DumpAsXML->filter(shift)->any_errata_seen" \
+ thingy.pod
+
+=head1 DESCRIPTION
+
+Pod::Simple::DumpAsXML is a subclass of L<Pod::Simple> that parses Pod
+and turns it into indented and wrapped XML. This class is of
+interest to people writing Pod formatters based on Pod::Simple.
+
+Pod::Simple::DumpAsXML inherits methods from
+L<Pod::Simple>.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple::XMLOutStream> is rather like this class.
+Pod::Simple::XMLOutStream's output is space-padded in a way
+that's better for sending to an XML processor (that is, it has
+no ignoreable whitespace). But
+Pod::Simple::DumpAsXML's output is much more human-readable, being
+(more-or-less) one token per line, with line-wrapping.
+
+L<Pod::Simple::DumpAsText> is rather like this class,
+except that it doesn't dump with XML syntax. Try them and see
+which one you like best!
+
+L<Pod::Simple>, L<Pod::Simple::DumpAsXML>
+
+The older libraries L<Pod::PXML>, L<Pod::XML>, L<Pod::SAX>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/HTML.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/HTML.pm
new file mode 100644
index 00000000000..b1a75cb4e39
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/HTML.pm
@@ -0,0 +1,978 @@
+
+require 5;
+package Pod::Simple::HTML;
+use strict;
+use Pod::Simple::PullParser ();
+use vars qw(
+ @ISA %Tagmap $Computerese $LamePad $Linearization_Limit $VERSION
+ $Perldoc_URL_Prefix $Perldoc_URL_Postfix $Man_URL_Prefix $Man_URL_Postfix
+ $Title_Prefix $Title_Postfix $HTML_EXTENSION %ToIndex
+ $Doctype_decl $Content_decl
+);
+@ISA = ('Pod::Simple::PullParser');
+$VERSION = '3.14';
+
+BEGIN {
+ if(defined &DEBUG) { } # no-op
+ elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG }
+ else { *DEBUG = sub () {0}; }
+}
+
+$Doctype_decl ||= ''; # No. Just No. Don't even ask me for it.
+ # qq{<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ # "http://www.w3.org/TR/html4/loose.dtd">\n};
+
+$Content_decl ||=
+ q{<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" >};
+
+$HTML_EXTENSION = '.html' unless defined $HTML_EXTENSION;
+$Computerese = "" unless defined $Computerese;
+$LamePad = '' unless defined $LamePad;
+
+$Linearization_Limit = 120 unless defined $Linearization_Limit;
+ # headings/items longer than that won't get an <a name="...">
+$Perldoc_URL_Prefix = 'http://search.cpan.org/perldoc?'
+ unless defined $Perldoc_URL_Prefix;
+$Perldoc_URL_Postfix = ''
+ unless defined $Perldoc_URL_Postfix;
+
+
+$Man_URL_Prefix = 'http://man.he.net/man';
+$Man_URL_Postfix = '';
+
+$Title_Prefix = '' unless defined $Title_Prefix;
+$Title_Postfix = '' unless defined $Title_Postfix;
+%ToIndex = map {; $_ => 1 } qw(head1 head2 head3 head4 ); # item-text
+ # 'item-text' stuff in the index doesn't quite work, and may
+ # not be a good idea anyhow.
+
+
+__PACKAGE__->_accessorize(
+ 'perldoc_url_prefix',
+ # In turning L<Foo::Bar> into http://whatever/Foo%3a%3aBar, what
+ # to put before the "Foo%3a%3aBar".
+ # (for singleton mode only?)
+ 'perldoc_url_postfix',
+ # what to put after "Foo%3a%3aBar" in the URL. Normally "".
+
+ 'man_url_prefix',
+ # In turning L<crontab(5)> into http://whatever/man/1/crontab, what
+ # to put before the "1/crontab".
+ 'man_url_postfix',
+ # what to put after the "1/crontab" in the URL. Normally "".
+
+ 'batch_mode', # whether we're in batch mode
+ 'batch_mode_current_level',
+ # When in batch mode, how deep the current module is: 1 for "LWP",
+ # 2 for "LWP::Procotol", 3 for "LWP::Protocol::GHTTP", etc
+
+ 'title_prefix', 'title_postfix',
+ # What to put before and after the title in the head.
+ # Should already be &-escaped
+
+ 'html_h_level',
+
+ 'html_header_before_title',
+ 'html_header_after_title',
+ 'html_footer',
+
+ 'index', # whether to add an index at the top of each page
+ # (actually it's a table-of-contents, but we'll call it an index,
+ # out of apparently longstanding habit)
+
+ 'html_css', # URL of CSS file to point to
+ 'html_javascript', # URL of CSS file to point to
+
+ 'force_title', # should already be &-escaped
+ 'default_title', # should already be &-escaped
+);
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+my @_to_accept;
+
+%Tagmap = (
+ 'Verbatim' => "\n<pre$Computerese>",
+ '/Verbatim' => "</pre>\n",
+ 'VerbatimFormatted' => "\n<pre$Computerese>",
+ '/VerbatimFormatted' => "</pre>\n",
+ 'VerbatimB' => "<b>",
+ '/VerbatimB' => "</b>",
+ 'VerbatimI' => "<i>",
+ '/VerbatimI' => "</i>",
+ 'VerbatimBI' => "<b><i>",
+ '/VerbatimBI' => "</i></b>",
+
+
+ 'Data' => "\n",
+ '/Data' => "\n",
+
+ 'head1' => "\n<h1>", # And also stick in an <a name="...">
+ 'head2' => "\n<h2>", # ''
+ 'head3' => "\n<h3>", # ''
+ 'head4' => "\n<h4>", # ''
+ '/head1' => "</a></h1>\n",
+ '/head2' => "</a></h2>\n",
+ '/head3' => "</a></h3>\n",
+ '/head4' => "</a></h4>\n",
+
+ 'X' => "<!--\n\tINDEX: ",
+ '/X' => "\n-->",
+
+ changes(qw(
+ Para=p
+ B=b I=i
+ over-bullet=ul
+ over-number=ol
+ over-text=dl
+ over-block=blockquote
+ item-bullet=li
+ item-number=li
+ item-text=dt
+ )),
+ changes2(
+ map {; m/^([-a-z]+)/s && push @_to_accept, $1; $_ }
+ qw[
+ sample=samp
+ definition=dfn
+ kbd=keyboard
+ variable=var
+ citation=cite
+ abbreviation=abbr
+ acronym=acronym
+ subscript=sub
+ superscript=sup
+ big=big
+ small=small
+ underline=u
+ strikethrough=s
+ ] # no point in providing a way to get <q>...</q>, I think
+ ),
+
+ '/item-bullet' => "</li>$LamePad\n",
+ '/item-number' => "</li>$LamePad\n",
+ '/item-text' => "</a></dt>$LamePad\n",
+ 'item-body' => "\n<dd>",
+ '/item-body' => "</dd>\n",
+
+
+ 'B' => "<b>", '/B' => "</b>",
+ 'I' => "<i>", '/I' => "</i>",
+ 'F' => "<em$Computerese>", '/F' => "</em>",
+ 'C' => "<code$Computerese>", '/C' => "</code>",
+ 'L' => "<a href='YOU_SHOULD_NEVER_SEE_THIS'>", # ideally never used!
+ '/L' => "</a>",
+);
+
+sub changes {
+ return map {; m/^([-_:0-9a-zA-Z]+)=([-_:0-9a-zA-Z]+)$/s
+ ? ( $1, => "\n<$2>", "/$1", => "</$2>\n" ) : die "Funky $_"
+ } @_;
+}
+sub changes2 {
+ return map {; m/^([-_:0-9a-zA-Z]+)=([-_:0-9a-zA-Z]+)$/s
+ ? ( $1, => "<$2>", "/$1", => "</$2>" ) : die "Funky $_"
+ } @_;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+sub go { Pod::Simple::HTML->parse_from_file(@ARGV); exit 0 }
+ # Just so we can run from the command line. No options.
+ # For that, use perldoc!
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub new {
+ my $new = shift->SUPER::new(@_);
+ #$new->nix_X_codes(1);
+ $new->nbsp_for_S(1);
+ $new->accept_targets( 'html', 'HTML' );
+ $new->accept_codes('VerbatimFormatted');
+ $new->accept_codes(@_to_accept);
+ DEBUG > 2 and print "To accept: ", join(' ',@_to_accept), "\n";
+
+ $new->perldoc_url_prefix( $Perldoc_URL_Prefix );
+ $new->perldoc_url_postfix( $Perldoc_URL_Postfix );
+ $new->man_url_prefix( $Man_URL_Prefix );
+ $new->man_url_postfix( $Man_URL_Postfix );
+ $new->title_prefix( $Title_Prefix );
+ $new->title_postfix( $Title_Postfix );
+
+ $new->html_header_before_title(
+ qq[$Doctype_decl<html><head><title>]
+ );
+ $new->html_header_after_title( join "\n" =>
+ "</title>",
+ $Content_decl,
+ "</head>\n<body class='pod'>",
+ $new->version_tag_comment,
+ "<!-- start doc -->\n",
+ );
+ $new->html_footer( qq[\n<!-- end doc -->\n\n</body></html>\n] );
+
+ $new->{'Tagmap'} = {%Tagmap};
+
+ return $new;
+}
+
+sub __adjust_html_h_levels {
+ my ($self) = @_;
+ my $Tagmap = $self->{'Tagmap'};
+
+ my $add = $self->html_h_level;
+ return unless defined $add;
+ return if ($self->{'Adjusted_html_h_levels'}||0) == $add;
+
+ $add -= 1;
+ for (1 .. 4) {
+ $Tagmap->{"head$_"} =~ s/$_/$_ + $add/e;
+ $Tagmap->{"/head$_"} =~ s/$_/$_ + $add/e;
+ }
+}
+
+sub batch_mode_page_object_init {
+ my($self, $batchconvobj, $module, $infile, $outfile, $depth) = @_;
+ DEBUG and print "Initting $self\n for $module\n",
+ " in $infile\n out $outfile\n depth $depth\n";
+ $self->batch_mode(1);
+ $self->batch_mode_current_level($depth);
+ return $self;
+}
+
+sub run {
+ my $self = $_[0];
+ return $self->do_middle if $self->bare_output;
+ return
+ $self->do_beginning && $self->do_middle && $self->do_end;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub do_beginning {
+ my $self = $_[0];
+
+ my $title;
+
+ if(defined $self->force_title) {
+ $title = $self->force_title;
+ DEBUG and print "Forcing title to be $title\n";
+ } else {
+ # Actually try looking for the title in the document:
+ $title = $self->get_short_title();
+ unless($self->content_seen) {
+ DEBUG and print "No content seen in search for title.\n";
+ return;
+ }
+ $self->{'Title'} = $title;
+
+ if(defined $title and $title =~ m/\S/) {
+ $title = $self->title_prefix . esc($title) . $self->title_postfix;
+ } else {
+ $title = $self->default_title;
+ $title = '' unless defined $title;
+ DEBUG and print "Title defaults to $title\n";
+ }
+ }
+
+
+ my $after = $self->html_header_after_title || '';
+ if($self->html_css) {
+ my $link =
+ $self->html_css =~ m/</
+ ? $self->html_css # It's a big blob of markup, let's drop it in
+ : sprintf( # It's just a URL, so let's wrap it up
+ qq[<link rel="stylesheet" type="text/css" title="pod_stylesheet" href="%s">\n],
+ $self->html_css,
+ );
+ $after =~ s{(</head>)}{$link\n$1}i; # otherwise nevermind
+ }
+ $self->_add_top_anchor(\$after);
+
+ if($self->html_javascript) {
+ my $link =
+ $self->html_javascript =~ m/</
+ ? $self->html_javascript # It's a big blob of markup, let's drop it in
+ : sprintf( # It's just a URL, so let's wrap it up
+ qq[<script type="text/javascript" src="%s"></script>\n],
+ $self->html_javascript,
+ );
+ $after =~ s{(</head>)}{$link\n$1}i; # otherwise nevermind
+ }
+
+ print {$self->{'output_fh'}}
+ $self->html_header_before_title || '',
+ $title, # already escaped
+ $after,
+ ;
+
+ DEBUG and print "Returning from do_beginning...\n";
+ return 1;
+}
+
+sub _add_top_anchor {
+ my($self, $text_r) = @_;
+ unless($$text_r and $$text_r =~ m/name=['"]___top['"]/) { # a hack
+ $$text_r .= "<a name='___top' class='dummyTopAnchor' ></a>\n";
+ }
+ return;
+}
+
+sub version_tag_comment {
+ my $self = shift;
+ return sprintf
+ "<!--\n generated by %s v%s,\n using %s v%s,\n under Perl v%s at %s GMT.\n\n %s\n\n-->\n",
+ esc(
+ ref($self), $self->VERSION(), $ISA[0], $ISA[0]->VERSION(),
+ $], scalar(gmtime),
+ ), $self->_modnote(),
+ ;
+}
+
+sub _modnote {
+ my $class = ref($_[0]) || $_[0];
+ return join "\n " => grep m/\S/, split "\n",
+
+qq{
+If you want to change this HTML document, you probably shouldn't do that
+by changing it directly. Instead, see about changing the calling options
+to $class, and/or subclassing $class,
+then reconverting this document from the Pod source.
+When in doubt, email the author of $class for advice.
+See 'perldoc $class' for more info.
+};
+
+}
+
+sub do_end {
+ my $self = $_[0];
+ print {$self->{'output_fh'}} $self->html_footer || '';
+ return 1;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Normally this would just be a call to _do_middle_main_loop -- but we
+# have to do some elaborate things to emit all the content and then
+# summarize it and output it /before/ the content that it's a summary of.
+
+sub do_middle {
+ my $self = $_[0];
+ return $self->_do_middle_main_loop unless $self->index;
+
+ if( $self->output_string ) {
+ # An efficiency hack
+ my $out = $self->output_string; #it's a reference to it
+ my $sneakytag = "\f\f\e\e\b\bIndex Here\e\e\b\b\f\f\n";
+ $$out .= $sneakytag;
+ $self->_do_middle_main_loop;
+ $sneakytag = quotemeta($sneakytag);
+ my $index = $self->index_as_html();
+ if( $$out =~ s/$sneakytag/$index/s ) {
+ # Expected case
+ DEBUG and print "Inserted ", length($index), " bytes of index HTML into $out.\n";
+ } else {
+ DEBUG and print "Odd, couldn't find where to insert the index in the output!\n";
+ # I don't think this should ever happen.
+ }
+ return 1;
+ }
+
+ unless( $self->output_fh ) {
+ require Carp;
+ Carp::confess("Parser object \$p doesn't seem to have any output object! I don't know how to deal with that.");
+ }
+
+ # If we get here, we're outputting to a FH. So we need to do some magic.
+ # Namely, divert all content to a string, which we output after the index.
+ my $fh = $self->output_fh;
+ my $content = '';
+ {
+ # Our horrible bait and switch:
+ $self->output_string( \$content );
+ $self->_do_middle_main_loop;
+ $self->abandon_output_string();
+ $self->output_fh($fh);
+ }
+ print $fh $self->index_as_html();
+ print $fh $content;
+
+ return 1;
+}
+
+###########################################################################
+
+sub index_as_html {
+ my $self = $_[0];
+ # This is meant to be called AFTER the input document has been parsed!
+
+ my $points = $self->{'PSHTML_index_points'} || [];
+
+ @$points > 1 or return qq[<div class='indexgroupEmpty'></div>\n];
+ # There's no point in having a 0-item or 1-item index, I dare say.
+
+ my(@out) = qq{\n<div class='indexgroup'>};
+ my $level = 0;
+
+ my( $target_level, $previous_tagname, $tagname, $text, $anchorname, $indent);
+ foreach my $p (@$points, ['head0', '(end)']) {
+ ($tagname, $text) = @$p;
+ $anchorname = $self->section_escape($text);
+ if( $tagname =~ m{^head(\d+)$} ) {
+ $target_level = 0 + $1;
+ } else { # must be some kinda list item
+ if($previous_tagname =~ m{^head\d+$} ) {
+ $target_level = $level + 1;
+ } else {
+ $target_level = $level; # no change needed
+ }
+ }
+
+ # Get to target_level by opening or closing ULs
+ while($level > $target_level)
+ { --$level; push @out, (" " x $level) . "</ul>"; }
+ while($level < $target_level)
+ { ++$level; push @out, (" " x ($level-1))
+ . "<ul class='indexList indexList$level'>"; }
+
+ $previous_tagname = $tagname;
+ next unless $level;
+
+ $indent = ' ' x $level;
+ push @out, sprintf
+ "%s<li class='indexItem indexItem%s'><a href='#%s'>%s</a>",
+ $indent, $level, esc($anchorname), esc($text)
+ ;
+ }
+ push @out, "</div>\n";
+ return join "\n", @out;
+}
+
+###########################################################################
+
+sub _do_middle_main_loop {
+ my $self = $_[0];
+ my $fh = $self->{'output_fh'};
+ my $tagmap = $self->{'Tagmap'};
+
+ $self->__adjust_html_h_levels;
+
+ my($token, $type, $tagname, $linkto, $linktype);
+ my @stack;
+ my $dont_wrap = 0;
+
+ while($token = $self->get_token) {
+
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ if( ($type = $token->type) eq 'start' ) {
+ if(($tagname = $token->tagname) eq 'L') {
+ $linktype = $token->attr('type') || 'insane';
+
+ $linkto = $self->do_link($token);
+
+ if(defined $linkto and length $linkto) {
+ esc($linkto);
+ # (Yes, SGML-escaping applies on top of %-escaping!
+ # But it's rarely noticeable in practice.)
+ print $fh qq{<a href="$linkto" class="podlink$linktype"\n>};
+ } else {
+ print $fh "<a>"; # Yes, an 'a' element with no attributes!
+ }
+
+ } elsif ($tagname eq 'item-text' or $tagname =~ m/^head\d$/s) {
+ print $fh $tagmap->{$tagname} || next;
+
+ my @to_unget;
+ while(1) {
+ push @to_unget, $self->get_token;
+ last if $to_unget[-1]->is_end
+ and $to_unget[-1]->tagname eq $tagname;
+
+ # TODO: support for X<...>'s found in here? (maybe hack into linearize_tokens)
+ }
+
+ my $name = $self->linearize_tokens(@to_unget);
+ $name = $self->do_section($name, $token) if defined $name;
+
+ print $fh "<a ";
+ print $fh "class='u' href='#___top' title='click to go to top of document'\n"
+ if $tagname =~ m/^head\d$/s;
+
+ if(defined $name) {
+ my $esc = esc( $self->section_name_tidy( $name ) );
+ print $fh qq[name="$esc"];
+ DEBUG and print "Linearized ", scalar(@to_unget),
+ " tokens as \"$name\".\n";
+ push @{ $self->{'PSHTML_index_points'} }, [$tagname, $name]
+ if $ToIndex{ $tagname };
+ # Obviously, this discards all formatting codes (saving
+ # just their content), but ahwell.
+
+ } else { # ludicrously long, so nevermind
+ DEBUG and print "Linearized ", scalar(@to_unget),
+ " tokens, but it was too long, so nevermind.\n";
+ }
+ print $fh "\n>";
+ $self->unget_token(@to_unget);
+
+ } elsif ($tagname eq 'Data') {
+ my $next = $self->get_token;
+ next unless defined $next;
+ unless( $next->type eq 'text' ) {
+ $self->unget_token($next);
+ next;
+ }
+ DEBUG and print " raw text ", $next->text, "\n";
+ print $fh "\n" . $next->text . "\n";
+ next;
+
+ } else {
+ if( $tagname =~ m/^over-/s ) {
+ push @stack, '';
+ } elsif( $tagname =~ m/^item-/s and @stack and $stack[-1] ) {
+ print $fh $stack[-1];
+ $stack[-1] = '';
+ }
+ print $fh $tagmap->{$tagname} || next;
+ ++$dont_wrap if $tagname eq 'Verbatim' or $tagname eq "VerbatimFormatted"
+ or $tagname eq 'X';
+ }
+
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ } elsif( $type eq 'end' ) {
+ if( ($tagname = $token->tagname) =~ m/^over-/s ) {
+ if( my $end = pop @stack ) {
+ print $fh $end;
+ }
+ } elsif( $tagname =~ m/^item-/s and @stack) {
+ $stack[-1] = $tagmap->{"/$tagname"};
+ if( $tagname eq 'item-text' and defined(my $next = $self->get_token) ) {
+ $self->unget_token($next);
+ if( $next->type eq 'start' ) {
+ print $fh $tagmap->{"/item-text"},$tagmap->{"item-body"};
+ $stack[-1] = $tagmap->{"/item-body"};
+ }
+ }
+ next;
+ }
+ print $fh $tagmap->{"/$tagname"} || next;
+ --$dont_wrap if $tagname eq 'Verbatim' or $tagname eq 'X';
+
+ # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ } elsif( $type eq 'text' ) {
+ esc($type = $token->text); # reuse $type, why not
+ $type =~ s/([\?\!\"\'\.\,]) /$1\n/g unless $dont_wrap;
+ print $fh $type;
+ }
+
+ }
+ return 1;
+}
+
+###########################################################################
+#
+
+sub do_section {
+ my($self, $name, $token) = @_;
+ return $name;
+}
+
+sub do_link {
+ my($self, $token) = @_;
+ my $type = $token->attr('type');
+ if(!defined $type) {
+ $self->whine("Typeless L!?", $token->attr('start_line'));
+ } elsif( $type eq 'pod') { return $self->do_pod_link($token);
+ } elsif( $type eq 'url') { return $self->do_url_link($token);
+ } elsif( $type eq 'man') { return $self->do_man_link($token);
+ } else {
+ $self->whine("L of unknown type $type!?", $token->attr('start_line'));
+ }
+ return 'FNORG'; # should never get called
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub do_url_link { return $_[1]->attr('to') }
+
+sub do_man_link {
+ my ($self, $link) = @_;
+ my $to = $link->attr('to');
+ my $frag = $link->attr('section');
+
+ return undef unless defined $to and length $to; # should never happen
+
+ $frag = $self->section_escape($frag)
+ if defined $frag and length($frag .= ''); # (stringify)
+
+ DEBUG and print "Resolving \"$to/$frag\"\n\n";
+
+ return $self->resolve_man_page_link($to, $frag);
+}
+
+
+sub do_pod_link {
+ # And now things get really messy...
+ my($self, $link) = @_;
+ my $to = $link->attr('to');
+ my $section = $link->attr('section');
+ return undef unless( # should never happen
+ (defined $to and length $to) or
+ (defined $section and length $section)
+ );
+
+ $section = $self->section_escape($section)
+ if defined $section and length($section .= ''); # (stringify)
+
+ DEBUG and printf "Resolving \"%s\" \"%s\"...\n",
+ $to || "(nil)", $section || "(nil)";
+
+ {
+ # An early hack:
+ my $complete_url = $self->resolve_pod_link_by_table($to, $section);
+ if( $complete_url ) {
+ DEBUG > 1 and print "resolve_pod_link_by_table(T,S) gives ",
+ $complete_url, "\n (Returning that.)\n";
+ return $complete_url;
+ } else {
+ DEBUG > 4 and print " resolve_pod_link_by_table(T,S)",
+ " didn't return anything interesting.\n";
+ }
+ }
+
+ if(defined $to and length $to) {
+ # Give this routine first hack again
+ my $there = $self->resolve_pod_link_by_table($to);
+ if(defined $there and length $there) {
+ DEBUG > 1
+ and print "resolve_pod_link_by_table(T) gives $there\n";
+ } else {
+ $there =
+ $self->resolve_pod_page_link($to, $section);
+ # (I pass it the section value, but I don't see a
+ # particular reason it'd use it.)
+ DEBUG > 1 and print "resolve_pod_page_link gives ", $to || "(nil)", "\n";
+ unless( defined $there and length $there ) {
+ DEBUG and print "Can't resolve $to\n";
+ return undef;
+ }
+ # resolve_pod_page_link returning undef is how it
+ # can signal that it gives up on making a link
+ }
+ $to = $there;
+ }
+
+ #DEBUG and print "So far [", $to||'nil', "] [", $section||'nil', "]\n";
+
+ my $out = (defined $to and length $to) ? $to : '';
+ $out .= "#" . $section if defined $section and length $section;
+
+ unless(length $out) { # sanity check
+ DEBUG and printf "Oddly, couldn't resolve \"%s\" \"%s\"...\n",
+ $to || "(nil)", $section || "(nil)";
+ return undef;
+ }
+
+ DEBUG and print "Resolved to $out\n";
+ return $out;
+}
+
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+
+sub section_escape {
+ my($self, $section) = @_;
+ return $self->section_url_escape(
+ $self->section_name_tidy($section)
+ );
+}
+
+sub section_name_tidy {
+ my($self, $section) = @_;
+ $section =~ tr/ /_/;
+ $section =~ tr/\x00-\x1F\x80-\x9F//d if 'A' eq chr(65); # drop crazy characters
+ $section = $self->unicode_escape_url($section);
+ $section = '_' unless length $section;
+ return $section;
+}
+
+sub section_url_escape { shift->general_url_escape(@_) }
+sub pagepath_url_escape { shift->general_url_escape(@_) }
+sub manpage_url_escape { shift->general_url_escape(@_) }
+
+sub general_url_escape {
+ my($self, $string) = @_;
+
+ $string =~ s/([^\x00-\xFF])/join '', map sprintf('%%%02X',$_), unpack 'C*', $1/eg;
+ # express Unicode things as urlencode(utf(orig)).
+
+ # A pretty conservative escaping, behoovey even for query components
+ # of a URL (see RFC 2396)
+
+ $string =~ s/([^-_\.!~*()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/sprintf('%%%02X',ord($1))/eg;
+ # Yes, stipulate the list without a range, so that this can work right on
+ # all charsets that this module happens to run under.
+ # Altho, hmm, what about that ord? Presumably that won't work right
+ # under non-ASCII charsets. Something should be done
+ # about that, I guess?
+
+ return $string;
+}
+
+#--------------------------------------------------------------------------
+#
+# Oh look, a yawning portal to Hell! Let's play touch football right by it!
+#
+
+sub resolve_pod_page_link {
+ # resolve_pod_page_link must return a properly escaped URL
+ my $self = shift;
+ return $self->batch_mode()
+ ? $self->resolve_pod_page_link_batch_mode(@_)
+ : $self->resolve_pod_page_link_singleton_mode(@_)
+ ;
+}
+
+sub resolve_pod_page_link_singleton_mode {
+ my($self, $it) = @_;
+ return undef unless defined $it and length $it;
+ my $url = $self->pagepath_url_escape($it);
+
+ $url =~ s{::$}{}s; # probably never comes up anyway
+ $url =~ s{::}{/}g unless $self->perldoc_url_prefix =~ m/\?/s; # sane DWIM?
+
+ return undef unless length $url;
+ return $self->perldoc_url_prefix . $url . $self->perldoc_url_postfix;
+}
+
+sub resolve_pod_page_link_batch_mode {
+ my($self, $to) = @_;
+ DEBUG > 1 and print " During batch mode, resolving $to ...\n";
+ my @path = grep length($_), split m/::/s, $to, -1;
+ unless( @path ) { # sanity
+ DEBUG and print "Very odd! Splitting $to gives (nil)!\n";
+ return undef;
+ }
+ $self->batch_mode_rectify_path(\@path);
+ my $out = join('/', map $self->pagepath_url_escape($_), @path)
+ . $HTML_EXTENSION;
+ DEBUG > 1 and print " => $out\n";
+ return $out;
+}
+
+sub batch_mode_rectify_path {
+ my($self, $pathbits) = @_;
+ my $level = $self->batch_mode_current_level;
+ $level--; # how many levels up to go to get to the root
+ if($level < 1) {
+ unshift @$pathbits, '.'; # just to be pretty
+ } else {
+ unshift @$pathbits, ('..') x $level;
+ }
+ return;
+}
+
+sub resolve_man_page_link {
+ my ($self, $to, $frag) = @_;
+ my ($page, $section) = $to =~ /^([^(]+)(?:[(](\d+)[)])?$/;
+
+ return undef unless defined $page and length $page;
+ $section ||= 1;
+
+ return $self->man_url_prefix . "$section/"
+ . $self->manpage_url_escape($page)
+ . $self->man_url_postfix;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub resolve_pod_link_by_table {
+ # A crazy hack to allow specifying custom L<foo> => URL mappings
+
+ return unless $_[0]->{'podhtml_LOT'}; # An optimizy shortcut
+
+ my($self, $to, $section) = @_;
+
+ # TODO: add a method that actually populates podhtml_LOT from a file?
+
+ if(defined $section) {
+ $to = '' unless defined $to and length $to;
+ return $self->{'podhtml_LOT'}{"$to#$section"}; # quite possibly undef!
+ } else {
+ return $self->{'podhtml_LOT'}{$to}; # quite possibly undef!
+ }
+ return;
+}
+
+###########################################################################
+
+sub linearize_tokens { # self, tokens
+ my $self = shift;
+ my $out = '';
+
+ my $t;
+ while($t = shift @_) {
+ if(!ref $t or !UNIVERSAL::can($t, 'is_text')) {
+ $out .= $t; # a string, or some insane thing
+ } elsif($t->is_text) {
+ $out .= $t->text;
+ } elsif($t->is_start and $t->tag eq 'X') {
+ # Ignore until the end of this X<...> sequence:
+ my $x_open = 1;
+ while($x_open) {
+ next if( ($t = shift @_)->is_text );
+ if( $t->is_start and $t->tag eq 'X') { ++$x_open }
+ elsif($t->is_end and $t->tag eq 'X') { --$x_open }
+ }
+ }
+ }
+ return undef if length $out > $Linearization_Limit;
+ return $out;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub unicode_escape_url {
+ my($self, $string) = @_;
+ $string =~ s/([^\x00-\xFF])/'('.ord($1).')'/eg;
+ # Turn char 1234 into "(1234)"
+ return $string;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+sub esc { # a function.
+ if(defined wantarray) {
+ if(wantarray) {
+ @_ = splice @_; # break aliasing
+ } else {
+ my $x = shift;
+ $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg;
+ return $x;
+ }
+ }
+ foreach my $x (@_) {
+ # Escape things very cautiously:
+ $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg
+ if defined $x;
+ # Leave out "- so that "--" won't make it thru in X-generated comments
+ # with text in them.
+
+ # Yes, stipulate the list without a range, so that this can work right on
+ # all charsets that this module happens to run under.
+ # Altho, hmm, what about that ord? Presumably that won't work right
+ # under non-ASCII charsets. Something should be done about that.
+ }
+ return @_;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Simple::HTML - convert Pod to HTML
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::HTML -e Pod::Simple::HTML::go thingy.pod
+
+
+=head1 DESCRIPTION
+
+This class is for making an HTML rendering of a Pod document.
+
+This is a subclass of L<Pod::Simple::PullParser> and inherits all its
+methods (and options).
+
+Note that if you want to do a batch conversion of a lot of Pod
+documents to HTML, you should see the module L<Pod::Simple::HTMLBatch>.
+
+
+
+=head1 CALLING FROM THE COMMAND LINE
+
+TODO
+
+ perl -MPod::Simple::HTML -e Pod::Simple::HTML::go Thing.pod Thing.html
+
+
+
+=head1 CALLING FROM PERL
+
+TODO make a new object, set any options, and use parse_from_file
+
+
+=head1 METHODS
+
+TODO
+all (most?) accessorized methods
+
+
+=head1 SUBCLASSING
+
+TODO
+
+ can just set any of: html_css html_javascript title_prefix
+ 'html_header_before_title',
+ 'html_header_after_title',
+ 'html_footer',
+
+maybe override do_pod_link
+
+maybe override do_beginning do_end
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::HTMLBatch>
+
+TODO: a corpus of sample Pod input and HTML output? Or common
+idioms?
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002-2004 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to L<Hurricane Electrict|http://he.net/> for permission to use its
+L<Linux man pages online|http://man.he.net/> site for man page links.
+
+Thanks to L<search.cpan.org|http://search.cpan.org/> for permission to use the
+site for Perl module links.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/HTMLBatch.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/HTMLBatch.pm
new file mode 100644
index 00000000000..227c23b7f9f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/HTMLBatch.pm
@@ -0,0 +1,1370 @@
+
+require 5;
+package Pod::Simple::HTMLBatch;
+use strict;
+use vars qw( $VERSION $HTML_RENDER_CLASS $HTML_EXTENSION
+ $CSS $JAVASCRIPT $SLEEPY $SEARCH_CLASS @ISA
+);
+$VERSION = '3.14';
+@ISA = (); # Yup, we're NOT a subclass of Pod::Simple::HTML!
+
+# TODO: nocontents stylesheets. Strike some of the color variations?
+
+use Pod::Simple::HTML ();
+BEGIN {*esc = \&Pod::Simple::HTML::esc }
+use File::Spec ();
+
+use Pod::Simple::Search;
+$SEARCH_CLASS ||= 'Pod::Simple::Search';
+
+BEGIN {
+ if(defined &DEBUG) { } # no-op
+ elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG }
+ else { *DEBUG = sub () {0}; }
+}
+
+$SLEEPY = 1 if !defined $SLEEPY and $^O =~ /mswin|mac/i;
+# flag to occasionally sleep for $SLEEPY - 1 seconds.
+
+$HTML_RENDER_CLASS ||= "Pod::Simple::HTML";
+
+#
+# Methods beginning with "_" are particularly internal and possibly ugly.
+#
+
+Pod::Simple::_accessorize( __PACKAGE__,
+ 'verbose', # how verbose to be during batch conversion
+ 'html_render_class', # what class to use to render
+ 'search_class', # what to use to search for POD documents
+ 'contents_file', # If set, should be the name of a file (in current directory)
+ # to write the list of all modules to
+ 'index', # will set $htmlpage->index(...) to this (true or false)
+ 'progress', # progress object
+ 'contents_page_start', 'contents_page_end',
+
+ 'css_flurry', '_css_wad', 'javascript_flurry', '_javascript_wad',
+ 'no_contents_links', # set to true to suppress automatic adding of << links.
+ '_contents',
+);
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Just so we can run from the command line more easily
+sub go {
+ @ARGV == 2 or die sprintf(
+ "Usage: perl -M%s -e %s:go indirs outdir\n (or use \"\@INC\" for indirs)\n",
+ __PACKAGE__, __PACKAGE__,
+ );
+
+ if(defined($ARGV[1]) and length($ARGV[1])) {
+ my $d = $ARGV[1];
+ -e $d or die "I see no output directory named \"$d\"\nAborting";
+ -d $d or die "But \"$d\" isn't a directory!\nAborting";
+ -w $d or die "Directory \"$d\" isn't writeable!\nAborting";
+ }
+
+ __PACKAGE__->batch_convert(@ARGV);
+}
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
+sub new {
+ my $new = bless {}, ref($_[0]) || $_[0];
+ $new->html_render_class($HTML_RENDER_CLASS);
+ $new->search_class($SEARCH_CLASS);
+ $new->verbose(1 + DEBUG);
+ $new->_contents([]);
+
+ $new->index(1);
+
+ $new-> _css_wad([]); $new->css_flurry(1);
+ $new->_javascript_wad([]); $new->javascript_flurry(1);
+
+ $new->contents_file(
+ 'index' . ($HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION)
+ );
+
+ $new->contents_page_start( join "\n", grep $_,
+ $Pod::Simple::HTML::Doctype_decl,
+ "<html><head>",
+ "<title>Perl Documentation</title>",
+ $Pod::Simple::HTML::Content_decl,
+ "</head>",
+ "\n<body class='contentspage'>\n<h1>Perl Documentation</h1>\n"
+ ); # override if you need a different title
+
+
+ $new->contents_page_end( sprintf(
+ "\n\n<p class='contentsfooty'>Generated by %s v%s under Perl v%s\n<br >At %s GMT, which is %s local time.</p>\n\n</body></html>\n",
+ esc(
+ ref($new),
+ eval {$new->VERSION} || $VERSION,
+ $], scalar(gmtime), scalar(localtime),
+ )));
+
+ return $new;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub muse {
+ my $self = shift;
+ if($self->verbose) {
+ print 'T+', int(time() - $self->{'_batch_start_time'}), "s: ", @_, "\n";
+ }
+ return 1;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub batch_convert {
+ my($self, $dirs, $outdir) = @_;
+ $self ||= __PACKAGE__; # tolerate being called as an optionless function
+ $self = $self->new unless ref $self; # tolerate being used as a class method
+
+ if(!defined($dirs) or $dirs eq '' or $dirs eq '@INC' ) {
+ $dirs = '';
+ } elsif(ref $dirs) {
+ # OK, it's an explicit set of dirs to scan, specified as an arrayref.
+ } else {
+ # OK, it's an explicit set of dirs to scan, specified as a
+ # string like "/thing:/also:/whatever/perl" (":"-delim, as usual)
+ # or, under MSWin, like "c:/thing;d:/also;c:/whatever/perl" (";"-delim!)
+ require Config;
+ my $ps = quotemeta( $Config::Config{'path_sep'} || ":" );
+ $dirs = [ grep length($_), split qr/$ps/, $dirs ];
+ }
+
+ $outdir = $self->filespecsys->curdir
+ unless defined $outdir and length $outdir;
+
+ $self->_batch_convert_main($dirs, $outdir);
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _batch_convert_main {
+ my($self, $dirs, $outdir) = @_;
+ # $dirs is either false, or an arrayref.
+ # $outdir is a pathspec.
+
+ $self->{'_batch_start_time'} ||= time();
+
+ $self->muse( "= ", scalar(localtime) );
+ $self->muse( "Starting batch conversion to \"$outdir\"" );
+
+ my $progress = $self->progress;
+ if(!$progress and $self->verbose > 0 and $self->verbose() <= 5) {
+ require Pod::Simple::Progress;
+ $progress = Pod::Simple::Progress->new(
+ ($self->verbose < 2) ? () # Default omission-delay
+ : ($self->verbose == 2) ? 1 # Reduce the omission-delay
+ : 0 # Eliminate the omission-delay
+ );
+ $self->progress($progress);
+ }
+
+ if($dirs) {
+ $self->muse(scalar(@$dirs), " dirs to scan: @$dirs");
+ } else {
+ $self->muse("Scanning \@INC. This could take a minute or two.");
+ }
+ my $mod2path = $self->find_all_pods($dirs ? $dirs : ());
+ $self->muse("Done scanning.");
+
+ my $total = keys %$mod2path;
+ unless($total) {
+ $self->muse("No pod found. Aborting batch conversion.\n");
+ return $self;
+ }
+
+ $progress and $progress->goal($total);
+ $self->muse("Now converting pod files to HTML.",
+ ($total > 25) ? " This will take a while more." : ()
+ );
+
+ $self->_spray_css( $outdir );
+ $self->_spray_javascript( $outdir );
+
+ $self->_do_all_batch_conversions($mod2path, $outdir);
+
+ $progress and $progress->done(sprintf (
+ "Done converting %d files.", $self->{"__batch_conv_page_count"}
+ ));
+ return $self->_batch_convert_finish($outdir);
+ return $self;
+}
+
+
+sub _do_all_batch_conversions {
+ my($self, $mod2path, $outdir) = @_;
+ $self->{"__batch_conv_page_count"} = 0;
+
+ foreach my $module (sort {lc($a) cmp lc($b)} keys %$mod2path) {
+ $self->_do_one_batch_conversion($module, $mod2path, $outdir);
+ sleep($SLEEPY - 1) if $SLEEPY;
+ }
+
+ return;
+}
+
+sub _batch_convert_finish {
+ my($self, $outdir) = @_;
+ $self->write_contents_file($outdir);
+ $self->muse("Done with batch conversion. $$self{'__batch_conv_page_count'} files done.");
+ $self->muse( "= ", scalar(localtime) );
+ $self->progress and $self->progress->done("All done!");
+ return;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _do_one_batch_conversion {
+ my($self, $module, $mod2path, $outdir, $outfile) = @_;
+
+ my $retval;
+ my $total = scalar keys %$mod2path;
+ my $infile = $mod2path->{$module};
+ my @namelets = grep m/\S/, split "::", $module;
+ # this can stick around in the contents LoL
+ my $depth = scalar @namelets;
+ die "Contentless thingie?! $module $infile" unless @namelets; #sanity
+
+ $outfile ||= do {
+ my @n = @namelets;
+ $n[-1] .= $HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION;
+ $self->filespecsys->catfile( $outdir, @n );
+ };
+
+ my $progress = $self->progress;
+
+ my $page = $self->html_render_class->new;
+ if(DEBUG > 5) {
+ $self->muse($self->{"__batch_conv_page_count"} + 1, "/$total: ",
+ ref($page), " render ($depth) $module => $outfile");
+ } elsif(DEBUG > 2) {
+ $self->muse($self->{"__batch_conv_page_count"} + 1, "/$total: $module => $outfile")
+ }
+
+ # Give each class a chance to init the converter:
+ $page->batch_mode_page_object_init($self, $module, $infile, $outfile, $depth)
+ if $page->can('batch_mode_page_object_init');
+ # Init for the index (TOC), too.
+ $self->batch_mode_page_object_init($page, $module, $infile, $outfile, $depth)
+ if $self->can('batch_mode_page_object_init');
+
+ # Now get busy...
+ $self->makepath($outdir => \@namelets);
+
+ $progress and $progress->reach($self->{"__batch_conv_page_count"}, "Rendering $module");
+
+ if( $retval = $page->parse_from_file($infile, $outfile) ) {
+ ++ $self->{"__batch_conv_page_count"} ;
+ $self->note_for_contents_file( \@namelets, $infile, $outfile );
+ } else {
+ $self->muse("Odd, parse_from_file(\"$infile\", \"$outfile\") returned false.");
+ }
+
+ $page->batch_mode_page_object_kill($self, $module, $infile, $outfile, $depth)
+ if $page->can('batch_mode_page_object_kill');
+ # The following isn't a typo. Note that it switches $self and $page.
+ $self->batch_mode_page_object_kill($page, $module, $infile, $outfile, $depth)
+ if $self->can('batch_mode_page_object_kill');
+
+ DEBUG > 4 and printf "%s %sb < $infile %s %sb\n",
+ $outfile, -s $outfile, $infile, -s $infile
+ ;
+
+ undef($page);
+ return $retval;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+sub filespecsys { $_[0]{'_filespecsys'} || 'File::Spec' }
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub note_for_contents_file {
+ my($self, $namelets, $infile, $outfile) = @_;
+
+ # I think the infile and outfile parts are never used. -- SMB
+ # But it's handy to have them around for debugging.
+
+ if( $self->contents_file ) {
+ my $c = $self->_contents();
+ push @$c,
+ [ join("::", @$namelets), $infile, $outfile, $namelets ]
+ # 0 1 2 3
+ ;
+ DEBUG > 3 and print "Noting @$c[-1]\n";
+ }
+ return;
+}
+
+#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+
+sub write_contents_file {
+ my($self, $outdir) = @_;
+ my $outfile = $self->_contents_filespec($outdir) || return;
+
+ $self->muse("Preparing list of modules for ToC");
+
+ my($toplevel, # maps toplevelbit => [all submodules]
+ $toplevel_form_freq, # ends up being 'foo' => 'Foo'
+ ) = $self->_prep_contents_breakdown;
+
+ my $Contents = eval { $self->_wopen($outfile) };
+ if( $Contents ) {
+ $self->muse( "Writing contents file $outfile" );
+ } else {
+ warn "Couldn't write-open contents file $outfile: $!\nAbort writing to $outfile at all";
+ return;
+ }
+
+ $self->_write_contents_start( $Contents, $outfile, );
+ $self->_write_contents_middle( $Contents, $outfile, $toplevel, $toplevel_form_freq );
+ $self->_write_contents_end( $Contents, $outfile, );
+ return $outfile;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _write_contents_start {
+ my($self, $Contents, $outfile) = @_;
+ my $starter = $self->contents_page_start || '';
+
+ {
+ my $css_wad = $self->_css_wad_to_markup(1);
+ if( $css_wad ) {
+ $starter =~ s{(</head>)}{\n$css_wad\n$1}i; # otherwise nevermind
+ }
+
+ my $javascript_wad = $self->_javascript_wad_to_markup(1);
+ if( $javascript_wad ) {
+ $starter =~ s{(</head>)}{\n$javascript_wad\n$1}i; # otherwise nevermind
+ }
+ }
+
+ unless(print $Contents $starter, "<dl class='superindex'>\n" ) {
+ warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all";
+ close($Contents);
+ return 0;
+ }
+ return 1;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _write_contents_middle {
+ my($self, $Contents, $outfile, $toplevel2submodules, $toplevel_form_freq) = @_;
+
+ foreach my $t (sort keys %$toplevel2submodules) {
+ my @downlines = sort {$a->[-1] cmp $b->[-1]}
+ @{ $toplevel2submodules->{$t} };
+
+ printf $Contents qq[<dt><a name="%s">%s</a></dt>\n<dd>\n],
+ esc( $t, $toplevel_form_freq->{$t} )
+ ;
+
+ my($path, $name);
+ foreach my $e (@downlines) {
+ $name = $e->[0];
+ $path = join( "/", '.', esc( @{$e->[3]} ) )
+ . ($HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION);
+ print $Contents qq{ <a href="$path">}, esc($name), "</a>&nbsp;&nbsp;\n";
+ }
+ print $Contents "</dd>\n\n";
+ }
+ return 1;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _write_contents_end {
+ my($self, $Contents, $outfile) = @_;
+ unless(
+ print $Contents "</dl>\n",
+ $self->contents_page_end || '',
+ ) {
+ warn "Couldn't write to $outfile: $!";
+ }
+ close($Contents) or warn "Couldn't close $outfile: $!";
+ return 1;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _prep_contents_breakdown {
+ my($self) = @_;
+ my $contents = $self->_contents;
+ my %toplevel; # maps lctoplevelbit => [all submodules]
+ my %toplevel_form_freq; # ends up being 'foo' => 'Foo'
+ # (mapping anycase forms to most freq form)
+
+ foreach my $entry (@$contents) {
+ my $toplevel =
+ $entry->[0] =~ m/^perl\w*$/ ? 'perl_core_docs'
+ # group all the perlwhatever docs together
+ : $entry->[3][0] # normal case
+ ;
+ ++$toplevel_form_freq{ lc $toplevel }{ $toplevel };
+ push @{ $toplevel{ lc $toplevel } }, $entry;
+ push @$entry, lc($entry->[0]); # add a sort-order key to the end
+ }
+
+ foreach my $toplevel (sort keys %toplevel) {
+ my $fgroup = $toplevel_form_freq{$toplevel};
+ $toplevel_form_freq{$toplevel} =
+ (
+ sort { $fgroup->{$b} <=> $fgroup->{$a} or $a cmp $b }
+ keys %$fgroup
+ # This hash is extremely unlikely to have more than 4 members, so this
+ # sort isn't so very wasteful
+ )[0];
+ }
+
+ return(\%toplevel, \%toplevel_form_freq) if wantarray;
+ return \%toplevel;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _contents_filespec {
+ my($self, $outdir) = @_;
+ my $outfile = $self->contents_file;
+ return unless $outfile;
+ return $self->filespecsys->catfile( $outdir, $outfile );
+}
+
+#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+
+sub makepath {
+ my($self, $outdir, $namelets) = @_;
+ return unless @$namelets > 1;
+ for my $i (0 .. ($#$namelets - 1)) {
+ my $dir = $self->filespecsys->catdir( $outdir, @$namelets[0 .. $i] );
+ if(-e $dir) {
+ die "$dir exists but not as a directory!?" unless -d $dir;
+ next;
+ }
+ DEBUG > 3 and print " Making $dir\n";
+ mkdir $dir, 0777
+ or die "Can't mkdir $dir: $!\nAborting"
+ ;
+ }
+ return;
+}
+
+#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+
+sub batch_mode_page_object_init {
+ my $self = shift;
+ my($page, $module, $infile, $outfile, $depth) = @_;
+
+ # TODO: any further options to percolate onto this new object here?
+
+ $page->default_title($module);
+ $page->index( $self->index );
+
+ $page->html_css( $self-> _css_wad_to_markup($depth) );
+ $page->html_javascript( $self->_javascript_wad_to_markup($depth) );
+
+ $self->add_header_backlink($page, $module, $infile, $outfile, $depth);
+ $self->add_footer_backlink($page, $module, $infile, $outfile, $depth);
+
+
+ return $self;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub add_header_backlink {
+ my $self = shift;
+ return if $self->no_contents_links;
+ my($page, $module, $infile, $outfile, $depth) = @_;
+ $page->html_header_after_title( join '',
+ $page->html_header_after_title || '',
+
+ qq[<p class="backlinktop"><b><a name="___top" href="],
+ $self->url_up_to_contents($depth),
+ qq[" accesskey="1" title="All Documents">&lt;&lt;</a></b></p>\n],
+ )
+ if $self->contents_file
+ ;
+ return;
+}
+
+sub add_footer_backlink {
+ my $self = shift;
+ return if $self->no_contents_links;
+ my($page, $module, $infile, $outfile, $depth) = @_;
+ $page->html_footer( join '',
+ qq[<p class="backlinkbottom"><b><a name="___bottom" href="],
+ $self->url_up_to_contents($depth),
+ qq[" title="All Documents">&lt;&lt;</a></b></p>\n],
+
+ $page->html_footer || '',
+ )
+ if $self->contents_file
+ ;
+ return;
+}
+
+sub url_up_to_contents {
+ my($self, $depth) = @_;
+ --$depth;
+ return join '/', ('..') x $depth, esc($self->contents_file);
+}
+
+#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+
+sub find_all_pods {
+ my($self, $dirs) = @_;
+ # You can override find_all_pods in a subclass if you want to
+ # do extra filtering or whatnot. But for the moment, we just
+ # pass to modnames2paths:
+ return $self->modnames2paths($dirs);
+}
+
+#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
+
+sub modnames2paths { # return a hashref mapping modulenames => paths
+ my($self, $dirs) = @_;
+
+ my $m2p;
+ {
+ my $search = $self->search_class->new;
+ DEBUG and print "Searching via $search\n";
+ $search->verbose(1) if DEBUG > 10;
+ $search->progress( $self->progress->copy->goal(0) ) if $self->progress;
+ $search->shadows(0); # don't bother noting shadowed files
+ $search->inc( $dirs ? 0 : 1 );
+ $search->survey( $dirs ? @$dirs : () );
+ $m2p = $search->name2path;
+ die "What, no name2path?!" unless $m2p;
+ }
+
+ $self->muse("That's odd... no modules found!") unless keys %$m2p;
+ if( DEBUG > 4 ) {
+ print "Modules found (name => path):\n";
+ foreach my $m (sort {lc($a) cmp lc($b)} keys %$m2p) {
+ print " $m $$m2p{$m}\n";
+ }
+ print "(total ", scalar(keys %$m2p), ")\n\n";
+ } elsif( DEBUG ) {
+ print "Found ", scalar(keys %$m2p), " modules.\n";
+ }
+ $self->muse( "Found ", scalar(keys %$m2p), " modules." );
+
+ # return the Foo::Bar => /whatever/Foo/Bar.pod|pm hashref
+ return $m2p;
+}
+
+#===========================================================================
+
+sub _wopen {
+ # this is abstracted out so that the daemon class can override it
+ my($self, $outpath) = @_;
+ require Symbol;
+ my $out_fh = Symbol::gensym();
+ DEBUG > 5 and print "Write-opening to $outpath\n";
+ return $out_fh if open($out_fh, "> $outpath");
+ require Carp;
+ Carp::croak("Can't write-open $outpath: $!");
+}
+
+#==========================================================================
+
+sub add_css {
+ my($self, $url, $is_default, $name, $content_type, $media, $_code) = @_;
+ return unless $url;
+ unless($name) {
+ # cook up a reasonable name based on the URL
+ $name = $url;
+ if( $name !~ m/\?/ and $name =~ m{([^/]+)$}s ) {
+ $name = $1;
+ $name =~ s/\.css//i;
+ }
+ }
+ $media ||= 'all';
+ $content_type ||= 'text/css';
+
+ my $bunch = [$url, $name, $content_type, $media, $_code];
+ if($is_default) { unshift @{ $self->_css_wad }, $bunch }
+ else { push @{ $self->_css_wad }, $bunch }
+ return;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _spray_css {
+ my($self, $outdir) = @_;
+
+ return unless $self->css_flurry();
+ $self->_gen_css_wad();
+
+ my $lol = $self->_css_wad;
+ foreach my $chunk (@$lol) {
+ my $url = $chunk->[0];
+ my $outfile;
+ if( ref($chunk->[-1]) and $url =~ m{^(_[-a-z0-9_]+\.css$)} ) {
+ $outfile = $self->filespecsys->catfile( $outdir, "$1" );
+ DEBUG > 5 and print "Noting $$chunk[0] as a file I'll create.\n";
+ } else {
+ DEBUG > 5 and print "OK, noting $$chunk[0] as an external CSS.\n";
+ # Requires no further attention.
+ next;
+ }
+
+ #$self->muse( "Writing autogenerated CSS file $outfile" );
+ my $Cssout = $self->_wopen($outfile);
+ print $Cssout ${$chunk->[-1]}
+ or warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all";
+ close($Cssout);
+ DEBUG > 5 and print "Wrote $outfile\n";
+ }
+
+ return;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub _css_wad_to_markup {
+ my($self, $depth) = @_;
+
+ my @css = @{ $self->_css_wad || return '' };
+ return '' unless @css;
+
+ my $rel = 'stylesheet';
+ my $out = '';
+
+ --$depth;
+ my $uplink = $depth ? ('../' x $depth) : '';
+
+ foreach my $chunk (@css) {
+ next unless $chunk and @$chunk;
+
+ my( $url1, $url2, $title, $type, $media) = (
+ $self->_maybe_uplink( $chunk->[0], $uplink ),
+ esc(grep !ref($_), @$chunk)
+ );
+
+ $out .= qq{<link rel="$rel" title="$title" type="$type" href="$url1$url2" media="$media" >\n};
+
+ $rel = 'alternate stylesheet'; # alternates = all non-first iterations
+ }
+ return $out;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+sub _maybe_uplink {
+ # if the given URL looks relative, return the given uplink string --
+ # otherwise return emptystring
+ my($self, $url, $uplink) = @_;
+ ($url =~ m{^\./} or $url !~ m{[/\:]} )
+ ? $uplink
+ : ''
+ # qualify it, if/as needed
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+sub _gen_css_wad {
+ my $self = $_[0];
+ my $css_template = $self->_css_template;
+ foreach my $variation (
+
+ # Commented out for sake of concision:
+ #
+ # 011n=black_with_red_on_white
+ # 001n=black_with_yellow_on_white
+ # 101n=black_with_green_on_white
+ # 110=white_with_yellow_on_black
+ # 010=white_with_green_on_black
+ # 011=white_with_blue_on_black
+ # 100=white_with_red_on_black
+ '110n=blkbluw', # black_with_blue_on_white
+ '010n=blkmagw', # black_with_magenta_on_white
+ '100n=blkcynw', # black_with_cyan_on_white
+ '101=whtprpk', # white_with_purple_on_black
+ '001=whtnavk', # white_with_navy_blue_on_black
+ '010a=grygrnk', # grey_with_green_on_black
+ '010b=whtgrng', # white_with_green_on_grey
+ '101an=blkgrng', # black_with_green_on_grey
+ '101bn=grygrnw', # grey_with_green_on_white
+ ) {
+
+ my $outname = $variation;
+ my($flipmode, @swap) = ( ($4 || ''), $1,$2,$3)
+ if $outname =~ s/^([012])([012])([[012])([a-z]*)=?//s;
+ @swap = () if '010' eq join '', @swap; # 010 is a swop-no-op!
+
+ my $this_css =
+ "/* This file is autogenerated. Do not edit. $variation */\n\n"
+ . $css_template;
+
+ # Only look at three-digitty colors, for now at least.
+ if( $flipmode =~ m/n/ ) {
+ $this_css =~ s/(#[0-9a-fA-F]{3})\b/_color_negate($1)/eg;
+ $this_css =~ s/\bthin\b/medium/g;
+ }
+ $this_css =~ s<#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])\b>
+ < join '', '#', ($1,$2,$3)[@swap] >eg if @swap;
+
+ if( $flipmode =~ m/a/)
+ { $this_css =~ s/#fff\b/#999/gi } # black -> dark grey
+ elsif($flipmode =~ m/b/)
+ { $this_css =~ s/#000\b/#666/gi } # white -> light grey
+
+ my $name = $outname;
+ $name =~ tr/-_/ /;
+ $self->add_css( "_$outname.css", 0, $name, 0, 0, \$this_css);
+ }
+
+ # Now a few indexless variations:
+ foreach my $variation (
+ 'blkbluw', # black_with_blue_on_white
+ 'whtpurk', # white_with_purple_on_black
+ 'whtgrng', # white_with_green_on_grey
+ 'grygrnw', # grey_with_green_on_white
+ ) {
+ my $outname = "$variation\_";
+ my $this_css = join "\n",
+ "/* This file is autogenerated. Do not edit. $outname */\n",
+ "\@import url(\"./_$variation.css\");",
+ ".indexgroup { display: none; }",
+ "\n",
+ ;
+ my $name = $outname;
+ $name =~ tr/-_/ /;
+ $self->add_css( "$outname.css", 0, $name, 0, 0, \$this_css);
+ }
+
+ return;
+}
+
+sub _color_negate {
+ my $x = lc $_[0];
+ $x =~ tr[0123456789abcdef]
+ [fedcba9876543210];
+ return $x;
+}
+
+#===========================================================================
+
+sub add_javascript {
+ my($self, $url, $content_type, $_code) = @_;
+ return unless $url;
+ push @{ $self->_javascript_wad }, [
+ $url, $content_type || 'text/javascript', $_code
+ ];
+ return;
+}
+
+sub _spray_javascript {
+ my($self, $outdir) = @_;
+ return unless $self->javascript_flurry();
+ $self->_gen_javascript_wad();
+
+ my $lol = $self->_javascript_wad;
+ foreach my $script (@$lol) {
+ my $url = $script->[0];
+ my $outfile;
+
+ if( ref($script->[-1]) and $url =~ m{^(_[-a-z0-9_]+\.js$)} ) {
+ $outfile = $self->filespecsys->catfile( $outdir, "$1" );
+ DEBUG > 5 and print "Noting $$script[0] as a file I'll create.\n";
+ } else {
+ DEBUG > 5 and print "OK, noting $$script[0] as an external JavaScript.\n";
+ next;
+ }
+
+ #$self->muse( "Writing JavaScript file $outfile" );
+ my $Jsout = $self->_wopen($outfile);
+
+ print $Jsout ${$script->[-1]}
+ or warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all";
+ close($Jsout);
+ DEBUG > 5 and print "Wrote $outfile\n";
+ }
+
+ return;
+}
+
+sub _gen_javascript_wad {
+ my $self = $_[0];
+ my $js_code = $self->_javascript || return;
+ $self->add_javascript( "_podly.js", 0, \$js_code);
+ return;
+}
+
+sub _javascript_wad_to_markup {
+ my($self, $depth) = @_;
+
+ my @scripts = @{ $self->_javascript_wad || return '' };
+ return '' unless @scripts;
+
+ my $out = '';
+
+ --$depth;
+ my $uplink = $depth ? ('../' x $depth) : '';
+
+ foreach my $s (@scripts) {
+ next unless $s and @$s;
+
+ my( $url1, $url2, $type, $media) = (
+ $self->_maybe_uplink( $s->[0], $uplink ),
+ esc(grep !ref($_), @$s)
+ );
+
+ $out .= qq{<script type="$type" src="$url1$url2"></script>\n};
+ }
+ return $out;
+}
+
+#===========================================================================
+
+sub _css_template { return $CSS }
+sub _javascript { return $JAVASCRIPT }
+
+$CSS = <<'EOCSS';
+/* For accessibility reasons, never specify text sizes in px/pt/pc/in/cm/mm */
+
+@media all { .hide { display: none; } }
+
+@media print {
+ .noprint, div.indexgroup, .backlinktop, .backlinkbottom { display: none }
+
+ * {
+ border-color: black !important;
+ color: black !important;
+ background-color: transparent !important;
+ background-image: none !important;
+ }
+
+ dl.superindex > dd {
+ word-spacing: .6em;
+ }
+}
+
+@media aural, braille, embossed {
+ div.indexgroup { display: none; } /* Too noisy, don't you think? */
+ dl.superindex > dt:before { content: "Group "; }
+ dl.superindex > dt:after { content: " contains:"; }
+ .backlinktop a:before { content: "Back to contents"; }
+ .backlinkbottom a:before { content: "Back to contents"; }
+}
+
+@media aural {
+ dl.superindex > dt { pause-before: 600ms; }
+}
+
+@media screen, tty, tv, projection {
+ .noscreen { display: none; }
+
+ a:link { color: #7070ff; text-decoration: underline; }
+ a:visited { color: #e030ff; text-decoration: underline; }
+ a:active { color: #800000; text-decoration: underline; }
+ body.contentspage a { text-decoration: none; }
+ a.u { color: #fff !important; text-decoration: none; }
+
+ body.pod {
+ margin: 0 5px;
+ color: #fff;
+ background-color: #000;
+ }
+
+ body.pod h1, body.pod h2, body.pod h3, body.pod h4 {
+ font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif;
+ font-weight: normal;
+ margin-top: 1.2em;
+ margin-bottom: .1em;
+ border-top: thin solid transparent;
+ /* margin-left: -5px; border-left: 2px #7070ff solid; padding-left: 3px; */
+ }
+
+ body.pod h1 { border-top-color: #0a0; }
+ body.pod h2 { border-top-color: #080; }
+ body.pod h3 { border-top-color: #040; }
+ body.pod h4 { border-top-color: #010; }
+
+ p.backlinktop + h1 { border-top: none; margin-top: 0em; }
+ p.backlinktop + h2 { border-top: none; margin-top: 0em; }
+ p.backlinktop + h3 { border-top: none; margin-top: 0em; }
+ p.backlinktop + h4 { border-top: none; margin-top: 0em; }
+
+ body.pod dt {
+ font-size: 105%; /* just a wee bit more than normal */
+ }
+
+ .indexgroup { font-size: 80%; }
+
+ .backlinktop, .backlinkbottom {
+ margin-left: -5px;
+ margin-right: -5px;
+ background-color: #040;
+ border-top: thin solid #050;
+ border-bottom: thin solid #050;
+ }
+
+ .backlinktop a, .backlinkbottom a {
+ text-decoration: none;
+ color: #080;
+ background-color: #000;
+ border: thin solid #0d0;
+ }
+ .backlinkbottom { margin-bottom: 0; padding-bottom: 0; }
+ .backlinktop { margin-top: 0; padding-top: 0; }
+
+ body.contentspage {
+ color: #fff;
+ background-color: #000;
+ }
+
+ body.contentspage h1 {
+ color: #0d0;
+ margin-left: 1em;
+ margin-right: 1em;
+ text-indent: -.9em;
+ font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif;
+ font-weight: normal;
+ border-top: thin solid #fff;
+ border-bottom: thin solid #fff;
+ text-align: center;
+ }
+
+ dl.superindex > dt {
+ font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif;
+ font-weight: normal;
+ font-size: 90%;
+ margin-top: .45em;
+ /* margin-bottom: -.15em; */
+ }
+ dl.superindex > dd {
+ word-spacing: .6em; /* most important rule here! */
+ }
+ dl.superindex > a:link {
+ text-decoration: none;
+ color: #fff;
+ }
+
+ .contentsfooty {
+ border-top: thin solid #999;
+ font-size: 90%;
+ }
+
+}
+
+/* The End */
+
+EOCSS
+
+#==========================================================================
+
+$JAVASCRIPT = <<'EOJAVASCRIPT';
+
+// From http://www.alistapart.com/articles/alternate/
+
+function setActiveStyleSheet(title) {
+ var i, a, main;
+ for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) {
+ if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
+ a.disabled = true;
+ if(a.getAttribute("title") == title) a.disabled = false;
+ }
+ }
+}
+
+function getActiveStyleSheet() {
+ var i, a;
+ for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) {
+ if( a.getAttribute("rel").indexOf("style") != -1
+ && a.getAttribute("title")
+ && !a.disabled
+ ) return a.getAttribute("title");
+ }
+ return null;
+}
+
+function getPreferredStyleSheet() {
+ var i, a;
+ for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) {
+ if( a.getAttribute("rel").indexOf("style") != -1
+ && a.getAttribute("rel").indexOf("alt") == -1
+ && a.getAttribute("title")
+ ) return a.getAttribute("title");
+ }
+ return null;
+}
+
+function createCookie(name,value,days) {
+ if (days) {
+ var date = new Date();
+ date.setTime(date.getTime()+(days*24*60*60*1000));
+ var expires = "; expires="+date.toGMTString();
+ }
+ else expires = "";
+ document.cookie = name+"="+value+expires+"; path=/";
+}
+
+function readCookie(name) {
+ var nameEQ = name + "=";
+ var ca = document.cookie.split(';');
+ for(var i=0 ; i < ca.length ; i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1,c.length);
+ if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
+ }
+ return null;
+}
+
+window.onload = function(e) {
+ var cookie = readCookie("style");
+ var title = cookie ? cookie : getPreferredStyleSheet();
+ setActiveStyleSheet(title);
+}
+
+window.onunload = function(e) {
+ var title = getActiveStyleSheet();
+ createCookie("style", title, 365);
+}
+
+var cookie = readCookie("style");
+var title = cookie ? cookie : getPreferredStyleSheet();
+setActiveStyleSheet(title);
+
+// The End
+
+EOJAVASCRIPT
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+1;
+__END__
+
+
+=head1 NAME
+
+Pod::Simple::HTMLBatch - convert several Pod files to several HTML files
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::HTMLBatch -e 'Pod::Simple::HTMLBatch::go' in out
+
+
+=head1 DESCRIPTION
+
+This module is used for running batch-conversions of a lot of HTML
+documents
+
+This class is NOT a subclass of Pod::Simple::HTML
+(nor of bad old Pod::Html) -- although it uses
+Pod::Simple::HTML for doing the conversion of each document.
+
+The normal use of this class is like so:
+
+ use Pod::Simple::HTMLBatch;
+ my $batchconv = Pod::Simple::HTMLBatch->new;
+ $batchconv->some_option( some_value );
+ $batchconv->some_other_option( some_other_value );
+ $batchconv->batch_convert( \@search_dirs, $output_dir );
+
+=head2 FROM THE COMMAND LINE
+
+Note that this class also provides
+(but does not export) the function Pod::Simple::HTMLBatch::go.
+This is basically just a shortcut for C<<
+Pod::Simple::HTMLBatch->batch_convert(@ARGV) >>.
+It's meant to be handy for calling from the command line.
+
+However, the shortcut requires that you specify exactly two command-line
+arguments, C<indirs> and C<outdir>.
+
+Example:
+
+ % mkdir out_html
+ % perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go @INC out_html
+ (to convert the pod from Perl's @INC
+ files under the directory ../htmlversion)
+
+(Note that the command line there contains a literal atsign-I-N-C. This
+is handled as a special case by batch_convert, in order to save you having
+to enter the odd-looking "" as the first command-line parameter when you
+mean "just use whatever's in @INC".)
+
+Example:
+
+ % mkdir ../seekrut
+ % chmod og-rx ../seekrut
+ % perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go . ../htmlversion
+ (to convert the pod under the current dir into HTML
+ files under the directory ../htmlversion)
+
+Example:
+
+ % perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go happydocs .
+ (to convert all pod from happydocs into the current directory)
+
+
+
+=head1 MAIN METHODS
+
+=over
+
+=item $batchconv = Pod::Simple::HTMLBatch->new;
+
+This TODO
+
+
+=item $batchconv->batch_convert( I<indirs>, I<outdir> );
+
+this TODO
+
+=item $batchconv->batch_convert( undef , ...);
+
+=item $batchconv->batch_convert( q{@INC}, ...);
+
+These two values for I<indirs> specify that the normal Perl @INC
+
+=item $batchconv->batch_convert( \@dirs , ...);
+
+This specifies that the input directories are the items in
+the arrayref C<\@dirs>.
+
+=item $batchconv->batch_convert( "somedir" , ...);
+
+This specifies that the director "somedir" is the input.
+(This can be an absolute or relative path, it doesn't matter.)
+
+A common value you might want would be just "." for the current
+directory:
+
+ $batchconv->batch_convert( "." , ...);
+
+
+=item $batchconv->batch_convert( 'somedir:someother:also' , ...);
+
+This specifies that you want the dirs "somedir", "somother", and "also"
+scanned, just as if you'd passed the arrayref
+C<[qw( somedir someother also)]>. Note that a ":"-separator is normal
+under Unix, but Under MSWin, you'll need C<'somedir;someother;also'>
+instead, since the pathsep on MSWin is ";" instead of ":". (And
+I<that> is because ":" often comes up in paths, like
+C<"c:/perl/lib">.)
+
+(Exactly what separator character should be used, is gotten from
+C<$Config::Config{'path_sep'}>, via the L<Config> module.)
+
+=item $batchconv->batch_convert( ... , undef );
+
+This specifies that you want the HTML output to go into the current
+directory.
+
+(Note that a missing or undefined value means a different thing in
+the first slot than in the second. That's so that C<batch_convert()>
+with no arguments (or undef arguments) means "go from @INC, into
+the current directory.)
+
+=item $batchconv->batch_convert( ... , 'somedir' );
+
+This specifies that you want the HTML output to go into the
+directory 'somedir'.
+(This can be an absolute or relative path, it doesn't matter.)
+
+=back
+
+
+Note that you can also call C<batch_convert> as a class method,
+like so:
+
+ Pod::Simple::HTMLBatch->batch_convert( ... );
+
+That is just short for this:
+
+ Pod::Simple::HTMLBatch-> new-> batch_convert(...);
+
+That is, it runs a conversion with default options, for
+whatever inputdirs and output dir you specify.
+
+
+=head2 ACCESSOR METHODS
+
+The following are all accessor methods -- that is, they don't do anything
+on their own, but just alter the contents of the conversion object,
+which comprises the options for this particular batch conversion.
+
+We show the "put" form of the accessors below (i.e., the syntax you use
+for setting the accessor to a specific value). But you can also
+call each method with no parameters to get its current value. For
+example, C<< $self->contents_file() >> returns the current value of
+the contents_file attribute.
+
+=over
+
+
+=item $batchconv->verbose( I<nonnegative_integer> );
+
+This controls how verbose to be during batch conversion, as far as
+notes to STDOUT (or whatever is C<select>'d) about how the conversion
+is going. If 0, no progress information is printed.
+If 1 (the default value), some progress information is printed.
+Higher values print more information.
+
+
+=item $batchconv->index( I<true-or-false> );
+
+This controls whether or not each HTML page is liable to have a little
+table of contents at the top (which we call an "index" for historical
+reasons). This is true by default.
+
+
+=item $batchconv->contents_file( I<filename> );
+
+If set, should be the name of a file (in the output directory)
+to write the HTML index to. The default value is "index.html".
+If you set this to a false value, no contents file will be written.
+
+=item $batchconv->contents_page_start( I<HTML_string> );
+
+This specifies what string should be put at the beginning of
+the contents page.
+The default is a string more or less like this:
+
+ <html>
+ <head><title>Perl Documentation</title></head>
+ <body class='contentspage'>
+ <h1>Perl Documentation</h1>
+
+=item $batchconv->contents_page_end( I<HTML_string> );
+
+This specifies what string should be put at the end of the contents page.
+The default is a string more or less like this:
+
+ <p class='contentsfooty'>Generated by
+ Pod::Simple::HTMLBatch v3.01 under Perl v5.008
+ <br >At Fri May 14 22:26:42 2004 GMT,
+ which is Fri May 14 14:26:42 2004 local time.</p>
+
+
+
+=item $batchconv->add_css( $url );
+
+TODO
+
+=item $batchconv->add_javascript( $url );
+
+TODO
+
+=item $batchconv->css_flurry( I<true-or-false> );
+
+If true (the default value), we autogenerate some CSS files in the
+output directory, and set our HTML files to use those.
+TODO: continue
+
+=item $batchconv->javascript_flurry( I<true-or-false> );
+
+If true (the default value), we autogenerate a JavaScript in the
+output directory, and set our HTML files to use it. Currently,
+the JavaScript is used only to get the browser to remember what
+stylesheet it prefers.
+TODO: continue
+
+=item $batchconv->no_contents_links( I<true-or-false> );
+
+TODO
+
+=item $batchconv->html_render_class( I<classname> );
+
+This sets what class is used for rendering the files.
+The default is "Pod::Simple::HTML". If you set it to something else,
+it should probably be a subclass of Pod::Simple::HTML, and you should
+C<require> or C<use> that class so that's it's loaded before
+Pod::Simple::HTMLBatch tries loading it.
+
+=item $batchconv->search_class( I<classname> );
+
+This sets what class is used for searching for the files.
+The default is "Pod::Simple::Search". If you set it to something else,
+it should probably be a subclass of Pod::Simple::Search, and you should
+C<require> or C<use> that class so that's it's loaded before
+Pod::Simple::HTMLBatch tries loading it.
+
+=back
+
+
+
+
+=head1 NOTES ON CUSTOMIZATION
+
+TODO
+
+ call add_css($someurl) to add stylesheet as alternate
+ call add_css($someurl,1) to add as primary stylesheet
+
+ call add_javascript
+
+ subclass Pod::Simple::HTML and set $batchconv->html_render_class to
+ that classname
+ and maybe override
+ $page->batch_mode_page_object_init($self, $module, $infile, $outfile, $depth)
+ or maybe override
+ $batchconv->batch_mode_page_object_init($page, $module, $infile, $outfile, $depth)
+ subclass Pod::Simple::Search and set $batchconv->search_class to
+ that classname
+
+
+
+=head1 ASK ME!
+
+If you want to do some kind of big pod-to-HTML version with some
+particular kind of option that you don't see how to achieve using this
+module, email me (C<sburke@cpan.org>) and I'll probably have a good idea
+how to do it. For reasons of concision and energetic laziness, some
+methods and options in this module (and the dozen modules it depends on)
+are undocumented; but one of those undocumented bits might be just what
+you're looking for.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::HTMLBatch>, L<perlpod>, L<perlpodspec>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/HTMLLegacy.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/HTMLLegacy.pm
new file mode 100644
index 00000000000..f78de90144f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/HTMLLegacy.pm
@@ -0,0 +1,104 @@
+
+require 5;
+package Pod::Simple::HTMLLegacy;
+use strict;
+
+use vars qw($VERSION);
+use Getopt::Long;
+
+$VERSION = "5.01";
+
+#--------------------------------------------------------------------------
+#
+# This class is meant to thinly emulate bad old Pod::Html
+#
+# TODO: some basic docs
+
+sub pod2html {
+ my @args = (@_);
+
+ my( $verbose, $infile, $outfile, $title );
+ my $index = 1;
+
+ {
+ my($help);
+
+ my($netscape); # dummy
+ local @ARGV = @args;
+ GetOptions(
+ "help" => \$help,
+ "verbose!" => \$verbose,
+ "infile=s" => \$infile,
+ "outfile=s" => \$outfile,
+ "title=s" => \$title,
+ "index!" => \$index,
+
+ "netscape!" => \$netscape,
+ ) or return bad_opts(@args);
+ bad_opts(@args) if @ARGV; # it should be all switches!
+ return help_message() if $help;
+ }
+
+ for($infile, $outfile) { $_ = undef unless defined and length }
+
+ if($verbose) {
+ warn sprintf "%s version %s\n", __PACKAGE__, $VERSION;
+ warn "OK, processed args [@args] ...\n";
+ warn sprintf
+ " Verbose: %s\n Index: %s\n Infile: %s\n Outfile: %s\n Title: %s\n",
+ map defined($_) ? $_ : "(nil)",
+ $verbose, $index, $infile, $outfile, $title,
+ ;
+ *Pod::Simple::HTML::DEBUG = sub(){1};
+ }
+ require Pod::Simple::HTML;
+ Pod::Simple::HTML->VERSION(3);
+
+ die "No such input file as $infile\n"
+ if defined $infile and ! -e $infile;
+
+
+ my $pod = Pod::Simple::HTML->new;
+ $pod->force_title($title) if defined $title;
+ $pod->index($index);
+ return $pod->parse_from_file($infile, $outfile);
+}
+
+#--------------------------------------------------------------------------
+
+sub bad_opts { die _help_message(); }
+sub help_message { print STDOUT _help_message() }
+
+#--------------------------------------------------------------------------
+
+sub _help_message {
+
+ join '',
+
+"[", __PACKAGE__, " version ", $VERSION, qq~]
+Usage: pod2html --help --infile=<name> --outfile=<name>
+ --verbose --index --noindex
+
+Options:
+ --help - prints this message.
+ --[no]index - generate an index at the top of the resulting html
+ (default behavior).
+ --infile - filename for the pod to convert (input taken from stdin
+ by default).
+ --outfile - filename for the resulting html file (output sent to
+ stdout by default).
+ --title - title that will appear in resulting html file.
+ --[no]verbose - self-explanatory (off by default).
+
+Note that pod2html is DEPRECATED, and this version implements only
+ some of the options known to older versions.
+For more information, see 'perldoc pod2html'.
+~;
+
+}
+
+1;
+__END__
+
+OVER the underpass! UNDER the overpass! Around the FUTURE and BEYOND REPAIR!!
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/LinkSection.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/LinkSection.pm
new file mode 100644
index 00000000000..e426b2c547f
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/LinkSection.pm
@@ -0,0 +1,174 @@
+
+require 5;
+package Pod::Simple::LinkSection;
+ # Based somewhat dimly on Array::Autojoin
+use vars qw($VERSION );
+$VERSION = '3.14';
+
+use strict;
+use Pod::Simple::BlackBox;
+use vars qw($VERSION );
+$VERSION = '3.14';
+
+use overload( # So it'll stringify nice
+ '""' => \&Pod::Simple::BlackBox::stringify_lol,
+ 'bool' => \&Pod::Simple::BlackBox::stringify_lol,
+ # '.=' => \&tack_on, # grudgingly support
+
+ 'fallback' => 1, # turn on cleverness
+);
+
+sub tack_on {
+ $_[0] = ['', {}, "$_[0]" ];
+ return $_[0][2] .= $_[1];
+}
+
+sub as_string {
+ goto &Pod::Simple::BlackBox::stringify_lol;
+}
+sub stringify {
+ goto &Pod::Simple::BlackBox::stringify_lol;
+}
+
+sub new {
+ my $class = shift;
+ $class = ref($class) || $class;
+ my $new;
+ if(@_ == 1) {
+ if (!ref($_[0] || '')) { # most common case: one bare string
+ return bless ['', {}, $_[0] ], $class;
+ } elsif( ref($_[0] || '') eq 'ARRAY') {
+ $new = [ @{ $_[0] } ];
+ } else {
+ Carp::croak( "$class new() doesn't know to clone $new" );
+ }
+ } else { # misc stuff
+ $new = [ '', {}, @_ ];
+ }
+
+ # By now it's a treelet: [ 'foo', {}, ... ]
+ foreach my $x (@$new) {
+ if(ref($x || '') eq 'ARRAY') {
+ $x = $class->new($x); # recurse
+ } elsif(ref($x || '') eq 'HASH') {
+ $x = { %$x };
+ }
+ # otherwise leave it.
+ }
+
+ return bless $new, $class;
+}
+
+# Not much in this class is likely to be link-section specific --
+# but it just so happens that link-sections are about the only treelets
+# that are exposed to the user.
+
+1;
+
+__END__
+
+# TODO: let it be an option whether a given subclass even wants little treelets?
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::LinkSection -- represent "section" attributes of L codes
+
+=head1 SYNOPSIS
+
+ # a long story
+
+=head1 DESCRIPTION
+
+This class is not of interest to general users.
+
+Pod::Simple uses this class for representing the value of the
+"section" attribute of "L" start-element events. Most applications
+can just use the normal stringification of objects of this class;
+they stringify to just the text content of the section,
+such as "foo" for
+C<< LZ<><Stuff/foo> >>, and "bar" for
+C<< LZ<><Stuff/bIZ<><ar>> >>.
+
+However, anyone particularly interested in getting the full value of
+the treelet, can just traverse the content of the treeleet
+@$treelet_object. To wit:
+
+
+ % perl -MData::Dumper -e
+ "use base qw(Pod::Simple::Methody);
+ sub start_L { print Dumper($_[1]{'section'} ) }
+ __PACKAGE__->new->parse_string_document('=head1 L<Foo/bI<ar>baz>>')
+ "
+Output:
+ $VAR1 = bless( [
+ '',
+ {},
+ 'b',
+ bless( [
+ 'I',
+ {},
+ 'ar'
+ ], 'Pod::Simple::LinkSection' ),
+ 'baz'
+ ], 'Pod::Simple::LinkSection' );
+
+But stringify it and you get just the text content:
+
+ % perl -MData::Dumper -e
+ "use base qw(Pod::Simple::Methody);
+ sub start_L { print Dumper( '' . $_[1]{'section'} ) }
+ __PACKAGE__->new->parse_string_document('=head1 L<Foo/bI<ar>baz>>')
+ "
+Output:
+ $VAR1 = 'barbaz';
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2004 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Methody.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Methody.pm
new file mode 100644
index 00000000000..bed3e8662b2
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Methody.pm
@@ -0,0 +1,152 @@
+
+require 5;
+package Pod::Simple::Methody;
+use strict;
+use Pod::Simple ();
+use vars qw(@ISA $VERSION);
+$VERSION = '3.14';
+@ISA = ('Pod::Simple');
+
+# Yes, we could use named variables, but I want this to be impose
+# as little an additional performance hit as possible.
+
+sub _handle_element_start {
+ $_[1] =~ tr/-:./__/;
+ ( $_[0]->can( 'start_' . $_[1] )
+ || return
+ )->(
+ $_[0], $_[2]
+ );
+}
+
+sub _handle_text {
+ ( $_[0]->can( 'handle_text' )
+ || return
+ )->(
+ @_
+ );
+}
+
+sub _handle_element_end {
+ $_[1] =~ tr/-:./__/;
+ ( $_[0]->can( 'end_' . $_[1] )
+ || return
+ )->(
+ $_[0]
+ );
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::Methody -- turn Pod::Simple events into method calls
+
+=head1 SYNOPSIS
+
+ require 5;
+ use strict;
+ package SomePodFormatter;
+ use base qw(Pod::Simple::Methody);
+
+ sub handle_text {
+ my($self, $text) = @_;
+ ...
+ }
+
+ sub start_head1 {
+ my($self, $attrs) = @_;
+ ...
+ }
+ sub end_head1 {
+ my($self) = @_;
+ ...
+ }
+
+...and start_/end_ methods for whatever other events you want to catch.
+
+=head1 DESCRIPTION
+
+This class is of
+interest to people writing Pod formatters based on Pod::Simple.
+
+This class (which is very small -- read the source) overrides
+Pod::Simple's _handle_element_start, _handle_text, and
+_handle_element_end methods so that parser events are turned into method
+calls. (Otherwise, this is a subclass of L<Pod::Simple> and inherits all
+its methods.)
+
+You can use this class as the base class for a Pod formatter/processor.
+
+=head1 METHOD CALLING
+
+When Pod::Simple sees a "=head1 Hi there", for example, it basically does
+this:
+
+ $parser->_handle_element_start( "head1", \%attributes );
+ $parser->_handle_text( "Hi there" );
+ $parser->_handle_element_end( "head1" );
+
+But if you subclass Pod::Simple::Methody, it will instead do this
+when it sees a "=head1 Hi there":
+
+ $parser->start_head1( \%attributes ) if $parser->can('start_head1');
+ $parser->handle_text( "Hi there" ) if $parser->can('handle_text');
+ $parser->end_head1() if $parser->can('end_head1');
+
+If Pod::Simple sends an event where the element name has a dash,
+period, or colon, the corresponding method name will have a underscore
+in its place. For example, "foo.bar:baz" becomes start_foo_bar_baz
+and end_foo_bar_baz.
+
+See the source for Pod::Simple::Text for an example of using this class.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::Subclassing>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Progress.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Progress.pm
new file mode 100644
index 00000000000..7de46d5696b
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Progress.pm
@@ -0,0 +1,93 @@
+
+require 5;
+package Pod::Simple::Progress;
+$VERSION = '3.14';
+use strict;
+
+# Objects of this class are used for noting progress of an
+# operation every so often. Messages delivered more often than that
+# are suppressed.
+#
+# There's actually nothing in here that's specific to Pod processing;
+# but it's ad-hoc enough that I'm not willing to give it a name that
+# implies that it's generally useful, like "IO::Progress" or something.
+#
+# -- sburke
+#
+#--------------------------------------------------------------------------
+
+sub new {
+ my($class,$delay) = @_;
+ my $self = bless {'quiet_until' => 1}, ref($class) || $class;
+ $self->to(*STDOUT{IO});
+ $self->delay(defined($delay) ? $delay : 5);
+ return $self;
+}
+
+sub copy {
+ my $orig = shift;
+ bless {%$orig, 'quiet_until' => 1}, ref($orig);
+}
+#--------------------------------------------------------------------------
+
+sub reach {
+ my($self, $point, $note) = @_;
+ if( (my $now = time) >= $self->{'quiet_until'}) {
+ my $goal;
+ my $to = $self->{'to'};
+ print $to join('',
+ ($self->{'quiet_until'} == 1) ? () : '... ',
+ (defined $point) ? (
+ '#',
+ ($goal = $self->{'goal'}) ? (
+ ' ' x (length($goal) - length($point)),
+ $point, '/', $goal,
+ ) : $point,
+ $note ? ': ' : (),
+ ) : (),
+ $note || '',
+ "\n"
+ );
+ $self->{'quiet_until'} = $now + $self->{'delay'};
+ }
+ return $self;
+}
+
+#--------------------------------------------------------------------------
+
+sub done {
+ my($self, $note) = @_;
+ $self->{'quiet_until'} = 1;
+ return $self->reach( undef, $note );
+}
+
+#--------------------------------------------------------------------------
+# Simple accessors:
+
+sub delay {
+ return $_[0]{'delay'} if @_ == 1; $_[0]{'delay'} = $_[1]; return $_[0] }
+sub goal {
+ return $_[0]{'goal' } if @_ == 1; $_[0]{'goal' } = $_[1]; return $_[0] }
+sub to {
+ return $_[0]{'to' } if @_ == 1; $_[0]{'to' } = $_[1]; return $_[0] }
+
+#--------------------------------------------------------------------------
+
+unless(caller) { # Simple self-test:
+ my $p = __PACKAGE__->new->goal(5);
+ $p->reach(1, "Primus!");
+ sleep 1;
+ $p->reach(2, "Secundus!");
+ sleep 3;
+ $p->reach(3, "Tertius!");
+ sleep 5;
+ $p->reach(4);
+ $p->reach(5, "Quintus!");
+ sleep 1;
+ $p->done("All done");
+}
+
+#--------------------------------------------------------------------------
+1;
+__END__
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/PullParser.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParser.pm
new file mode 100644
index 00000000000..c27d0cbeb0e
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParser.pm
@@ -0,0 +1,843 @@
+
+require 5;
+package Pod::Simple::PullParser;
+$VERSION = '3.14';
+use Pod::Simple ();
+BEGIN {@ISA = ('Pod::Simple')}
+
+use strict;
+use Carp ();
+
+use Pod::Simple::PullParserStartToken;
+use Pod::Simple::PullParserEndToken;
+use Pod::Simple::PullParserTextToken;
+
+BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG }
+
+__PACKAGE__->_accessorize(
+ 'source_fh', # the filehandle we're reading from
+ 'source_scalar_ref', # the scalarref we're reading from
+ 'source_arrayref', # the arrayref we're reading from
+);
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#
+# And here is how we implement a pull-parser on top of a push-parser...
+
+sub filter {
+ my($self, $source) = @_;
+ $self = $self->new unless ref $self;
+
+ $source = *STDIN{IO} unless defined $source;
+ $self->set_source($source);
+ $self->output_fh(*STDOUT{IO});
+
+ $self->run; # define run() in a subclass if you want to use filter()!
+ return $self;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub parse_string_document {
+ my $this = shift;
+ $this->set_source(\ $_[0]);
+ $this->run;
+}
+
+sub parse_file {
+ my($this, $filename) = @_;
+ $this->set_source($filename);
+ $this->run;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# In case anyone tries to use them:
+
+sub run {
+ use Carp ();
+ if( __PACKAGE__ eq ref($_[0]) || $_[0]) { # I'm not being subclassed!
+ Carp::croak "You can call run() only on subclasses of "
+ . __PACKAGE__;
+ } else {
+ Carp::croak join '',
+ "You can't call run() because ",
+ ref($_[0]) || $_[0], " didn't define a run() method";
+ }
+}
+
+sub parse_lines {
+ use Carp ();
+ Carp::croak "Use set_source with ", __PACKAGE__,
+ " and subclasses, not parse_lines";
+}
+
+sub parse_line {
+ use Carp ();
+ Carp::croak "Use set_source with ", __PACKAGE__,
+ " and subclasses, not parse_line";
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+ die "Couldn't construct for $class" unless $self;
+
+ $self->{'token_buffer'} ||= [];
+ $self->{'start_token_class'} ||= 'Pod::Simple::PullParserStartToken';
+ $self->{'text_token_class'} ||= 'Pod::Simple::PullParserTextToken';
+ $self->{'end_token_class'} ||= 'Pod::Simple::PullParserEndToken';
+
+ DEBUG > 1 and print "New pullparser object: $self\n";
+
+ return $self;
+}
+
+# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+sub get_token {
+ my $self = shift;
+ DEBUG > 1 and print "\nget_token starting up on $self.\n";
+ DEBUG > 2 and print " Items in token-buffer (",
+ scalar( @{ $self->{'token_buffer'} } ) ,
+ ") :\n", map(
+ " " . $_->dump . "\n", @{ $self->{'token_buffer'} }
+ ),
+ @{ $self->{'token_buffer'} } ? '' : ' (no tokens)',
+ "\n"
+ ;
+
+ until( @{ $self->{'token_buffer'} } ) {
+ DEBUG > 3 and print "I need to get something into my empty token buffer...\n";
+ if($self->{'source_dead'}) {
+ DEBUG and print "$self 's source is dead.\n";
+ push @{ $self->{'token_buffer'} }, undef;
+ } elsif(exists $self->{'source_fh'}) {
+ my @lines;
+ my $fh = $self->{'source_fh'}
+ || Carp::croak('You have to call set_source before you can call get_token');
+
+ DEBUG and print "$self 's source is filehandle $fh.\n";
+ # Read those many lines at a time
+ for(my $i = Pod::Simple::MANY_LINES; $i--;) {
+ DEBUG > 3 and print " Fetching a line from source filehandle $fh...\n";
+ local $/ = $Pod::Simple::NL;
+ push @lines, scalar(<$fh>); # readline
+ DEBUG > 3 and print " Line is: ",
+ defined($lines[-1]) ? $lines[-1] : "<undef>\n";
+ unless( defined $lines[-1] ) {
+ DEBUG and print "That's it for that source fh! Killing.\n";
+ delete $self->{'source_fh'}; # so it can be GC'd
+ last;
+ }
+ # but pass thru the undef, which will set source_dead to true
+
+ # TODO: look to see if $lines[-1] is =encoding, and if so,
+ # do horribly magic things
+
+ }
+
+ if(DEBUG > 8) {
+ print "* I've gotten ", scalar(@lines), " lines:\n";
+ foreach my $l (@lines) {
+ if(defined $l) {
+ print " line {$l}\n";
+ } else {
+ print " line undef\n";
+ }
+ }
+ print "* end of ", scalar(@lines), " lines\n";
+ }
+
+ $self->SUPER::parse_lines(@lines);
+
+ } elsif(exists $self->{'source_arrayref'}) {
+ DEBUG and print "$self 's source is arrayref $self->{'source_arrayref'}, with ",
+ scalar(@{$self->{'source_arrayref'}}), " items left in it.\n";
+
+ DEBUG > 3 and print " Fetching ", Pod::Simple::MANY_LINES, " lines.\n";
+ $self->SUPER::parse_lines(
+ splice @{ $self->{'source_arrayref'} },
+ 0,
+ Pod::Simple::MANY_LINES
+ );
+ unless( @{ $self->{'source_arrayref'} } ) {
+ DEBUG and print "That's it for that source arrayref! Killing.\n";
+ $self->SUPER::parse_lines(undef);
+ delete $self->{'source_arrayref'}; # so it can be GC'd
+ }
+ # to make sure that an undef is always sent to signal end-of-stream
+
+ } elsif(exists $self->{'source_scalar_ref'}) {
+
+ DEBUG and print "$self 's source is scalarref $self->{'source_scalar_ref'}, with ",
+ length(${ $self->{'source_scalar_ref'} }) -
+ (pos(${ $self->{'source_scalar_ref'} }) || 0),
+ " characters left to parse.\n";
+
+ DEBUG > 3 and print " Fetching a line from source-string...\n";
+ if( ${ $self->{'source_scalar_ref'} } =~
+ m/([^\n\r]*)((?:\r?\n)?)/g
+ ) {
+ #print(">> $1\n"),
+ $self->SUPER::parse_lines($1)
+ if length($1) or length($2)
+ or pos( ${ $self->{'source_scalar_ref'} })
+ != length( ${ $self->{'source_scalar_ref'} });
+ # I.e., unless it's a zero-length "empty line" at the very
+ # end of "foo\nbar\n" (i.e., between the \n and the EOS).
+ } else { # that's the end. Byebye
+ $self->SUPER::parse_lines(undef);
+ delete $self->{'source_scalar_ref'};
+ DEBUG and print "That's it for that source scalarref! Killing.\n";
+ }
+
+
+ } else {
+ die "What source??";
+ }
+ }
+ DEBUG and print "get_token about to return ",
+ Pod::Simple::pretty( @{$self->{'token_buffer'}}
+ ? $self->{'token_buffer'}[-1] : undef
+ ), "\n";
+ return shift @{$self->{'token_buffer'}}; # that's an undef if empty
+}
+
+sub unget_token {
+ my $self = shift;
+ DEBUG and print "Ungetting ", scalar(@_), " tokens: ",
+ @_ ? "@_\n" : "().\n";
+ foreach my $t (@_) {
+ Carp::croak "Can't unget that, because it's not a token -- it's undef!"
+ unless defined $t;
+ Carp::croak "Can't unget $t, because it's not a token -- it's a string!"
+ unless ref $t;
+ Carp::croak "Can't unget $t, because it's not a token object!"
+ unless UNIVERSAL::can($t, 'type');
+ }
+
+ unshift @{$self->{'token_buffer'}}, @_;
+ DEBUG > 1 and print "Token buffer now has ",
+ scalar(@{$self->{'token_buffer'}}), " items in it.\n";
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+# $self->{'source_filename'} = $source;
+
+sub set_source {
+ my $self = shift @_;
+ return $self->{'source_fh'} unless @_;
+ my $handle;
+ if(!defined $_[0]) {
+ Carp::croak("Can't use empty-string as a source for set_source");
+ } elsif(ref(\( $_[0] )) eq 'GLOB') {
+ $self->{'source_filename'} = '' . ($handle = $_[0]);
+ DEBUG and print "$self 's source is glob $_[0]\n";
+ # and fall thru
+ } elsif(ref( $_[0] ) eq 'SCALAR') {
+ $self->{'source_scalar_ref'} = $_[0];
+ DEBUG and print "$self 's source is scalar ref $_[0]\n";
+ return;
+ } elsif(ref( $_[0] ) eq 'ARRAY') {
+ $self->{'source_arrayref'} = $_[0];
+ DEBUG and print "$self 's source is array ref $_[0]\n";
+ return;
+ } elsif(ref $_[0]) {
+ $self->{'source_filename'} = '' . ($handle = $_[0]);
+ DEBUG and print "$self 's source is fh-obj $_[0]\n";
+ } elsif(!length $_[0]) {
+ Carp::croak("Can't use empty-string as a source for set_source");
+ } else { # It's a filename!
+ DEBUG and print "$self 's source is filename $_[0]\n";
+ {
+ local *PODSOURCE;
+ open(PODSOURCE, "<$_[0]") || Carp::croak "Can't open $_[0]: $!";
+ $handle = *PODSOURCE{IO};
+ }
+ $self->{'source_filename'} = $_[0];
+ DEBUG and print " Its name is $_[0].\n";
+
+ # TODO: file-discipline things here!
+ }
+
+ $self->{'source_fh'} = $handle;
+ DEBUG and print " Its handle is $handle\n";
+ return 1;
+}
+
+# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
+sub get_title_short { shift->get_short_title(@_) } # alias
+
+sub get_short_title {
+ my $title = shift->get_title(@_);
+ $title = $1 if $title =~ m/^(\S{1,60})\s+--?\s+./s;
+ # turn "Foo::Bar -- bars for your foo" into "Foo::Bar"
+ return $title;
+}
+
+sub get_title { shift->_get_titled_section(
+ 'NAME', max_token => 50, desperate => 1, @_)
+}
+sub get_version { shift->_get_titled_section(
+ 'VERSION',
+ max_token => 400,
+ accept_verbatim => 1,
+ max_content_length => 3_000,
+ @_,
+ );
+}
+sub get_description { shift->_get_titled_section(
+ 'DESCRIPTION',
+ max_token => 400,
+ max_content_length => 3_000,
+ @_,
+) }
+
+sub get_authors { shift->get_author(@_) } # a harmless alias
+
+sub get_author {
+ my $this = shift;
+ # Max_token is so high because these are
+ # typically at the end of the document:
+ $this->_get_titled_section('AUTHOR' , max_token => 10_000, @_) ||
+ $this->_get_titled_section('AUTHORS', max_token => 10_000, @_);
+}
+
+#--------------------------------------------------------------------------
+
+sub _get_titled_section {
+ # Based on a get_title originally contributed by Graham Barr
+ my($self, $titlename, %options) = (@_);
+
+ my $max_token = delete $options{'max_token'};
+ my $desperate_for_title = delete $options{'desperate'};
+ my $accept_verbatim = delete $options{'accept_verbatim'};
+ my $max_content_length = delete $options{'max_content_length'};
+ my $nocase = delete $options{'nocase'};
+ $max_content_length = 120 unless defined $max_content_length;
+
+ Carp::croak( "Unknown " . ((1 == keys %options) ? "option: " : "options: ")
+ . join " ", map "[$_]", sort keys %options
+ )
+ if keys %options;
+
+ my %content_containers;
+ $content_containers{'Para'} = 1;
+ if($accept_verbatim) {
+ $content_containers{'Verbatim'} = 1;
+ $content_containers{'VerbatimFormatted'} = 1;
+ }
+
+ my $token_count = 0;
+ my $title;
+ my @to_unget;
+ my $state = 0;
+ my $depth = 0;
+
+ Carp::croak "What kind of titlename is \"$titlename\"?!" unless
+ defined $titlename and $titlename =~ m/^[A-Z ]{1,60}$/s; #sanity
+ my $titlename_re = quotemeta($titlename);
+
+ my $head1_text_content;
+ my $para_text_content;
+
+ while(
+ ++$token_count <= ($max_token || 1_000_000)
+ and defined(my $token = $self->get_token)
+ ) {
+ push @to_unget, $token;
+
+ if ($state == 0) { # seeking =head1
+ if( $token->is_start and $token->tagname eq 'head1' ) {
+ DEBUG and print " Found head1. Seeking content...\n";
+ ++$state;
+ $head1_text_content = '';
+ }
+ }
+
+ elsif($state == 1) { # accumulating text until end of head1
+ if( $token->is_text ) {
+ DEBUG and print " Adding \"", $token->text, "\" to head1-content.\n";
+ $head1_text_content .= $token->text;
+ } elsif( $token->is_end and $token->tagname eq 'head1' ) {
+ DEBUG and print " Found end of head1. Considering content...\n";
+ $head1_text_content = uc $head1_text_content if $nocase;
+ if($head1_text_content eq $titlename
+ or $head1_text_content =~ m/\($titlename_re\)/s
+ # We accept "=head1 Nomen Modularis (NAME)" for sake of i18n
+ ) {
+ DEBUG and print " Yup, it was $titlename. Seeking next para-content...\n";
+ ++$state;
+ } elsif(
+ $desperate_for_title
+ # if we're so desperate we'll take the first
+ # =head1's content as a title
+ and $head1_text_content =~ m/\S/
+ and $head1_text_content !~ m/^[ A-Z]+$/s
+ and $head1_text_content !~
+ m/\((?:
+ NAME | TITLE | VERSION | AUTHORS? | DESCRIPTION | SYNOPSIS
+ | COPYRIGHT | LICENSE | NOTES? | FUNCTIONS? | METHODS?
+ | CAVEATS? | BUGS? | SEE\ ALSO | SWITCHES | ENVIRONMENT
+ )\)/sx
+ # avoid accepting things like =head1 Thingy Thongy (DESCRIPTION)
+ and ($max_content_length
+ ? (length($head1_text_content) <= $max_content_length) # sanity
+ : 1)
+ ) {
+ DEBUG and print " It looks titular: \"$head1_text_content\".\n",
+ "\n Using that.\n";
+ $title = $head1_text_content;
+ last;
+ } else {
+ --$state;
+ DEBUG and print " Didn't look titular ($head1_text_content).\n",
+ "\n Dropping back to seeking-head1-content mode...\n";
+ }
+ }
+ }
+
+ elsif($state == 2) {
+ # seeking start of para (which must immediately follow)
+ if($token->is_start and $content_containers{ $token->tagname }) {
+ DEBUG and print " Found start of Para. Accumulating content...\n";
+ $para_text_content = '';
+ ++$state;
+ } else {
+ DEBUG and print
+ " Didn't see an immediately subsequent start-Para. Reseeking H1\n";
+ $state = 0;
+ }
+ }
+
+ elsif($state == 3) {
+ # accumulating text until end of Para
+ if( $token->is_text ) {
+ DEBUG and print " Adding \"", $token->text, "\" to para-content.\n";
+ $para_text_content .= $token->text;
+ # and keep looking
+
+ } elsif( $token->is_end and $content_containers{ $token->tagname } ) {
+ DEBUG and print " Found end of Para. Considering content: ",
+ $para_text_content, "\n";
+
+ if( $para_text_content =~ m/\S/
+ and ($max_content_length
+ ? (length($para_text_content) <= $max_content_length)
+ : 1)
+ ) {
+ # Some minimal sanity constraints, I think.
+ DEBUG and print " It looks contentworthy, I guess. Using it.\n";
+ $title = $para_text_content;
+ last;
+ } else {
+ DEBUG and print " Doesn't look at all contentworthy!\n Giving up.\n";
+ undef $title;
+ last;
+ }
+ }
+ }
+
+ else {
+ die "IMPOSSIBLE STATE $state!\n"; # should never happen
+ }
+
+ }
+
+ # Put it all back!
+ $self->unget_token(@to_unget);
+
+ if(DEBUG) {
+ if(defined $title) { print " Returing title <$title>\n" }
+ else { print "Returning title <>\n" }
+ }
+
+ return '' unless defined $title;
+ $title =~ s/^\s+//;
+ return $title;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#
+# Methods that actually do work at parse-time:
+
+sub _handle_element_start {
+ my $self = shift; # leaving ($element_name, $attr_hash_r)
+ DEBUG > 2 and print "++ $_[0] (", map("<$_> ", %{$_[1]}), ")\n";
+
+ push @{ $self->{'token_buffer'} },
+ $self->{'start_token_class'}->new(@_);
+ return;
+}
+
+sub _handle_text {
+ my $self = shift; # leaving ($text)
+ DEBUG > 2 and print "== $_[0]\n";
+ push @{ $self->{'token_buffer'} },
+ $self->{'text_token_class'}->new(@_);
+ return;
+}
+
+sub _handle_element_end {
+ my $self = shift; # leaving ($element_name);
+ DEBUG > 2 and print "-- $_[0]\n";
+ push @{ $self->{'token_buffer'} },
+ $self->{'end_token_class'}->new(@_);
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::PullParser -- a pull-parser interface to parsing Pod
+
+=head1 SYNOPSIS
+
+ my $parser = SomePodProcessor->new;
+ $parser->set_source( "whatever.pod" );
+ $parser->run;
+
+Or:
+
+ my $parser = SomePodProcessor->new;
+ $parser->set_source( $some_filehandle_object );
+ $parser->run;
+
+Or:
+
+ my $parser = SomePodProcessor->new;
+ $parser->set_source( \$document_source );
+ $parser->run;
+
+Or:
+
+ my $parser = SomePodProcessor->new;
+ $parser->set_source( \@document_lines );
+ $parser->run;
+
+And elsewhere:
+
+ require 5;
+ package SomePodProcessor;
+ use strict;
+ use base qw(Pod::Simple::PullParser);
+
+ sub run {
+ my $self = shift;
+ Token:
+ while(my $token = $self->get_token) {
+ ...process each token...
+ }
+ }
+
+=head1 DESCRIPTION
+
+This class is for using Pod::Simple to build a Pod processor -- but
+one that uses an interface based on a stream of token objects,
+instead of based on events.
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+A subclass of Pod::Simple::PullParser should define a C<run> method
+that calls C<< $token = $parser->get_token >> to pull tokens.
+
+See the source for Pod::Simple::RTF for an example of a formatter
+that uses Pod::Simple::PullParser.
+
+=head1 METHODS
+
+=over
+
+=item my $token = $parser->get_token
+
+This returns the next token object (which will be of a subclass of
+L<Pod::Simple::PullParserToken>), or undef if the parser-stream has hit
+the end of the document.
+
+=item $parser->unget_token( $token )
+
+=item $parser->unget_token( $token1, $token2, ... )
+
+This restores the token object(s) to the front of the parser stream.
+
+=back
+
+The source has to be set before you can parse anything. The lowest-level
+way is to call C<set_source>:
+
+=over
+
+=item $parser->set_source( $filename )
+
+=item $parser->set_source( $filehandle_object )
+
+=item $parser->set_source( \$document_source )
+
+=item $parser->set_source( \@document_lines )
+
+=back
+
+Or you can call these methods, which Pod::Simple::PullParser has defined
+to work just like Pod::Simple's same-named methods:
+
+=over
+
+=item $parser->parse_file(...)
+
+=item $parser->parse_string_document(...)
+
+=item $parser->filter(...)
+
+=item $parser->parse_from_file(...)
+
+=back
+
+For those to work, the Pod-processing subclass of
+Pod::Simple::PullParser has to have defined a $parser->run method --
+so it is advised that all Pod::Simple::PullParser subclasses do so.
+See the Synopsis above, or the source for Pod::Simple::RTF.
+
+Authors of formatter subclasses might find these methods useful to
+call on a parser object that you haven't started pulling tokens
+from yet:
+
+=over
+
+=item my $title_string = $parser->get_title
+
+This tries to get the title string out of $parser, by getting some tokens,
+and scanning them for the title, and then ungetting them so that you can
+process the token-stream from the beginning.
+
+For example, suppose you have a document that starts out:
+
+ =head1 NAME
+
+ Hoo::Boy::Wowza -- Stuff B<wow> yeah!
+
+$parser->get_title on that document will return "Hoo::Boy::Wowza --
+Stuff wow yeah!". If the document starts with:
+
+ =head1 Name
+
+ Hoo::Boy::W00t -- Stuff B<w00t> yeah!
+
+Then you'll need to pass the C<nocase> option in order to recognize "Name":
+
+ $parser->get_title(nocase => 1);
+
+In cases where get_title can't find the title, it will return empty-string
+("").
+
+=item my $title_string = $parser->get_short_title
+
+This is just like get_title, except that it returns just the modulename, if
+the title seems to be of the form "SomeModuleName -- description".
+
+For example, suppose you have a document that starts out:
+
+ =head1 NAME
+
+ Hoo::Boy::Wowza -- Stuff B<wow> yeah!
+
+then $parser->get_short_title on that document will return
+"Hoo::Boy::Wowza".
+
+But if the document starts out:
+
+ =head1 NAME
+
+ Hooboy, stuff B<wow> yeah!
+
+then $parser->get_short_title on that document will return "Hooboy,
+stuff wow yeah!". If the document starts with:
+
+ =head1 Name
+
+ Hoo::Boy::W00t -- Stuff B<w00t> yeah!
+
+Then you'll need to pass the C<nocase> option in order to recognize "Name":
+
+ $parser->get_short_title(nocase => 1);
+
+If the title can't be found, then get_short_title returns empty-string
+("").
+
+=item $author_name = $parser->get_author
+
+This works like get_title except that it returns the contents of the
+"=head1 AUTHOR\n\nParagraph...\n" section, assuming that that section
+isn't terribly long. To recognize a "=head1 Author\n\nParagraph\n"
+section, pass the C<nocase> otpion:
+
+ $parser->get_author(nocase => 1);
+
+(This method tolerates "AUTHORS" instead of "AUTHOR" too.)
+
+=item $description_name = $parser->get_description
+
+This works like get_title except that it returns the contents of the
+"=head1 DESCRIPTION\n\nParagraph...\n" section, assuming that that section
+isn't terribly long. To recognize a "=head1 Description\n\nParagraph\n"
+section, pass the C<nocase> otpion:
+
+ $parser->get_description(nocase => 1);
+
+=item $version_block = $parser->get_version
+
+This works like get_title except that it returns the contents of
+the "=head1 VERSION\n\n[BIG BLOCK]\n" block. Note that this does NOT
+return the module's C<$VERSION>!! To recognize a
+"=head1 Version\n\n[BIG BLOCK]\n" section, pass the C<nocase> otpion:
+
+ $parser->get_version(nocase => 1);
+
+=back
+
+=head1 NOTE
+
+You don't actually I<have> to define a C<run> method. If you're
+writing a Pod-formatter class, you should define a C<run> just so
+that users can call C<parse_file> etc, but you don't I<have> to.
+
+And if you're not writing a formatter class, but are instead just
+writing a program that does something simple with a Pod::PullParser
+object (and not an object of a subclass), then there's no reason to
+bother subclassing to add a C<run> method.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>
+
+L<Pod::Simple::PullParserToken> -- and its subclasses
+L<Pod::Simple::PullParserStartToken>,
+L<Pod::Simple::PullParserTextToken>, and
+L<Pod::Simple::PullParserEndToken>.
+
+L<HTML::TokeParser>, which inspired this.
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
+JUNK:
+
+sub _old_get_title { # some witchery in here
+ my $self = $_[0];
+ my $title;
+ my @to_unget;
+
+ while(1) {
+ push @to_unget, $self->get_token;
+ unless(defined $to_unget[-1]) { # whoops, short doc!
+ pop @to_unget;
+ last;
+ }
+
+ DEBUG and print "-Got token ", $to_unget[-1]->dump, "\n";
+
+ (DEBUG and print "Too much in the buffer.\n"),
+ last if @to_unget > 25; # sanity
+
+ my $pattern = '';
+ if( #$to_unget[-1]->type eq 'end'
+ #and $to_unget[-1]->tagname eq 'Para'
+ #and
+ ($pattern = join('',
+ map {;
+ ($_->type eq 'start') ? ("<" . $_->tagname .">")
+ : ($_->type eq 'end' ) ? ("</". $_->tagname .">")
+ : ($_->type eq 'text' ) ? ($_->text =~ m<^([A-Z]+)$>s ? $1 : 'X')
+ : "BLORP"
+ } @to_unget
+ )) =~ m{<head1>NAME</head1><Para>(X|</?[BCIFLS]>)+</Para>$}s
+ ) {
+ # Whee, it fits the pattern
+ DEBUG and print "Seems to match =head1 NAME pattern.\n";
+ $title = '';
+ foreach my $t (reverse @to_unget) {
+ last if $t->type eq 'start' and $t->tagname eq 'Para';
+ $title = $t->text . $title if $t->type eq 'text';
+ }
+ undef $title if $title =~ m<^\s*$>; # make sure it's contentful!
+ last;
+
+ } elsif ($pattern =~ m{<head(\d)>(.+)</head\d>$}
+ and !( $1 eq '1' and $2 eq 'NAME' )
+ ) {
+ # Well, it fits a fallback pattern
+ DEBUG and print "Seems to match NAMEless pattern.\n";
+ $title = '';
+ foreach my $t (reverse @to_unget) {
+ last if $t->type eq 'start' and $t->tagname =~ m/^head\d$/s;
+ $title = $t->text . $title if $t->type eq 'text';
+ }
+ undef $title if $title =~ m<^\s*$>; # make sure it's contentful!
+ last;
+
+ } else {
+ DEBUG and $pattern and print "Leading pattern: $pattern\n";
+ }
+ }
+
+ # Put it all back:
+ $self->unget_token(@to_unget);
+
+ if(DEBUG) {
+ if(defined $title) { print " Returing title <$title>\n" }
+ else { print "Returning title <>\n" }
+ }
+
+ return '' unless defined $title;
+ return $title;
+}
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserEndToken.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserEndToken.pm
new file mode 100644
index 00000000000..67a625d8877
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserEndToken.pm
@@ -0,0 +1,120 @@
+
+require 5;
+package Pod::Simple::PullParserEndToken;
+use Pod::Simple::PullParserToken ();
+use strict;
+use vars qw(@ISA $VERSION);
+@ISA = ('Pod::Simple::PullParserToken');
+$VERSION = '3.14';
+
+sub new { # Class->new(tagname);
+ my $class = shift;
+ return bless ['end', @_], ref($class) || $class;
+}
+
+# Purely accessors:
+
+sub tagname { (@_ == 2) ? ($_[0][1] = $_[1]) : $_[0][1] }
+sub tag { shift->tagname(@_) }
+
+# shortcut:
+sub is_tagname { $_[0][1] eq $_[1] }
+sub is_tag { shift->is_tagname(@_) }
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::PullParserEndToken -- end-tokens from Pod::Simple::PullParser
+
+=head1 SYNOPSIS
+
+(See L<Pod::Simple::PullParser>)
+
+=head1 DESCRIPTION
+
+When you do $parser->get_token on a L<Pod::Simple::PullParser>, you might
+get an object of this class.
+
+This is a subclass of L<Pod::Simple::PullParserToken> and inherits all its methods,
+and adds these methods:
+
+=over
+
+=item $token->tagname
+
+This returns the tagname for this end-token object.
+For example, parsing a "=head1 ..." line will give you
+a start-token with the tagname of "head1", token(s) for its
+content, and then an end-token with the tagname of "head1".
+
+=item $token->tagname(I<somestring>)
+
+This changes the tagname for this end-token object.
+You probably won't need to do this.
+
+=item $token->tag(...)
+
+A shortcut for $token->tagname(...)
+
+=item $token->is_tag(I<somestring>) or $token->is_tagname(I<somestring>)
+
+These are shortcuts for C<< $token->tag() eq I<somestring> >>
+
+=back
+
+You're unlikely to ever need to construct an object of this class for
+yourself, but if you want to, call
+C<<
+Pod::Simple::PullParserEndToken->new( I<tagname> )
+>>
+
+=head1 SEE ALSO
+
+L<Pod::Simple::PullParserToken>, L<Pod::Simple>, L<Pod::Simple::Subclassing>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserStartToken.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserStartToken.pm
new file mode 100644
index 00000000000..37d68ef6196
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserStartToken.pm
@@ -0,0 +1,161 @@
+
+require 5;
+package Pod::Simple::PullParserStartToken;
+use Pod::Simple::PullParserToken ();
+use strict;
+use vars qw(@ISA $VERSION);
+@ISA = ('Pod::Simple::PullParserToken');
+$VERSION = '3.14';
+
+sub new { # Class->new(tagname, optional_attrhash);
+ my $class = shift;
+ return bless ['start', @_], ref($class) || $class;
+}
+
+# Purely accessors:
+
+sub tagname { (@_ == 2) ? ($_[0][1] = $_[1]) : $_[0][1] }
+sub tag { shift->tagname(@_) }
+
+sub is_tagname { $_[0][1] eq $_[1] }
+sub is_tag { shift->is_tagname(@_) }
+
+
+sub attr_hash { $_[0][2] ||= {} }
+
+sub attr {
+ if(@_ == 2) { # Reading: $token->attr('attrname')
+ ${$_[0][2] || return undef}{ $_[1] };
+ } elsif(@_ > 2) { # Writing: $token->attr('attrname', 'newval')
+ ${$_[0][2] ||= {}}{ $_[1] } = $_[2];
+ } else {
+ require Carp;
+ Carp::croak(
+ 'usage: $object->attr("val") or $object->attr("key", "newval")');
+ return undef;
+ }
+}
+
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::PullParserStartToken -- start-tokens from Pod::Simple::PullParser
+
+=head1 SYNOPSIS
+
+(See L<Pod::Simple::PullParser>)
+
+=head1 DESCRIPTION
+
+When you do $parser->get_token on a L<Pod::Simple::PullParser> object, you might
+get an object of this class.
+
+This is a subclass of L<Pod::Simple::PullParserToken> and inherits all its methods,
+and adds these methods:
+
+=over
+
+=item $token->tagname
+
+This returns the tagname for this start-token object.
+For example, parsing a "=head1 ..." line will give you
+a start-token with the tagname of "head1", token(s) for its
+content, and then an end-token with the tagname of "head1".
+
+=item $token->tagname(I<somestring>)
+
+This changes the tagname for this start-token object.
+You probably won't need
+to do this.
+
+=item $token->tag(...)
+
+A shortcut for $token->tagname(...)
+
+=item $token->is_tag(I<somestring>) or $token->is_tagname(I<somestring>)
+
+These are shortcuts for C<< $token->tag() eq I<somestring> >>
+
+=item $token->attr(I<attrname>)
+
+This returns the value of the I<attrname> attribute for this start-token
+object, or undef.
+
+For example, parsing a LZ<><Foo/"Bar"> link will produce a start-token
+with a "to" attribute with the value "Foo", a "type" attribute with the
+value "pod", and a "section" attribute with the value "Bar".
+
+=item $token->attr(I<attrname>, I<newvalue>)
+
+This sets the I<attrname> attribute for this start-token object to
+I<newvalue>. You probably won't need to do this.
+
+=item $token->attr_hash
+
+This returns the hashref that is the attribute set for this start-token.
+This is useful if (for example) you want to ask what all the attributes
+are -- you can just do C<< keys %{$token->attr_hash} >>
+
+=back
+
+
+You're unlikely to ever need to construct an object of this class for
+yourself, but if you want to, call
+C<<
+Pod::Simple::PullParserStartToken->new( I<tagname>, I<attrhash> )
+>>
+
+=head1 SEE ALSO
+
+L<Pod::Simple::PullParserToken>, L<Pod::Simple>, L<Pod::Simple::Subclassing>
+
+=head1 SEE ALSO
+
+L<Pod::Simple::PullParserToken>, L<Pod::Simple>, L<Pod::Simple::Subclassing>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserTextToken.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserTextToken.pm
new file mode 100644
index 00000000000..ed6340d598a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserTextToken.pm
@@ -0,0 +1,128 @@
+
+require 5;
+package Pod::Simple::PullParserTextToken;
+use Pod::Simple::PullParserToken ();
+use strict;
+use vars qw(@ISA $VERSION);
+@ISA = ('Pod::Simple::PullParserToken');
+$VERSION = '3.14';
+
+sub new { # Class->new(text);
+ my $class = shift;
+ return bless ['text', @_], ref($class) || $class;
+}
+
+# Purely accessors:
+
+sub text { (@_ == 2) ? ($_[0][1] = $_[1]) : $_[0][1] }
+
+sub text_r { \ $_[0][1] }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::PullParserTextToken -- text-tokens from Pod::Simple::PullParser
+
+=head1 SYNOPSIS
+
+(See L<Pod::Simple::PullParser>)
+
+=head1 DESCRIPTION
+
+When you do $parser->get_token on a L<Pod::Simple::PullParser>, you might
+get an object of this class.
+
+This is a subclass of L<Pod::Simple::PullParserToken> and inherits all its methods,
+and adds these methods:
+
+=over
+
+=item $token->text
+
+This returns the text that this token holds. For example, parsing
+CZ<><foo> will return a C start-token, a text-token, and a C end-token. And
+if you want to get the "foo" out of the text-token, call C<< $token->text >>
+
+=item $token->text(I<somestring>)
+
+This changes the string that this token holds. You probably won't need
+to do this.
+
+=item $token->text_r()
+
+This returns a scalar reference to the string that this token holds.
+This can be useful if you don't want to memory-copy the potentially
+large text value (well, as large as a paragraph or a verbatim block)
+as calling $token->text would do.
+
+Or, if you want to alter the value, you can even do things like this:
+
+ for ( ${ $token->text_r } ) { # Aliases it with $_ !!
+
+ s/ The / the /g; # just for example
+
+ if( 'A' eq chr(65) ) { # (if in an ASCII world)
+ tr/\xA0/ /;
+ tr/\xAD//d;
+ }
+
+ ...or however you want to alter the value...
+ }
+
+=back
+
+You're unlikely to ever need to construct an object of this class for
+yourself, but if you want to, call
+C<<
+Pod::Simple::PullParserTextToken->new( I<text> )
+>>
+
+=head1 SEE ALSO
+
+L<Pod::Simple::PullParserToken>, L<Pod::Simple>, L<Pod::Simple::Subclassing>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserToken.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserToken.pm
new file mode 100644
index 00000000000..2234ccf7ade
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/PullParserToken.pm
@@ -0,0 +1,163 @@
+
+require 5;
+package Pod::Simple::PullParserToken;
+ # Base class for tokens gotten from Pod::Simple::PullParser's $parser->get_token
+@ISA = ();
+$VERSION = '3.14';
+use strict;
+
+sub new { # Class->new('type', stuff...); ## Overridden in derived classes anyway
+ my $class = shift;
+ return bless [@_], ref($class) || $class;
+}
+
+sub type { $_[0][0] } # Can't change the type of an object
+sub dump { Pod::Simple::pretty( [ @{ $_[0] } ] ) }
+
+sub is_start { $_[0][0] eq 'start' }
+sub is_end { $_[0][0] eq 'end' }
+sub is_text { $_[0][0] eq 'text' }
+
+1;
+__END__
+
+sub dump { '[' . _esc( @{ $_[0] } ) . ']' }
+
+# JUNK:
+
+sub _esc {
+ return '' unless @_;
+ my @out;
+ foreach my $in (@_) {
+ push @out, '"' . $in . '"';
+ $out[-1] =~ s/([^- \:\:\.\,\'\>\<\"\/\=\?\+\|\[\]\{\}\_a-zA-Z0-9_\`\~\!\#\%\^\&\*\(\)])/
+ sprintf( (ord($1) < 256) ? "\\x%02X" : "\\x{%X}", ord($1))
+ /eg;
+ }
+ return join ', ', @out;
+}
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::PullParserToken -- tokens from Pod::Simple::PullParser
+
+=head1 SYNOPSIS
+
+Given a $parser that's an object of class Pod::Simple::PullParser
+(or a subclass)...
+
+ while(my $token = $parser->get_token) {
+ $DEBUG and print "Token: ", $token->dump, "\n";
+ if($token->is_start) {
+ ...access $token->tagname, $token->attr, etc...
+
+ } elsif($token->is_text) {
+ ...access $token->text, $token->text_r, etc...
+
+ } elsif($token->is_end) {
+ ...access $token->tagname...
+
+ }
+ }
+
+(Also see L<Pod::Simple::PullParser>)
+
+=head1 DESCRIPTION
+
+When you do $parser->get_token on a L<Pod::Simple::PullParser>, you should
+get an object of a subclass of Pod::Simple::PullParserToken.
+
+Subclasses will add methods, and will also inherit these methods:
+
+=over
+
+=item $token->type
+
+This returns the type of the token. This will be either the string
+"start", the string "text", or the string "end".
+
+Once you know what the type of an object is, you then know what
+subclass it belongs to, and therefore what methods it supports.
+
+Yes, you could probably do the same thing with code like
+$token->isa('Pod::Simple::PullParserEndToken'), but that's not so
+pretty as using just $token->type, or even the following shortcuts:
+
+=item $token->is_start
+
+This is a shortcut for C<< $token->type() eq "start" >>
+
+=item $token->is_text
+
+This is a shortcut for C<< $token->type() eq "text" >>
+
+=item $token->is_end
+
+This is a shortcut for C<< $token->type() eq "end" >>
+
+=item $token->dump
+
+This returns a handy stringified value of this object. This
+is useful for debugging, as in:
+
+ while(my $token = $parser->get_token) {
+ $DEBUG and print "Token: ", $token->dump, "\n";
+ ...
+ }
+
+=back
+
+=head1 SEE ALSO
+
+My subclasses:
+L<Pod::Simple::PullParserStartToken>,
+L<Pod::Simple::PullParserTextToken>, and
+L<Pod::Simple::PullParserEndToken>.
+
+L<Pod::Simple::PullParser> and L<Pod::Simple>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/RTF.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/RTF.pm
new file mode 100644
index 00000000000..f476d37b249
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/RTF.pm
@@ -0,0 +1,699 @@
+
+require 5;
+package Pod::Simple::RTF;
+
+#sub DEBUG () {4};
+#sub Pod::Simple::DEBUG () {4};
+#sub Pod::Simple::PullParser::DEBUG () {4};
+
+use strict;
+use vars qw($VERSION @ISA %Escape $WRAP %Tagmap);
+$VERSION = '3.14';
+use Pod::Simple::PullParser ();
+BEGIN {@ISA = ('Pod::Simple::PullParser')}
+
+use Carp ();
+BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG }
+
+$WRAP = 1 unless defined $WRAP;
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub _openclose {
+ return map {;
+ m/^([-A-Za-z]+)=(\w[^\=]*)$/s or die "what's <$_>?";
+ ( $1, "{\\$2\n", "/$1", "}" );
+ } @_;
+}
+
+my @_to_accept;
+
+%Tagmap = (
+ # 'foo=bar' means ('foo' => '{\bar'."\n", '/foo' => '}')
+ _openclose(
+ 'B=cs18\b',
+ 'I=cs16\i',
+ 'C=cs19\f1\lang1024\noproof',
+ 'F=cs17\i\lang1024\noproof',
+
+ 'VerbatimI=cs26\i',
+ 'VerbatimB=cs27\b',
+ 'VerbatimBI=cs28\b\i',
+
+ map {; m/^([-a-z]+)/s && push @_to_accept, $1; $_ }
+ qw[
+ underline=ul smallcaps=scaps shadow=shad
+ superscript=super subscript=sub strikethrough=strike
+ outline=outl emboss=embo engrave=impr
+ dotted-underline=uld dash-underline=uldash
+ dot-dash-underline=uldashd dot-dot-dash-underline=uldashdd
+ double-underline=uldb thick-underline=ulth
+ word-underline=ulw wave-underline=ulwave
+ ]
+ # But no double-strikethrough, because MSWord can't agree with the
+ # RTF spec on whether it's supposed to be \strikedl or \striked1 (!!!)
+ ),
+
+ # Bit of a hack here:
+ 'L=pod' => '{\cs22\i'."\n",
+ 'L=url' => '{\cs23\i'."\n",
+ 'L=man' => '{\cs24\i'."\n",
+ '/L' => '}',
+
+ 'Data' => "\n",
+ '/Data' => "\n",
+
+ 'Verbatim' => "\n{\\pard\\li#rtfindent##rtfkeep#\\plain\\s20\\sa180\\f1\\fs18\\lang1024\\noproof\n",
+ '/Verbatim' => "\n\\par}\n",
+ 'VerbatimFormatted' => "\n{\\pard\\li#rtfindent##rtfkeep#\\plain\\s20\\sa180\\f1\\fs18\\lang1024\\noproof\n",
+ '/VerbatimFormatted' => "\n\\par}\n",
+ 'Para' => "\n{\\pard\\li#rtfindent#\\sa180\n",
+ '/Para' => "\n\\par}\n",
+ 'head1' => "\n{\\pard\\li#rtfindent#\\s31\\keepn\\sb90\\sa180\\f2\\fs#head1_halfpoint_size#\\ul{\n",
+ '/head1' => "\n}\\par}\n",
+ 'head2' => "\n{\\pard\\li#rtfindent#\\s32\\keepn\\sb90\\sa180\\f2\\fs#head2_halfpoint_size#\\ul{\n",
+ '/head2' => "\n}\\par}\n",
+ 'head3' => "\n{\\pard\\li#rtfindent#\\s33\\keepn\\sb90\\sa180\\f2\\fs#head3_halfpoint_size#\\ul{\n",
+ '/head3' => "\n}\\par}\n",
+ 'head4' => "\n{\\pard\\li#rtfindent#\\s34\\keepn\\sb90\\sa180\\f2\\fs#head4_halfpoint_size#\\ul{\n",
+ '/head4' => "\n}\\par}\n",
+ # wordpad borks on \tc\tcl1, or I'd put that in =head1 and =head2
+
+ 'item-bullet' => "\n{\\pard\\li#rtfindent##rtfitemkeepn#\\sb60\\sa150\\fi-120\n",
+ '/item-bullet' => "\n\\par}\n",
+ 'item-number' => "\n{\\pard\\li#rtfindent##rtfitemkeepn#\\sb60\\sa150\\fi-120\n",
+ '/item-number' => "\n\\par}\n",
+ 'item-text' => "\n{\\pard\\li#rtfindent##rtfitemkeepn#\\sb60\\sa150\\fi-120\n",
+ '/item-text' => "\n\\par}\n",
+
+ # we don't need any styles for over-* and /over-*
+);
+
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+sub new {
+ my $new = shift->SUPER::new(@_);
+ $new->nix_X_codes(1);
+ $new->nbsp_for_S(1);
+ $new->accept_targets( 'rtf', 'RTF' );
+
+ $new->{'Tagmap'} = {%Tagmap};
+
+ $new->accept_codes(@_to_accept);
+ $new->accept_codes('VerbatimFormatted');
+ DEBUG > 2 and print "To accept: ", join(' ',@_to_accept), "\n";
+ $new->doc_lang(
+ ( $ENV{'RTFDEFLANG'} || '') =~ m/^(\d{1,10})$/s ? $1
+ : ($ENV{'RTFDEFLANG'} || '') =~ m/^0?x([a-fA-F0-9]{1,10})$/s ? hex($1)
+ # yes, tolerate hex!
+ : ($ENV{'RTFDEFLANG'} || '') =~ m/^([a-fA-F0-9]{4})$/s ? hex($1)
+ # yes, tolerate even more hex!
+ : '1033'
+ );
+
+ $new->head1_halfpoint_size(32);
+ $new->head2_halfpoint_size(28);
+ $new->head3_halfpoint_size(25);
+ $new->head4_halfpoint_size(22);
+ $new->codeblock_halfpoint_size(18);
+ $new->header_halfpoint_size(17);
+ $new->normal_halfpoint_size(25);
+
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+__PACKAGE__->_accessorize(
+ 'doc_lang',
+ 'head1_halfpoint_size',
+ 'head2_halfpoint_size',
+ 'head3_halfpoint_size',
+ 'head4_halfpoint_size',
+ 'codeblock_halfpoint_size',
+ 'header_halfpoint_size',
+ 'normal_halfpoint_size',
+ 'no_proofing_exemptions',
+);
+
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+sub run {
+ my $self = $_[0];
+ return $self->do_middle if $self->bare_output;
+ return
+ $self->do_beginning && $self->do_middle && $self->do_end;
+}
+
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub do_middle { # the main work
+ my $self = $_[0];
+ my $fh = $self->{'output_fh'};
+
+ my($token, $type, $tagname, $scratch);
+ my @stack;
+ my @indent_stack;
+ $self->{'rtfindent'} = 0 unless defined $self->{'rtfindent'};
+
+ while($token = $self->get_token) {
+
+ if( ($type = $token->type) eq 'text' ) {
+ if( $self->{'rtfverbatim'} ) {
+ DEBUG > 1 and print " $type " , $token->text, " in verbatim!\n";
+ rtf_esc_codely($scratch = $token->text);
+ print $fh $scratch;
+ next;
+ }
+
+ DEBUG > 1 and print " $type " , $token->text, "\n";
+
+ $scratch = $token->text;
+ $scratch =~ tr/\t\cb\cc/ /d;
+
+ $self->{'no_proofing_exemptions'} or $scratch =~
+ s/(?:
+ ^
+ |
+ (?<=[\cm\cj\t "\[\<\(])
+ ) # start on whitespace, sequence-start, or quote
+ ( # something looking like a Perl token:
+ (?:
+ [\$\@\:\<\*\\_]\S+ # either starting with a sigil, etc.
+ )
+ |
+ # or starting alpha, but containing anything strange:
+ (?:
+ [a-zA-Z'\x80-\xFF]+[\$\@\:_<>\(\\\*]\S+
+ )
+ )
+ /\cb$1\cc/xsg
+ ;
+
+ rtf_esc($scratch);
+ $scratch =~
+ s/(
+ [^\cm\cj\n]{65} # Snare 65 characters from a line
+ [^\cm\cj\n\x20]{0,50} # and finish any current word
+ )
+ (\x20{1,10})(?![\cm\cj\n]) # capture some spaces not at line-end
+ /$1$2\n/gx # and put a NL before those spaces
+ if $WRAP;
+ # This may wrap at well past the 65th column, but not past the 120th.
+
+ print $fh $scratch;
+
+ } elsif( $type eq 'start' ) {
+ DEBUG > 1 and print " +$type ",$token->tagname,
+ " (", map("<$_> ", %{$token->attr_hash}), ")\n";
+
+ if( ($tagname = $token->tagname) eq 'Verbatim'
+ or $tagname eq 'VerbatimFormatted'
+ ) {
+ ++$self->{'rtfverbatim'};
+ my $next = $self->get_token;
+ next unless defined $next;
+ my $line_count = 1;
+ if($next->type eq 'text') {
+ my $t = $next->text_r;
+ while( $$t =~ m/$/mg ) {
+ last if ++$line_count > 15; # no point in counting further
+ }
+ DEBUG > 3 and print " verbatim line count: $line_count\n";
+ }
+ $self->unget_token($next);
+ $self->{'rtfkeep'} = ($line_count > 15) ? '' : '\keepn' ;
+
+ } elsif( $tagname =~ m/^item-/s ) {
+ my @to_unget;
+ my $text_count_here = 0;
+ $self->{'rtfitemkeepn'} = '';
+ # Some heuristics to stop item-*'s functioning as subheadings
+ # from getting split from the things they're subheadings for.
+ #
+ # It's not terribly pretty, but it really does make things pretty.
+ #
+ while(1) {
+ push @to_unget, $self->get_token;
+ pop(@to_unget), last unless defined $to_unget[-1];
+ # Erroneously used to be "unshift" instead of pop! Adds instead
+ # of removes, and operates on the beginning instead of the end!
+
+ if($to_unget[-1]->type eq 'text') {
+ if( ($text_count_here += length ${$to_unget[-1]->text_r}) > 150 ){
+ DEBUG > 1 and print " item-* is too long to be keepn'd.\n";
+ last;
+ }
+ } elsif (@to_unget > 1 and
+ $to_unget[-2]->type eq 'end' and
+ $to_unget[-2]->tagname =~ m/^item-/s
+ ) {
+ # Bail out here, after setting rtfitemkeepn yea or nay.
+ $self->{'rtfitemkeepn'} = '\keepn' if
+ $to_unget[-1]->type eq 'start' and
+ $to_unget[-1]->tagname eq 'Para';
+
+ DEBUG > 1 and printf " item-* before %s(%s) %s keepn'd.\n",
+ $to_unget[-1]->type,
+ $to_unget[-1]->can('tagname') ? $to_unget[-1]->tagname : '',
+ $self->{'rtfitemkeepn'} ? "gets" : "doesn't get";
+ last;
+ } elsif (@to_unget > 40) {
+ DEBUG > 1 and print " item-* now has too many tokens (",
+ scalar(@to_unget),
+ (DEBUG > 4) ? (q<: >, map($_->dump, @to_unget)) : (),
+ ") to be keepn'd.\n";
+ last; # give up
+ }
+ # else keep while'ing along
+ }
+ # Now put it aaaaall back...
+ $self->unget_token(@to_unget);
+
+ } elsif( $tagname =~ m/^over-/s ) {
+ push @stack, $1;
+ push @indent_stack,
+ int($token->attr('indent') * 4 * $self->normal_halfpoint_size);
+ DEBUG and print "Indenting over $indent_stack[-1] twips.\n";
+ $self->{'rtfindent'} += $indent_stack[-1];
+
+ } elsif ($tagname eq 'L') {
+ $tagname .= '=' . ($token->attr('type') || 'pod');
+
+ } elsif ($tagname eq 'Data') {
+ my $next = $self->get_token;
+ next unless defined $next;
+ unless( $next->type eq 'text' ) {
+ $self->unget_token($next);
+ next;
+ }
+ DEBUG and print " raw text ", $next->text, "\n";
+ printf $fh "\n" . $next->text . "\n";
+ next;
+ }
+
+ defined($scratch = $self->{'Tagmap'}{$tagname}) or next;
+ $scratch =~ s/\#([^\#]+)\#/${$self}{$1}/g; # interpolate
+ print $fh $scratch;
+
+ if ($tagname eq 'item-number') {
+ print $fh $token->attr('number'), ". \n";
+ } elsif ($tagname eq 'item-bullet') {
+ print $fh "\\'95 \n";
+ #for funky testing: print $fh '', rtf_esc("\x{4E4B}\x{9053}");
+ }
+
+ } elsif( $type eq 'end' ) {
+ DEBUG > 1 and print " -$type ",$token->tagname,"\n";
+ if( ($tagname = $token->tagname) =~ m/^over-/s ) {
+ DEBUG and print "Indenting back $indent_stack[-1] twips.\n";
+ $self->{'rtfindent'} -= pop @indent_stack;
+ pop @stack;
+ } elsif( $tagname eq 'Verbatim' or $tagname eq 'VerbatimFormatted') {
+ --$self->{'rtfverbatim'};
+ }
+ defined($scratch = $self->{'Tagmap'}{"/$tagname"}) or next;
+ $scratch =~ s/\#([^\#]+)\#/${$self}{$1}/g; # interpolate
+ print $fh $scratch;
+ }
+ }
+ return 1;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+sub do_beginning {
+ my $self = $_[0];
+ my $fh = $self->{'output_fh'};
+ return print $fh join '',
+ $self->doc_init,
+ $self->font_table,
+ $self->stylesheet,
+ $self->color_table,
+ $self->doc_info,
+ $self->doc_start,
+ "\n"
+ ;
+}
+
+sub do_end {
+ my $self = $_[0];
+ my $fh = $self->{'output_fh'};
+ return print $fh '}'; # that should do it
+}
+
+###########################################################################
+
+sub stylesheet {
+ return sprintf <<'END',
+{\stylesheet
+{\snext0 Normal;}
+{\*\cs10 \additive Default Paragraph Font;}
+{\*\cs16 \additive \i \sbasedon10 pod-I;}
+{\*\cs17 \additive \i\lang1024\noproof \sbasedon10 pod-F;}
+{\*\cs18 \additive \b \sbasedon10 pod-B;}
+{\*\cs19 \additive \f1\lang1024\noproof\sbasedon10 pod-C;}
+{\s20\ql \li0\ri0\sa180\widctlpar\f1\fs%s\lang1024\noproof\sbasedon0 \snext0 pod-codeblock;}
+{\*\cs21 \additive \lang1024\noproof \sbasedon10 pod-computerese;}
+{\*\cs22 \additive \i\lang1024\noproof\sbasedon10 pod-L-pod;}
+{\*\cs23 \additive \i\lang1024\noproof\sbasedon10 pod-L-url;}
+{\*\cs24 \additive \i\lang1024\noproof\sbasedon10 pod-L-man;}
+
+{\*\cs25 \additive \f1\lang1024\noproof\sbasedon0 pod-codelbock-plain;}
+{\*\cs26 \additive \f1\lang1024\noproof\sbasedon25 pod-codelbock-ital;}
+{\*\cs27 \additive \f1\lang1024\noproof\sbasedon25 pod-codelbock-bold;}
+{\*\cs28 \additive \f1\lang1024\noproof\sbasedon25 pod-codelbock-bold-ital;}
+
+{\s31\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head1;}
+{\s32\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head2;}
+{\s33\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head3;}
+{\s34\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head4;}
+}
+
+END
+
+ $_[0]->codeblock_halfpoint_size(),
+ $_[0]->head1_halfpoint_size(),
+ $_[0]->head2_halfpoint_size(),
+ $_[0]->head3_halfpoint_size(),
+ $_[0]->head4_halfpoint_size(),
+ ;
+}
+
+###########################################################################
+# Override these as necessary for further customization
+
+sub font_table {
+ return <<'END'; # text font, code font, heading font
+{\fonttbl
+{\f0\froman Times New Roman;}
+{\f1\fmodern Courier New;}
+{\f2\fswiss Arial;}
+}
+
+END
+}
+
+sub doc_init {
+ return <<'END';
+{\rtf1\ansi\deff0
+
+END
+}
+
+sub color_table {
+ return <<'END';
+{\colortbl;\red255\green0\blue0;\red0\green0\blue255;}
+END
+}
+
+
+sub doc_info {
+ my $self = $_[0];
+
+ my $class = ref($self) || $self;
+
+ my $tag = __PACKAGE__ . ' ' . $VERSION;
+
+ unless($class eq __PACKAGE__) {
+ $tag = " ($tag)";
+ $tag = " v" . $self->VERSION . $tag if defined $self->VERSION;
+ $tag = $class . $tag;
+ }
+
+ return sprintf <<'END',
+{\info{\doccomm
+%s
+ using %s v%s
+ under Perl v%s at %s GMT}
+{\author [see doc]}{\company [see doc]}{\operator [see doc]}
+}
+
+END
+
+ # None of the following things should need escaping, I dare say!
+ $tag,
+ $ISA[0], $ISA[0]->VERSION(),
+ $], scalar(gmtime),
+ ;
+}
+
+sub doc_start {
+ my $self = $_[0];
+ my $title = $self->get_short_title();
+ DEBUG and print "Short Title: <$title>\n";
+ $title .= ' ' if length $title;
+
+ $title =~ s/ *$/ /s;
+ $title =~ s/^ //s;
+ $title =~ s/ $/, /s;
+ # make sure it ends in a comma and a space, unless it's 0-length
+
+ my $is_obviously_module_name;
+ $is_obviously_module_name = 1
+ if $title =~ m/^\S+$/s and $title =~ m/::/s;
+ # catches the most common case, at least
+
+ DEBUG and print "Title0: <$title>\n";
+ $title = rtf_esc($title);
+ DEBUG and print "Title1: <$title>\n";
+ $title = '\lang1024\noproof ' . $title
+ if $is_obviously_module_name;
+
+ return sprintf <<'END',
+\deflang%s\plain\lang%s\widowctrl
+{\header\pard\qr\plain\f2\fs%s
+%s
+p.\chpgn\par}
+\fs%s
+
+END
+ ($self->doc_lang) x 2,
+ $self->header_halfpoint_size,
+ $title,
+ $self->normal_halfpoint_size,
+ ;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+#-------------------------------------------------------------------------
+
+use integer;
+sub rtf_esc {
+ my $x; # scratch
+ if(!defined wantarray) { # void context: alter in-place!
+ for(@_) {
+ s/([F\x00-\x1F\-\\\{\}\x7F-\xFF])/$Escape{$1}/g; # ESCAPER
+ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg;
+ }
+ return;
+ } elsif(wantarray) { # return an array
+ return map {; ($x = $_) =~
+ s/([F\x00-\x1F\-\\\{\}\x7F-\xFF])/$Escape{$1}/g; # ESCAPER
+ $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg;
+ $x;
+ } @_;
+ } else { # return a single scalar
+ ($x = ((@_ == 1) ? $_[0] : join '', @_)
+ ) =~ s/([F\x00-\x1F\-\\\{\}\x7F-\xFF])/$Escape{$1}/g; # ESCAPER
+ # Escape \, {, }, -, control chars, and 7f-ff.
+ $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg;
+ return $x;
+ }
+}
+
+sub rtf_esc_codely {
+ # Doesn't change "-" to hard-hyphen, nor apply computerese style-smarts.
+ # We don't want to change the "-" to hard-hyphen, because we want to
+ # be able to paste this into a file and run it without there being
+ # dire screaming about the mysterious hard-hyphen character (which
+ # looks just like a normal dash character).
+
+ my $x; # scratch
+ if(!defined wantarray) { # void context: alter in-place!
+ for(@_) {
+ s/([F\x00-\x1F\\\{\}\x7F-\xFF])/$Escape{$1}/g; # ESCAPER
+ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg;
+ }
+ return;
+ } elsif(wantarray) { # return an array
+ return map {; ($x = $_) =~
+ s/([F\x00-\x1F\\\{\}\x7F-\xFF])/$Escape{$1}/g; # ESCAPER
+ $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg;
+ $x;
+ } @_;
+ } else { # return a single scalar
+ ($x = ((@_ == 1) ? $_[0] : join '', @_)
+ ) =~ s/([F\x00-\x1F\\\{\}\x7F-\xFF])/$Escape{$1}/g; # ESCAPER
+ # Escape \, {, }, -, control chars, and 7f-ff.
+ $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg;
+ return $x;
+ }
+}
+
+%Escape = (
+ map( (chr($_),chr($_)), # things not apparently needing escaping
+ 0x20 .. 0x7E ),
+ map( (chr($_),sprintf("\\'%02x", $_)), # apparently escapeworthy things
+ 0x00 .. 0x1F, 0x5c, 0x7b, 0x7d, 0x7f .. 0xFF, 0x46),
+
+ # We get to escape out 'F' so that we can send RTF files thru the mail
+ # without the slightest worry that paragraphs beginning with "From"
+ # will get munged.
+
+ # And some refinements:
+ "\cm" => "\n",
+ "\cj" => "\n",
+ "\n" => "\n\\line ",
+
+ "\t" => "\\tab ", # Tabs (altho theoretically raw \t's are okay)
+ "\f" => "\n\\page\n", # Formfeed
+ "-" => "\\_", # Turn plaintext '-' into a non-breaking hyphen
+ "\xA0" => "\\~", # Latin-1 non-breaking space
+ "\xAD" => "\\-", # Latin-1 soft (optional) hyphen
+
+ # CRAZY HACKS:
+ "\n" => "\\line\n",
+ "\r" => "\n",
+ "\cb" => "{\n\\cs21\\lang1024\\noproof ", # \\cf1
+ "\cc" => "}",
+);
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::RTF -- format Pod as RTF
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::RTF -e \
+ "exit Pod::Simple::RTF->filter(shift)->any_errata_seen" \
+ thingy.pod > thingy.rtf
+
+=head1 DESCRIPTION
+
+This class is a formatter that takes Pod and renders it as RTF, good for
+viewing/printing in MSWord, WordPad/write.exe, TextEdit, etc.
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+=head1 FORMAT CONTROL ATTRIBUTES
+
+You can set these attributes on the parser object before you
+call C<parse_file> (or a similar method) on it:
+
+=over
+
+=item $parser->head1_halfpoint_size( I<halfpoint_integer> );
+
+=item $parser->head2_halfpoint_size( I<halfpoint_integer> );
+
+=item $parser->head3_halfpoint_size( I<halfpoint_integer> );
+
+=item $parser->head4_halfpoint_size( I<halfpoint_integer> );
+
+These methods set the size (in half-points, like 52 for 26-point)
+that these heading levels will appear as.
+
+=item $parser->codeblock_halfpoint_size( I<halfpoint_integer> );
+
+This method sets the size (in half-points, like 21 for 10.5-point)
+that codeblocks ("verbatim sections") will appear as.
+
+=item $parser->header_halfpoint_size( I<halfpoint_integer> );
+
+This method sets the size (in half-points, like 15 for 7.5-point)
+that the header on each page will appear in. The header
+is usually just "I<modulename> p. I<pagenumber>".
+
+=item $parser->normal_halfpoint_size( I<halfpoint_integer> );
+
+This method sets the size (in half-points, like 26 for 13-point)
+that normal paragraphic text will appear in.
+
+=item $parser->no_proofing_exemptions( I<true_or_false> );
+
+Set this value to true if you don't want the formatter to try
+putting a hidden code on all Perl symbols (as best as it can
+notice them) that labels them as being not in English, and
+so not worth spellchecking.
+
+=item $parser->doc_lang( I<microsoft_decimal_language_code> )
+
+This sets the language code to tag this document as being in. By
+default, it is currently the value of the environment variable
+C<RTFDEFLANG>, or if that's not set, then the value
+1033 (for US English).
+
+Setting this appropriately is useful if you want to use the RTF
+to spellcheck, and/or if you want it to hyphenate right.
+
+Here are some notable values:
+
+ 1033 US English
+ 2057 UK English
+ 3081 Australia English
+ 4105 Canada English
+ 1034 Spain Spanish
+ 2058 Mexico Spanish
+ 1031 Germany German
+ 1036 France French
+ 3084 Canada French
+ 1035 Finnish
+ 1044 Norwegian (Bokmal)
+ 2068 Norwegian (Nynorsk)
+
+=back
+
+If you are particularly interested in customizing this module's output
+even more, see the source and/or write to me.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<RTF::Writer>, L<RTF::Cookbook>, L<RTF::Document>,
+L<RTF::Generator>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Search.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Search.pm
new file mode 100644
index 00000000000..762701aa9cc
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Search.pm
@@ -0,0 +1,1043 @@
+
+require 5.005;
+package Pod::Simple::Search;
+use strict;
+
+use vars qw($VERSION $MAX_VERSION_WITHIN $SLEEPY);
+$VERSION = '3.14'; ## Current version of this package
+
+BEGIN { *DEBUG = sub () {0} unless defined &DEBUG; } # set DEBUG level
+use Carp ();
+
+$SLEEPY = 1 if !defined $SLEEPY and $^O =~ /mswin|mac/i;
+ # flag to occasionally sleep for $SLEEPY - 1 seconds.
+
+$MAX_VERSION_WITHIN ||= 60;
+
+#############################################################################
+
+#use diagnostics;
+use File::Spec ();
+use File::Basename qw( basename );
+use Config ();
+use Cwd qw( cwd );
+
+#==========================================================================
+__PACKAGE__->_accessorize( # Make my dumb accessor methods
+ 'callback', 'progress', 'dir_prefix', 'inc', 'laborious', 'limit_glob',
+ 'limit_re', 'shadows', 'verbose', 'name2path', 'path2name',
+);
+#==========================================================================
+
+sub new {
+ my $class = shift;
+ my $self = bless {}, ref($class) || $class;
+ $self->init;
+ return $self;
+}
+
+sub init {
+ my $self = shift;
+ $self->inc(1);
+ $self->verbose(DEBUG);
+ return $self;
+}
+
+#--------------------------------------------------------------------------
+
+sub survey {
+ my($self, @search_dirs) = @_;
+ $self = $self->new unless ref $self; # tolerate being a class method
+
+ $self->_expand_inc( \@search_dirs );
+
+
+ $self->{'_scan_count'} = 0;
+ $self->{'_dirs_visited'} = {};
+ $self->path2name( {} );
+ $self->name2path( {} );
+ $self->limit_re( $self->_limit_glob_to_limit_re ) if $self->{'limit_glob'};
+ my $cwd = cwd();
+ my $verbose = $self->verbose;
+ local $_; # don't clobber the caller's $_ !
+
+ foreach my $try (@search_dirs) {
+ unless( File::Spec->file_name_is_absolute($try) ) {
+ # make path absolute
+ $try = File::Spec->catfile( $cwd ,$try);
+ }
+ # simplify path
+ $try = File::Spec->canonpath($try);
+
+ my $start_in;
+ my $modname_prefix;
+ if($self->{'dir_prefix'}) {
+ $start_in = File::Spec->catdir(
+ $try,
+ grep length($_), split '[\\/:]+', $self->{'dir_prefix'}
+ );
+ $modname_prefix = [grep length($_), split m{[:/\\]}, $self->{'dir_prefix'}];
+ $verbose and print "Appending \"$self->{'dir_prefix'}\" to $try, ",
+ "giving $start_in (= @$modname_prefix)\n";
+ } else {
+ $start_in = $try;
+ }
+
+ if( $self->{'_dirs_visited'}{$start_in} ) {
+ $verbose and print "Directory '$start_in' already seen, skipping.\n";
+ next;
+ } else {
+ $self->{'_dirs_visited'}{$start_in} = 1;
+ }
+
+ unless(-e $start_in) {
+ $verbose and print "Skipping non-existent $start_in\n";
+ next;
+ }
+
+ my $closure = $self->_make_search_callback;
+
+ if(-d $start_in) {
+ # Normal case:
+ $verbose and print "Beginning excursion under $start_in\n";
+ $self->_recurse_dir( $start_in, $closure, $modname_prefix );
+ $verbose and print "Back from excursion under $start_in\n\n";
+
+ } elsif(-f _) {
+ # A excursion consisting of just one file!
+ $_ = basename($start_in);
+ $verbose and print "Pondering $start_in ($_)\n";
+ $closure->($start_in, $_, 0, []);
+
+ } else {
+ $verbose and print "Skipping mysterious $start_in\n";
+ }
+ }
+ $self->progress and $self->progress->done(
+ "Noted $$self{'_scan_count'} Pod files total");
+
+ return unless defined wantarray; # void
+ return $self->name2path unless wantarray; # scalar
+ return $self->name2path, $self->path2name; # list
+}
+
+
+#==========================================================================
+sub _make_search_callback {
+ my $self = $_[0];
+
+ # Put the options in variables, for easy access
+ my( $laborious, $verbose, $shadows, $limit_re, $callback, $progress,$path2name,$name2path) =
+ map scalar($self->$_()),
+ qw(laborious verbose shadows limit_re callback progress path2name name2path);
+
+ my($file, $shortname, $isdir, $modname_bits);
+ return sub {
+ ($file, $shortname, $isdir, $modname_bits) = @_;
+
+ if($isdir) { # this never gets called on the startdir itself, just subdirs
+
+ if( $self->{'_dirs_visited'}{$file} ) {
+ $verbose and print "Directory '$file' already seen, skipping.\n";
+ return 'PRUNE';
+ }
+
+ print "Looking in dir $file\n" if $verbose;
+
+ unless ($laborious) { # $laborious overrides pruning
+ if( m/^(\d+\.[\d_]{3,})\z/s
+ and do { my $x = $1; $x =~ tr/_//d; $x != $] }
+ ) {
+ $verbose and print "Perl $] version mismatch on $_, skipping.\n";
+ return 'PRUNE';
+ }
+
+ if( m/^([A-Za-z][a-zA-Z0-9_]*)\z/s ) {
+ $verbose and print "$_ is a well-named module subdir. Looking....\n";
+ } else {
+ $verbose and print "$_ is a fishy directory name. Skipping.\n";
+ return 'PRUNE';
+ }
+ } # end unless $laborious
+
+ $self->{'_dirs_visited'}{$file} = 1;
+ return; # (not pruning);
+ }
+
+
+ # Make sure it's a file even worth even considering
+ if($laborious) {
+ unless(
+ m/\.(pod|pm|plx?)\z/i || -x _ and -T _
+ # Note that the cheapest operation (the RE) is run first.
+ ) {
+ $verbose > 1 and print " Brushing off uninteresting $file\n";
+ return;
+ }
+ } else {
+ unless( m/^[-_a-zA-Z0-9]+\.(?:pod|pm|plx?)\z/is ) {
+ $verbose > 1 and print " Brushing off oddly-named $file\n";
+ return;
+ }
+ }
+
+ $verbose and print "Considering item $file\n";
+ my $name = $self->_path2modname( $file, $shortname, $modname_bits );
+ $verbose > 0.01 and print " Nominating $file as $name\n";
+
+ if($limit_re and $name !~ m/$limit_re/i) {
+ $verbose and print "Shunning $name as not matching $limit_re\n";
+ return;
+ }
+
+ if( !$shadows and $name2path->{$name} ) {
+ $verbose and print "Not worth considering $file ",
+ "-- already saw $name as ",
+ join(' ', grep($path2name->{$_} eq $name, keys %$path2name)), "\n";
+ return;
+ }
+
+ # Put off until as late as possible the expense of
+ # actually reading the file:
+ if( m/\.pod\z/is ) {
+ # just assume it has pod, okay?
+ } else {
+ $progress and $progress->reach($self->{'_scan_count'}, "Scanning $file");
+ return unless $self->contains_pod( $file );
+ }
+ ++ $self->{'_scan_count'};
+
+ # Or finally take note of it:
+ if( $name2path->{$name} ) {
+ $verbose and print
+ "Duplicate POD found (shadowing?): $name ($file)\n",
+ " Already seen in ",
+ join(' ', grep($path2name->{$_} eq $name, keys %$path2name)), "\n";
+ } else {
+ $name2path->{$name} = $file; # Noting just the first occurrence
+ }
+ $verbose and print " Noting $name = $file\n";
+ if( $callback ) {
+ local $_ = $_; # insulate from changes, just in case
+ $callback->($file, $name);
+ }
+ $path2name->{$file} = $name;
+ return;
+ }
+}
+
+#==========================================================================
+
+sub _path2modname {
+ my($self, $file, $shortname, $modname_bits) = @_;
+
+ # this code simplifies the POD name for Perl modules:
+ # * remove "site_perl"
+ # * remove e.g. "i586-linux" (from 'archname')
+ # * remove e.g. 5.00503
+ # * remove pod/ if followed by perl*.pod (e.g. in pod/perlfunc.pod)
+ # * dig into the file for case-preserved name if not already mixed case
+
+ my @m = @$modname_bits;
+ my $x;
+ my $verbose = $self->verbose;
+
+ # Shaving off leading naughty-bits
+ while(@m
+ and defined($x = lc( $m[0] ))
+ and( $x eq 'site_perl'
+ or($x eq 'pod' and @m == 1 and $shortname =~ m{^perl.*\.pod$}s )
+ or $x =~ m{\\d+\\.z\\d+([_.]?\\d+)?} # if looks like a vernum
+ or $x eq lc( $Config::Config{'archname'} )
+ )) { shift @m }
+
+ my $name = join '::', @m, $shortname;
+ $self->_simplify_base($name);
+
+ # On VMS, case-preserved document names can't be constructed from
+ # filenames, so try to extract them from the "=head1 NAME" tag in the
+ # file instead.
+ if ($^O eq 'VMS' && ($name eq lc($name) || $name eq uc($name))) {
+ open PODFILE, "<$file" or die "_path2modname: Can't open $file: $!";
+ my $in_pod = 0;
+ my $in_name = 0;
+ my $line;
+ while ($line = <PODFILE>) {
+ chomp $line;
+ $in_pod = 1 if ($line =~ m/^=\w/);
+ $in_pod = 0 if ($line =~ m/^=cut/);
+ next unless $in_pod; # skip non-pod text
+ next if ($line =~ m/^\s*\z/); # and blank lines
+ next if ($in_pod && ($line =~ m/^X</)); # and commands
+ if ($in_name) {
+ if ($line =~ m/(\w+::)?(\w+)/) {
+ # substitute case-preserved version of name
+ my $podname = $2;
+ my $prefix = $1 || '';
+ $verbose and print "Attempting case restore of '$name' from '$prefix$podname'\n";
+ unless ($name =~ s/$prefix$podname/$prefix$podname/i) {
+ $verbose and print "Attempting case restore of '$name' from '$podname'\n";
+ $name =~ s/$podname/$podname/i;
+ }
+ last;
+ }
+ }
+ $in_name = 1 if ($line =~ m/^=head1 NAME/);
+ }
+ close PODFILE;
+ }
+
+ return $name;
+}
+
+#==========================================================================
+
+sub _recurse_dir {
+ my($self, $startdir, $callback, $modname_bits) = @_;
+
+ my $maxdepth = $self->{'fs_recursion_maxdepth'} || 10;
+ my $verbose = $self->verbose;
+
+ my $here_string = File::Spec->curdir;
+ my $up_string = File::Spec->updir;
+ $modname_bits ||= [];
+
+ my $recursor;
+ $recursor = sub {
+ my($dir_long, $dir_bare) = @_;
+ if( @$modname_bits >= 10 ) {
+ $verbose and print "Too deep! [@$modname_bits]\n";
+ return;
+ }
+
+ unless(-d $dir_long) {
+ $verbose > 2 and print "But it's not a dir! $dir_long\n";
+ return;
+ }
+ unless( opendir(INDIR, $dir_long) ) {
+ $verbose > 2 and print "Can't opendir $dir_long : $!\n";
+ closedir(INDIR);
+ return
+ }
+ my @items = sort readdir(INDIR);
+ closedir(INDIR);
+
+ push @$modname_bits, $dir_bare unless $dir_bare eq '';
+
+ my $i_full;
+ foreach my $i (@items) {
+ next if $i eq $here_string or $i eq $up_string or $i eq '';
+ $i_full = File::Spec->catfile( $dir_long, $i );
+
+ if(!-r $i_full) {
+ $verbose and print "Skipping unreadable $i_full\n";
+
+ } elsif(-f $i_full) {
+ $_ = $i;
+ $callback->( $i_full, $i, 0, $modname_bits );
+
+ } elsif(-d _) {
+ $i =~ s/\.DIR\z//i if $^O eq 'VMS';
+ $_ = $i;
+ my $rv = $callback->( $i_full, $i, 1, $modname_bits ) || '';
+
+ if($rv eq 'PRUNE') {
+ $verbose > 1 and print "OK, pruning";
+ } else {
+ # Otherwise, recurse into it
+ $recursor->( File::Spec->catdir($dir_long, $i) , $i);
+ }
+ } else {
+ $verbose > 1 and print "Skipping oddity $i_full\n";
+ }
+ }
+ pop @$modname_bits;
+ return;
+ };;
+
+ local $_;
+ $recursor->($startdir, '');
+
+ undef $recursor; # allow it to be GC'd
+
+ return;
+}
+
+
+#==========================================================================
+
+sub run {
+ # A function, useful in one-liners
+
+ my $self = __PACKAGE__->new;
+ $self->limit_glob($ARGV[0]) if @ARGV;
+ $self->callback( sub {
+ my($file, $name) = @_;
+ my $version = '';
+
+ # Yes, I know we won't catch the version in like a File/Thing.pm
+ # if we see File/Thing.pod first. That's just the way the
+ # cookie crumbles. -- SMB
+
+ if($file =~ m/\.pod$/i) {
+ # Don't bother looking for $VERSION in .pod files
+ DEBUG and print "Not looking for \$VERSION in .pod $file\n";
+ } elsif( !open(INPOD, $file) ) {
+ DEBUG and print "Couldn't open $file: $!\n";
+ close(INPOD);
+ } else {
+ # Sane case: file is readable
+ my $lines = 0;
+ while(<INPOD>) {
+ last if $lines++ > $MAX_VERSION_WITHIN; # some degree of sanity
+ if( s/^\s*\$VERSION\s*=\s*//s and m/\d/ ) {
+ DEBUG and print "Found version line (#$lines): $_";
+ s/\s*\#.*//s;
+ s/\;\s*$//s;
+ s/\s+$//s;
+ s/\t+/ /s; # nix tabs
+ # Optimize the most common cases:
+ $_ = "v$1"
+ if m{^v?["']?([0-9_]+(\.[0-9_]+)*)["']?$}s
+ # like in $VERSION = "3.14159";
+ or m{\$Revision:\s*([0-9_]+(?:\.[0-9_]+)*)\s*\$}s
+ # like in sprintf("%d.%02d", q$Revision: 4.13 $ =~ /(\d+)\.(\d+)/);
+ ;
+
+ # Like in sprintf("%d.%s", map {s/_//g; $_} q$Name: release-0_55-public $ =~ /-(\d+)_([\d_]+)/)
+ $_ = sprintf("v%d.%s",
+ map {s/_//g; $_}
+ $1 =~ m/-(\d+)_([\d_]+)/) # snare just the numeric part
+ if m{\$Name:\s*([^\$]+)\$}s
+ ;
+ $version = $_;
+ DEBUG and print "Noting $version as version\n";
+ last;
+ }
+ }
+ close(INPOD);
+ }
+ print "$name\t$version\t$file\n";
+ return;
+ # End of callback!
+ });
+
+ $self->survey;
+}
+
+#==========================================================================
+
+sub simplify_name {
+ my($self, $str) = @_;
+
+ # Remove all path components
+ # XXX Why not just use basename()? -- SMB
+
+ if ($^O eq 'MacOS') { $str =~ s{^.*:+}{}s }
+ else { $str =~ s{^.*/+}{}s }
+
+ $self->_simplify_base($str);
+ return $str;
+}
+
+#==========================================================================
+
+sub _simplify_base { # Internal method only
+
+ # strip Perl's own extensions
+ $_[1] =~ s/\.(pod|pm|plx?)\z//i;
+
+ # strip meaningless extensions on Win32 and OS/2
+ $_[1] =~ s/\.(bat|exe|cmd)\z//i if $^O =~ /mswin|os2/i;
+
+ # strip meaningless extensions on VMS
+ $_[1] =~ s/\.(com)\z//i if $^O eq 'VMS';
+
+ return;
+}
+
+#==========================================================================
+
+sub _expand_inc {
+ my($self, $search_dirs) = @_;
+
+ return unless $self->{'inc'};
+
+ if ($^O eq 'MacOS') {
+ push @$search_dirs,
+ grep $_ ne File::Spec->curdir, $self->_mac_whammy(@INC);
+ # Any other OSs need custom handling here?
+ } else {
+ push @$search_dirs, grep $_ ne File::Spec->curdir, @INC;
+ }
+
+ $self->{'laborious'} = 0; # Since inc said to use INC
+ return;
+}
+
+#==========================================================================
+
+sub _mac_whammy { # Tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS
+ my @them;
+ (undef,@them) = @_;
+ for $_ (@them) {
+ if ( $_ eq '.' ) {
+ $_ = ':';
+ } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) {
+ $_ = ':'. $_;
+ } else {
+ $_ =~ s|^\./|:|;
+ }
+ }
+ return @them;
+}
+
+#==========================================================================
+
+sub _limit_glob_to_limit_re {
+ my $self = $_[0];
+ my $limit_glob = $self->{'limit_glob'} || return;
+
+ my $limit_re = '^' . quotemeta($limit_glob) . '$';
+ $limit_re =~ s/\\\?/./g; # glob "?" => "."
+ $limit_re =~ s/\\\*/.*?/g; # glob "*" => ".*?"
+ $limit_re =~ s/\.\*\?\$$//s; # final glob "*" => ".*?$" => ""
+
+ $self->{'verbose'} and print "Turning limit_glob $limit_glob into re $limit_re\n";
+
+ # A common optimization:
+ if(!exists($self->{'dir_prefix'})
+ and $limit_glob =~ m/^(?:\w+\:\:)+/s # like "File::*" or "File::Thing*"
+ # Optimize for sane and common cases (but not things like "*::File")
+ ) {
+ $self->{'dir_prefix'} = join "::", $limit_glob =~ m/^(?:\w+::)+/sg;
+ $self->{'verbose'} and print " and setting dir_prefix to $self->{'dir_prefix'}\n";
+ }
+
+ return $limit_re;
+}
+
+#==========================================================================
+
+# contribution mostly from Tim Jenness <t.jenness@jach.hawaii.edu>
+
+sub find {
+ my($self, $pod, @search_dirs) = @_;
+ $self = $self->new unless ref $self; # tolerate being a class method
+
+ # Check usage
+ Carp::carp 'Usage: \$self->find($podname, ...)'
+ unless defined $pod and length $pod;
+
+ my $verbose = $self->verbose;
+
+ # Split on :: and then join the name together using File::Spec
+ my @parts = split /::/, $pod;
+ $verbose and print "Chomping {$pod} => {@parts}\n";
+
+ #@search_dirs = File::Spec->curdir unless @search_dirs;
+
+ if( $self->inc ) {
+ if( $^O eq 'MacOS' ) {
+ push @search_dirs, $self->_mac_whammy(@INC);
+ } else {
+ push @search_dirs, @INC;
+ }
+
+ # Add location of pod documentation for perl man pages (eg perlfunc)
+ # This is a pod directory in the private install tree
+ #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'},
+ # 'pod');
+ #push (@search_dirs, $perlpoddir)
+ # if -d $perlpoddir;
+
+ # Add location of binaries such as pod2text:
+ push @search_dirs, $Config::Config{'scriptdir'};
+ # and if that's undef or q{} or nonexistent, we just ignore it later
+ }
+
+ my %seen_dir;
+ Dir:
+ foreach my $dir ( @search_dirs ) {
+ next unless defined $dir and length $dir;
+ next if $seen_dir{$dir};
+ $seen_dir{$dir} = 1;
+ unless(-d $dir) {
+ print "Directory $dir does not exist\n" if $verbose;
+ next Dir;
+ }
+
+ print "Looking in directory $dir\n" if $verbose;
+ my $fullname = File::Spec->catfile( $dir, @parts );
+ print "Filename is now $fullname\n" if $verbose;
+
+ foreach my $ext ('', '.pod', '.pm', '.pl') { # possible extensions
+ my $fullext = $fullname . $ext;
+ if( -f $fullext and $self->contains_pod( $fullext ) ){
+ print "FOUND: $fullext\n" if $verbose;
+ return $fullext;
+ }
+ }
+ my $subdir = File::Spec->catdir($dir,'pod');
+ if(-d $subdir) { # slip in the ./pod dir too
+ $verbose and print "Noticing $subdir and stopping there...\n";
+ $dir = $subdir;
+ redo Dir;
+ }
+ }
+
+ return undef;
+}
+
+#==========================================================================
+
+sub contains_pod {
+ my($self, $file) = @_;
+ my $verbose = $self->{'verbose'};
+
+ # check for one line of POD
+ $verbose > 1 and print " Scanning $file for pod...\n";
+ unless( open(MAYBEPOD,"<$file") ) {
+ print "Error: $file is unreadable: $!\n";
+ return undef;
+ }
+
+ sleep($SLEEPY - 1) if $SLEEPY;
+ # avoid totally hogging the processor on OSs with poor process control
+
+ local $_;
+ while( <MAYBEPOD> ) {
+ if(m/^=(head\d|pod|over|item)\b/s) {
+ close(MAYBEPOD) || die "Bizarre error closing $file: $!\nAborting";
+ chomp;
+ $verbose > 1 and print " Found some pod ($_) in $file\n";
+ return 1;
+ }
+ }
+ close(MAYBEPOD) || die "Bizarre error closing $file: $!\nAborting";
+ $verbose > 1 and print " No POD in $file, skipping.\n";
+ return 0;
+}
+
+#==========================================================================
+
+sub _accessorize { # A simple-minded method-maker
+ shift;
+ no strict 'refs';
+ foreach my $attrname (@_) {
+ *{caller() . '::' . $attrname} = sub {
+ use strict;
+ $Carp::CarpLevel = 1, Carp::croak(
+ "Accessor usage: \$obj->$attrname() or \$obj->$attrname(\$new_value)"
+ ) unless (@_ == 1 or @_ == 2) and ref $_[0];
+
+ # Read access:
+ return $_[0]->{$attrname} if @_ == 1;
+
+ # Write access:
+ $_[0]->{$attrname} = $_[1];
+ return $_[0]; # RETURNS MYSELF!
+ };
+ }
+ # Ya know, they say accessories make the ensemble!
+ return;
+}
+
+#==========================================================================
+sub _state_as_string {
+ my $self = $_[0];
+ return '' unless ref $self;
+ my @out = "{\n # State of $self ...\n";
+ foreach my $k (sort keys %$self) {
+ push @out, " ", _esc($k), " => ", _esc($self->{$k}), ",\n";
+ }
+ push @out, "}\n";
+ my $x = join '', @out;
+ $x =~ s/^/#/mg;
+ return $x;
+}
+
+sub _esc {
+ my $in = $_[0];
+ return 'undef' unless defined $in;
+ $in =~
+ s<([^\x20\x21\x23\x27-\x3F\x41-\x5B\x5D-\x7E])>
+ <'\\x'.(unpack("H2",$1))>eg;
+ return qq{"$in"};
+}
+
+#==========================================================================
+
+run() unless caller; # run if "perl whatever/Search.pm"
+
+1;
+
+#==========================================================================
+
+__END__
+
+
+=head1 NAME
+
+Pod::Simple::Search - find POD documents in directory trees
+
+=head1 SYNOPSIS
+
+ use Pod::Simple::Search;
+ my $name2path = Pod::Simple::Search->new->limit_glob('LWP::*')->survey;
+ print "Looky see what I found: ",
+ join(' ', sort keys %$name2path), "\n";
+
+ print "LWPUA docs = ",
+ Pod::Simple::Search->new->find('LWP::UserAgent') || "?",
+ "\n";
+
+=head1 DESCRIPTION
+
+B<Pod::Simple::Search> is a class that you use for running searches
+for Pod files. An object of this class has several attributes
+(mostly options for controlling search options), and some methods
+for searching based on those attributes.
+
+The way to use this class is to make a new object of this class,
+set any options, and then call one of the search options
+(probably C<survey> or C<find>). The sections below discuss the
+syntaxes for doing all that.
+
+
+=head1 CONSTRUCTOR
+
+This class provides the one constructor, called C<new>.
+It takes no parameters:
+
+ use Pod::Simple::Search;
+ my $search = Pod::Simple::Search->new;
+
+=head1 ACCESSORS
+
+This class defines several methods for setting (and, occasionally,
+reading) the contents of an object. With two exceptions (discussed at
+the end of this section), these attributes are just for controlling the
+way searches are carried out.
+
+Note that each of these return C<$self> when you call them as
+C<< $self->I<whatever(value)> >>. That's so that you can chain
+together set-attribute calls like this:
+
+ my $name2path =
+ Pod::Simple::Search->new
+ -> inc(0) -> verbose(1) -> callback(\&blab)
+ ->survey(@there);
+
+...which works exactly as if you'd done this:
+
+ my $search = Pod::Simple::Search->new;
+ $search->inc(0);
+ $search->verbose(1);
+ $search->callback(\&blab);
+ my $name2path = $search->survey(@there);
+
+=over
+
+=item $search->inc( I<true-or-false> );
+
+This attribute, if set to a true value, means that searches should
+implicitly add perl's I<@INC> paths. This
+automatically considers paths specified in the C<PERL5LIB> environment
+as this is prepended to I<@INC> by the Perl interpreter itself.
+This attribute's default value is B<TRUE>. If you want to search
+only specific directories, set $self->inc(0) before calling
+$inc->survey or $inc->find.
+
+
+=item $search->verbose( I<nonnegative-number> );
+
+This attribute, if set to a nonzero positive value, will make searches output
+(via C<warn>) notes about what they're doing as they do it.
+This option may be useful for debugging a pod-related module.
+This attribute's default value is zero, meaning that no C<warn> messages
+are produced. (Setting verbose to 1 turns on some messages, and setting
+it to 2 turns on even more messages, i.e., makes the following search(es)
+even more verbose than 1 would make them.)
+
+
+=item $search->limit_glob( I<some-glob-string> );
+
+This option means that you want to limit the results just to items whose
+podnames match the given glob/wildcard expression. For example, you
+might limit your search to just "LWP::*", to search only for modules
+starting with "LWP::*" (but not including the module "LWP" itself); or
+you might limit your search to "LW*" to see only modules whose (full)
+names begin with "LW"; or you might search for "*Find*" to search for
+all modules with "Find" somewhere in their full name. (You can also use
+"?" in a glob expression; so "DB?" will match "DBI" and "DBD".)
+
+
+=item $search->callback( I<\&some_routine> );
+
+This attribute means that every time this search sees a matching
+Pod file, it should call this callback routine. The routine is called
+with two parameters: the current file's filespec, and its pod name.
+(For example: C<("/etc/perljunk/File/Crunk.pm", "File::Crunk")> would
+be in C<@_>.)
+
+The callback routine's return value is not used for anything.
+
+This attribute's default value is false, meaning that no callback
+is called.
+
+=item $search->laborious( I<true-or-false> );
+
+Unless you set this attribute to a true value, Pod::Search will
+apply Perl-specific heuristics to find the correct module PODs quickly.
+This attribute's default value is false. You won't normally need
+to set this to true.
+
+Specifically: Turning on this option will disable the heuristics for
+seeing only files with Perl-like extensions, omitting subdirectories
+that are numeric but do I<not> match the current Perl interpreter's
+version ID, suppressing F<site_perl> as a module hierarchy name, etc.
+
+
+=item $search->shadows( I<true-or-false> );
+
+Unless you set this attribute to a true value, Pod::Simple::Search will
+consider only the first file of a given modulename as it looks thru the
+specified directories; that is, with this option off, if
+Pod::Simple::Search has seen a C<somepathdir/Foo/Bar.pm> already in this
+search, then it won't bother looking at a C<somelaterpathdir/Foo/Bar.pm>
+later on in that search, because that file is merely a "shadow". But if
+you turn on C<< $self->shadows(1) >>, then these "shadow" files are
+inspected too, and are noted in the pathname2podname return hash.
+
+This attribute's default value is false; and normally you won't
+need to turn it on.
+
+
+=item $search->limit_re( I<some-regxp> );
+
+Setting this attribute (to a value that's a regexp) means that you want
+to limit the results just to items whose podnames match the given
+regexp. Normally this option is not needed, and the more efficient
+C<limit_glob> attribute is used instead.
+
+
+=item $search->dir_prefix( I<some-string-value> );
+
+Setting this attribute to a string value means that the searches should
+begin in the specified subdirectory name (like "Pod" or "File::Find",
+also expressable as "File/Find"). For example, the search option
+C<< $search->limit_glob("File::Find::R*") >>
+is the same as the combination of the search options
+C<< $search->limit_re("^File::Find::R") -> dir_prefix("File::Find") >>.
+
+Normally you don't need to know about the C<dir_prefix> option, but I
+include it in case it might prove useful for someone somewhere.
+
+(Implementationally, searching with limit_glob ends up setting limit_re
+and usually dir_prefix.)
+
+
+=item $search->progress( I<some-progress-object> );
+
+If you set a value for this attribute, the value is expected
+to be an object (probably of a class that you define) that has a
+C<reach> method and a C<done> method. This is meant for reporting
+progress during the search, if you don't want to use a simple
+callback.
+
+Normally you don't need to know about the C<progress> option, but I
+include it in case it might prove useful for someone somewhere.
+
+While a search is in progress, the progress object's C<reach> and
+C<done> methods are called like this:
+
+ # Every time a file is being scanned for pod:
+ $progress->reach($count, "Scanning $file"); ++$count;
+
+ # And then at the end of the search:
+ $progress->done("Noted $count Pod files total");
+
+Internally, we often set this to an object of class
+Pod::Simple::Progress. That class is probably undocumented,
+but you may wish to look at its source.
+
+
+=item $name2path = $self->name2path;
+
+This attribute is not a search parameter, but is used to report the
+result of C<survey> method, as discussed in the next section.
+
+=item $path2name = $self->path2name;
+
+This attribute is not a search parameter, but is used to report the
+result of C<survey> method, as discussed in the next section.
+
+=back
+
+=head1 MAIN SEARCH METHODS
+
+Once you've actually set any options you want (if any), you can go
+ahead and use the following methods to search for Pod files
+in particular ways.
+
+
+=head2 C<< $search->survey( @directories ) >>
+
+The method C<survey> searches for POD documents in a given set of
+files and/or directories. This runs the search according to the various
+options set by the accessors above. (For example, if the C<inc> attribute
+is on, as it is by default, then the perl @INC directories are implicitly
+added to the list of directories (if any) that you specify.)
+
+The return value of C<survey> is two hashes:
+
+=over
+
+=item C<name2path>
+
+A hash that maps from each pod-name to the filespec (like
+"Stuff::Thing" => "/whatever/plib/Stuff/Thing.pm")
+
+=item C<path2name>
+
+A hash that maps from each Pod filespec to its pod-name (like
+"/whatever/plib/Stuff/Thing.pm" => "Stuff::Thing")
+
+=back
+
+Besides saving these hashes as the hashref attributes
+C<name2path> and C<path2name>, calling this function also returns
+these hashrefs. In list context, the return value of
+C<< $search->survey >> is the list C<(\%name2path, \%path2name)>.
+In scalar context, the return value is C<\%name2path>.
+Or you can just call this in void context.
+
+Regardless of calling context, calling C<survey> saves
+its results in its C<name2path> and C<path2name> attributes.
+
+E.g., when searching in F<$HOME/perl5lib>, the file
+F<$HOME/perl5lib/MyModule.pm> would get the POD name I<MyModule>,
+whereas F<$HOME/perl5lib/Myclass/Subclass.pm> would be
+I<Myclass::Subclass>. The name information can be used for POD
+translators.
+
+Only text files containing at least one valid POD command are found.
+
+In verbose mode, a warning is printed if shadows are found (i.e., more
+than one POD file with the same POD name is found, e.g. F<CPAN.pm> in
+different directories). This usually indicates duplicate occurrences of
+modules in the I<@INC> search path, which is occasionally inadvertent
+(but is often simply a case of a user's path dir having a more recent
+version than the system's general path dirs in general.)
+
+The options to this argument is a list of either directories that are
+searched recursively, or files. (Usually you wouldn't specify files,
+but just dirs.) Or you can just specify an empty-list, as in
+$name2path; with the
+C<inc> option on, as it is by default, teh
+
+The POD names of files are the plain basenames with any Perl-like
+extension (.pm, .pl, .pod) stripped, and path separators replaced by
+C<::>'s.
+
+Calling Pod::Simple::Search->search(...) is short for
+Pod::Simple::Search->new->search(...). That is, a throwaway object
+with default attribute values is used.
+
+
+=head2 C<< $search->simplify_name( $str ) >>
+
+The method B<simplify_name> is equivalent to B<basename>, but also
+strips Perl-like extensions (.pm, .pl, .pod) and extensions like
+F<.bat>, F<.cmd> on Win32 and OS/2, or F<.com> on VMS, respectively.
+
+
+=head2 C<< $search->find( $pod ) >>
+
+=head2 C<< $search->find( $pod, @search_dirs ) >>
+
+Returns the location of a Pod file, given a Pod/module/script name
+(like "Foo::Bar" or "perlvar" or "perldoc"), and an idea of
+what files/directories to look in.
+It searches according to the various options set by the accessors above.
+(For example, if the C<inc> attribute is on, as it is by default, then
+the perl @INC directories are implicitly added to the list of
+directories (if any) that you specify.)
+
+This returns the full path of the first occurrence to the file.
+Package names (eg 'A::B') are automatically converted to directory
+names in the selected directory. Additionally, '.pm', '.pl' and '.pod'
+are automatically appended to the search as required.
+(So, for example, under Unix, "A::B" is converted to "somedir/A/B.pm",
+"somedir/A/B.pod", or "somedir/A/B.pl", as appropriate.)
+
+If no such Pod file is found, this method returns undef.
+
+If any of the given search directories contains a F<pod/> subdirectory,
+then it is searched. (That's how we manage to find F<perlfunc>,
+for example, which is usually in F<pod/perlfunc> in most Perl dists.)
+
+The C<verbose> and C<inc> attributes influence the behavior of this
+search; notably, C<inc>, if true, adds @INC I<and also
+$Config::Config{'scriptdir'}> to the list of directories to search.
+
+It is common to simply say C<< $filename = Pod::Simple::Search-> new
+->find("perlvar") >> so that just the @INC (well, and scriptdir)
+directories are searched. (This happens because the C<inc>
+attribute is true by default.)
+
+Calling Pod::Simple::Search->find(...) is short for
+Pod::Simple::Search->new->find(...). That is, a throwaway object
+with default attribute values is used.
+
+
+=head2 C<< $self->contains_pod( $file ) >>
+
+Returns true if the supplied filename (not POD module) contains some Pod
+documentation.
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org> with code borrowed
+from Marek Rouchal's L<Pod::Find>, which in turn heavily borrowed code from
+Nick Ing-Simmons' C<PodToHtml>.
+
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/SimpleTree.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/SimpleTree.pm
new file mode 100644
index 00000000000..32db4b6a51d
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/SimpleTree.pm
@@ -0,0 +1,180 @@
+
+
+require 5;
+package Pod::Simple::SimpleTree;
+use strict;
+use Carp ();
+use Pod::Simple ();
+use vars qw( $ATTR_PAD @ISA $VERSION $SORT_ATTRS);
+$VERSION = '3.14';
+BEGIN {
+ @ISA = ('Pod::Simple');
+ *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG;
+}
+
+__PACKAGE__->_accessorize(
+ 'root', # root of the tree
+);
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub _handle_element_start { # self, tagname, attrhash
+ DEBUG > 2 and print "Handling $_[1] start-event\n";
+ my $x = [$_[1], $_[2]];
+ if($_[0]{'_currpos'}) {
+ push @{ $_[0]{'_currpos'}[0] }, $x; # insert in parent's child-list
+ unshift @{ $_[0]{'_currpos'} }, $x; # prefix to stack
+ } else {
+ DEBUG and print " And oo, it gets to be root!\n";
+ $_[0]{'_currpos'} = [ $_[0]{'root'} = $x ];
+ # first event! set to stack, and set as root.
+ }
+ DEBUG > 3 and print "Stack is now: ",
+ join(">", map $_->[0], @{$_[0]{'_currpos'}}), "\n";
+ return;
+}
+
+sub _handle_element_end { # self, tagname
+ DEBUG > 2 and print "Handling $_[1] end-event\n";
+ shift @{$_[0]{'_currpos'}};
+ DEBUG > 3 and print "Stack is now: ",
+ join(">", map $_->[0], @{$_[0]{'_currpos'}}), "\n";
+ return;
+}
+
+sub _handle_text { # self, text
+ DEBUG > 2 and print "Handling $_[1] text-event\n";
+ push @{ $_[0]{'_currpos'}[0] }, $_[1];
+ return;
+}
+
+
+# A bit of evil from the black box... please avert your eyes, kind souls.
+sub _traverse_treelet_bit {
+ DEBUG > 2 and print "Handling $_[1] paragraph event\n";
+ my $self = shift;
+ push @{ $self->{'_currpos'}[0] }, [@_];
+ return;
+}
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1;
+__END__
+
+=head1 NAME
+
+Pod::Simple::SimpleTree -- parse Pod into a simple parse tree
+
+=head1 SYNOPSIS
+
+ % cat ptest.pod
+
+ =head1 PIE
+
+ I like B<pie>!
+
+ % perl -MPod::Simple::SimpleTree -MData::Dumper -e \
+ "print Dumper(Pod::Simple::SimpleTree->new->parse_file(shift)->root)" \
+ ptest.pod
+
+ $VAR1 = [
+ 'Document',
+ { 'start_line' => 1 },
+ [
+ 'head1',
+ { 'start_line' => 1 },
+ 'PIE'
+ ],
+ [
+ 'Para',
+ { 'start_line' => 3 },
+ 'I like ',
+ [
+ 'B',
+ {},
+ 'pie'
+ ],
+ '!'
+ ]
+ ];
+
+=head1 DESCRIPTION
+
+This class is of interest to people writing a Pod processor/formatter.
+
+This class takes Pod and parses it, returning a parse tree made just
+of arrayrefs, and hashrefs, and strings.
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+This class is inspired by XML::Parser's "Tree" parsing-style, although
+it doesn't use exactly the same LoL format.
+
+=head1 METHODS
+
+At the end of the parse, call C<< $parser->root >> to get the
+tree's top node.
+
+=head1 Tree Contents
+
+Every element node in the parse tree is represented by an arrayref of
+the form: C<[ I<elementname>, \%attributes, I<...subnodes...> ]>.
+See the example tree dump in the Synopsis, above.
+
+Every text node in the tree is represented by a simple (non-ref)
+string scalar. So you can test C<ref($node)> to see whather you have
+an element node or just a text node.
+
+The top node in the tree is C<[ 'Document', \%attributes,
+I<...subnodes...> ]>
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple>
+
+L<perllol>
+
+L<The "Tree" subsubsection in XML::Parser|XML::Parser/"Tree">
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Subclassing.pod b/Master/tlpkg/tlperl/lib/Pod/Simple/Subclassing.pod
new file mode 100644
index 00000000000..f2011d5a5ce
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Subclassing.pod
@@ -0,0 +1,946 @@
+
+=head1 NAME
+
+Pod::Simple::Subclassing -- write a formatter as a Pod::Simple subclass
+
+=head1 SYNOPSIS
+
+ package Pod::SomeFormatter;
+ use Pod::Simple;
+ @ISA = qw(Pod::Simple);
+ $VERSION = '1.01';
+ use strict;
+
+ sub _handle_element_start {
+ my($parser, $element_name, $attr_hash_r) = @_;
+ ...
+ }
+
+ sub _handle_element_end {
+ my($parser, $element_name) = @_;
+ ...
+ }
+
+ sub _handle_text {
+ my($parser, $text) = @_;
+ ...
+ }
+ 1;
+
+=head1 DESCRIPTION
+
+This document is about using Pod::Simple to write a Pod processor,
+generally a Pod formatter. If you just want to know about using an
+existing Pod formatter, instead see its documentation and see also the
+docs in L<Pod::Simple>.
+
+The zeroeth step in writing a Pod formatter is to make sure that there
+isn't already a decent one in CPAN. See L<http://search.cpan.org/>, and
+run a search on the name of the format you want to render to. Also
+consider joining the Pod People list
+L<http://lists.perl.org/showlist.cgi?name=pod-people> and asking whether
+anyone has a formatter for that format -- maybe someone cobbled one
+together but just hasn't released it.
+
+The first step in writing a Pod processor is to read L<perlpodspec>,
+which contains notes information on writing a Pod parser (which has been
+largely taken care of by Pod::Simple), but also a lot of requirements
+and recommendations for writing a formatter.
+
+The second step is to actually learn the format you're planning to
+format to -- or at least as much as you need to know to represent Pod,
+which probably isn't much.
+
+The third step is to pick which of Pod::Simple's interfaces you want to
+use -- the basic interface via Pod::Simple or L<Pod::Simple::Methody> is
+event-based, sort of like L<HTML::Parser>'s interface, or sort of like
+L<XML::Parser>'s "Handlers" interface), but L<Pod::Simple::PullParser>
+provides a token-stream interface, sort of like L<HTML::TokeParser>'s
+interface; L<Pod::Simple::SimpleTree> provides a simple tree interface,
+rather like XML::Parser's "Tree" interface. Users familiar with
+XML-handling will find one of these styles relatively familiar; but if
+you would be even more at home with XML, there are classes that produce
+an XML representation of the Pod stream, notably
+L<Pod::Simple::XMLOutStream>; you can feed the output of such a class to
+whatever XML parsing system you are most at home with.
+
+The last step is to write your code based on how the events (or tokens,
+or tree-nodes, or the XML, or however you're parsing) will map to
+constructs in the output format. Also sure to consider how to escape
+text nodes containing arbitrary text, and also what to do with text
+nodes that represent preformatted text (from verbatim sections).
+
+
+
+=head1 Events
+
+TODO intro... mention that events are supplied for implicits, like for
+missing >'s
+
+
+In the following section, we use XML to represent the event structure
+associated with a particular construct. That is, TODO
+
+=over
+
+=item C<< $parser->_handle_element_start( I<element_name>, I<attr_hashref> ) >>
+
+=item C<< $parser->_handle_element_end( I<element_name> ) >>
+
+=item C<< $parser->_handle_text( I<text_string> ) >>
+
+=back
+
+TODO describe
+
+
+=over
+
+=item events with an element_name of Document
+
+Parsing a document produces this event structure:
+
+ <Document start_line="543">
+ ...all events...
+ </Document>
+
+The value of the I<start_line> attribute will be the line number of the first
+Pod directive in the document.
+
+If there is no Pod in the given document, then the
+event structure will be this:
+
+ <Document contentless="1" start_line="543">
+ </Document>
+
+In that case, the value of the I<start_line> attribute will not be meaningful;
+under current implementations, it will probably be the line number of the
+last line in the file.
+
+=item events with an element_name of Para
+
+Parsing a plain (non-verbatim, non-directive, non-data) paragraph in
+a Pod document produces this event structure:
+
+ <Para start_line="543">
+ ...all events in this paragraph...
+ </Para>
+
+The value of the I<start_line> attribute will be the line number of the start
+of the paragraph.
+
+For example, parsing this paragraph of Pod:
+
+ The value of the I<start_line> attribute will be the
+ line number of the start of the paragraph.
+
+produces this event structure:
+
+ <Para start_line="129">
+ The value of the
+ <I>
+ start_line
+ </I>
+ attribute will be the line number of the first Pod directive
+ in the document.
+ </Para>
+
+=item events with an element_name of B, C, F, or I.
+
+Parsing a BE<lt>...E<gt> formatting code (or of course any of its
+semantically identical syntactic variants
+S<BE<lt>E<lt> ... E<gt>E<gt>>,
+or S<BE<lt>E<lt>E<lt>E<lt> ... E<gt>E<gt>E<gt>E<gt>>, etc.)
+produces this event structure:
+
+ <B>
+ ...stuff...
+ </B>
+
+Currently, there are no attributes conveyed.
+
+Parsing C, F, or I codes produce the same structure, with only a
+different element name.
+
+If your parser object has been set to accept other formatting codes,
+then they will be presented like these B/C/F/I codes -- i.e., without
+any attributes.
+
+=item events with an element_name of S
+
+Normally, parsing an SE<lt>...E<gt> sequence produces this event
+structure, just as if it were a B/C/F/I code:
+
+ <S>
+ ...stuff...
+ </S>
+
+However, Pod::Simple (and presumably all derived parsers) offers the
+C<nbsp_for_S> option which, if enabled, will suppress all S events, and
+instead change all spaces in the content to non-breaking spaces. This is
+intended for formatters that output to a format that has no code that
+means the same as SE<lt>...E<gt>, but which has a code/character that
+means non-breaking space.
+
+=item events with an element_name of X
+
+Normally, parsing an XE<lt>...E<gt> sequence produces this event
+structure, just as if it were a B/C/F/I code:
+
+ <X>
+ ...stuff...
+ </X>
+
+However, Pod::Simple (and presumably all derived parsers) offers the
+C<nix_X_codes> option which, if enabled, will suppress all X events
+and ignore their content. For formatters/processors that don't use
+X events, this is presumably quite useful.
+
+
+=item events with an element_name of L
+
+Because the LE<lt>...E<gt> is the most complex construct in the
+language, it should not surprise you that the events it generates are
+the most complex in the language. Most of complexity is hidden away in
+the attribute values, so for those of you writing a Pod formatter that
+produces a non-hypertextual format, you can just ignore the attributes
+and treat an L event structure like a formatting element that
+(presumably) doesn't actually produce a change in formatting. That is,
+the content of the L event structure (as opposed to its
+attributes) is always what text should be displayed.
+
+There are, at first glance, three kinds of L links: URL, man, and pod.
+
+When a LE<lt>I<some_url>E<gt> code is parsed, it produces this event
+structure:
+
+ <L content-implicit="yes" to="that_url" type="url">
+ that_url
+ </L>
+
+The C<type="url"> attribute is always specified for this type of
+L code.
+
+For example, this Pod source:
+
+ L<http://www.perl.com/CPAN/authors/>
+
+produces this event structure:
+
+ <L content-implicit="yes" to="http://www.perl.com/CPAN/authors/" type="url">
+ http://www.perl.com/CPAN/authors/
+ </L>
+
+When a LE<lt>I<manpage(section)>E<gt> code is parsed (and these are
+fairly rare and not terribly useful), it produces this event structure:
+
+ <L content-implicit="yes" to="manpage(section)" type="man">
+ manpage(section)
+ </L>
+
+The C<type="man"> attribute is always specified for this type of
+L code.
+
+For example, this Pod source:
+
+ L<crontab(5)>
+
+produces this event structure:
+
+ <L content-implicit="yes" to="crontab(5)" type="man">
+ crontab(5)
+ </L>
+
+In the rare cases where a man page link has a specified, that text appears
+in a I<section> attribute. For example, this Pod source:
+
+ L<crontab(5)/"ENVIRONMENT">
+
+will produce this event structure:
+
+ <L content-implicit="yes" section="ENVIRONMENT" to="crontab(5)" type="man">
+ "ENVIRONMENT" in crontab(5)
+ </L>
+
+In the rare case where the Pod document has code like
+LE<lt>I<sometext>|I<manpage(section)>E<gt>, then the I<sometext> will appear
+as the content of the element, the I<manpage(section)> text will appear
+only as the value of the I<to> attribute, and there will be no
+C<content-implicit="yes"> attribute (whose presence means that the Pod parser
+had to infer what text should appear as the link text -- as opposed to
+cases where that attribute is absent, which means that the Pod parser did
+I<not> have to infer the link text, because that L code explicitly specified
+some link text.)
+
+For example, this Pod source:
+
+ L<hell itself!|crontab(5)>
+
+will produce this event structure:
+
+ <L to="crontab(5)" type="man">
+ hell itself!
+ </L>
+
+The last type of L structure is for links to/within Pod documents. It is
+the most complex because it can have a I<to> attribute, I<or> a
+I<section> attribute, or both. The C<type="pod"> attribute is always
+specified for this type of L code.
+
+In the most common case, the simple case of a LE<lt>podpageE<gt> code
+produces this event structure:
+
+ <L content-implicit="yes" to="Net::Ping" type="pod">
+ podpage
+ </L>
+
+For example, this Pod source:
+
+ L<Net::Ping>
+
+produces this event structure:
+
+ <L content-implicit="yes" to="Net::Ping" type="pod">
+ Net::Ping
+ </L>
+
+In cases where there is link-text explicitly specified, it
+is to be found in the content of the element (and not the
+attributes), just as with the LE<lt>I<sometext>|I<manpage(section)>E<gt>
+case discussed above. For example, this Pod source:
+
+ L<Perl Error Messages|perldiag>
+
+produces this event structure:
+
+ <L to="perldiag" type="pod">
+ Perl Error Messages
+ </L>
+
+In cases of links to a section in the current Pod document,
+there is a I<section> attribute instead of a I<to> attribute.
+For example, this Pod source:
+
+ L</"Member Data">
+
+produces this event structure:
+
+ <L content-implicit="yes" section="Member Data" type="pod">
+ "Member Data"
+ </L>
+
+As another example, this Pod source:
+
+ L<the various attributes|/"Member Data">
+
+produces this event structure:
+
+ <L section="Member Data" type="pod">
+ the various attributes
+ </L>
+
+In cases of links to a section in a different Pod document,
+there are both a I<section> attribute and a L<to> attribute.
+For example, this Pod source:
+
+ L<perlsyn/"Basic BLOCKs and Switch Statements">
+
+produces this event structure:
+
+ <L content-implicit="yes" section="Basic BLOCKs and Switch Statements" to="perlsyn" type="pod">
+ "Basic BLOCKs and Switch Statements" in perlsyn
+ </L>
+
+As another example, this Pod source:
+
+ L<SWITCH statements|perlsyn/"Basic BLOCKs and Switch Statements">
+
+produces this event structure:
+
+ <L section="Basic BLOCKs and Switch Statements" to="perlsyn" type="pod">
+ SWITCH statements
+ </L>
+
+Incidentally, note that we do not distinguish between these syntaxes:
+
+ L</"Member Data">
+ L<"Member Data">
+ L</Member Data>
+ L<Member Data> [deprecated syntax]
+
+That is, they all produce the same event structure, namely:
+
+ <L content-implicit="yes" section="Member Data" type="pod">
+ &#34;Member Data&#34;
+ </L>
+
+=item events with an element_name of E or Z
+
+While there are Pod codes EE<lt>...E<gt> and ZE<lt>E<gt>, these
+I<do not> produce any E or Z events -- that is, there are no such
+events as E or Z.
+
+=item events with an element_name of Verbatim
+
+When a Pod verbatim paragraph (AKA "codeblock") is parsed, it
+produces this event structure:
+
+ <Verbatim start_line="543" xml:space="preserve">
+ ...text...
+ </Verbatim>
+
+The value of the I<start_line> attribute will be the line number of the
+first line of this verbatim block. The I<xml:space> attribute is always
+present, and always has the value "preserve".
+
+The text content will have tabs already expanded.
+
+
+=item events with an element_name of head1 .. head4
+
+When a "=head1 ..." directive is parsed, it produces this event
+structure:
+
+ <head1>
+ ...stuff...
+ </head1>
+
+For example, a directive consisting of this:
+
+ =head1 Options to C<new> et al.
+
+will produce this event structure:
+
+ <head1 start_line="543">
+ Options to
+ <C>
+ new
+ </C>
+ et al.
+ </head1>
+
+"=head2" thru "=head4" directives are the same, except for the element
+names in the event structure.
+
+=item events with an element_name of over-bullet
+
+When an "=over ... Z<>=back" block is parsed where the items are
+a bulletted list, it will produce this event structure:
+
+ <over-bullet indent="4" start_line="543">
+ <item-bullet start_line="545">
+ ...Stuff...
+ </item-bullet>
+ ...more item-bullets...
+ </over-bullet>
+
+The value of the I<indent> attribute is whatever value is after the
+"=over" directive, as in "=over 8". If no such value is specified
+in the directive, then the I<indent> attribute has the value "4".
+
+For example, this Pod source:
+
+ =over
+
+ =item *
+
+ Stuff
+
+ =item *
+
+ Bar I<baz>!
+
+ =back
+
+produces this event structure:
+
+ <over-bullet indent="4" start_line="10">
+ <item-bullet start_line="12">
+ Stuff
+ </item-bullet>
+ <item-bullet start_line="14">
+ Bar <I>baz</I>!
+ </item-bullet>
+ </over-bullet>
+
+=item events with an element_name of over-number
+
+When an "=over ... Z<>=back" block is parsed where the items are
+a numbered list, it will produce this event structure:
+
+ <over-number indent="4" start_line="543">
+ <item-number number="1" start_line="545">
+ ...Stuff...
+ </item-number>
+ ...more item-number...
+ </over-bullet>
+
+This is like the "over-bullet" event structure; but note that the contents
+are "item-number" instead of "item-bullet", and note that they will have
+a "number" attribute, which some formatters/processors may ignore
+(since, for example, there's no need for it in HTML when producing
+an "<UL><LI>...</LI>...</UL>" structure), but which any processor may use.
+
+Note that the values for the I<number> attributes of "item-number"
+elements in a given "over-number" area I<will> start at 1 and go up by
+one each time. If the Pod source doesn't follow that order (even though
+it really should should!), whatever numbers it has will be ignored (with
+the correct values being put in the I<number> attributes), and an error
+message might be issued to the user.
+
+=item events with an element_name of over-text
+
+These events are are somewhat unlike the other over-*
+structures, as far as what their contents are. When
+an "=over ... Z<>=back" block is parsed where the items are
+a list of text "subheadings", it will produce this event structure:
+
+ <over-text indent="4" start_line="543">
+ <item-text>
+ ...stuff...
+ </item-text>
+ ...stuff (generally Para or Verbatim elements)...
+ <item-text>
+ ...more item-text and/or stuff...
+ </over-text>
+
+The I<indent> attribute is as with the other over-* events.
+
+For example, this Pod source:
+
+ =over
+
+ =item Foo
+
+ Stuff
+
+ =item Bar I<baz>!
+
+ Quux
+
+ =back
+
+produces this event structure:
+
+ <over-text indent="4" start_line="20">
+ <item-text start_line="22">
+ Foo
+ </item-text>
+ <Para start_line="24">
+ Stuff
+ </Para>
+ <item-text start_line="26">
+ Bar
+ <I>
+ baz
+ </I>
+ !
+ </item-text>
+ <Para start_line="28">
+ Quux
+ </Para>
+ </over-text>
+
+
+
+=item events with an element_name of over-block
+
+These events are are somewhat unlike the other over-*
+structures, as far as what their contents are. When
+an "=over ... Z<>=back" block is parsed where there are no items,
+it will produce this event structure:
+
+ <over-block indent="4" start_line="543">
+ ...stuff (generally Para or Verbatim elements)...
+ </over-block>
+
+The I<indent> attribute is as with the other over-* events.
+
+For example, this Pod source:
+
+ =over
+
+ For cutting off our trade with all parts of the world
+
+ For transporting us beyond seas to be tried for pretended offenses
+
+ He is at this time transporting large armies of foreign mercenaries to
+ complete the works of death, desolation and tyranny, already begun with
+ circumstances of cruelty and perfidy scarcely paralleled in the most
+ barbarous ages, and totally unworthy the head of a civilized nation.
+
+ =cut
+
+will produce this event structure:
+
+ <over-block indent="4" start_line="2">
+ <Para start_line="4">
+ For cutting off our trade with all parts of the world
+ </Para>
+ <Para start_line="6">
+ For transporting us beyond seas to be tried for pretended offenses
+ </Para>
+ <Para start_line="8">
+ He is at this time transporting large armies of [...more text...]
+ </Para>
+ </over-block>
+
+=item events with an element_name of item-bullet
+
+See L</"events with an element_name of over-bullet">, above.
+
+=item events with an element_name of item-number
+
+See L</"events with an element_name of over-number">, above.
+
+=item events with an element_name of item-text
+
+See L</"events with an element_name of over-text">, above.
+
+=item events with an element_name of for
+
+TODO...
+
+=item events with an element_name of Data
+
+TODO...
+
+=back
+
+
+
+=head1 More Pod::Simple Methods
+
+Pod::Simple provides a lot of methods that aren't generally interesting
+to the end user of an existing Pod formatter, but some of which you
+might find useful in writing a Pod formatter. They are listed below. The
+first several methods (the accept_* methods) are for declaring the
+capabilites of your parser, notably what C<=for I<targetname>> sections
+it's interested in, what extra NE<lt>...E<gt> codes it accepts beyond
+the ones described in the I<perlpod>.
+
+=over
+
+=item C<< $parser->accept_targets( I<SOMEVALUE> ) >>
+
+As the parser sees sections like:
+
+ =for html <img src="fig1.jpg">
+
+or
+
+ =begin html
+
+ <img src="fig1.jpg">
+
+ =end html
+
+...the parser will ignore these sections unless your subclass has
+specified that it wants to see sections targetted to "html" (or whatever
+the formatter name is).
+
+If you want to process all sections, even if they're not targetted for you,
+call this before you start parsing:
+
+ $parser->accept_targets('*');
+
+=item C<< $parser->accept_targets_as_text( I<SOMEVALUE> ) >>
+
+This is like accept_targets, except that it specifies also that the
+content of sections for this target should be treated as Pod text even
+if the target name in "=for I<targetname>" doesn't start with a ":".
+
+At time of writing, I don't think you'll need to use this.
+
+
+=item C<< $parser->accept_codes( I<Codename>, I<Codename>... ) >>
+
+This tells the parser that you accept additional formatting codes,
+beyond just the standard ones (I B C L F S X, plus the two weird ones
+you don't actually see in the parse tree, Z and E). For example, to also
+accept codes "N", "R", and "W":
+
+ $parser->accept_codes( qw( N R W ) );
+
+B<TODO: document how this interacts with =extend, and long element names>
+
+
+=item C<< $parser->accept_directive_as_data( I<directive_name> ) >>
+
+=item C<< $parser->accept_directive_as_verbatim( I<directive_name> ) >>
+
+=item C<< $parser->accept_directive_as_processed( I<directive_name> ) >>
+
+In the unlikely situation that you need to tell the parser that you will
+accept additional directives ("=foo" things), you need to first set the
+parset to treat its content as data (i.e., not really processed at
+all), or as verbatim (mostly just expanding tabs), or as processed text
+(parsing formatting codes like BE<lt>...E<gt>).
+
+For example, to accept a new directive "=method", you'd presumably
+use:
+
+ $parser->accept_directive_as_processed("method");
+
+so that you could have Pod lines like:
+
+ =method I<$whatever> thing B<um>
+
+Making up your own directives breaks compatibility with other Pod
+formatters, in a way that using "=for I<target> ..." lines doesn't;
+however, you may find this useful if you're making a Pod superset
+format where you don't need to worry about compatibility.
+
+
+=item C<< $parser->nbsp_for_S( I<BOOLEAN> ); >>
+
+Setting this attribute to a true value (and by default it is false) will
+turn "SE<lt>...E<gt>" sequences into sequences of words separated by
+C<\xA0> (non-breaking space) characters. For example, it will take this:
+
+ I like S<Dutch apple pie>, don't you?
+
+and treat it as if it were:
+
+ I like DutchE<nbsp>appleE<nbsp>pie, don't you?
+
+This is handy for output formats that don't have anything quite like an
+"SE<lt>...E<gt>" code, but which do have a code for non-breaking space.
+
+There is currently no method for going the other way; but I can
+probably provide one upon request.
+
+
+=item C<< $parser->version_report() >>
+
+This returns a string reporting the $VERSION value from your module (and
+its classname) as well as the $VERSION value of Pod::Simple. Note that
+L<perlpodspec> requires output formats (wherever possible) to note
+this detail in a comment in the output format. For example, for
+some kind of SGML output format:
+
+ print OUT "<!-- \n", $parser->version_report, "\n -->";
+
+
+=item C<< $parser->pod_para_count() >>
+
+This returns the count of Pod paragraphs seen so far.
+
+
+=item C<< $parser->line_count() >>
+
+This is the current line number being parsed. But you might find the
+"line_number" event attribute more accurate, when it is present.
+
+
+=item C<< $parser->nix_X_codes( I<SOMEVALUE> ) >>
+
+This attribute, when set to a true value (and it is false by default)
+ignores any "XE<lt>...E<gt>" sequences in the document being parsed.
+Many formats don't actually use the content of these codes, so have
+no reason to process them.
+
+
+=item C<< $parser->merge_text( I<SOMEVALUE> ) >>
+
+This attribute, when set to a true value (and it is false by default)
+makes sure that only one event (or token, or node) will be created
+for any single contiguous sequence of text. For example, consider
+this somewhat contrived example:
+
+ I just LOVE Z<>hotE<32>apple pie!
+
+When that is parsed and events are about to be called on it, it may
+actually seem to be four different text events, one right after another:
+one event for "I just LOVE ", one for "hot", one for " ", and one for
+"apple pie!". But if you have merge_text on, then you're guaranteed
+that it will be fired as one text event: "I just LOVE hot apple pie!".
+
+
+=item C<< $parser->code_handler( I<CODE_REF> ) >>
+
+This specifies code that should be called when a code line is seen
+(i.e., a line outside of the Pod). Normally this is undef, meaning
+that no code should be called. If you provide a routine, it should
+start out like this:
+
+ sub get_code_line { # or whatever you'll call it
+ my($line, $line_number, $parser) = @_;
+ ...
+ }
+
+Note, however, that sometimes the Pod events aren't processed in exactly
+the same order as the code lines are -- i.e., if you have a file with
+Pod, then code, then more Pod, sometimes the code will be processed (via
+whatever you have code_handler call) before the all of the preceding Pod
+has been processed.
+
+
+=item C<< $parser->cut_handler( I<CODE_REF> ) >>
+
+This is just like the code_handler attribute, except that it's for
+"=cut" lines, not code lines. The same caveats apply. "=cut" lines are
+unlikely to be interesting, but this is included for completeness.
+
+
+=item C<< $parser->whine( I<linenumber>, I<complaint string> ) >>
+
+This notes a problem in the Pod, which will be reported to in the "Pod
+Errors" section of the document and/or send to STDERR, depending on the
+values of the attributes C<no_whining>, C<no_errata_section>, and
+C<complain_stderr>.
+
+=item C<< $parser->scream( I<linenumber>, I<complaint string> ) >>
+
+This notes an error like C<whine> does, except that it is not
+suppressable with C<no_whining>. This should be used only for very
+serious errors.
+
+
+=item C<< $parser->source_dead(1) >>
+
+This aborts parsing of the current document, by switching on the flag
+that indicates that EOF has been seen. In particularly drastic cases,
+you might want to do this. It's rather nicer than just calling
+C<die>!
+
+=item C<< $parser->hide_line_numbers( I<SOMEVALUE> ) >>
+
+Some subclasses that indescriminately dump event attributes (well,
+except for ones beginning with "~") can use this object attribute for
+refraining to dump the "start_line" attribute.
+
+=item C<< $parser->no_whining( I<SOMEVALUE> ) >>
+
+This attribute, if set to true, will suppress reports of non-fatal
+error messages. The default value is false, meaning that complaints
+I<are> reported. How they get reported depends on the values of
+the attributes C<no_errata_section> and C<complain_stderr>.
+
+=item C<< $parser->no_errata_section( I<SOMEVALUE> ) >>
+
+This attribute, if set to true, will suppress generation of an errata
+section. The default value is false -- i.e., an errata section will be
+generated.
+
+=item C<< $parser->complain_stderr( I<SOMEVALUE> ) >>
+
+This attribute, if set to true will send complaints to STDERR. The
+default value is false -- i.e., complaints do not go to STDERR.
+
+=item C<< $parser->bare_output( I<SOMEVALUE> ) >>
+
+Some formatter subclasses use this as a flag for whether output should
+have prologue and epilogue code omitted. For example, setting this to
+true for an HTML formatter class should omit the
+"<html><head><title>...</title><body>..." prologue and the
+"</body></html>" epilogue.
+
+If you want to set this to true, you should probably also set
+C<no_whining> or at least C<no_errata_section> to true.
+
+=item C<< $parser->preserve_whitespace( I<SOMEVALUE> ) >>
+
+If you set this attribute to a true value, the parser will try to
+preserve whitespace in the output. This means that such formatting
+conventions as two spaces after periods will be preserved by the parser.
+This is primarily useful for output formats that treat whitespace as
+significant (such as text or *roff, but not HTML).
+
+=back
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple> -- event-based Pod-parsing framework
+
+L<Pod::Simple::Methody> -- like Pod::Simple, but each sort of event
+calls its own method (like C<start_head3>)
+
+L<Pod::Simple::PullParser> -- a Pod-parsing framework like Pod::Simple,
+but with a token-stream interface
+
+L<Pod::Simple::SimpleTree> -- a Pod-parsing framework like Pod::Simple,
+but with a tree interface
+
+L<Pod::Simple::Checker> -- a simple Pod::Simple subclass that reads
+documents, and then makes a plaintext report of any errors found in the
+document
+
+L<Pod::Simple::DumpAsXML> -- for dumping Pod documents as tidily
+indented XML, showing each event on its own line
+
+L<Pod::Simple::XMLOutStream> -- dumps a Pod document as XML (without
+introducing extra whitespace as Pod::Simple::DumpAsXML does).
+
+L<Pod::Simple::DumpAsText> -- for dumping Pod documents as tidily
+indented text, showing each event on its own line
+
+L<Pod::Simple::LinkSection> -- class for objects representing the values
+of the TODO and TODO attributes of LE<lt>...E<gt> elements
+
+L<Pod::Escapes> -- the module the Pod::Simple uses for evaluating
+EE<lt>...E<gt> content
+
+L<Pod::Simple::Text> -- a simple plaintext formatter for Pod
+
+L<Pod::Simple::TextContent> -- like Pod::Simple::Text, but
+makes no effort for indent or wrap the text being formatted
+
+L<perlpod|perlpod>
+
+L<perlpodspec|perlpodspec>
+
+L<perldoc>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=for notes
+Hm, my old podchecker version (1.2) says:
+ *** WARNING: node 'http://search.cpan.org/' contains non-escaped | or / at line 38 in file Subclassing.pod
+ *** WARNING: node 'http://lists.perl.org/showlist.cgi?name=pod-people' contains non-escaped | or / at line 41 in file Subclassing.pod
+Yes, L<...> is hard.
+
+
+=cut
+
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Text.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Text.pm
new file mode 100644
index 00000000000..81fde4e7a70
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Text.pm
@@ -0,0 +1,185 @@
+
+require 5;
+package Pod::Simple::Text;
+use strict;
+use Carp ();
+use Pod::Simple::Methody ();
+use Pod::Simple ();
+use vars qw( @ISA $VERSION $FREAKYMODE);
+$VERSION = '3.14';
+@ISA = ('Pod::Simple::Methody');
+BEGIN { *DEBUG = defined(&Pod::Simple::DEBUG)
+ ? \&Pod::Simple::DEBUG
+ : sub() {0}
+ }
+
+use Text::Wrap 98.112902 ();
+$Text::Wrap::wrap = 'overflow';
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ $new->accept_target_as_text(qw( text plaintext plain ));
+ $new->nix_X_codes(1);
+ $new->nbsp_for_S(1);
+ $new->{'Thispara'} = '';
+ $new->{'Indent'} = 0;
+ $new->{'Indentstring'} = ' ';
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub handle_text { $_[0]{'Thispara'} .= $_[1] }
+
+sub start_Para { $_[0]{'Thispara'} = '' }
+sub start_head1 { $_[0]{'Thispara'} = '' }
+sub start_head2 { $_[0]{'Thispara'} = '' }
+sub start_head3 { $_[0]{'Thispara'} = '' }
+sub start_head4 { $_[0]{'Thispara'} = '' }
+
+sub start_Verbatim { $_[0]{'Thispara'} = '' }
+sub start_item_bullet { $_[0]{'Thispara'} = $FREAKYMODE ? '' : '* ' }
+sub start_item_number { $_[0]{'Thispara'} = $FREAKYMODE ? '' : "$_[1]{'number'}. " }
+sub start_item_text { $_[0]{'Thispara'} = '' }
+
+sub start_over_bullet { ++$_[0]{'Indent'} }
+sub start_over_number { ++$_[0]{'Indent'} }
+sub start_over_text { ++$_[0]{'Indent'} }
+sub start_over_block { ++$_[0]{'Indent'} }
+
+sub end_over_bullet { --$_[0]{'Indent'} }
+sub end_over_number { --$_[0]{'Indent'} }
+sub end_over_text { --$_[0]{'Indent'} }
+sub end_over_block { --$_[0]{'Indent'} }
+
+
+# . . . . . Now the actual formatters:
+
+sub end_head1 { $_[0]->emit_par(-4) }
+sub end_head2 { $_[0]->emit_par(-3) }
+sub end_head3 { $_[0]->emit_par(-2) }
+sub end_head4 { $_[0]->emit_par(-1) }
+sub end_Para { $_[0]->emit_par( 0) }
+sub end_item_bullet { $_[0]->emit_par( 0) }
+sub end_item_number { $_[0]->emit_par( 0) }
+sub end_item_text { $_[0]->emit_par(-2) }
+sub start_L { $_[0]{'Link'} = $_[1] if $_[1]->{type} eq 'url' }
+sub end_L {
+ if (my $link = delete $_[0]{'Link'}) {
+ # Append the URL to the output unless it's already present.
+ $_[0]{'Thispara'} .= " <$link->{to}>"
+ unless $_[0]{'Thispara'} =~ /\b\E$link->{to}/;
+ }
+}
+
+sub emit_par {
+ my($self, $tweak_indent) = splice(@_,0,2);
+ my $indent = ' ' x ( 2 * $self->{'Indent'} + 4 + ($tweak_indent||0) );
+ # Yes, 'STRING' x NEGATIVE gives '', same as 'STRING' x 0
+
+ $self->{'Thispara'} =~ tr{\xAD}{}d if Pod::Simple::ASCII;
+ my $out = Text::Wrap::wrap($indent, $indent, $self->{'Thispara'} .= "\n");
+ $out =~ tr{\xA0}{ } if Pod::Simple::ASCII;
+ print {$self->{'output_fh'}} $out, "\n";
+ $self->{'Thispara'} = '';
+
+ return;
+}
+
+# . . . . . . . . . . And then off by its lonesome:
+
+sub end_Verbatim {
+ my $self = shift;
+ if(Pod::Simple::ASCII) {
+ $self->{'Thispara'} =~ tr{\xA0}{ };
+ $self->{'Thispara'} =~ tr{\xAD}{}d;
+ }
+
+ my $i = ' ' x ( 2 * $self->{'Indent'} + 4);
+ #my $i = ' ' x (4 + $self->{'Indent'});
+
+ $self->{'Thispara'} =~ s/^/$i/mg;
+
+ print { $self->{'output_fh'} } '',
+ $self->{'Thispara'},
+ "\n\n"
+ ;
+ $self->{'Thispara'} = '';
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::Text -- format Pod as plaintext
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::Text -e \
+ "exit Pod::Simple::Text->filter(shift)->any_errata_seen" \
+ thingy.pod
+
+=head1 DESCRIPTION
+
+This class is a formatter that takes Pod and renders it as
+wrapped plaintext.
+
+Its wrapping is done by L<Text::Wrap>, so you can change
+C<$Text::Wrap::columns> as you like.
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::TextContent>, L<Pod::Text>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/TextContent.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/TextContent.pm
new file mode 100644
index 00000000000..914c7fd166c
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/TextContent.pm
@@ -0,0 +1,112 @@
+
+
+require 5;
+package Pod::Simple::TextContent;
+use strict;
+use Carp ();
+use Pod::Simple ();
+use vars qw( @ISA $VERSION );
+$VERSION = '3.14';
+@ISA = ('Pod::Simple');
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ $new->nix_X_codes(1);
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub _handle_element_start {
+ print {$_[0]{'output_fh'}} "\n" unless $_[1] =~ m/^[A-Z]$/s;
+ return;
+}
+
+sub _handle_text {
+ if( chr(65) eq 'A' ) { # in ASCIIworld
+ $_[1] =~ tr/\xAD//d;
+ $_[1] =~ tr/\xA0/ /;
+ }
+ print {$_[0]{'output_fh'}} $_[1];
+ return;
+}
+
+sub _handle_element_end {
+ print {$_[0]{'output_fh'}} "\n" unless $_[1] =~ m/^[A-Z]$/s;
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::TextContent -- get the text content of Pod
+
+=head1 SYNOPSIS
+
+ TODO
+
+ perl -MPod::Simple::TextContent -e \
+ "exit Pod::Simple::TextContent->filter(shift)->any_errata_seen" \
+ thingy.pod
+
+=head1 DESCRIPTION
+
+This class is that parses Pod and dumps just the text content. It is
+mainly meant for use by the Pod::Simple test suite, but you may find
+some other use for it.
+
+This is a subclass of L<Pod::Simple> and inherits all its methods.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::Text>, L<Pod::Spell>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/TiedOutFH.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/TiedOutFH.pm
new file mode 100644
index 00000000000..c5d4483b283
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/TiedOutFH.pm
@@ -0,0 +1,105 @@
+
+use strict;
+package Pod::Simple::TiedOutFH;
+use Symbol ('gensym');
+use Carp ();
+use vars qw($VERSION );
+$VERSION = '3.14';
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub handle_on { # some horrible frightening things are encapsulated in here
+ my $class = shift;
+ $class = ref($class) || $class;
+
+ Carp::croak "Usage: ${class}->handle_on(\$somescalar)" unless @_;
+
+ my $x = (defined($_[0]) and ref($_[0]))
+ ? $_[0]
+ : ( \( $_[0] ) )[0]
+ ;
+ $$x = '' unless defined $$x;
+
+ #Pod::Simple::DEBUG and print "New $class handle on $x = \"$$x\"\n";
+
+ my $new = gensym();
+ tie *$new, $class, $x;
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub TIEHANDLE { # Ties to just a scalar ref
+ my($class, $scalar_ref) = @_;
+ $$scalar_ref = '' unless defined $$scalar_ref;
+ return bless \$scalar_ref, ref($class) || $class;
+}
+
+sub PRINT {
+ my $it = shift;
+ foreach my $x (@_) { $$$it .= $x }
+
+ #Pod::Simple::DEBUG > 10 and print " appended to $$it = \"$$$it\"\n";
+
+ return 1;
+}
+
+sub FETCH {
+ return ${$_[0]};
+}
+
+sub PRINTF {
+ my $it = shift;
+ my $format = shift;
+ $$$it .= sprintf $format, @_;
+ return 1;
+}
+
+sub FILENO { ${ $_[0] } + 100 } # just to produce SOME number
+
+sub CLOSE { 1 }
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1;
+__END__
+
+Chole
+
+ * 1 large red onion
+ * 2 tomatillos
+ * 4 or 5 roma tomatoes (optionally with the pulp discarded)
+ * 1 tablespoons chopped ginger root (or more, to taste)
+ * 2 tablespoons canola oil (or vegetable oil)
+
+ * 1 tablespoon garam masala
+ * 1/2 teaspoon red chili powder, or to taste
+ * Salt, to taste (probably quite a bit)
+ * 2 (15-ounce) cans chick peas or garbanzo beans, drained and rinsed
+ * juice of one smallish lime
+ * a dash of balsamic vinegar (to taste)
+ * cooked rice, preferably long-grain white rice (whether plain,
+ basmati rice, jasmine rice, or even a mild pilaf)
+
+In a blender or food processor, puree the onions, tomatoes, tomatillos,
+and ginger root. You can even do it with a Braun hand "mixer", if you
+chop things finer to start with, and work at it.
+
+In a saucepan set over moderate heat, warm the oil until hot.
+
+Add the puree and the balsamic vinegar, and cook, stirring occasionally,
+for 20 to 40 minutes. (Cooking it longer will make it sweeter.)
+
+Add the Garam Masala, chili powder, and cook, stirring occasionally, for
+5 minutes.
+
+Add the salt and chick peas and cook, stirring, until heated through.
+
+Stir in the lime juice, and optionally one or two teaspoons of tahini.
+You can let it simmer longer, depending on how much softer you want the
+garbanzos to get.
+
+Serve over rice, like a curry.
+
+Yields 5 to 7 servings.
+
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/Transcode.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/Transcode.pm
new file mode 100644
index 00000000000..258d0d76760
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/Transcode.pm
@@ -0,0 +1,35 @@
+
+require 5;
+package Pod::Simple::Transcode;
+use vars qw($VERSION );
+$VERSION = '3.14';
+
+BEGIN {
+ if(defined &DEBUG) {;} # Okay
+ elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG; }
+ else { *DEBUG = sub () {0}; }
+}
+
+foreach my $class (
+ 'Pod::Simple::TranscodeSmart',
+ 'Pod::Simple::TranscodeDumb',
+ '',
+) {
+ $class or die "Couldn't load any encoding classes";
+ DEBUG and print "About to try loading $class...\n";
+ eval "require $class;";
+ if($@) {
+ DEBUG and print "Couldn't load $class: $@\n";
+ } else {
+ DEBUG and print "OK, loaded $class.\n";
+ @ISA = ($class);
+ last;
+ }
+}
+
+sub _blorp { return; } # just to avoid any "empty class" warning
+
+1;
+__END__
+
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeDumb.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeDumb.pm
new file mode 100644
index 00000000000..d1c320d5d1a
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeDumb.pm
@@ -0,0 +1,63 @@
+
+require 5;
+## This module is to be use()'d only by Pod::Simple::Transcode
+
+package Pod::Simple::TranscodeDumb;
+use strict;
+use vars qw($VERSION %Supported);
+$VERSION = '3.14';
+# This module basically pretends it knows how to transcode, except
+# only for null-transcodings! We use this when Encode isn't
+# available.
+
+%Supported = (
+ 'ascii' => 1,
+ 'ascii-ctrl' => 1,
+ 'iso-8859-1' => 1,
+ 'null' => 1,
+ 'latin1' => 1,
+ 'latin-1' => 1,
+ %Supported,
+);
+
+sub is_dumb {1}
+sub is_smart {0}
+
+sub all_encodings {
+ return sort keys %Supported;
+}
+
+sub encoding_is_available {
+ return exists $Supported{lc $_[1]};
+}
+
+sub encmodver {
+ return __PACKAGE__ . " v" .($VERSION || '?');
+}
+
+sub make_transcoder {
+ my($e) = $_[1];
+ die "WHAT ENCODING!?!?" unless $e;
+ my $x;
+ return sub {;
+ #foreach $x (@_) {
+ # if(Pod::Simple::ASCII and !Pod::Simple::UNICODE and $] > 5.005) {
+ # # We're in horrible gimp territory, so we need to knock out
+ # # all the highbit things
+ # $x =
+ # pack 'C*',
+ # map {; ($_ < 128) ? $_ : 0x7e }
+ # unpack "C*",
+ # $x
+ # ;
+ # }
+ #}
+ #
+ #return;
+ };
+}
+
+
+1;
+
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeSmart.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeSmart.pm
new file mode 100644
index 00000000000..bab59fc8972
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/TranscodeSmart.pm
@@ -0,0 +1,44 @@
+
+require 5;
+use 5.008;
+## Anything before 5.8.0 is GIMPY!
+## This module is to be use()'d only by Pod::Simple::Transcode
+
+package Pod::Simple::TranscodeSmart;
+use strict;
+use Pod::Simple;
+require Encode;
+use vars qw($VERSION );
+$VERSION = '3.14';
+
+sub is_dumb {0}
+sub is_smart {1}
+
+sub all_encodings {
+ return Encode::->encodings(':all');
+}
+
+sub encoding_is_available {
+ return Encode::resolve_alias($_[1]);
+}
+
+sub encmodver {
+ return "Encode.pm v" .($Encode::VERSION || '?');
+}
+
+sub make_transcoder {
+ my($e) = $_[1];
+ die "WHAT ENCODING!?!?" unless $e;
+ my $x;
+ return sub {
+ foreach $x (@_) {
+ $x = Encode::decode($e, $x);
+ }
+ return;
+ };
+}
+
+
+1;
+
+
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/XHTML.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/XHTML.pm
new file mode 100644
index 00000000000..6a8fb7e97e4
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/XHTML.pm
@@ -0,0 +1,717 @@
+=pod
+
+=head1 NAME
+
+Pod::Simple::XHTML -- format Pod as validating XHTML
+
+=head1 SYNOPSIS
+
+ use Pod::Simple::XHTML;
+
+ my $parser = Pod::Simple::XHTML->new();
+
+ ...
+
+ $parser->parse_file('path/to/file.pod');
+
+=head1 DESCRIPTION
+
+This class is a formatter that takes Pod and renders it as XHTML
+validating HTML.
+
+This is a subclass of L<Pod::Simple::Methody> and inherits all its
+methods. The implementation is entirely different than
+L<Pod::Simple::HTML>, but it largely preserves the same interface.
+
+=cut
+
+package Pod::Simple::XHTML;
+use strict;
+use vars qw( $VERSION @ISA $HAS_HTML_ENTITIES );
+$VERSION = '3.14';
+use Carp ();
+use Pod::Simple::Methody ();
+@ISA = ('Pod::Simple::Methody');
+
+BEGIN {
+ $HAS_HTML_ENTITIES = eval "require HTML::Entities; 1";
+}
+
+my %entities = (
+ q{>} => 'gt',
+ q{<} => 'lt',
+ q{'} => '#39',
+ q{"} => 'quot',
+ q{&} => 'amp',
+);
+
+sub encode_entities {
+ return HTML::Entities::encode_entities( $_[0] ) if $HAS_HTML_ENTITIES;
+ my $str = $_[0];
+ my $ents = join '', keys %entities;
+ $str =~ s/([$ents])/'&' . $entities{$1} . ';'/ge;
+ return $str;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+=head1 METHODS
+
+Pod::Simple::XHTML offers a number of methods that modify the format of
+the HTML output. Call these after creating the parser object, but before
+the call to C<parse_file>:
+
+ my $parser = Pod::PseudoPod::HTML->new();
+ $parser->set_optional_param("value");
+ $parser->parse_file($file);
+
+=head2 perldoc_url_prefix
+
+In turning L<Foo::Bar> into http://whatever/Foo%3a%3aBar, what
+to put before the "Foo%3a%3aBar". The default value is
+"http://search.cpan.org/perldoc?".
+
+=head2 perldoc_url_postfix
+
+What to put after "Foo%3a%3aBar" in the URL. This option is not set by
+default.
+
+=head2 man_url_prefix
+
+In turning C<< L<crontab(5)> >> into http://whatever/man/1/crontab, what
+to put before the "1/crontab". The default value is
+"http://man.he.net/man".
+
+=head2 man_url_postfix
+
+What to put after "1/crontab" in the URL. This option is not set by default.
+
+=head2 title_prefix, title_postfix
+
+What to put before and after the title in the head. The values should
+already be &-escaped.
+
+=head2 html_css
+
+ $parser->html_css('path/to/style.css');
+
+The URL or relative path of a CSS file to include. This option is not
+set by default.
+
+=head2 html_javascript
+
+The URL or relative path of a JavaScript file to pull in. This option is
+not set by default.
+
+=head2 html_doctype
+
+A document type tag for the file. This option is not set by default.
+
+=head2 html_header_tags
+
+Additional arbitrary HTML tags for the header of the document. The
+default value is just a content type header tag:
+
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+Add additional meta tags here, or blocks of inline CSS or JavaScript
+(wrapped in the appropriate tags).
+
+=head2 html_h_level
+
+This is the level of HTML "Hn" element to which a Pod "head1" corresponds. For
+example, if C<html_h_level> is set to 2, a head1 will produce an H2, a head2
+will produce an H3, and so on.
+
+=head2 default_title
+
+Set a default title for the page if no title can be determined from the
+content. The value of this string should already be &-escaped.
+
+=head2 force_title
+
+Force a title for the page (don't try to determine it from the content).
+The value of this string should already be &-escaped.
+
+=head2 html_header, html_footer
+
+Set the HTML output at the beginning and end of each file. The default
+header includes a title, a doctype tag (if C<html_doctype> is set), a
+content tag (customized by C<html_header_tags>), a tag for a CSS file
+(if C<html_css> is set), and a tag for a Javascript file (if
+C<html_javascript> is set). The default footer simply closes the C<html>
+and C<body> tags.
+
+The options listed above customize parts of the default header, but
+setting C<html_header> or C<html_footer> completely overrides the
+built-in header or footer. These may be useful if you want to use
+template tags instead of literal HTML headers and footers or are
+integrating converted POD pages in a larger website.
+
+If you want no headers or footers output in the HTML, set these options
+to the empty string.
+
+=head2 index
+
+Whether to add a table-of-contents at the top of each page (called an
+index for the sake of tradition).
+
+
+=cut
+
+__PACKAGE__->_accessorize(
+ 'perldoc_url_prefix',
+ 'perldoc_url_postfix',
+ 'man_url_prefix',
+ 'man_url_postfix',
+ 'title_prefix', 'title_postfix',
+ 'html_css',
+ 'html_javascript',
+ 'html_doctype',
+ 'html_header_tags',
+ 'html_h_level',
+ 'title', # Used internally for the title extracted from the content
+ 'default_title',
+ 'force_title',
+ 'html_header',
+ 'html_footer',
+ 'index',
+ 'batch_mode', # whether we're in batch mode
+ 'batch_mode_current_level',
+ # When in batch mode, how deep the current module is: 1 for "LWP",
+ # 2 for "LWP::Procotol", 3 for "LWP::Protocol::GHTTP", etc
+);
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+=head1 SUBCLASSING
+
+If the standard options aren't enough, you may want to subclass
+Pod::Simple::XHMTL. These are the most likely candidates for methods
+you'll want to override when subclassing.
+
+=cut
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ $new->perldoc_url_prefix('http://search.cpan.org/perldoc?');
+ $new->man_url_prefix('http://man.he.net/man');
+ $new->html_header_tags('<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />');
+ $new->nix_X_codes(1);
+ $new->codes_in_verbatim(1);
+ $new->{'scratch'} = '';
+ $new->{'to_index'} = [];
+ $new->{'output'} = [];
+ $new->{'saved'} = [];
+ $new->{'ids'} = {};
+
+ $new->{'__region_targets'} = [];
+ $new->{'__literal_targets'} = {};
+ $new->accept_targets_as_html( 'html', 'HTML' );
+
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+=head2 handle_text
+
+This method handles the body of text within any element: it's the body
+of a paragraph, or everything between a "=begin" tag and the
+corresponding "=end" tag, or the text within an L entity, etc. You would
+want to override this if you are adding a custom element type that does
+more than just display formatted text. Perhaps adding a way to generate
+HTML tables from an extended version of POD.
+
+So, let's say you want add a custom element called 'foo'. In your
+subclass's C<new> method, after calling C<SUPER::new> you'd call:
+
+ $new->accept_targets_as_text( 'foo' );
+
+Then override the C<start_for> method in the subclass to check for when
+"$flags->{'target'}" is equal to 'foo' and set a flag that marks that
+you're in a foo block (maybe "$self->{'in_foo'} = 1"). Then override the
+C<handle_text> method to check for the flag, and pass $text to your
+custom subroutine to construct the HTML output for 'foo' elements,
+something like:
+
+ sub handle_text {
+ my ($self, $text) = @_;
+ if ($self->{'in_foo'}) {
+ $self->{'scratch'} .= build_foo_html($text);
+ } else {
+ $self->{'scratch'} .= $text;
+ }
+ }
+
+=head2 accept_targets_as_html
+
+This method behaves like C<accept_targets_as_text>, but also marks the region
+as one whose content should be emitted literally, without HTML entity escaping
+or wrapping in a C<div> element.
+
+=cut
+
+sub __in_literal_xhtml_region {
+ return unless @{ $_[0]{__region_targets} };
+ my $target = $_[0]{__region_targets}[-1];
+ return $_[0]{__literal_targets}{ $target };
+}
+
+sub accept_targets_as_html {
+ my ($self, @targets) = @_;
+ $self->accept_targets(@targets);
+ $self->{__literal_targets}{$_} = 1 for @targets;
+}
+
+sub handle_text {
+ # escape special characters in HTML (<, >, &, etc)
+ $_[0]{'scratch'} .= $_[0]->__in_literal_xhtml_region
+ ? $_[1]
+ : encode_entities( $_[1] );
+}
+
+sub start_Para { $_[0]{'scratch'} = '<p>' }
+sub start_Verbatim { $_[0]{'scratch'} = '<pre><code>' }
+
+sub start_head1 { $_[0]{'in_head'} = 1 }
+sub start_head2 { $_[0]{'in_head'} = 2 }
+sub start_head3 { $_[0]{'in_head'} = 3 }
+sub start_head4 { $_[0]{'in_head'} = 4 }
+
+sub start_item_number {
+ $_[0]{'scratch'} = "</li>\n" if $_[0]{'in_li'};
+ $_[0]{'scratch'} .= '<li><p>';
+ $_[0]{'in_li'} = 1
+}
+
+sub start_item_bullet {
+ $_[0]{'scratch'} = "</li>\n" if $_[0]{'in_li'};
+ $_[0]{'scratch'} .= '<li><p>';
+ $_[0]{'in_li'} = 1
+}
+
+sub start_item_text {
+ if ($_[0]{'in_dd'}[ $_[0]{'dl_level'} ]) {
+ $_[0]{'scratch'} = "</dd>\n";
+ $_[0]{'in_dd'}[ $_[0]{'dl_level'} ] = 0;
+ }
+ $_[0]{'scratch'} .= '<dt>';
+}
+
+sub start_over_bullet { $_[0]{'scratch'} = '<ul>'; $_[0]->emit }
+sub start_over_block { $_[0]{'scratch'} = '<ul>'; $_[0]->emit }
+sub start_over_number { $_[0]{'scratch'} = '<ol>'; $_[0]->emit }
+sub start_over_text {
+ $_[0]{'scratch'} = '<dl>';
+ $_[0]{'dl_level'}++;
+ $_[0]{'in_dd'} ||= [];
+ $_[0]->emit
+}
+
+sub end_over_block { $_[0]{'scratch'} .= '</ul>'; $_[0]->emit }
+
+sub end_over_number {
+ $_[0]{'scratch'} = "</li>\n" if delete $_[0]{'in_li'};
+ $_[0]{'scratch'} .= '</ol>';
+ $_[0]->emit;
+}
+
+sub end_over_bullet {
+ $_[0]{'scratch'} = "</li>\n" if delete $_[0]{'in_li'};
+ $_[0]{'scratch'} .= '</ul>';
+ $_[0]->emit;
+}
+
+sub end_over_text {
+ if ($_[0]{'in_dd'}[ $_[0]{'dl_level'} ]) {
+ $_[0]{'scratch'} = "</dd>\n";
+ $_[0]{'in_dd'}[ $_[0]{'dl_level'} ] = 0;
+ }
+ $_[0]{'scratch'} .= '</dl>';
+ $_[0]{'dl_level'}--;
+ $_[0]->emit;
+}
+
+# . . . . . Now the actual formatters:
+
+sub end_Para { $_[0]{'scratch'} .= '</p>'; $_[0]->emit }
+sub end_Verbatim {
+ $_[0]{'scratch'} .= '</code></pre>';
+ $_[0]->emit;
+}
+
+sub _end_head {
+ my $h = delete $_[0]{in_head};
+
+ my $add = $_[0]->html_h_level;
+ $add = 1 unless defined $add;
+ $h += $add - 1;
+
+ my $id = $_[0]->idify($_[0]{scratch});
+ my $text = $_[0]{scratch};
+ $_[0]{'scratch'} = qq{<h$h id="$id">$text</h$h>};
+ $_[0]->emit;
+ push @{ $_[0]{'to_index'} }, [$h, $id, $text];
+}
+
+sub end_head1 { shift->_end_head(@_); }
+sub end_head2 { shift->_end_head(@_); }
+sub end_head3 { shift->_end_head(@_); }
+sub end_head4 { shift->_end_head(@_); }
+
+sub end_item_bullet { $_[0]{'scratch'} .= '</p>'; $_[0]->emit }
+sub end_item_number { $_[0]{'scratch'} .= '</p>'; $_[0]->emit }
+
+sub end_item_text {
+ $_[0]{'scratch'} .= "</dt>\n<dd>";
+ $_[0]{'in_dd'}[ $_[0]{'dl_level'} ] = 1;
+ $_[0]->emit;
+}
+
+# This handles =begin and =for blocks of all kinds.
+sub start_for {
+ my ($self, $flags) = @_;
+
+ push @{ $self->{__region_targets} }, $flags->{target_matching};
+
+ unless ($self->__in_literal_xhtml_region) {
+ $self->{scratch} .= '<div';
+ $self->{scratch} .= qq( class="$flags->{target}") if $flags->{target};
+ $self->{scratch} .= '>';
+ }
+
+ $self->emit;
+
+}
+sub end_for {
+ my ($self) = @_;
+
+ $self->{'scratch'} .= '</div>' unless $self->__in_literal_xhtml_region;
+
+ pop @{ $self->{__region_targets} };
+ $self->emit;
+}
+
+sub start_Document {
+ my ($self) = @_;
+ if (defined $self->html_header) {
+ $self->{'scratch'} .= $self->html_header;
+ $self->emit unless $self->html_header eq "";
+ } else {
+ my ($doctype, $title, $metatags);
+ $doctype = $self->html_doctype || '';
+ $title = $self->force_title || $self->title || $self->default_title || '';
+ $metatags = $self->html_header_tags || '';
+ if ($self->html_css) {
+ $metatags .= "\n<link rel='stylesheet' href='" .
+ $self->html_css . "' type='text/css'>";
+ }
+ if ($self->html_javascript) {
+ $metatags .= "\n<script type='text/javascript' src='" .
+ $self->html_javascript . "'></script>";
+ }
+ $self->{'scratch'} .= <<"HTML";
+$doctype
+<html>
+<head>
+<title>$title</title>
+$metatags
+</head>
+<body>
+HTML
+ $self->emit;
+ }
+}
+
+sub end_Document {
+ my ($self) = @_;
+ my $to_index = $self->{'to_index'};
+ if ($self->index && @{ $to_index } ) {
+ my @out;
+ my $level = 0;
+ my $indent = -1;
+ my $space = '';
+ my $id = ' id="index"';
+
+ for my $h (@{ $to_index }, [0]) {
+ my $target_level = $h->[0];
+ # Get to target_level by opening or closing ULs
+ if ($level == $target_level) {
+ $out[-1] .= '</li>';
+ } elsif ($level > $target_level) {
+ $out[-1] .= '</li>' if $out[-1] =~ /^\s+<li>/;
+ while ($level > $target_level) {
+ --$level;
+ push @out, (' ' x --$indent) . '</li>' if @out && $out[-1] =~ m{^\s+<\/ul};
+ push @out, (' ' x --$indent) . '</ul>';
+ }
+ push @out, (' ' x --$indent) . '</li>' if $level;
+ } else {
+ while ($level < $target_level) {
+ ++$level;
+ push @out, (' ' x ++$indent) . '<li>' if @out && $out[-1]=~ /^\s*<ul/;
+ push @out, (' ' x ++$indent) . "<ul$id>";
+ $id = '';
+ }
+ ++$indent;
+ }
+
+ next unless $level;
+ $space = ' ' x $indent;
+ push @out, sprintf '%s<li><a href="#%s">%s</a>',
+ $space, $h->[1], $h->[2];
+ }
+ # Splice the index in between the HTML headers and the first element.
+ my $offset = defined $self->html_header ? $self->html_header eq '' ? 0 : 1 : 1;
+ splice @{ $self->{'output'} }, $offset, 0, join "\n", @out;
+ }
+
+ if (defined $self->html_footer) {
+ $self->{'scratch'} .= $self->html_footer;
+ $self->emit unless $self->html_footer eq "";
+ } else {
+ $self->{'scratch'} .= "</body>\n</html>";
+ $self->emit;
+ }
+
+ if ($self->index) {
+ print {$self->{'output_fh'}} join ("\n\n", @{ $self->{'output'} }), "\n\n";
+ @{$self->{'output'}} = ();
+ }
+
+}
+
+# Handling code tags
+sub start_B { $_[0]{'scratch'} .= '<b>' }
+sub end_B { $_[0]{'scratch'} .= '</b>' }
+
+sub start_C { $_[0]{'scratch'} .= '<code>' }
+sub end_C { $_[0]{'scratch'} .= '</code>' }
+
+sub start_F { $_[0]{'scratch'} .= '<i>' }
+sub end_F { $_[0]{'scratch'} .= '</i>' }
+
+sub start_I { $_[0]{'scratch'} .= '<i>' }
+sub end_I { $_[0]{'scratch'} .= '</i>' }
+
+sub start_L {
+ my ($self, $flags) = @_;
+ my ($type, $to, $section) = @{$flags}{'type', 'to', 'section'};
+ my $url = $type eq 'url' ? $to
+ : $type eq 'pod' ? $self->resolve_pod_page_link($to, $section)
+ : $type eq 'man' ? $self->resolve_man_page_link($to, $section)
+ : undef;
+
+ # If it's an unknown type, use an attribute-less <a> like HTML.pm.
+ $self->{'scratch'} .= '<a' . ($url ? ' href="'. $url . '">' : '>');
+}
+
+sub end_L { $_[0]{'scratch'} .= '</a>' }
+
+sub start_S { $_[0]{'scratch'} .= '<nobr>' }
+sub end_S { $_[0]{'scratch'} .= '</nobr>' }
+
+sub emit {
+ my($self) = @_;
+ if ($self->index) {
+ push @{ $self->{'output'} }, $self->{'scratch'};
+ } else {
+ print {$self->{'output_fh'}} $self->{'scratch'}, "\n\n";
+ }
+ $self->{'scratch'} = '';
+ return;
+}
+
+=head2 resolve_pod_page_link
+
+ my $url = $pod->resolve_pod_page_link('Net::Ping', 'INSTALL');
+ my $url = $pod->resolve_pod_page_link('perlpodspec');
+ my $url = $pod->resolve_pod_page_link(undef, 'SYNOPSIS');
+
+Resolves a POD link target (typically a module or POD file name) and section
+name to a URL. The resulting link will be returned for the above examples as:
+
+ http://search.cpan.org/perldoc?Net::Ping#INSTALL
+ http://search.cpan.org/perldoc?perlpodspec
+ #SYNOPSIS
+
+Note that when there is only a section argument the URL will simply be a link
+to a section in the current document.
+
+=cut
+
+sub resolve_pod_page_link {
+ my ($self, $to, $section) = @_;
+ return undef unless defined $to || defined $section;
+ if (defined $section) {
+ $section = '#' . $self->idify($section, 1);
+ return $section unless defined $to;
+ } else {
+ $section = ''
+ }
+
+ return ($self->perldoc_url_prefix || '')
+ . encode_entities($to) . $section
+ . ($self->perldoc_url_postfix || '');
+}
+
+=head2 resolve_man_page_link
+
+ my $url = $pod->resolve_man_page_link('crontab(5)', 'EXAMPLE CRON FILE');
+ my $url = $pod->resolve_man_page_link('crontab');
+
+Resolves a man page link target and numeric section to a URL. The resulting
+link will be returned for the above examples as:
+
+ http://man.he.net/man5/crontab
+ http://man.he.net/man1/crontab
+
+Note that the first argument is required. The section number will be parsed
+from it, and if it's missing will default to 1. The second argument is
+currently ignored, as L<man.he.net|http://man.he.net> does not currently
+include linkable IDs or anchor names in its pages. Subclass to link to a
+different man page HTTP server.
+
+=cut
+
+sub resolve_man_page_link {
+ my ($self, $to, $section) = @_;
+ return undef unless defined $to;
+ my ($page, $part) = $to =~ /^([^(]+)(?:[(](\d+)[)])?$/;
+ return undef unless $page;
+ return ($self->man_url_prefix || '')
+ . ($part || 1) . "/" . encode_entities($page)
+ . ($self->man_url_postfix || '');
+
+}
+
+=head2 idify
+
+ my $id = $pod->idify($text);
+ my $hash = $pod->idify($text, 1);
+
+This method turns an arbitrary string into a valid XHTML ID attribute value.
+The rules enforced, following
+L<http://webdesign.about.com/od/htmltags/a/aa031707.htm>, are:
+
+=over
+
+=item *
+
+The id must start with a letter (a-z or A-Z)
+
+=item *
+
+All subsequent characters can be letters, numbers (0-9), hyphens (-),
+underscores (_), colons (:), and periods (.).
+
+=item *
+
+Each id must be unique within the document.
+
+=back
+
+In addition, the returned value will be unique within the context of the
+Pod::Simple::XHTML object unless a second argument is passed a true value. ID
+attributes should always be unique within a single XHTML document, but pass
+the true value if you are creating not an ID but a URL hash to point to
+an ID (i.e., if you need to put the "#foo" in C<< <a href="#foo">foo</a> >>.
+
+=cut
+
+sub idify {
+ my ($self, $t, $not_unique) = @_;
+ for ($t) {
+ s/<[^>]+>//g; # Strip HTML.
+ s/&[^;]+;//g; # Strip entities.
+ s/^([^a-zA-Z]+)$/pod$1/; # Prepend "pod" if no valid chars.
+ s/^[^a-zA-Z]+//; # First char must be a letter.
+ s/[^-a-zA-Z0-9_:.]+/-/g; # All other chars must be valid.
+ }
+ return $t if $not_unique;
+ my $i = '';
+ $i++ while $self->{ids}{"$t$i"}++;
+ return "$t$i";
+}
+
+=head2 batch_mode_page_object_init
+
+ $pod->batch_mode_page_object_init($batchconvobj, $module, $infile, $outfile, $depth);
+
+Called by L<Pod::Simple::HTMLBatch> so that the class has a chance to
+initialize the converter. Internally it sets the C<batch_mode> property to
+true and sets C<batch_mode_current_level()>, but Pod::Simple::XHTML does not
+currently use those features. Subclasses might, though.
+
+=cut
+
+sub batch_mode_page_object_init {
+ my ($self, $batchconvobj, $module, $infile, $outfile, $depth) = @_;
+ $self->batch_mode(1);
+ $self->batch_mode_current_level($depth);
+ return $self;
+}
+
+1;
+
+__END__
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::Text>, L<Pod::Spell>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2003-2005 Allison Randal.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 ACKNOWLEDGEMENTS
+
+Thanks to L<Hurricane Electrict|http://he.net/> for permission to use its
+L<Linux man pages online|http://man.he.net/> site for man page links.
+
+Thanks to L<search.cpan.org|http://search.cpan.org/> for permission to use the
+site for Perl module links.
+
+=head1 AUTHOR
+
+Pod::Simpele::XHTML was created by Allison Randal <allison@perl.org>.
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Simple/XMLOutStream.pm b/Master/tlpkg/tlperl/lib/Pod/Simple/XMLOutStream.pm
new file mode 100644
index 00000000000..2e6b42834e0
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Simple/XMLOutStream.pm
@@ -0,0 +1,185 @@
+
+require 5;
+package Pod::Simple::XMLOutStream;
+use strict;
+use Carp ();
+use Pod::Simple ();
+use vars qw( $ATTR_PAD @ISA $VERSION $SORT_ATTRS);
+$VERSION = '3.14';
+BEGIN {
+ @ISA = ('Pod::Simple');
+ *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG;
+}
+
+$ATTR_PAD = "\n" unless defined $ATTR_PAD;
+ # Don't mess with this unless you know what you're doing.
+
+$SORT_ATTRS = 0 unless defined $SORT_ATTRS;
+
+sub new {
+ my $self = shift;
+ my $new = $self->SUPER::new(@_);
+ $new->{'output_fh'} ||= *STDOUT{IO};
+ #$new->accept_codes('VerbatimFormatted');
+ return $new;
+}
+
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+sub _handle_element_start {
+ # ($self, $element_name, $attr_hash_r)
+ my $fh = $_[0]{'output_fh'};
+ my($key, $value);
+ DEBUG and print "++ $_[1]\n";
+ print $fh "<", $_[1];
+ if($SORT_ATTRS) {
+ foreach my $key (sort keys %{$_[2]}) {
+ unless($key =~ m/^~/s) {
+ next if $key eq 'start_line' and $_[0]{'hide_line_numbers'};
+ _xml_escape($value = $_[2]{$key});
+ print $fh $ATTR_PAD, $key, '="', $value, '"';
+ }
+ }
+ } else { # faster
+ while(($key,$value) = each %{$_[2]}) {
+ unless($key =~ m/^~/s) {
+ next if $key eq 'start_line' and $_[0]{'hide_line_numbers'};
+ _xml_escape($value);
+ print $fh $ATTR_PAD, $key, '="', $value, '"';
+ }
+ }
+ }
+ print $fh ">";
+ return;
+}
+
+sub _handle_text {
+ DEBUG and print "== \"$_[1]\"\n";
+ if(length $_[1]) {
+ my $text = $_[1];
+ _xml_escape($text);
+ print {$_[0]{'output_fh'}} $text;
+ }
+ return;
+}
+
+sub _handle_element_end {
+ DEBUG and print "-- $_[1]\n";
+ print {$_[0]{'output_fh'}} "</", $_[1], ">";
+ return;
+}
+
+# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+sub _xml_escape {
+ foreach my $x (@_) {
+ # Escape things very cautiously:
+ $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg;
+ # Yes, stipulate the list without a range, so that this can work right on
+ # all charsets that this module happens to run under.
+ # Altho, hmm, what about that ord? Presumably that won't work right
+ # under non-ASCII charsets. Something should be done about that.
+ }
+ return;
+}
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+1;
+
+__END__
+
+=head1 NAME
+
+Pod::Simple::XMLOutStream -- turn Pod into XML
+
+=head1 SYNOPSIS
+
+ perl -MPod::Simple::XMLOutStream -e \
+ "exit Pod::Simple::XMLOutStream->filter(shift)->any_errata_seen" \
+ thingy.pod
+
+=head1 DESCRIPTION
+
+Pod::Simple::XMLOutStream is a subclass of L<Pod::Simple> that parses
+Pod and turns it into XML.
+
+Pod::Simple::XMLOutStream inherits methods from
+L<Pod::Simple>.
+
+
+=head1 SEE ALSO
+
+L<Pod::Simple::DumpAsXML> is rather like this class; see its
+documentation for a discussion of the differences.
+
+L<Pod::Simple>, L<Pod::Simple::DumpAsXML>, L<Pod::SAX>
+
+L<Pod::Simple::Subclassing>
+
+The older (and possibly obsolete) libraries L<Pod::PXML>, L<Pod::XML>
+
+
+=head1 ABOUT EXTENDING POD
+
+TODO: An example or two of =extend, then point to Pod::Simple::Subclassing
+
+
+=head1 ASK ME!
+
+If you actually want to use Pod as a format that you want to render to
+XML (particularly if to an XML instance with more elements than normal
+Pod has), please email me (C<sburke@cpan.org>) and I'll probably have
+some recommendations.
+
+For reasons of concision and energetic laziness, some methods and
+options in this module (and the dozen modules it depends on) are
+undocumented; but one of those undocumented bits might be just what
+you're looking for.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Simple::Text>, L<Pod::Spell>
+
+=head1 SUPPORT
+
+Questions or discussion about POD and Pod::Simple should be sent to the
+pod-people@perl.org mail list. Send an empty email to
+pod-people-subscribe@perl.org to subscribe.
+
+This module is managed in an open GitHub repository,
+L<http://github.com/theory/pod-simple/>. Feel free to fork and contribute, or
+to clone L<git://github.com/theory/pod-simple.git> and send patches!
+
+Patches against Pod::Simple are welcome. Please send bug reports to
+<bug-pod-simple@rt.cpan.org>.
+
+=head1 COPYRIGHT AND DISCLAIMERS
+
+Copyright (c) 2002-2004 Sean M. Burke.
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+This program is distributed in the hope that it will be useful, but
+without any warranty; without even the implied warranty of
+merchantability or fitness for a particular purpose.
+
+=head1 AUTHOR
+
+Pod::Simple was created by Sean M. Burke <sburke@cpan.org>.
+But don't bother him, he's retired.
+
+Pod::Simple is maintained by:
+
+=over
+
+=item * Allison Randal C<allison@perl.org>
+
+=item * Hans Dieter Pearcey C<hdp@cpan.org>
+
+=item * David E. Wheeler C<dwheeler@cpan.org>
+
+=back
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Text.pm b/Master/tlpkg/tlperl/lib/Pod/Text.pm
new file mode 100644
index 00000000000..c68313c3898
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Text.pm
@@ -0,0 +1,878 @@
+# Pod::Text -- Convert POD data to formatted ASCII text.
+#
+# Copyright 1999, 2000, 2001, 2002, 2004, 2006, 2008, 2009
+# Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This module converts POD to formatted text. It replaces the old Pod::Text
+# module that came with versions of Perl prior to 5.6.0 and attempts to match
+# its output except for some specific circumstances where other decisions
+# seemed to produce better output. It uses Pod::Parser and is designed to be
+# very easy to subclass.
+#
+# Perl core hackers, please note that this module is also separately
+# maintained outside of the Perl core as part of the podlators. Please send
+# me any patches at the address above in addition to sending them to the
+# standard Perl mailing lists.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text;
+
+require 5.004;
+
+use strict;
+use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
+
+use Carp qw(carp croak);
+use Exporter ();
+use Pod::Simple ();
+
+@ISA = qw(Pod::Simple Exporter);
+
+# We have to export pod2text for backward compatibility.
+@EXPORT = qw(pod2text);
+
+$VERSION = '3.14';
+
+##############################################################################
+# Initialization
+##############################################################################
+
+# This function handles code blocks. It's registered as a callback to
+# Pod::Simple and therefore doesn't work as a regular method call, but all it
+# does is call output_code with the line.
+sub handle_code {
+ my ($line, $number, $parser) = @_;
+ $parser->output_code ($line . "\n");
+}
+
+# Initialize the object and set various Pod::Simple options that we need.
+# Here, we also process any additional options passed to the constructor or
+# set up defaults if none were given. Note that all internal object keys are
+# in all-caps, reserving all lower-case object keys for Pod::Simple and user
+# arguments.
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new;
+
+ # Tell Pod::Simple to handle S<> by automatically inserting &nbsp;.
+ $self->nbsp_for_S (1);
+
+ # Tell Pod::Simple to keep whitespace whenever possible.
+ if ($self->can ('preserve_whitespace')) {
+ $self->preserve_whitespace (1);
+ } else {
+ $self->fullstop_space_harden (1);
+ }
+
+ # The =for and =begin targets that we accept.
+ $self->accept_targets (qw/text TEXT/);
+
+ # Ensure that contiguous blocks of code are merged together. Otherwise,
+ # some of the guesswork heuristics don't work right.
+ $self->merge_text (1);
+
+ # Pod::Simple doesn't do anything useful with our arguments, but we want
+ # to put them in our object as hash keys and values. This could cause
+ # problems if we ever clash with Pod::Simple's own internal class
+ # variables.
+ my %opts = @_;
+ my @opts = map { ("opt_$_", $opts{$_}) } keys %opts;
+ %$self = (%$self, @opts);
+
+ # Send errors to stderr if requested.
+ if ($$self{opt_stderr}) {
+ $self->no_errata_section (1);
+ $self->complain_stderr (1);
+ delete $$self{opt_stderr};
+ }
+
+ # Initialize various things from our parameters.
+ $$self{opt_alt} = 0 unless defined $$self{opt_alt};
+ $$self{opt_indent} = 4 unless defined $$self{opt_indent};
+ $$self{opt_margin} = 0 unless defined $$self{opt_margin};
+ $$self{opt_loose} = 0 unless defined $$self{opt_loose};
+ $$self{opt_sentence} = 0 unless defined $$self{opt_sentence};
+ $$self{opt_width} = 76 unless defined $$self{opt_width};
+
+ # Figure out what quotes we'll be using for C<> text.
+ $$self{opt_quotes} ||= '"';
+ if ($$self{opt_quotes} eq 'none') {
+ $$self{LQUOTE} = $$self{RQUOTE} = '';
+ } elsif (length ($$self{opt_quotes}) == 1) {
+ $$self{LQUOTE} = $$self{RQUOTE} = $$self{opt_quotes};
+ } elsif ($$self{opt_quotes} =~ /^(.)(.)$/
+ || $$self{opt_quotes} =~ /^(..)(..)$/) {
+ $$self{LQUOTE} = $1;
+ $$self{RQUOTE} = $2;
+ } else {
+ croak qq(Invalid quote specification "$$self{opt_quotes}");
+ }
+
+ # If requested, do something with the non-POD text.
+ $self->code_handler (\&handle_code) if $$self{opt_code};
+
+ # Return the created object.
+ return $self;
+}
+
+##############################################################################
+# Core parsing
+##############################################################################
+
+# This is the glue that connects the code below with Pod::Simple itself. The
+# goal is to convert the event stream coming from the POD parser into method
+# calls to handlers once the complete content of a tag has been seen. Each
+# paragraph or POD command will have textual content associated with it, and
+# as soon as all of a paragraph or POD command has been seen, that content
+# will be passed in to the corresponding method for handling that type of
+# object. The exceptions are handlers for lists, which have opening tag
+# handlers and closing tag handlers that will be called right away.
+#
+# The internal hash key PENDING is used to store the contents of a tag until
+# all of it has been seen. It holds a stack of open tags, each one
+# represented by a tuple of the attributes hash for the tag and the contents
+# of the tag.
+
+# Add a block of text to the contents of the current node, formatting it
+# according to the current formatting instructions as we do.
+sub _handle_text {
+ my ($self, $text) = @_;
+ my $tag = $$self{PENDING}[-1];
+ $$tag[1] .= $text;
+}
+
+# Given an element name, get the corresponding method name.
+sub method_for_element {
+ my ($self, $element) = @_;
+ $element =~ tr/-/_/;
+ $element =~ tr/A-Z/a-z/;
+ $element =~ tr/_a-z0-9//cd;
+ return $element;
+}
+
+# Handle the start of a new element. If cmd_element is defined, assume that
+# we need to collect the entire tree for this element before passing it to the
+# element method, and create a new tree into which we'll collect blocks of
+# text and nested elements. Otherwise, if start_element is defined, call it.
+sub _handle_element_start {
+ my ($self, $element, $attrs) = @_;
+ my $method = $self->method_for_element ($element);
+
+ # If we have a command handler, we need to accumulate the contents of the
+ # tag before calling it.
+ if ($self->can ("cmd_$method")) {
+ push (@{ $$self{PENDING} }, [ $attrs, '' ]);
+ } elsif ($self->can ("start_$method")) {
+ my $method = 'start_' . $method;
+ $self->$method ($attrs, '');
+ }
+}
+
+# Handle the end of an element. If we had a cmd_ method for this element,
+# this is where we pass along the text that we've accumulated. Otherwise, if
+# we have an end_ method for the element, call that.
+sub _handle_element_end {
+ my ($self, $element) = @_;
+ my $method = $self->method_for_element ($element);
+
+ # If we have a command handler, pull off the pending text and pass it to
+ # the handler along with the saved attribute hash.
+ if ($self->can ("cmd_$method")) {
+ my $tag = pop @{ $$self{PENDING} };
+ my $method = 'cmd_' . $method;
+ my $text = $self->$method (@$tag);
+ if (defined $text) {
+ if (@{ $$self{PENDING} } > 1) {
+ $$self{PENDING}[-1][1] .= $text;
+ } else {
+ $self->output ($text);
+ }
+ }
+ } elsif ($self->can ("end_$method")) {
+ my $method = 'end_' . $method;
+ $self->$method ();
+ }
+}
+
+##############################################################################
+# Output formatting
+##############################################################################
+
+# Wrap a line, indenting by the current left margin. We can't use Text::Wrap
+# because it plays games with tabs. We can't use formline, even though we'd
+# really like to, because it screws up non-printing characters. So we have to
+# do the wrapping ourselves.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{opt_width} - $$self{MARGIN};
+ while (length > $width) {
+ if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ return $output;
+}
+
+# Reformat a paragraph of text for the current margin. Takes the text to
+# reformat and returns the formatted text.
+sub reformat {
+ my $self = shift;
+ local $_ = shift;
+
+ # If we're trying to preserve two spaces after sentences, do some munging
+ # to support that. Otherwise, smash all repeated whitespace.
+ if ($$self{opt_sentence}) {
+ s/ +$//mg;
+ s/\.\n/. \n/g;
+ s/\n/ /g;
+ s/ +/ /g;
+ } else {
+ s/\s+/ /g;
+ }
+ return $self->wrap ($_);
+}
+
+# Output text to the output device. Replace non-breaking spaces with spaces
+# and soft hyphens with nothing, and then try to fix the output encoding if
+# necessary to match the input encoding unless UTF-8 output is forced. This
+# preserves the traditional pass-through behavior of Pod::Text.
+sub output {
+ my ($self, $text) = @_;
+ $text =~ tr/\240\255/ /d;
+ unless ($$self{opt_utf8} || $$self{CHECKED_ENCODING}) {
+ my $encoding = $$self{encoding} || '';
+ if ($encoding) {
+ eval { binmode ($$self{output_fh}, ":encoding($encoding)") };
+ }
+ $$self{CHECKED_ENCODING} = 1;
+ }
+ print { $$self{output_fh} } $text;
+}
+
+# Output a block of code (something that isn't part of the POD text). Called
+# by preprocess_paragraph only if we were given the code option. Exists here
+# only so that it can be overridden by subclasses.
+sub output_code { $_[0]->output ($_[1]) }
+
+##############################################################################
+# Document initialization
+##############################################################################
+
+# Set up various things that have to be initialized on a per-document basis.
+sub start_document {
+ my $self = shift;
+ my $margin = $$self{opt_indent} + $$self{opt_margin};
+
+ # Initialize a few per-document variables.
+ $$self{INDENTS} = []; # Stack of indentations.
+ $$self{MARGIN} = $margin; # Default left margin.
+ $$self{PENDING} = [[]]; # Pending output.
+
+ # We have to redo encoding handling for each document.
+ delete $$self{CHECKED_ENCODING};
+
+ # If we were given the utf8 option, set an output encoding on our file
+ # handle. Wrap in an eval in case we're using a version of Perl too old
+ # to understand this.
+ #
+ # This is evil because it changes the global state of a file handle that
+ # we may not own. However, we can't just blindly encode all output, since
+ # there may be a pre-applied output encoding (such as from PERL_UNICODE)
+ # and then we would double-encode. This seems to be the least bad
+ # approach.
+ if ($$self{opt_utf8}) {
+ eval { binmode ($$self{output_fh}, ':encoding(UTF-8)') };
+ }
+
+ return '';
+}
+
+##############################################################################
+# Text blocks
+##############################################################################
+
+# Intended for subclasses to override, this method returns text with any
+# non-printing formatting codes stripped out so that length() correctly
+# returns the length of the text. For basic Pod::Text, it does nothing.
+sub strip_format {
+ my ($self, $string) = @_;
+ return $string;
+}
+
+# This method is called whenever an =item command is complete (in other words,
+# we've seen its associated paragraph or know for certain that it doesn't have
+# one). It gets the paragraph associated with the item as an argument. If
+# that argument is empty, just output the item tag; if it contains a newline,
+# output the item tag followed by the newline. Otherwise, see if there's
+# enough room for us to output the item tag in the margin of the text or if we
+# have to put it on a separate line.
+sub item {
+ my ($self, $text) = @_;
+ my $tag = $$self{ITEM};
+ unless (defined $tag) {
+ carp "Item called without tag";
+ return;
+ }
+ undef $$self{ITEM};
+
+ # Calculate the indentation and margin. $fits is set to true if the tag
+ # will fit into the margin of the paragraph given our indentation level.
+ my $indent = $$self{INDENTS}[-1];
+ $indent = $$self{opt_indent} unless defined $indent;
+ my $margin = ' ' x $$self{opt_margin};
+ my $tag_length = length ($self->strip_format ($tag));
+ my $fits = ($$self{MARGIN} - $indent >= $tag_length + 1);
+
+ # If the tag doesn't fit, or if we have no associated text, print out the
+ # tag separately. Otherwise, put the tag in the margin of the paragraph.
+ if (!$text || $text =~ /^\s+$/ || !$fits) {
+ my $realindent = $$self{MARGIN};
+ $$self{MARGIN} = $indent;
+ my $output = $self->reformat ($tag);
+ $output =~ s/^$margin /$margin:/ if ($$self{opt_alt} && $indent > 0);
+ $output =~ s/\n*$/\n/;
+
+ # If the text is just whitespace, we have an empty item paragraph;
+ # this can result from =over/=item/=back without any intermixed
+ # paragraphs. Insert some whitespace to keep the =item from merging
+ # into the next paragraph.
+ $output .= "\n" if $text && $text =~ /^\s*$/;
+
+ $self->output ($output);
+ $$self{MARGIN} = $realindent;
+ $self->output ($self->reformat ($text)) if ($text && $text =~ /\S/);
+ } else {
+ my $space = ' ' x $indent;
+ $space =~ s/^$margin /$margin:/ if $$self{opt_alt};
+ $text = $self->reformat ($text);
+ $text =~ s/^$margin /$margin:/ if ($$self{opt_alt} && $indent > 0);
+ my $tagspace = ' ' x $tag_length;
+ $text =~ s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item";
+ $self->output ($text);
+ }
+}
+
+# Handle a basic block of text. The only tricky thing here is that if there
+# is a pending item tag, we need to format this as an item paragraph.
+sub cmd_para {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$/\n/;
+ if (defined $$self{ITEM}) {
+ $self->item ($text . "\n");
+ } else {
+ $self->output ($self->reformat ($text . "\n"));
+ }
+ return '';
+}
+
+# Handle a verbatim paragraph. Just print it out, but indent it according to
+# our margin.
+sub cmd_verbatim {
+ my ($self, $attrs, $text) = @_;
+ $self->item if defined $$self{ITEM};
+ return if $text =~ /^\s*$/;
+ $text =~ s/^(\n*)([ \t]*\S+)/$1 . (' ' x $$self{MARGIN}) . $2/gme;
+ $text =~ s/\s*$/\n\n/;
+ $self->output ($text);
+ return '';
+}
+
+# Handle literal text (produced by =for and similar constructs). Just output
+# it with the minimum of changes.
+sub cmd_data {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/^\n+//;
+ $text =~ s/\n{0,2}$/\n/;
+ $self->output ($text);
+ return '';
+}
+
+##############################################################################
+# Headings
+##############################################################################
+
+# The common code for handling all headers. Takes the header text, the
+# indentation, and the surrounding marker for the alt formatting method.
+sub heading {
+ my ($self, $text, $indent, $marker) = @_;
+ $self->item ("\n\n") if defined $$self{ITEM};
+ $text =~ s/\s+$//;
+ if ($$self{opt_alt}) {
+ my $closemark = reverse (split (//, $marker));
+ my $margin = ' ' x $$self{opt_margin};
+ $self->output ("\n" . "$margin$marker $text $closemark" . "\n\n");
+ } else {
+ $text .= "\n" if $$self{opt_loose};
+ my $margin = ' ' x ($$self{opt_margin} + $indent);
+ $self->output ($margin . $text . "\n");
+ }
+ return '';
+}
+
+# First level heading.
+sub cmd_head1 {
+ my ($self, $attrs, $text) = @_;
+ $self->heading ($text, 0, '====');
+}
+
+# Second level heading.
+sub cmd_head2 {
+ my ($self, $attrs, $text) = @_;
+ $self->heading ($text, $$self{opt_indent} / 2, '== ');
+}
+
+# Third level heading.
+sub cmd_head3 {
+ my ($self, $attrs, $text) = @_;
+ $self->heading ($text, $$self{opt_indent} * 2 / 3 + 0.5, '= ');
+}
+
+# Fourth level heading.
+sub cmd_head4 {
+ my ($self, $attrs, $text) = @_;
+ $self->heading ($text, $$self{opt_indent} * 3 / 4 + 0.5, '- ');
+}
+
+##############################################################################
+# List handling
+##############################################################################
+
+# Handle the beginning of an =over block. Takes the type of the block as the
+# first argument, and then the attr hash. This is called by the handlers for
+# the four different types of lists (bullet, number, text, and block).
+sub over_common_start {
+ my ($self, $attrs) = @_;
+ $self->item ("\n\n") if defined $$self{ITEM};
+
+ # Find the indentation level.
+ my $indent = $$attrs{indent};
+ unless (defined ($indent) && $indent =~ /^\s*[-+]?\d{1,4}\s*$/) {
+ $indent = $$self{opt_indent};
+ }
+
+ # Add this to our stack of indents and increase our current margin.
+ push (@{ $$self{INDENTS} }, $$self{MARGIN});
+ $$self{MARGIN} += ($indent + 0);
+ return '';
+}
+
+# End an =over block. Takes no options other than the class pointer. Output
+# any pending items and then pop one level of indentation.
+sub over_common_end {
+ my ($self) = @_;
+ $self->item ("\n\n") if defined $$self{ITEM};
+ $$self{MARGIN} = pop @{ $$self{INDENTS} };
+ return '';
+}
+
+# Dispatch the start and end calls as appropriate.
+sub start_over_bullet { $_[0]->over_common_start ($_[1]) }
+sub start_over_number { $_[0]->over_common_start ($_[1]) }
+sub start_over_text { $_[0]->over_common_start ($_[1]) }
+sub start_over_block { $_[0]->over_common_start ($_[1]) }
+sub end_over_bullet { $_[0]->over_common_end }
+sub end_over_number { $_[0]->over_common_end }
+sub end_over_text { $_[0]->over_common_end }
+sub end_over_block { $_[0]->over_common_end }
+
+# The common handler for all item commands. Takes the type of the item, the
+# attributes, and then the text of the item.
+sub item_common {
+ my ($self, $type, $attrs, $text) = @_;
+ $self->item if defined $$self{ITEM};
+
+ # Clean up the text. We want to end up with two variables, one ($text)
+ # which contains any body text after taking out the item portion, and
+ # another ($item) which contains the actual item text. Note the use of
+ # the internal Pod::Simple attribute here; that's a potential land mine.
+ $text =~ s/\s+$//;
+ my ($item, $index);
+ if ($type eq 'bullet') {
+ $item = '*';
+ } elsif ($type eq 'number') {
+ $item = $$attrs{'~orig_content'};
+ } else {
+ $item = $text;
+ $item =~ s/\s*\n\s*/ /g;
+ $text = '';
+ }
+ $$self{ITEM} = $item;
+
+ # If body text for this item was included, go ahead and output that now.
+ if ($text) {
+ $text =~ s/\s*$/\n/;
+ $self->item ($text);
+ }
+ return '';
+}
+
+# Dispatch the item commands to the appropriate place.
+sub cmd_item_bullet { my $self = shift; $self->item_common ('bullet', @_) }
+sub cmd_item_number { my $self = shift; $self->item_common ('number', @_) }
+sub cmd_item_text { my $self = shift; $self->item_common ('text', @_) }
+sub cmd_item_block { my $self = shift; $self->item_common ('block', @_) }
+
+##############################################################################
+# Formatting codes
+##############################################################################
+
+# The simple ones.
+sub cmd_b { return $_[0]{alt} ? "``$_[2]''" : $_[2] }
+sub cmd_f { return $_[0]{alt} ? "\"$_[2]\"" : $_[2] }
+sub cmd_i { return '*' . $_[2] . '*' }
+sub cmd_x { return '' }
+
+# Apply a whole bunch of messy heuristics to not quote things that don't
+# benefit from being quoted. These originally come from Barrie Slaymaker and
+# largely duplicate code in Pod::Man.
+sub cmd_c {
+ my ($self, $attrs, $text) = @_;
+
+ # A regex that matches the portion of a variable reference that's the
+ # array or hash index, separated out just because we want to use it in
+ # several places in the following regex.
+ my $index = '(?: \[.*\] | \{.*\} )?';
+
+ # Check for things that we don't want to quote, and if we find any of
+ # them, return the string with just a font change and no quoting.
+ $text =~ m{
+ ^\s*
+ (?:
+ ( [\'\`\"] ) .* \1 # already quoted
+ | \` .* \' # `quoted'
+ | \$+ [\#^]? \S $index # special ($^Foo, $")
+ | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func
+ | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
+ | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number
+ | 0x [a-fA-F\d]+ # a hex constant
+ )
+ \s*\z
+ }xo && return $text;
+
+ # If we didn't return, go ahead and quote the text.
+ return $$self{opt_alt}
+ ? "``$text''"
+ : "$$self{LQUOTE}$text$$self{RQUOTE}";
+}
+
+# Links reduce to the text that we're given, wrapped in angle brackets if it's
+# a URL.
+sub cmd_l {
+ my ($self, $attrs, $text) = @_;
+ if ($$attrs{type} eq 'url') {
+ if (not defined($$attrs{to}) or $$attrs{to} eq $text) {
+ return "<$text>";
+ } else {
+ return "$text <$$attrs{to}>";
+ }
+ } else {
+ return $text;
+ }
+}
+
+##############################################################################
+# Backwards compatibility
+##############################################################################
+
+# The old Pod::Text module did everything in a pod2text() function. This
+# tries to provide the same interface for legacy applications.
+sub pod2text {
+ my @args;
+
+ # This is really ugly; I hate doing option parsing in the middle of a
+ # module. But the old Pod::Text module supported passing flags to its
+ # entry function, so handle -a and -<number>.
+ while ($_[0] =~ /^-/) {
+ my $flag = shift;
+ if ($flag eq '-a') { push (@args, alt => 1) }
+ elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
+ else {
+ unshift (@_, $flag);
+ last;
+ }
+ }
+
+ # Now that we know what arguments we're using, create the parser.
+ my $parser = Pod::Text->new (@args);
+
+ # If two arguments were given, the second argument is going to be a file
+ # handle. That means we want to call parse_from_filehandle(), which means
+ # we need to turn the first argument into a file handle. Magic open will
+ # handle the <&STDIN case automagically.
+ if (defined $_[1]) {
+ my @fhs = @_;
+ local *IN;
+ unless (open (IN, $fhs[0])) {
+ croak ("Can't open $fhs[0] for reading: $!\n");
+ return;
+ }
+ $fhs[0] = \*IN;
+ $parser->output_fh ($fhs[1]);
+ my $retval = $parser->parse_file ($fhs[0]);
+ my $fh = $parser->output_fh ();
+ close $fh;
+ return $retval;
+ } else {
+ $parser->output_fh (\*STDOUT);
+ return $parser->parse_file (@_);
+ }
+}
+
+# Reset the underlying Pod::Simple object between calls to parse_from_file so
+# that the same object can be reused to convert multiple pages.
+sub parse_from_file {
+ my $self = shift;
+ $self->reinit;
+
+ # Fake the old cutting option to Pod::Parser. This fiddings with internal
+ # Pod::Simple state and is quite ugly; we need a better approach.
+ if (ref ($_[0]) eq 'HASH') {
+ my $opts = shift @_;
+ if (defined ($$opts{-cutting}) && !$$opts{-cutting}) {
+ $$self{in_pod} = 1;
+ $$self{last_was_blank} = 1;
+ }
+ }
+
+ # Do the work.
+ my $retval = $self->Pod::Simple::parse_from_file (@_);
+
+ # Flush output, since Pod::Simple doesn't do this. Ideally we should also
+ # close the file descriptor if we had to open one, but we can't easily
+ # figure this out.
+ my $fh = $self->output_fh ();
+ my $oldfh = select $fh;
+ my $oldflush = $|;
+ $| = 1;
+ print $fh '';
+ $| = $oldflush;
+ select $oldfh;
+ return $retval;
+}
+
+# Pod::Simple failed to provide this backward compatibility function, so
+# implement it ourselves. File handles are one of the inputs that
+# parse_from_file supports.
+sub parse_from_filehandle {
+ my $self = shift;
+ $self->parse_from_file (@_);
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text - Convert POD data to formatted ASCII text
+
+=for stopwords
+alt stderr Allbery Sean Burke's Christiansen UTF-8 pre-Unicode utf8
+
+=head1 SYNOPSIS
+
+ use Pod::Text;
+ my $parser = Pod::Text->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text is a module that can convert documentation in the POD format (the
+preferred language for documenting Perl) into formatted ASCII. It uses no
+special formatting controls or codes whatsoever, and its output is therefore
+suitable for nearly any device.
+
+As a derived class from Pod::Simple, Pod::Text supports the same methods and
+interfaces. See L<Pod::Simple> for all the details; briefly, one creates a
+new parser with C<< Pod::Text->new() >> and then normally calls parse_file().
+
+new() can take options, in the form of key/value pairs, that control the
+behavior of the parser. The currently recognized options are:
+
+=over 4
+
+=item alt
+
+If set to a true value, selects an alternate output format that, among other
+things, uses a different heading style and marks C<=item> entries with a
+colon in the left margin. Defaults to false.
+
+=item code
+
+If set to a true value, the non-POD parts of the input file will be included
+in the output. Useful for viewing code documented with POD blocks with the
+POD rendered and the code left intact.
+
+=item indent
+
+The number of spaces to indent regular text, and the default indentation for
+C<=over> blocks. Defaults to 4.
+
+=item loose
+
+If set to a true value, a blank line is printed after a C<=head1> heading.
+If set to false (the default), no blank line is printed after C<=head1>,
+although one is still printed after C<=head2>. This is the default because
+it's the expected formatting for manual pages; if you're formatting
+arbitrary text documents, setting this to true may result in more pleasing
+output.
+
+=item margin
+
+The width of the left margin in spaces. Defaults to 0. This is the margin
+for all text, including headings, not the amount by which regular text is
+indented; for the latter, see the I<indent> option. To set the right
+margin, see the I<width> option.
+
+=item quotes
+
+Sets the quote marks used to surround CE<lt>> text. If the value is a
+single character, it is used as both the left and right quote; if it is two
+characters, the first character is used as the left quote and the second as
+the right quoted; and if it is four characters, the first two are used as
+the left quote and the second two as the right quote.
+
+This may also be set to the special value C<none>, in which case no quote
+marks are added around CE<lt>> text.
+
+=item sentence
+
+If set to a true value, Pod::Text will assume that each sentence ends in two
+spaces, and will try to preserve that spacing. If set to false, all
+consecutive whitespace in non-verbatim paragraphs is compressed into a
+single space. Defaults to true.
+
+=item stderr
+
+Send error messages about invalid POD to standard error instead of
+appending a POD ERRORS section to the generated output.
+
+=item utf8
+
+By default, Pod::Text uses the same output encoding as the input encoding
+of the POD source (provided that Perl was built with PerlIO; otherwise, it
+doesn't encode its output). If this option is given, the output encoding
+is forced to UTF-8.
+
+Be aware that, when using this option, the input encoding of your POD
+source must be properly declared unless it is US-ASCII or Latin-1. POD
+input without an C<=encoding> command will be assumed to be in Latin-1,
+and if it's actually in UTF-8, the output will be double-encoded. See
+L<perlpod(1)> for more information on the C<=encoding> command.
+
+=item width
+
+The column at which to wrap text on the right-hand side. Defaults to 76.
+
+=back
+
+The standard Pod::Simple method parse_file() takes one argument, the file or
+file handle to read from, and writes output to standard output unless that
+has been changed with the output_fh() method. See L<Pod::Simple> for the
+specific details and for other alternative interfaces.
+
+=head1 DIAGNOSTICS
+
+=over 4
+
+=item Bizarre space in item
+
+=item Item called without tag
+
+(W) Something has gone wrong in internal C<=item> processing. These
+messages indicate a bug in Pod::Text; you should never see them.
+
+=item Can't open %s for reading: %s
+
+(F) Pod::Text was invoked via the compatibility mode pod2text() interface
+and the input file it was given could not be opened.
+
+=item Invalid quote specification "%s"
+
+(F) The quote specification given (the quotes option to the constructor) was
+invalid. A quote specification must be one, two, or four characters long.
+
+=back
+
+=head1 BUGS
+
+Encoding handling assumes that PerlIO is available and does not work
+properly if it isn't. The C<utf8> option is therefore not supported
+unless Perl is built with PerlIO support.
+
+=head1 CAVEATS
+
+If Pod::Text is given the C<utf8> option, the encoding of its output file
+handle will be forced to UTF-8 if possible, overriding any existing
+encoding. This will be done even if the file handle is not created by
+Pod::Text and was passed in from outside. This maintains consistency
+regardless of PERL_UNICODE and other settings.
+
+If the C<utf8> option is not given, the encoding of its output file handle
+will be forced to the detected encoding of the input POD, which preserves
+whatever the input text is. This ensures backward compatibility with
+earlier, pre-Unicode versions of this module, without large numbers of
+Perl warnings.
+
+This is not ideal, but it seems to be the best compromise. If it doesn't
+work for you, please let me know the details of how it broke.
+
+=head1 NOTES
+
+This is a replacement for an earlier Pod::Text module written by Tom
+Christiansen. It has a revamped interface, since it now uses Pod::Simple,
+but an interface roughly compatible with the old Pod::Text::pod2text()
+function is still available. Please change to the new calling convention,
+though.
+
+The original Pod::Text contained code to do formatting via termcap
+sequences, although it wasn't turned on by default and it was problematic to
+get it to work at all. This rewrite doesn't even try to do that, but a
+subclass of it does. Look for L<Pod::Text::Termcap>.
+
+=head1 SEE ALSO
+
+L<Pod::Simple>, L<Pod::Text::Termcap>, L<perlpod(1)>, L<pod2text(1)>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original
+Pod::Text by Tom Christiansen <tchrist@mox.perl.com> and its conversion to
+Pod::Parser by Brad Appleton <bradapp@enteract.com>. Sean Burke's initial
+conversion of Pod::Man to use Pod::Simple provided much-needed guidance on
+how to use Pod::Simple.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2000, 2001, 2002, 2004, 2006, 2008, 2009 Russ Allbery
+<rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Text/Color.pm b/Master/tlpkg/tlperl/lib/Pod/Text/Color.pm
new file mode 100644
index 00000000000..2e8864148b4
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Text/Color.pm
@@ -0,0 +1,155 @@
+# Pod::Text::Color -- Convert POD data to formatted color ASCII text
+#
+# Copyright 1999, 2001, 2004, 2006, 2008, 2009 Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This is just a basic proof of concept. It should later be modified to make
+# better use of color, take options changing what colors are used for what
+# text, and the like.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text::Color;
+
+require 5.004;
+
+use Pod::Text ();
+use Term::ANSIColor qw(colored);
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+$VERSION = '2.06';
+
+##############################################################################
+# Overrides
+##############################################################################
+
+# Make level one headings bold.
+sub cmd_head1 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $self->SUPER::cmd_head1 ($attrs, colored ($text, 'bold'));
+}
+
+# Make level two headings bold.
+sub cmd_head2 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $self->SUPER::cmd_head2 ($attrs, colored ($text, 'bold'));
+}
+
+# Fix the various formatting codes.
+sub cmd_b { return colored ($_[2], 'bold') }
+sub cmd_f { return colored ($_[2], 'cyan') }
+sub cmd_i { return colored ($_[2], 'yellow') }
+
+# Output any included code in green.
+sub output_code {
+ my ($self, $code) = @_;
+ $code = colored ($code, 'green');
+ $self->output ($code);
+}
+
+# Strip all of the formatting from a provided string, returning the stripped
+# version. We will eventually want to use colorstrip() from Term::ANSIColor,
+# but it's fairly new so avoid the tight dependency.
+sub strip_format {
+ my ($self, $text) = @_;
+ $text =~ s/\e\[[\d;]*m//g;
+ return $text;
+}
+
+# We unfortunately have to override the wrapping code here, since the normal
+# wrapping code gets really confused by all the escape sequences.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{opt_width} - $$self{MARGIN};
+
+ # We have to do $shortchar and $longchar in variables because the
+ # construct ${char}{0,$width} didn't do the right thing until Perl 5.8.x.
+ my $char = '(?:(?:\e\[[\d;]+m)*[^\n])';
+ my $shortchar = $char . "{0,$width}";
+ my $longchar = $char . "{$width}";
+ while (length > $width) {
+ if (s/^($shortchar)\s+// || s/^($longchar)//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ $output;
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Color - Convert POD data to formatted color ASCII text
+
+=for stopwords
+Allbery
+
+=head1 SYNOPSIS
+
+ use Pod::Text::Color;
+ my $parser = Pod::Text::Color->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Color is a simple subclass of Pod::Text that highlights output
+text using ANSI color escape sequences. Apart from the color, it in all
+ways functions like Pod::Text. See L<Pod::Text> for details and available
+options.
+
+Term::ANSIColor is used to get colors and therefore must be installed to use
+this module.
+
+=head1 BUGS
+
+This is just a basic proof of concept. It should be seriously expanded to
+support configurable coloration via options passed to the constructor, and
+B<pod2text> should be taught about those.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Simple>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2001, 2004, 2006, 2008, 2009 Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Text/Overstrike.pm b/Master/tlpkg/tlperl/lib/Pod/Text/Overstrike.pm
new file mode 100644
index 00000000000..7578f0f8f58
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Text/Overstrike.pm
@@ -0,0 +1,208 @@
+# Pod::Text::Overstrike -- Convert POD data to formatted overstrike text
+#
+# Created by Joe Smith <Joe.Smith@inwap.com> 30-Nov-2000
+# (based on Pod::Text::Color by Russ Allbery <rra@stanford.edu>)
+# Copyright 2000 Joe Smith <Joe.Smith@inwap.com>.
+# Copyright 2001, 2004, 2008 Russ Allbery <rra@stanford.edu>.
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This was written because the output from:
+#
+# pod2text Text.pm > plain.txt; less plain.txt
+#
+# is not as rich as the output from
+#
+# pod2man Text.pm | nroff -man > fancy.txt; less fancy.txt
+#
+# and because both Pod::Text::Color and Pod::Text::Termcap are not device
+# independent.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text::Overstrike;
+
+require 5.004;
+
+use Pod::Text ();
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+$VERSION = '2.04';
+
+##############################################################################
+# Overrides
+##############################################################################
+
+# Make level one headings bold, overridding any existing formatting.
+sub cmd_head1 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $text = $self->strip_format ($text);
+ $text =~ s/(.)/$1\b$1/g;
+ return $self->SUPER::cmd_head1 ($attrs, $text);
+}
+
+# Make level two headings bold, overriding any existing formatting.
+sub cmd_head2 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $text = $self->strip_format ($text);
+ $text =~ s/(.)/$1\b$1/g;
+ return $self->SUPER::cmd_head2 ($attrs, $text);
+}
+
+# Make level three headings underscored, overriding any existing formatting.
+sub cmd_head3 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $text = $self->strip_format ($text);
+ $text =~ s/(.)/_\b$1/g;
+ return $self->SUPER::cmd_head3 ($attrs, $text);
+}
+
+# Level four headings look like level three headings.
+sub cmd_head4 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $text = $self->strip_format ($text);
+ $text =~ s/(.)/_\b$1/g;
+ return $self->SUPER::cmd_head4 ($attrs, $text);
+}
+
+# The common code for handling all headers. We have to override to avoid
+# interpolating twice and because we don't want to honor alt.
+sub heading {
+ my ($self, $text, $indent, $marker) = @_;
+ $self->item ("\n\n") if defined $$self{ITEM};
+ $text .= "\n" if $$self{opt_loose};
+ my $margin = ' ' x ($$self{opt_margin} + $indent);
+ $self->output ($margin . $text . "\n");
+ return '';
+}
+
+# Fix the various formatting codes.
+sub cmd_b { local $_ = $_[0]->strip_format ($_[2]); s/(.)/$1\b$1/g; $_ }
+sub cmd_f { local $_ = $_[0]->strip_format ($_[2]); s/(.)/_\b$1/g; $_ }
+sub cmd_i { local $_ = $_[0]->strip_format ($_[2]); s/(.)/_\b$1/g; $_ }
+
+# Output any included code in bold.
+sub output_code {
+ my ($self, $code) = @_;
+ $code =~ s/(.)/$1\b$1/g;
+ $self->output ($code);
+}
+
+# Strip all of the formatting from a provided string, returning the stripped
+# version.
+sub strip_format {
+ my ($self, $text) = @_;
+ $text =~ s/(.)[\b]\1/$1/g;
+ $text =~ s/_[\b]//g;
+ return $text;
+}
+
+# We unfortunately have to override the wrapping code here, since the normal
+# wrapping code gets really confused by all the backspaces.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{opt_width} - $$self{MARGIN};
+ while (length > $width) {
+ # This regex represents a single character, that's possibly underlined
+ # or in bold (in which case, it's three characters; the character, a
+ # backspace, and a character). Use [^\n] rather than . to protect
+ # against odd settings of $*.
+ my $char = '(?:[^\n][\b])?[^\n]';
+ if (s/^((?>$char){0,$width})(?:\Z|\s+)//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ return $output;
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+=for stopwords
+overstrike
+
+Pod::Text::Overstrike - Convert POD data to formatted overstrike text
+
+=for stopwords
+overstruck Overstruck Allbery terminal's
+
+=head1 SYNOPSIS
+
+ use Pod::Text::Overstrike;
+ my $parser = Pod::Text::Overstrike->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Overstrike is a simple subclass of Pod::Text that highlights
+output text using overstrike sequences, in a manner similar to nroff.
+Characters in bold text are overstruck (character, backspace, character)
+and characters in underlined text are converted to overstruck underscores
+(underscore, backspace, character). This format was originally designed
+for hard-copy terminals and/or line printers, yet is readable on soft-copy
+(CRT) terminals.
+
+Overstruck text is best viewed by page-at-a-time programs that take
+advantage of the terminal's B<stand-out> and I<underline> capabilities, such
+as the less program on Unix.
+
+Apart from the overstrike, it in all ways functions like Pod::Text. See
+L<Pod::Text> for details and available options.
+
+=head1 BUGS
+
+Currently, the outermost formatting instruction wins, so for example
+underlined text inside a region of bold text is displayed as simply bold.
+There may be some better approach possible.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Simple>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Joe Smith <Joe.Smith@inwap.com>, using the framework created by Russ Allbery
+<rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2000 by Joe Smith <Joe.Smith@inwap.com>.
+Copyright 2001, 2004, 2008 by Russ Allbery <rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Text/Termcap.pm b/Master/tlpkg/tlperl/lib/Pod/Text/Termcap.pm
new file mode 100644
index 00000000000..e4885c9d262
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Text/Termcap.pm
@@ -0,0 +1,195 @@
+# Pod::Text::Termcap -- Convert POD data to ASCII text with format escapes.
+#
+# Copyright 1999, 2001, 2002, 2004, 2006, 2008, 2009
+# Russ Allbery <rra@stanford.edu>
+#
+# This program is free software; you may redistribute it and/or modify it
+# under the same terms as Perl itself.
+#
+# This is a simple subclass of Pod::Text that overrides a few key methods to
+# output the right termcap escape sequences for formatted text on the current
+# terminal type.
+
+##############################################################################
+# Modules and declarations
+##############################################################################
+
+package Pod::Text::Termcap;
+
+require 5.004;
+
+use Pod::Text ();
+use POSIX ();
+use Term::Cap;
+
+use strict;
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Pod::Text);
+
+$VERSION = '2.06';
+
+##############################################################################
+# Overrides
+##############################################################################
+
+# In the initialization method, grab our terminal characteristics as well as
+# do all the stuff we normally do.
+sub new {
+ my ($self, @args) = @_;
+ my ($ospeed, $term, $termios);
+ $self = $self->SUPER::new (@args);
+
+ # $ENV{HOME} is usually not set on Windows. The default Term::Cap path
+ # may not work on Solaris.
+ my $home = exists $ENV{HOME} ? "$ENV{HOME}/.termcap:" : '';
+ $ENV{TERMPATH} = $home . '/etc/termcap:/usr/share/misc/termcap'
+ . ':/usr/share/lib/termcap';
+
+ # Fall back on a hard-coded terminal speed if POSIX::Termios isn't
+ # available (such as on VMS).
+ eval { $termios = POSIX::Termios->new };
+ if ($@) {
+ $ospeed = 9600;
+ } else {
+ $termios->getattr;
+ $ospeed = $termios->getospeed || 9600;
+ }
+
+ # Fall back on the ANSI escape sequences if Term::Cap doesn't work.
+ eval { $term = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed } };
+ $$self{BOLD} = $$term{_md} || "\e[1m";
+ $$self{UNDL} = $$term{_us} || "\e[4m";
+ $$self{NORM} = $$term{_me} || "\e[m";
+
+ unless (defined $$self{width}) {
+ $$self{opt_width} = $ENV{COLUMNS} || $$term{_co} || 80;
+ $$self{opt_width} -= 2;
+ }
+
+ return $self;
+}
+
+# Make level one headings bold.
+sub cmd_head1 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $self->SUPER::cmd_head1 ($attrs, "$$self{BOLD}$text$$self{NORM}");
+}
+
+# Make level two headings bold.
+sub cmd_head2 {
+ my ($self, $attrs, $text) = @_;
+ $text =~ s/\s+$//;
+ $self->SUPER::cmd_head2 ($attrs, "$$self{BOLD}$text$$self{NORM}");
+}
+
+# Fix up B<> and I<>. Note that we intentionally don't do F<>.
+sub cmd_b { my $self = shift; return "$$self{BOLD}$_[1]$$self{NORM}" }
+sub cmd_i { my $self = shift; return "$$self{UNDL}$_[1]$$self{NORM}" }
+
+# Output any included code in bold.
+sub output_code {
+ my ($self, $code) = @_;
+ $self->output ($$self{BOLD} . $code . $$self{NORM});
+}
+
+# Strip all of the formatting from a provided string, returning the stripped
+# version.
+sub strip_format {
+ my ($self, $text) = @_;
+ $text =~ s/\Q$$self{BOLD}//g;
+ $text =~ s/\Q$$self{UNDL}//g;
+ $text =~ s/\Q$$self{NORM}//g;
+ return $text;
+}
+
+# Override the wrapping code to igore the special sequences.
+sub wrap {
+ my $self = shift;
+ local $_ = shift;
+ my $output = '';
+ my $spaces = ' ' x $$self{MARGIN};
+ my $width = $$self{opt_width} - $$self{MARGIN};
+
+ # $codes matches a single special sequence. $char matches any number of
+ # special sequences preceeding a single character other than a newline.
+ # We have to do $shortchar and $longchar in variables because the
+ # construct ${char}{0,$width} didn't do the right thing until Perl 5.8.x.
+ my $codes = "(?:\Q$$self{BOLD}\E|\Q$$self{UNDL}\E|\Q$$self{NORM}\E)";
+ my $char = "(?:$codes*[^\\n])";
+ my $shortchar = $char . "{0,$width}";
+ my $longchar = $char . "{$width}";
+ while (length > $width) {
+ if (s/^($shortchar)\s+// || s/^($longchar)//) {
+ $output .= $spaces . $1 . "\n";
+ } else {
+ last;
+ }
+ }
+ $output .= $spaces . $_;
+ $output =~ s/\s+$/\n\n/;
+ return $output;
+}
+
+##############################################################################
+# Module return value and documentation
+##############################################################################
+
+1;
+__END__
+
+=head1 NAME
+
+Pod::Text::Termcap - Convert POD data to ASCII text with format escapes
+
+=for stopwords
+ECMA-48 VT100 Allbery
+
+=head1 SYNOPSIS
+
+ use Pod::Text::Termcap;
+ my $parser = Pod::Text::Termcap->new (sentence => 0, width => 78);
+
+ # Read POD from STDIN and write to STDOUT.
+ $parser->parse_from_filehandle;
+
+ # Read POD from file.pod and write to file.txt.
+ $parser->parse_from_file ('file.pod', 'file.txt');
+
+=head1 DESCRIPTION
+
+Pod::Text::Termcap is a simple subclass of Pod::Text that highlights output
+text using the correct termcap escape sequences for the current terminal.
+Apart from the format codes, it in all ways functions like Pod::Text. See
+L<Pod::Text> for details and available options.
+
+=head1 NOTES
+
+This module uses Term::Cap to retrieve the formatting escape sequences for
+the current terminal, and falls back on the ECMA-48 (the same in this
+regard as ANSI X3.64 and ISO 6429, the escape codes also used by DEC VT100
+terminals) if the bold, underline, and reset codes aren't set in the
+termcap information.
+
+=head1 SEE ALSO
+
+L<Pod::Text>, L<Pod::Simple>, L<Term::Cap>
+
+The current version of this module is always available from its web site at
+L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
+Perl core distribution as of 5.6.0.
+
+=head1 AUTHOR
+
+Russ Allbery <rra@stanford.edu>.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 1999, 2001, 2002, 2004, 2006, 2008, 2009 Russ Allbery
+<rra@stanford.edu>.
+
+This program is free software; you may redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
diff --git a/Master/tlpkg/tlperl/lib/Pod/Usage.pm b/Master/tlpkg/tlperl/lib/Pod/Usage.pm
new file mode 100644
index 00000000000..f463fb9c468
--- /dev/null
+++ b/Master/tlpkg/tlperl/lib/Pod/Usage.pm
@@ -0,0 +1,730 @@
+#############################################################################
+# Pod/Usage.pm -- print usage messages for the running script.
+#
+# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved.
+# This file is part of "PodParser". PodParser is free software;
+# you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+#############################################################################
+
+package Pod::Usage;
+use strict;
+
+use vars qw($VERSION @ISA @EXPORT);
+$VERSION = '1.36'; ## Current version of this package
+require 5.005; ## requires this Perl version or later
+
+=head1 NAME
+
+Pod::Usage, pod2usage() - print a usage message from embedded pod documentation
+
+=head1 SYNOPSIS
+
+ use Pod::Usage
+
+ my $message_text = "This text precedes the usage message.";
+ my $exit_status = 2; ## The exit status to use
+ my $verbose_level = 0; ## The verbose level to use
+ my $filehandle = \*STDERR; ## The filehandle to write to
+
+ pod2usage($message_text);
+
+ pod2usage($exit_status);
+
+ pod2usage( { -message => $message_text ,
+ -exitval => $exit_status ,
+ -verbose => $verbose_level,
+ -output => $filehandle } );
+
+ pod2usage( -msg => $message_text ,
+ -exitval => $exit_status ,
+ -verbose => $verbose_level,
+ -output => $filehandle );
+
+ pod2usage( -verbose => 2,
+ -noperldoc => 1 )
+
+=head1 ARGUMENTS
+
+B<pod2usage> should be given either a single argument, or a list of
+arguments corresponding to an associative array (a "hash"). When a single
+argument is given, it should correspond to exactly one of the following:
+
+=over 4
+
+=item *
+
+A string containing the text of a message to print I<before> printing
+the usage message
+
+=item *
+
+A numeric value corresponding to the desired exit status
+
+=item *
+
+A reference to a hash
+
+=back
+
+If more than one argument is given then the entire argument list is
+assumed to be a hash. If a hash is supplied (either as a reference or
+as a list) it should contain one or more elements with the following
+keys:
+
+=over 4
+
+=item C<-message>
+
+=item C<-msg>
+
+The text of a message to print immediately prior to printing the
+program's usage message.
+
+=item C<-exitval>
+
+The desired exit status to pass to the B<exit()> function.
+This should be an integer, or else the string "NOEXIT" to
+indicate that control should simply be returned without
+terminating the invoking process.
+
+=item C<-verbose>
+
+The desired level of "verboseness" to use when printing the usage
+message. If the corresponding value is 0, then only the "SYNOPSIS"
+section of the pod documentation is printed. If the corresponding value
+is 1, then the "SYNOPSIS" section, along with any section entitled
+"OPTIONS", "ARGUMENTS", or "OPTIONS AND ARGUMENTS" is printed. If the
+corresponding value is 2 or more then the entire manpage is printed.
+
+The special verbosity level 99 requires to also specify the -sections
+parameter; then these sections are extracted (see L<Pod::Select>)
+and printed.
+
+=item C<-sections>
+
+A string representing a selection list for sections to be printed
+when -verbose is set to 99, e.g. C<"NAME|SYNOPSIS|DESCRIPTION|VERSION">.
+
+Alternatively, an array reference of section specifications can be used:
+
+ pod2usage(-verbose => 99,
+ -sections => [ qw(fred fred/subsection) ] );
+
+=item C<-output>
+
+A reference to a filehandle, or the pathname of a file to which the
+usage message should be written. The default is C<\*STDERR> unless the
+exit value is less than 2 (in which case the default is C<\*STDOUT>).
+
+=item C<-input>
+
+A reference to a filehandle, or the pathname of a file from which the
+invoking script's pod documentation should be read. It defaults to the
+file indicated by C<$0> (C<$PROGRAM_NAME> for users of F<English.pm>).
+
+If you are calling B<pod2usage()> from a module and want to display
+that module's POD, you can use this:
+
+ use Pod::Find qw(pod_where);
+ pod2usage( -input => pod_where({-inc => 1}, __PACKAGE__) );
+
+=item C<-pathlist>
+
+A list of directory paths. If the input file does not exist, then it
+will be searched for in the given directory list (in the order the
+directories appear in the list). It defaults to the list of directories
+implied by C<$ENV{PATH}>. The list may be specified either by a reference
+to an array, or by a string of directory paths which use the same path
+separator as C<$ENV{PATH}> on your system (e.g., C<:> for Unix, C<;> for
+MSWin32 and DOS).
+
+=item C<-noperldoc>
+
+By default, Pod::Usage will call L<perldoc> when -verbose >= 2 is
+specified. This does not work well e.g. if the script was packed
+with L<PAR>. The -noperldoc option suppresses the external call to
+L<perldoc> and uses the simple text formatter (L<Pod::Text>) to
+output the POD.
+
+=back
+
+=head1 DESCRIPTION
+
+B<pod2usage> will print a usage message for the invoking script (using
+its embedded pod documentation) and then exit the script with the
+desired exit status. The usage message printed may have any one of three
+levels of "verboseness": If the verbose level is 0, then only a synopsis
+is printed. If the verbose level is 1, then the synopsis is printed
+along with a description (if present) of the command line options and
+arguments. If the verbose level is 2, then the entire manual page is
+printed.
+
+Unless they are explicitly specified, the default values for the exit
+status, verbose level, and output stream to use are determined as
+follows:
+
+=over 4
+
+=item *
+
+If neither the exit status nor the verbose level is specified, then the
+default is to use an exit status of 2 with a verbose level of 0.
+
+=item *
+
+If an exit status I<is> specified but the verbose level is I<not>, then the
+verbose level will default to 1 if the exit status is less than 2 and
+will default to 0 otherwise.
+
+=item *
+
+If an exit status is I<not> specified but verbose level I<is> given, then
+the exit status will default to 2 if the verbose level is 0 and will
+default to 1 otherwise.
+
+=item *
+
+If the exit status used is less than 2, then output is printed on
+C<STDOUT>. Otherwise output is printed on C<STDERR>.
+
+=back
+
+Although the above may seem a bit confusing at first, it generally does
+"the right thing" in most situations. This determination of the default
+values to use is based upon the following typical Unix conventions:
+
+=over 4
+
+=item *
+
+An exit status of 0 implies "success". For example, B<diff(1)> exits
+with a status of 0 if the two files have the same contents.
+
+=item *
+
+An exit status of 1 implies possibly abnormal, but non-defective, program
+termination. For example, B<grep(1)> exits with a status of 1 if
+it did I<not> find a matching line for the given regular expression.
+
+=item *
+
+An exit status of 2 or more implies a fatal error. For example, B<ls(1)>
+exits with a status of 2 if you specify an illegal (unknown) option on
+the command line.
+
+=item *
+
+Usage messages issued as a result of bad command-line syntax should go
+to C<STDERR>. However, usage messages issued due to an explicit request
+to print usage (like specifying B<-help> on the command line) should go
+to C<STDOUT>, just in case the user wants to pipe the output to a pager
+(such as B<more(1)>).
+
+=item *
+
+If program usage has been explicitly requested by the user, it is often
+desirable to exit with a status of 1 (as opposed to 0) after issuing
+the user-requested usage message. It is also desirable to give a
+more verbose description of program usage in this case.
+
+=back
+
+B<pod2usage> doesn't force the above conventions upon you, but it will
+use them by default if you don't expressly tell it to do otherwise. The
+ability of B<pod2usage()> to accept a single number or a string makes it
+convenient to use as an innocent looking error message handling function:
+
+ use Pod::Usage;
+ use Getopt::Long;
+
+ ## Parse options
+ GetOptions("help", "man", "flag1") || pod2usage(2);
+ pod2usage(1) if ($opt_help);
+ pod2usage(-verbose => 2) if ($opt_man);
+
+ ## Check for too many filenames
+ pod2usage("$0: Too many files given.\n") if (@ARGV > 1);
+
+Some user's however may feel that the above "economy of expression" is
+not particularly readable nor consistent and may instead choose to do
+something more like the following:
+
+ use Pod::Usage;
+ use Getopt::Long;
+
+ ## Parse options
+ GetOptions("help", "man", "flag1") || pod2usage(-verbose => 0);
+ pod2usage(-verbose => 1) if ($opt_help);
+ pod2usage(-verbose => 2) if ($opt_man);
+
+ ## Check for too many filenames
+ pod2usage(-verbose => 2, -message => "$0: Too many files given.\n")
+ if (@ARGV > 1);
+
+As with all things in Perl, I<there's more than one way to do it>, and
+B<pod2usage()> adheres to this philosophy. If you are interested in
+seeing a number of different ways to invoke B<pod2usage> (although by no
+means exhaustive), please refer to L<"EXAMPLES">.
+
+=head1 EXAMPLES
+
+Each of the following invocations of C<pod2usage()> will print just the
+"SYNOPSIS" section to C<STDERR> and will exit with a status of 2:
+
+ pod2usage();
+
+ pod2usage(2);
+
+ pod2usage(-verbose => 0);
+
+ pod2usage(-exitval => 2);
+
+ pod2usage({-exitval => 2, -output => \*STDERR});
+
+ pod2usage({-verbose => 0, -output => \*STDERR});
+
+ pod2usage(-exitval => 2, -verbose => 0);
+
+ pod2usage(-exitval => 2, -verbose => 0, -output => \*STDERR);
+
+Each of the following invocations of C<pod2usage()> will print a message
+of "Syntax error." (followed by a newline) to C<STDERR>, immediately
+followed by just the "SYNOPSIS" section (also printed to C<STDERR>) and
+will exit with a status of 2:
+
+ pod2usage("Syntax error.");
+
+ pod2usage(-message => "Syntax error.", -verbose => 0);
+
+ pod2usage(-msg => "Syntax error.", -exitval => 2);
+
+ pod2usage({-msg => "Syntax error.", -exitval => 2, -output => \*STDERR});
+
+ pod2usage({-msg => "Syntax error.", -verbose => 0, -output => \*STDERR});
+
+ pod2usage(-msg => "Syntax error.", -exitval => 2, -verbose => 0);
+
+ pod2usage(-message => "Syntax error.",
+ -exitval => 2,
+ -verbose => 0,
+ -output => \*STDERR);
+
+Each of the following invocations of C<pod2usage()> will print the
+"SYNOPSIS" section and any "OPTIONS" and/or "ARGUMENTS" sections to
+C<STDOUT> and will exit with a status of 1:
+
+ pod2usage(1);
+
+ pod2usage(-verbose => 1);
+
+ pod2usage(-exitval => 1);
+
+ pod2usage({-exitval => 1, -output => \*STDOUT});
+
+ pod2usage({-verbose => 1, -output => \*STDOUT});
+
+ pod2usage(-exitval => 1, -verbose => 1);
+
+ pod2usage(-exitval => 1, -verbose => 1, -output => \*STDOUT});
+
+Each of the following invocations of C<pod2usage()> will print the
+entire manual page to C<STDOUT> and will exit with a status of 1:
+
+ pod2usage(-verbose => 2);
+
+ pod2usage({-verbose => 2, -output => \*STDOUT});
+
+ pod2usage(-exitval => 1, -verbose => 2);
+
+ pod2usage({-exitval => 1, -verbose => 2, -output => \*STDOUT});
+
+=head2 Recommended Use
+
+Most scripts should print some type of usage message to C<STDERR> when a
+command line syntax error is detected. They should also provide an
+option (usually C<-H> or C<-help>) to print a (possibly more verbose)
+usage message to C<STDOUT>. Some scripts may even wish to go so far as to
+provide a means of printing their complete documentation to C<STDOUT>
+(perhaps by allowing a C<-man> option). The following complete example
+uses B<Pod::Usage> in combination with B<Getopt::Long> to do all of these
+things:
+
+ use Getopt::Long;
+ use Pod::Usage;
+
+ my $man = 0;
+ my $help = 0;
+ ## Parse options and print usage if there is a syntax error,
+ ## or if usage was explicitly requested.
+ GetOptions('help|?' => \$help, man => \$man) or pod2usage(2);
+ pod2usage(1) if $help;
+ pod2usage(-verbose => 2) if $man;
+
+ ## If no arguments were given, then allow STDIN to be used only
+ ## if it's not connected to a terminal (otherwise print usage)
+ pod2usage("$0: No files given.") if ((@ARGV == 0) && (-t STDIN));
+ __END__
+
+ =head1 NAME
+
+ sample - Using GetOpt::Long and Pod::Usage
+
+ =head1 SYNOPSIS
+
+ sample [options] [file ...]
+
+ Options:
+ -help brief help message
+ -man full documentation
+
+ =head1 OPTIONS
+
+ =over 8
+
+ =item B<-help>
+
+ Print a brief help message and exits.
+
+ =item B<-man>
+
+ Prints the manual page and exits.
+
+ =back
+
+ =head1 DESCRIPTION
+
+ B<This program> will read the given input file(s) and do something
+ useful with the contents thereof.
+
+ =cut
+
+=head1 CAVEATS
+
+By default, B<pod2usage()> will use C<$0> as the path to the pod input
+file. Unfortunately, not all systems on which Perl runs will set C<$0>
+properly (although if C<$0> isn't found, B<pod2usage()> will search
+C<$ENV{PATH}> or else the list specified by the C<-pathlist> option).
+If this is the case for your system, you may need to explicitly specify
+the path to the pod docs for the invoking script using something
+similar to the following:
+
+ pod2usage(-exitval => 2, -input => "/path/to/your/pod/docs");
+
+In the pathological case that a script is called via a relative path
+I<and> the script itself changes the current working directory
+(see L<perlfunc/chdir>) I<before> calling pod2usage, Pod::Usage will
+fail even on robust platforms. Don't do that.
+
+=head1 AUTHOR
+
+Please report bugs using L<http://rt.cpan.org>.
+
+Marek Rouchal E<lt>marekr@cpan.orgE<gt>
+
+Brad Appleton E<lt>bradapp@enteract.comE<gt>
+
+Based on code for B<Pod::Text::pod2text()> written by
+Tom Christiansen E<lt>tchrist@mox.perl.comE<gt>
+
+=head1 ACKNOWLEDGMENTS
+
+Steven McDougall E<lt>swmcd@world.std.comE<gt> for his help and patience
+with re-writing this manpage.
+
+=head1 SEE ALSO
+
+L<Pod::Parser>, L<Getopt::Long>, L<Pod::Find>
+
+=cut
+
+#############################################################################
+
+#use diagnostics;
+use Carp;
+use Config;
+use Exporter;
+use File::Spec;
+
+@EXPORT = qw(&pod2usage);
+BEGIN {
+ if ( $] >= 5.005_58 ) {
+ require Pod::Text;
+ @ISA = qw( Pod::Text );
+ }
+ else {
+ require Pod::PlainText;
+ @ISA = qw( Pod::PlainText );
+ }
+}
+
+require Pod::Select;
+
+##---------------------------------------------------------------------------
+
+##---------------------------------
+## Function definitions begin here
+##---------------------------------
+
+sub pod2usage {
+ local($_) = shift;
+ my %opts;
+ ## Collect arguments
+ if (@_ > 0) {
+ ## Too many arguments - assume that this is a hash and
+ ## the user forgot to pass a reference to it.
+ %opts = ($_, @_);
+ }
+ elsif (!defined $_) {
+ $_ = '';
+ }
+ elsif (ref $_) {
+ ## User passed a ref to a hash
+ %opts = %{$_} if (ref($_) eq 'HASH');
+ }
+ elsif (/^[-+]?\d+$/) {
+ ## User passed in the exit value to use
+ $opts{'-exitval'} = $_;
+ }
+ else {
+ ## User passed in a message to print before issuing usage.
+ $_ and $opts{'-message'} = $_;
+ }
+
+ ## Need this for backward compatibility since we formerly used
+ ## options that were all uppercase words rather than ones that
+ ## looked like Unix command-line options.
+ ## to be uppercase keywords)
+ %opts = map {
+ my ($key, $val) = ($_, $opts{$_});
+ $key =~ s/^(?=\w)/-/;
+ $key =~ /^-msg/i and $key = '-message';
+ $key =~ /^-exit/i and $key = '-exitval';
+ lc($key) => $val;
+ } (keys %opts);
+
+ ## Now determine default -exitval and -verbose values to use
+ if ((! defined $opts{'-exitval'}) && (! defined $opts{'-verbose'})) {
+ $opts{'-exitval'} = 2;
+ $opts{'-verbose'} = 0;
+ }
+ elsif (! defined $opts{'-exitval'}) {
+ $opts{'-exitval'} = ($opts{'-verbose'} > 0) ? 1 : 2;
+ }
+ elsif (! defined $opts{'-verbose'}) {
+ $opts{'-verbose'} = (lc($opts{'-exitval'}) eq 'noexit' ||
+ $opts{'-exitval'} < 2);
+ }
+
+ ## Default the output file
+ $opts{'-output'} = (lc($opts{'-exitval'}) eq 'noexit' ||
+ $opts{'-exitval'} < 2) ? \*STDOUT : \*STDERR
+ unless (defined $opts{'-output'});
+ ## Default the input file
+ $opts{'-input'} = $0 unless (defined $opts{'-input'});
+
+ ## Look up input file in path if it doesnt exist.
+ unless ((ref $opts{'-input'}) || (-e $opts{'-input'})) {
+ my $basename = $opts{'-input'};
+ my $pathsep = ($^O =~ /^(?:dos|os2|MSWin32)$/i) ? ';'
+ : (($^O eq 'MacOS' || $^O eq 'VMS') ? ',' : ':');
+ my $pathspec = $opts{'-pathlist'} || $ENV{PATH} || $ENV{PERL5LIB};
+
+ my @paths = (ref $pathspec) ? @$pathspec : split($pathsep, $pathspec);
+ for my $dirname (@paths) {
+ $_ = File::Spec->catfile($dirname, $basename) if length;
+ last if (-e $_) && ($opts{'-input'} = $_);
+ }
+ }
+
+ ## Now create a pod reader and constrain it to the desired sections.
+ my $parser = new Pod::Usage(USAGE_OPTIONS => \%opts);
+ if ($opts{'-verbose'} == 0) {
+ $parser->select('(?:SYNOPSIS|USAGE)\s*');
+ }
+ elsif ($opts{'-verbose'} == 1) {
+ my $opt_re = '(?i)' .
+ '(?:OPTIONS|ARGUMENTS)' .
+ '(?:\s*(?:AND|\/)\s*(?:OPTIONS|ARGUMENTS))?';
+ $parser->select( '(?:SYNOPSIS|USAGE)\s*', $opt_re, "DESCRIPTION/$opt_re" );
+ }
+ elsif ($opts{'-verbose'} >= 2 && $opts{'-verbose'} != 99) {
+ $parser->select('.*');
+ }
+ elsif ($opts{'-verbose'} == 99) {
+ my $sections = $opts{'-sections'};
+ $parser->select( (ref $sections) ? @$sections : $sections );
+ $opts{'-verbose'} = 1;
+ }
+
+ ## Now translate the pod document and then exit with the desired status
+ if ( !$opts{'-noperldoc'}
+ and $opts{'-verbose'} >= 2
+ and !ref($opts{'-input'})
+ and $opts{'-output'} == \*STDOUT )
+ {
+ ## spit out the entire PODs. Might as well invoke perldoc
+ my $progpath = File::Spec->catfile($Config{scriptdir}, 'perldoc');
+ print { $opts{'-output'} } ($opts{'-message'}, "\n") if($opts{'-message'});
+ if(defined $opts{-input} && $opts{-input} =~ /^\s*(\S.*?)\s*$/) {
+ # the perldocs back to 5.005 should all have -F
+ # without -F there are warnings in -T scripts
+ system($progpath, '-F', $1);
+ if($?) {
+ # RT16091: fall back to more if perldoc failed
+ system(($Config{pager} || $ENV{PAGER} || '/bin/more'), $1);
+ }
+ } else {
+ croak "Unspecified input file or insecure argument.\n";
+ }
+ }
+ else {
+ $parser->parse_from_file($opts{'-input'}, $opts{'-output'});
+ }
+
+ exit($opts{'-exitval'}) unless (lc($opts{'-exitval'}) eq 'noexit');
+}
+
+##---------------------------------------------------------------------------
+
+##-------------------------------
+## Method definitions begin here
+##-------------------------------
+
+sub new {
+ my $this = shift;
+ my $class = ref($this) || $this;
+ my %params = @_;
+ my $self = {%params};
+ bless $self, $class;
+ if ($self->can('initialize')) {
+ $self->initialize();
+ } else {
+ $self = $self->SUPER::new();
+ %$self = (%$self, %params);
+ }
+ return $self;
+}
+
+sub select {
+ my ($self, @sections) = @_;
+ if ($ISA[0]->can('select')) {
+ $self->SUPER::select(@sections);
+ } else {
+ # we're using Pod::Simple - need to mimic the behavior of Pod::Select
+ my $add = ($sections[0] eq '+') ? shift(@sections) : '';
+ ## Reset the set of sections to use
+ unless (@sections) {
+ delete $self->{USAGE_SELECT} unless ($add);
+ return;
+ }
+ $self->{USAGE_SELECT} = []
+ unless ($add && $self->{USAGE_SELECT});
+ my $sref = $self->{USAGE_SELECT};
+ ## Compile each spec
+ for my $spec (@sections) {
+ my $cs = Pod::Select::_compile_section_spec($spec);
+ if ( defined $cs ) {
+ ## Store them in our sections array
+ push(@$sref, $cs);
+ } else {
+ carp qq{Ignoring section spec "$spec"!\n};
+ }
+ }
+ }
+}
+
+# Override Pod::Text->seq_i to return just "arg", not "*arg*".
+sub seq_i { return $_[1] }
+
+# This overrides the Pod::Text method to do something very akin to what
+# Pod::Select did as well as the work done below by preprocess_paragraph.
+# Note that the below is very, very specific to Pod::Text.
+sub _handle_element_end {
+ my ($self, $element) = @_;
+ if ($element eq 'head1') {
+ $self->{USAGE_HEADINGS} = [ $$self{PENDING}[-1][1] ];
+ if ($self->{USAGE_OPTIONS}->{-verbose} < 2) {
+ $$self{PENDING}[-1][1] =~ s/^\s*SYNOPSIS\s*$/USAGE/;
+ }
+ } elsif ($element =~ /^head(\d+)$/ && $1) { # avoid 0
+ my $idx = $1 - 1;
+ $self->{USAGE_HEADINGS} = [] unless($self->{USAGE_HEADINGS});
+ $self->{USAGE_HEADINGS}->[$idx] = $$self{PENDING}[-1][1];
+ }
+ if ($element =~ /^head\d+$/) {
+ $$self{USAGE_SKIPPING} = 1;
+ if (!$$self{USAGE_SELECT} || !@{ $$self{USAGE_SELECT} }) {
+ $$self{USAGE_SKIPPING} = 0;
+ } else {
+ my @headings = @{$$self{USAGE_HEADINGS}};
+ for my $section_spec ( @{$$self{USAGE_SELECT}} ) {
+ my $match = 1;
+ for (my $i = 0; $i < $Pod::Select::MAX_HEADING_LEVEL; ++$i) {
+ $headings[$i] = '' unless defined $headings[$i];
+ my $regex = $section_spec->[$i];
+ my $negated = ($regex =~ s/^\!//);
+ $match &= ($negated ? ($headings[$i] !~ /${regex}/)
+ : ($headings[$i] =~ /${regex}/));
+ last unless ($match);
+ } # end heading levels
+ if ($match) {
+ $$self{USAGE_SKIPPING} = 0;
+ last;
+ }
+ } # end sections
+ }
+
+ # Try to do some lowercasing instead of all-caps in headings, and use
+ # a colon to end all headings.
+ if($self->{USAGE_OPTIONS}->{-verbose} < 2) {
+ local $_ = $$self{PENDING}[-1][1];
+ s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge;
+ s/\s*$/:/ unless (/:\s*$/);
+ $_ .= "\n";
+ $$self{PENDING}[-1][1] = $_;
+ }
+ }
+ if ($$self{USAGE_SKIPPING} && $element !~ m/^over-/) {
+ pop @{ $$self{PENDING} };
+ } else {
+ $self->SUPER::_handle_element_end($element);
+ }
+}
+
+# required for Pod::Simple API
+sub start_document {
+ my $self = shift;
+ $self->SUPER::start_document();
+ my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1;
+ my $out_fh = $self->output_fh();
+ print $out_fh "$msg\n";
+}
+
+# required for old Pod::Parser API
+sub begin_pod {
+ my $self = shift;
+ $self->SUPER::begin_pod(); ## Have to call superclass
+ my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1;
+ my $out_fh = $self->output_handle();
+ print $out_fh "$msg\n";
+}
+
+sub preprocess_paragraph {
+ my $self = shift;
+ local $_ = shift;
+ my $line = shift;
+ ## See if this is a heading and we arent printing the entire manpage.
+ if (($self->{USAGE_OPTIONS}->{-verbose} < 2) && /^=head/) {
+ ## Change the title of the SYNOPSIS section to USAGE
+ s/^=head1\s+SYNOPSIS\s*$/=head1 USAGE/;
+ ## Try to do some lowercasing instead of all-caps in headings
+ s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge;
+ ## Use a colon to end all headings
+ s/\s*$/:/ unless (/:\s*$/);
+ $_ .= "\n";
+ }
+ return $self->SUPER::preprocess_paragraph($_);
+}
+
+1; # keep require happy