This patch describes the changes made in ActivePerl build 820 over the official Perl v5.8.8 sources from CPAN. Summary of changes in build 8XX: * Make "perl -V" output reflect ActiveState build. * Add Win32::BuildNumber() for compatibility. * Add resources to perl.exe and perl58.dll. The ActivePerl Release Notes contain an informal summary of these changes. These can be viewed at: http://www.ActiveState.com/ActivePerl/docs/CHANGES.html The included patch may be applied to Perl v5.8.0 sources using the GNU patch utility. e.g: % cd perl-5.8.8 % patch -lNp1 < this_file --------------------------------------------------------------------------- diff -ruN perl-5.8.8/activeperl.c AP820_source/activeperl.c --- perl-5.8.8/activeperl.c 1969-12-31 16:00:00.000000000 -0800 +++ AP820_source/activeperl.c 2007-01-25 15:48:39.000000000 -0800 @@ -0,0 +1,90 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +static +XS(ActivePerl_PRODUCT) +{ + dXSARGS; + if (items != 0) + Perl_croak(aTHX_ "Usage: ActivePerl::PRODUCT()"); + XSRETURN_PV(ACTIVEPERL_PRODUCT); +} + +static +XS(ActivePerl_BUILD) +{ + dXSARGS; + if (items != 0) + Perl_croak(aTHX_ "Usage: ActivePerl::BUILD()"); + XSRETURN_PV(PRODUCT_BUILD_NUMBER); +} + +static +XS(ActivePerl_CHANGELIST) +{ + dXSARGS; + char *str = ACTIVEPERL_CHANGELIST; + if (items != 0) + Perl_croak(aTHX_ "Usage: ActivePerl::CHANGELIST()"); + + while (*str && !isDIGIT(*str)) + str++; + + if (isDIGIT(*str)) { + char *end = str + 1; + while (isDIGIT(*end)) + end++; + XSRETURN_PVN(str, end - str); + } + else { + XSRETURN_UNDEF; + } +} + +#ifdef CONFIG_HEAVY +static +XS(ActivePerl_CONFIG_HEAVY) +{ + dXSARGS; + if (items != 0) + Perl_croak(aTHX_ "Usage: ActivePerl::_CONFIG_HEAVY()"); + XSRETURN_PV(STRINGIFY(CONFIG_HEAVY)); +} +#endif + +void +Perl_boot_core_ActivePerl(pTHX) +{ + char *file = __FILE__; + SV *version_sv = get_sv("ActivePerl::VERSION", TRUE); +#if ACTIVEPERL_SUBVERSION > 0 + Perl_sv_setpvf(aTHX_ version_sv, "%d.%02d", ACTIVEPERL_VERSION, ACTIVEPERL_SUBVERSION); +#else + sv_setiv(version_sv, ACTIVEPERL_VERSION); +#endif + newXS("ActivePerl::PRODUCT", ActivePerl_PRODUCT, file); + newXS("ActivePerl::BUILD", ActivePerl_BUILD, file); + newXS("ActivePerl::CHANGELIST", ActivePerl_CHANGELIST, file); +#ifdef CONFIG_HEAVY + newXS("ActivePerl::_CONFIG_HEAVY", ActivePerl_CONFIG_HEAVY, file); +#endif +} + + +/* compatibility wrappers */ + +/* XXX Perl_new_vstring */ +/* XXX Perl_pad_allocmy */ + +EXTERN_C runops_proc_t* Perl_Grunops_dbg_ptr(pTHX) { return &PL_runops_dbg; } +EXTERN_C runops_proc_t* Perl_Grunops_std_ptr(pTHX) { return &PL_runops_std; } +EXTERN_C thrhook_proc_t* Perl_Gthreadhook_ptr(pTHX) { return &PL_threadhook; } +EXTERN_C share_proc_t* Perl_Gsharehook_ptr(pTHX) { return &PL_sharehook; } +EXTERN_C share_proc_t* Perl_Glockhook_ptr(pTHX) { return &PL_lockhook; } +EXTERN_C share_proc_t* Perl_Gunlockhook_ptr(pTHX) { return &PL_unlockhook; } + +EXTERN_C AV** Perl_Icomppad_ptr(pTHX) { return &PL_comppad; } +EXTERN_C const char** Perl_Ish_path_ptr(pTHX) { return &PL_sh_path; } +/* XXX Is this really the right thing to do? */ +EXTERN_C bool* Perl_Iwantutf8_ptr(pTHX) { return &PL_utf8locale; } diff -ruN perl-5.8.8/BuildInfo.h AP820_source/BuildInfo.h --- perl-5.8.8/BuildInfo.h 1969-12-31 16:00:00.000000000 -0800 +++ AP820_source/BuildInfo.h 2007-01-25 15:48:38.000000000 -0800 @@ -0,0 +1,38 @@ +/* BuildInfo.h + * + * Copyright (C) 1998-2006 ActiveState Corp. All rights reserved. + * + */ + +#ifndef ___BuildInfo__h___ +#define ___BuildInfo__h___ + +#define ACTIVEPERL_PRODUCT "ActivePerl" +#define ACTIVEPERL_VERSION 820 +#define ACTIVEPERL_SUBVERSION 0 +#define ACTIVEPERL_CHANGELIST "" + +#define PERL_VENDORLIB_NAME "ActiveState" + +#ifndef STRINGIFY +# include "config.h" +#endif + +/* Derived values and legacy */ +#if ACTIVEPERL_SUBVERSION > 0 +# define PRODUCT_BUILD_NUMBER STRINGIFY(ACTIVEPERL_VERSION) "." STRINGIFY(ACTIVEPERL_SUBVERSION) +#else +# define PRODUCT_BUILD_NUMBER STRINGIFY(ACTIVEPERL_VERSION) +#endif +#define PERLFILEVERSION "5,8,8," STRINGIFY(ACTIVEPERL_VERSION) "\0" +#define PERLRC_VERSION 5,8,8,ACTIVEPERL_VERSION +#define PERLPRODUCTVERSION "Build " PRODUCT_BUILD_NUMBER ACTIVEPERL_CHANGELIST "\0" +#define PERLPRODUCTNAME ACTIVEPERL_PRODUCT "\0" +#define ACTIVEPERL_LOCAL_PATCHES_ENTRY ACTIVEPERL_PRODUCT " Build " PRODUCT_BUILD_NUMBER ACTIVEPERL_CHANGELIST +#ifdef BUILT_BY_ACTIVESTATE +#define BINARY_BUILD_NOTICE PerlIO_printf(PerlIO_stdout(), "\n\ +Binary build " PRODUCT_BUILD_NUMBER ACTIVEPERL_CHANGELIST " provided by ActiveState http://www.ActiveState.com\n\ +Built " __DATE__ " " __TIME__ "\n"); +#endif + +#endif /* ___BuildInfo__h___ */ diff -ruN perl-5.8.8/cflags.SH AP820_source/cflags.SH --- perl-5.8.8/cflags.SH 2005-05-26 08:59:31.000000000 -0700 +++ AP820_source/cflags.SH 2007-01-25 15:48:39.000000000 -0800 @@ -86,6 +86,9 @@ ODBM_File) ;; POSIX) ;; SDBM_File) ;; + activeperl) + ccflags="$ccflags -DCONFIG_HEAVY=$config_heavy" + ;; av) ;; byterun) ;; deb) ;; diff -ruN perl-5.8.8/Changes AP820_source/Changes --- perl-5.8.8/Changes 2006-01-31 07:50:45.000000000 -0800 +++ AP820_source/Changes 2007-01-25 15:48:38.000000000 -0800 @@ -24,6 +24,494 @@ to the perl5-porters mailing list. You can retrieve the messages for example from http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/ +-------------------- +ActivePerl build 820 Additional core patches in ActivePerl build 820 +-------------------- +____________________________________________________________________________ +[ 29930] By: stevep on 2007/01/23 01:52:16 + Log: Subject: [perl #41318] Patch: win32.c typo in #define MULTIPLICITY + From: "Devin Heitmueller" (via RT) + Date: Mon, 22 Jan 2007 14:46:15 -0800 + Message-ID: + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 29868] By: steveh on 2007/01/18 11:36:05 + Log: Subject: Re: [PATCH] win32_async_check() can still loop indefinitely + From: Jan Dubois + Date: Mon, 15 Jan 2007 19:25:11 -0800 + Message-ID: + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 29732] By: steveh on 2007/01/09 10:40:23 + Log: Subject: Re: [PATCH] ANSIfy the PATH environment variable on Windows + From: Jan Dubois + Date: Mon, 08 Jan 2007 14:58:12 -0800 + Message-ID: + + Fixes the Borland build, in which the PATH was getting corrupted + when the variable that was just putenv()'d got free()'d + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 29690] By: rgs on 2007/01/05 07:49:03 + Log: Subject: [PATCH] ANSIfy the PATH environment variable on Windows + From: Jan Dubois + Date: Thu, 04 Jan 2007 12:37:48 -0800 + Message-ID: <7coqp2pme3r30qaonticuv6c6licieg4cg@4ax.com> + Branch: perl + ! win32/perllib.c win32/win32.c +____________________________________________________________________________ +[ 29689] By: rgs on 2007/01/05 07:47:08 + Log: Subject: [PATCH] Add error handling to win32_ansipath + From: Jan Dubois + Date: Thu, 04 Jan 2007 12:20:21 -0800 + Message-ID: + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 29676] By: stevep on 2007/01/03 18:23:32 + Log: Subject: [PATCH] Update change 29607 to affect only Win32 + From: Jan Dubois + Date: Wed, 03 Jan 2007 08:48:22 -0800 + Message-ID: + Branch: perl + ! lib/blib.pm +____________________________________________________________________________ +[ 29675] By: steveh on 2007/01/03 17:56:16 + Log: Subject: [PATCH] Use short pathnames in $^X and @INC if the long form cannot be represented in the current codepage + From: Jan Dubois + Date: Thu, 28 Dec 2006 18:59:40 -0800 + Message-ID: + + Subject: Re: [PATCH] Use short pathnames in $^X and @INC if the long form cannot be represented in the current codepage + From: Jan Dubois + Date: Wed, 03 Jan 2007 08:12:35 -0800 + Message-ID: + Branch: perl + ! makedef.pl win32/perlhost.h win32/perllib.c win32/vdir.h + ! win32/win32.c win32/win32iop.h +____________________________________________________________________________ +[ 29607] By: rgs on 2006/12/21 09:47:34 + Log: Subject: [PATCH] allow blib.pm to be used for testing Win32 module (again) + From: Jan Dubois + Date: Wed, 20 Dec 2006 18:53:51 -0800 + Message-ID: + Branch: perl + ! lib/blib.pm +____________________________________________________________________________ +[ 29605] By: stevep on 2006/12/21 05:12:28 + Log: Subject: [PATCH] Implement killpg() for MSWin32 + From: Jan Dubois + Date: Wed, 20 Dec 2006 15:41:00 -0800 + Message-ID: + Branch: perl + ! win32/config.bc win32/config.gc win32/config.vc + ! win32/config.vc64 win32/config_H.bc win32/config_H.gc + ! win32/config_H.vc win32/config_H.vc64 win32/perlhost.h + ! win32/win32.c win32/win32.h +____________________________________________________________________________ +[ 29598] By: stevep on 2006/12/20 04:14:06 + Log: Subject: [PATCH] Update cwd() to return the "short" pathname if the long one doesn't fit the codepage + From: Jan Dubois + Date: Mon, 18 Dec 2006 21:37:25 -0800 + Message-ID: <3rteo219or8hqr511e4vg1fnsgvgemb4sh@4ax.com> + Branch: perl + ! win32/perlhost.h win32/vdir.h +____________________________________________________________________________ +[ 29597] By: stevep on 2006/12/20 04:07:11 + Log: Subject: [PATCH] let readdir() return the alternate (short) filename if the long name is outside the current codepage + From: Jan Dubois + Date: Tue, 19 Dec 2006 13:49:40 -0800 + Message-ID: <8nmgo2dr5gtmv00gtfu07g7rdgitr859jk@4ax.com> + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 29590] By: rgs on 2006/12/19 09:49:30 + Log: Subject: [PATCH] Don't destroy the Unicode system environment on Perl startup + From: Jan Dubois + Date: Mon, 18 Dec 2006 16:34:33 -0800 + Message-ID: + Branch: perl + ! perl.c +____________________________________________________________________________ +[ 29528] By: rgs on 2006/12/12 10:20:04 + Log: Subject: [PATCH] get ext/Win32/Win32.xs to compile on cygwin + From: Jan Dubois + Date: Mon, 11 Dec 2006 13:09:09 -0800 + Message-ID: + + and: + Date: Mon, 11 Dec 2006 15:08:53 -0800 + Message-ID: + Branch: perl + ! ext/Win32/Win32.xs win32/win32.c +____________________________________________________________________________ +[ 29511] By: rgs on 2006/12/11 13:23:55 + Log: Subject: re: [PATCH] Move Win32::* functions from win32/win32.c to ext/Win32/Win32.xs + From: Jan Dubois + Date: Sun, 10 Dec 2006 11:47:58 -0800 + Message-ID: <9moon29qtn5c23t9fer229ealsu06bkf11@4ax.com> + Branch: perl + ! ext/Storable/Storable.xs ext/Win32/Win32.pm win32/win32.c +____________________________________________________________________________ +[ 29510] By: rgs on 2006/12/11 13:22:11 + Log: Second patch from: + Subject: [PATCH] Move Win32::* functions from win32/win32.c to ext/Win32/Win32.xs + From: Jan Dubois + Date: Fri, 08 Dec 2006 19:07:06 -0800 + Message-ID: + Branch: perl + ! ext/Win32/Win32.xs win32/win32.c +____________________________________________________________________________ +[ 29509] By: rgs on 2006/12/11 13:21:28 + Log: First patch from: + Subject: [PATCH] Move Win32::* functions from win32/win32.c to ext/Win32/Win32.xs + From: Jan Dubois + Date: Fri, 08 Dec 2006 19:07:06 -0800 + Message-ID: + Branch: perl + ! ext/SDBM_File/Makefile.PL lib/Cwd.pm lib/ExtUtils/MM.pm + ! lib/File/CheckTree.t lib/File/Copy.pm t/op/fork.t + ! win32/FindExt.pm win32/config_sh.PL + ! win32/ext/Win32API/File/t/file.t +____________________________________________________________________________ +[ 29483] By: steveh on 2006/12/07 09:12:45 + Log: Subject: [PATCH] Move Win32 from win32/ext/Win32 to ext/Win32 + From: Jan Dubois + Date: Wed, 06 Dec 2006 16:31:42 -0800 + Message-ID: <1unen2lsrq4pnnt06933h96pqj1d8luh3b@4ax.com> + Branch: perl + +> ext/Win32/Makefile.PL ext/Win32/Win32.pm ext/Win32/Win32.xs + - win32/ext/Win32/Makefile.PL win32/ext/Win32/Win32.pm + - win32/ext/Win32/Win32.xs + ! Configure MANIFEST +____________________________________________________________________________ +[ 29481] By: steveh on 2006/12/07 08:53:15 + Log: Subject: [PATCH] Makefile.PL changes to compiler Win32.xs using cygwin + From: Jan Dubois + Date: Wed, 06 Dec 2006 16:26:38 -0800 + Message-ID: <5nnen2p2h4lhremj0qf1tmpkl0asvk87hr@4ax.com> + Branch: perl + ! win32/ext/Win32/Makefile.PL +____________________________________________________________________________ +[ 28671] By: steveh on 2006/08/07 16:58:16 + Log: Subject: Define PERL_NO_DEV_RANDOM on Windows + From: "Davies, Alex" + Date: Thu, 3 Aug 2006 13:31:14 -0400 + Message-ID: + + This stops perl from trying to read C:\dev\urandom on Windows + Branch: perl + ! dosish.h +____________________________________________________________________________ +[ 28376] By: rgs on 2006/06/09 16:15:08 + Log: Subject: [PATCH] Add error checks after execing PL_cshname or PL_sh_path + From: "Jan Dubois" + Date: Wed, 7 Jun 2006 15:53:02 -0700 + Message-ID: <002301c68a85$21aa7320$d045a8c0@candy> + Branch: perl + ! doio.c embed.fnc embed.h proto.h +____________________________________________________________________________ +[ 28305] By: gisle on 2006/05/25 07:09:15 + Log: Subject: Pod::Html should not convert "foo" in `foo'' + From: Gisle Aas + Date: 24 May 2006 14:09:49 -0700 + Message-ID: + Branch: perl + ! lib/Pod/Html.pm +____________________________________________________________________________ +[ 27847] By: stevep on 2006/04/16 13:52:47 + Log: Subject: [PATCH] testcase for change #27832 + From: "Jan Dubois" + Date: Sun, 16 Apr 2006 00:57:00 -0700 + Message-ID: <022a01c6612b$575cb7e0$2217a8c0@candy> + Branch: perl + ! lib/Pod/Html.pm lib/Pod/t/htmllink.pod +____________________________________________________________________________ +[ 27833] By: stevep on 2006/04/16 04:59:19 + Log: Subject: [PATCH] Change anchor generation in Pod::Html for "=item item 2" + From: "Jan Dubois" + Date: Fri, 14 Apr 2006 13:13:20 -0700 + Message-ID: <017a01c65fff$dfd0f370$2217a8c0@candy> + Branch: perl + ! lib/Pod/Html.pm lib/Pod/t/htmllink.t +____________________________________________________________________________ +[ 27832] By: stevep on 2006/04/16 04:50:15 + Log: Subject: [PATCH] Pod::Html::depod() doesn't work correctly for multi-line strings + From: "Jan Dubois" + Date: Mon, 10 Apr 2006 15:32:23 -0700 + Message-ID: <017b01c65cee$a2f5fe00$6062a8c0@candy> + Branch: perl + ! lib/Pod/Html.pm +____________________________________________________________________________ +[ 27736] By: gisle on 2006/04/07 16:08:26 + Log: Make perl_fini() run when compiling perl with + the Sun WorkShop compiler. + Branch: perl + ! perl.c +____________________________________________________________________________ +[ 27719] By: stevep on 2006/04/05 11:49:23 + Log: Document the functions htmlify() and anchorify() in Pod::Html. + Branch: perl + ! lib/Pod/Html.pm +____________________________________________________________________________ +[ 27634] By: gisle on 2006/03/30 12:31:26 + Log: Populate pre-canned config.sh files with + d_archlib and d_inc_version_list. + Ref change 27632. + Branch: perl + ! configure.com wince/config.ce win32/config.bc + ! win32/config.gc win32/config.vc win32/config.vc64 +____________________________________________________________________________ +[ 27632] By: gisle on 2006/03/30 12:13:54 + Log: Introduce d_sitearch and d_inc_version_list config.sh variables. + These allow me to set sitearch and sitelib to be the same without + ending up with duplicate entries in @INC. + + Basically the same way the old d_archlib variable is used. + Branch: perl + ! Configure Porting/Glossary config_h.SH perl.c +____________________________________________________________________________ +[ 27619] By: steveh on 2006/03/28 10:38:52 + Log: Subject: [PATCH lib/Term/ReadLine] Re: [cpan #17773] Bug in Term::ReadKey being trigger by a bug in Term::ReadLine + From: Jonathan Stowe + Date: Mon, 13 Mar 2006 16:09:44 +0000 + Message-Id: <1142266184.5811.141.camel@orpheus.gellyfish.com> + Branch: perl + ! lib/Term/ReadLine.pm +____________________________________________________________________________ +[ 27549] By: gisle on 2006/03/20 10:21:50 + Log: Move DynaLoader.o into libperl.so. + + This avoids the need to statically link DynaLoader into the stub perl + executable and make libperl.so provide all the code needed to get a + functional embedded perl interpreter up running. As a side effect + this also moves DynaLoader into libperl.a for non-useshrplib builds. + + Fixes [perl #32539] + Branch: perl + ! Makefile.SH ext/DynaLoader/Makefile.PL ext/util/make_ext + ! writemain.SH +____________________________________________________________________________ +[ 27519] By: gisle on 2006/03/16 20:32:27 + Log: Fix up miniperl dependency. + Depend on $(obj) when we use that to build miniperl. + Branch: perl + ! Makefile.SH +____________________________________________________________________________ +[ 27518] By: gisle on 2006/03/16 20:24:08 + Log: Simplify; make perl.o included in $(obj) + Branch: perl + ! Makefile.SH +____________________________________________________________________________ +[ 27528] By: stevep on 2006/03/17 04:29:30 + Log: Subject: [PATCH] win32_pclose() error exit doesn't unlock mutex + From: Jan Dubois + Date: Thu, 16 Mar 2006 16:30:23 -0800 + Message-ID: <02c701c64959$fac63ad0$6062a8c0@candy> + Branch: perl + ! win32/win32.c wince/wince.c +____________________________________________________________________________ +[ 27527] By: stevep on 2006/03/17 04:19:01 + Log: Subject: [PATCH] win32_async_check() can loop indefinitely; 5.8.8 regression + From: Jan Dubois + Date: Thu, 16 Mar 2006 16:11:48 -0800 + Message-ID: <02ab01c64957$62142e70$6062a8c0@candy> + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 27515] By: gisle on 2006/03/16 12:01:10 + Log: require should ignore directories found when searching @INC not just + die as soon as it finds one. It should for instance be possible to + for require "File" to read the file "./File" even if there happens to + be a "File" directory in perl's standard library. + + This fixes the RT #24404 fix in change 26373. + Branch: perl + ! pp_ctl.c t/comp/require.t +____________________________________________________________________________ +[ 27359] By: rgs on 2006/03/01 22:39:24 + Log: Don't put strings with embedded NULs in the environment. + This makes things like -d:Foo=bar work again. + Branch: perl + ! perl.c +____________________________________________________________________________ +[ 27210] By: gisle on 2006/02/17 20:54:46 + Log: Fix quote typo. + + Subject: [PATCH] 5.8.8: Debian patches + From: "Brendan O'Dea" + Date: Sat, 11 Feb 2006 00:37:15 +1100 + Message-ID: <20060210133715.GA6826@londo.c47.org> + Branch: perl + ! utils/c2ph.PL +____________________________________________________________________________ +[ 27203] By: rgs on 2006/02/16 14:15:53 + Log: Subject: Problem compiling swigged c++ code with 5.8.8 + From: Merijn Broeren + Date: Wed, 15 Feb 2006 13:51:49 +0100 + Message-ID: <20060215125148.GA12535@brugman.iloquent.nl> + Branch: perl + ! XSUB.h perl.h +____________________________________________________________________________ +[ 27200] By: rgs on 2006/02/16 11:46:51 + Log: Subject: [PATCH] stat() on Windows doesn't handle trailing slashes/backslashes correctly + From: "Jan Dubois" + Date: Wed, 15 Feb 2006 17:19:29 -0800 + Message-ID: <017901c63297$08e1e3f0$2217a8c0@candy> + Branch: perl + ! win32/win32.c +____________________________________________________________________________ +[ 27194] By: gisle on 2006/02/15 15:25:36 + Log: Get perl_fini() running on HP-UX again. + It was effectively disabled by change 24667 since + __ux_version is only available under DCE threads + which isn't used when perl is built on HP-UX 11 + and later. + Branch: perl + ! perl.c +____________________________________________________________________________ +[ 27133] By: nicholas on 2006/02/08 20:57:24 + Log: lastparen in the regexp structure is never initialised, and so will + still be uninitialised after a failed match, yet various points in + mg.c read it come what may. Should fix bug 38461. + Branch: perl + ! regcomp.c +____________________________________________________________________________ +[ 27061] By: rgs on 2006/02/03 13:35:44 + Log: Subject: L and Pod::Html + From: SADAHIRO Tomoyuki + Date: Mon, 09 Jan 2006 12:53:15 +0900 + Message-Id: <20060109125220.3BB0.BQW10602@nifty.com> + Branch: perl + ! lib/Pod/Html.pm +____________________________________________________________________________ +[ 27034] By: rgs on 2006/02/01 15:51:35 + Log: Avoid "Prototype mismatch" warnings with autouse. + Branch: perl + ! lib/autouse.pm +____________________________________________________________________________ +[ 26970] By: gisle on 2006/01/27 19:48:28 + Log: Subject: Re: Make Passive mode the default for Net::FTP + From: Gisle Aas + Date: 27 Jan 2006 07:21:16 -0800 + Message-ID: + Branch: perl + ! lib/Net/Config.pm lib/Net/FTP.pm +____________________________________________________________________________ +[ 26921] By: gisle on 2006/01/23 09:57:10 + Log: Subject: Avoid most getprotobyname/number calls in IO::Socket::INET + From: Gisle Aas + Date: 18 Jan 2006 09:28:24 -0800 + Message-ID: + Branch: perl + ! ext/IO/lib/IO/Socket/INET.pm +____________________________________________________________________________ +[ 26903] By: gisle on 2006/01/18 14:43:14 + Log: Allow IPPROTO_ICMP and IPPROTO_UDP to be exported. + These were introduced in change 26897. + Branch: perl + ! ext/Socket/Socket.pm +____________________________________________________________________________ +[ 26902] By: gisle on 2006/01/18 14:41:17 + Log: Use the IPPROTO_TCP constant instead of 6. + Branch: perl + ! ext/Socket/t/Socket.t +____________________________________________________________________________ +[ 26897] By: gisle on 2006/01/18 11:57:07 + Log: Make sure the most common IPPROTO_* constants are always available. + These are well known numbers so it should not be a problem to + hardcode values when no constant is provided by the C library. + Ref . + + On some old glibc systems (eg Redhat 6) IPPROTO_TCP is an enum only + and this change workaround that problem as well. + Branch: perl + ! ext/Socket/Makefile.PL +____________________________________________________________________________ +[ 26893] By: gisle on 2006/01/18 10:12:14 + Log: Suppress "statement not reached" warning from the Sun C compiler. + Branch: perl + ! doio.c +____________________________________________________________________________ +[ 26673] By: gisle on 2006/01/06 14:00:14 + Log: Remove code duplicated a few lines above by change 19695. + Branch: perl + ! toke.c +____________________________________________________________________________ +[ 26670] By: gisle on 2006/01/06 10:54:18 + Log: Make '-s' on the shebang line able to parse -foo=bar switches again. + This feature was broken by change 19695 some years ago + and integrated into perl-5.8.1. perl-5.8.0 was fine. + Ref http://bugs.activestate.com/show_bug.cgi?id=43483 + Branch: perl + ! perl.c t/run/switches.t +____________________________________________________________________________ +[ 26637] By: steveh on 2006/01/04 11:10:36 + Log: Make Borland and MinGW happy with change 26379 + + (They both complain "invalid conversion from `void*' to `HWND__*'" + otherwise) + Branch: perl + ! win32/perlhost.h +____________________________________________________________________________ +[ 26536] By: rgs on 2005/12/30 12:25:24 + Log: Subject: Re: [PATCH] Re: INSTALLSCRIPT versus INSTALLDIRS + From: Rafael Garcia-Suarez + Date: Mon, 12 Dec 2005 19:22:32 +0100 + Message-ID: <20051212192232.39cd0c1e@grubert.mandrakesoft.com> + Branch: perl + ! lib/ExtUtils/MM_Any.pm lib/ExtUtils/MM_Unix.pm + ! lib/ExtUtils/MakeMaker.pm +____________________________________________________________________________ +[ 26379] By: rgs on 2005/12/16 21:13:37 + Log: Subject: [PATCH] RE: PeekMessage() call in win32\win32.c win32_async_check + From: Jan Dubois + Date: Dec 16, 2005 7:12 AM + Message-ID: <015901c60207$abd64210$d563a8c0@candy> + + (Without the proposed alarm.t test) + Branch: perl + ! t/op/fork.t win32/perlhost.h win32/win32.c win32/win32.h +____________________________________________________________________________ +[ 26087] By: stevep on 2005/11/11 16:17:03 + Log: Subject: [PATCH] Storable 0.1 compatibility + From: Gisle Aas + Date: 11 Nov 2005 05:42:29 -0800 + Message-ID: + Branch: perl + ! MANIFEST ext/Storable/MANIFEST ext/Storable/Storable.xs + + ext/Storable/t/compat01.t#1 add +____________________________________________________________________________ +[ 25861] By: stevep on 2005/10/27 11:13:50 + Log: Subject: Re: IO::File performace issue + From: gisle@ActiveState.com (Gisle Aas) + Date: 27 Oct 2005 01:00:39 -0700 + Message-ID: + + Also includes a version bump for IO::File. + Branch: perl + ! ext/IO/lib/IO/File.pm +____________________________________________________________________________ +[ 25084] By: davem on 2005/07/05 18:17:34 + Log: a long /etc/groups entry could cause memory exhaustion. + Too small a buffer would cause ERANGE and a retry with double the + buffer size. later at EOF, the apparent error got 'stuck' as + ERANGE rather than ENOENT, so the buffer size doubled recursively + Branch: perl + ! reentr.h reentr.pl +____________________________________________________________________________ +[ 24699] By: rgs on 2005/06/03 21:07:03 + Log: Subject: Re: [PATCH] Improved ICMP_UNREACHABLE handling in Net::Ping + From: Gisle Aas + Date: 03 Jun 2005 09:17:44 -0700 + Message-ID: + Branch: perl + ! lib/Net/Ping.pm +____________________________________________________________________________ + -------------- Version v5.8.8 Maintenance release working toward v5.8.8 -------------- diff -ruN perl-5.8.8/config_h.SH AP820_source/config_h.SH --- perl-5.8.8/config_h.SH 2005-10-31 10:13:05.000000000 -0800 +++ AP820_source/config_h.SH 2007-01-25 15:48:39.000000000 -0800 @@ -2319,7 +2319,9 @@ * This symbol, if defined, indicates that sitecustomize should * be used. */ +#ifndef USE_SITECUSTOMIZE #$usesitecustomize USE_SITECUSTOMIZE /**/ +#endif /* HAS_SOCKET: * This symbol, if defined, indicates that the BSD socket interface is @@ -3028,7 +3030,7 @@ * for a C initialization string. See the inc_version_list entry * in Porting/Glossary for more details. */ -#define PERL_INC_VERSION_LIST $inc_version_list_init /**/ +#$d_inc_version_list PERL_INC_VERSION_LIST $inc_version_list_init /**/ /* INSTALL_USR_BIN_PERL: * This symbol, if defined, indicates that Perl is to be installed @@ -3472,8 +3474,8 @@ * 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 "$sitearch" /**/ -#define SITEARCH_EXP "$sitearchexp" /**/ +#$d_sitearch SITEARCH "$sitearch" /**/ +#$d_sitearch SITEARCH_EXP "$sitearchexp" /**/ /* SITELIB: * This symbol contains the name of the private library for this package. diff -ruN perl-5.8.8/configpm AP820_source/configpm --- perl-5.8.8/configpm 2005-09-14 01:34:34.000000000 -0700 +++ AP820_source/configpm 2007-01-25 15:48:39.000000000 -0800 @@ -7,9 +7,9 @@ # commonly used names to precache (and hence lookup fastest) my %Common; -while ($how_many_common--) { - $_ = ; - chomp; +while () { + next if /^\s*#/; + last unless $how_many_common--; /^(\S+):\s*(\d+)$/ or die "Malformed line '$_'"; $Common{$1} = $1; } @@ -80,6 +80,14 @@ use strict; # use warnings; Pulls in Carp # use vars pulls in Carp +BEGIN { + unless ($ENV{ACTIVEPERL_CONFIG_DISABLE}) { + eval { + require ActivePerl::Config; + }; + die $@ if $@ && $@ !~ /^Can't locate ActivePerl\/Config\.pm/; + } +} ENDOFBEG my $myver = sprintf "v%vd", $^V; @@ -201,6 +209,16 @@ # Search for it in the big string sub fetch_string { my($self, $key) = @_; + # Let ActivePerl::Config override if it wants + my $value; + $value = _fetch_string(@_) + unless defined(&ActivePerl::Config::override) && + ActivePerl::Config::override($key, $value); + return $self->{$key} = $value; # cache it +} + +sub _fetch_string { + my($self, $key) = @_; EOT @@ -259,7 +277,7 @@ $fetch_string .= <<'EOT'; # So we can say "if $Config{'foo'}". $value = undef if $value eq 'undef'; - $self->{$key} = $value; # cache it + return $value; } EOT @@ -525,16 +543,26 @@ # Sanity check needed to stop an infite loop if Config_heavy.pl fails to define # &launcher for some reason (eg it got truncated) -print CONFIG sprintf <<'ENDOFTIE', $fast_config; +$Config_heavy =~ s,.*[/\\],,; # basename +print CONFIG sprintf <<'ENDOFTIE', $Config_heavy, $Config_heavy, $fast_config; sub DESTROY { } sub AUTOLOAD { - require 'Config_heavy.pl'; + my $config_heavy = '%s'; + if (defined &ActivePerl::_CONFIG_HEAVY) { + $config_heavy = ActivePerl::_CONFIG_HEAVY(); + } + require $config_heavy; goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/; die "&Config::AUTOLOAD failed on $Config::AUTOLOAD"; } +sub __unused { + # XXX Keep PerlApp happy + require '%s'; +} + # tie returns the object, so the value returned to require will be true. tie %%Config, 'Config', { %s}; @@ -803,7 +831,7 @@ sitelibexp: 4305 privlibexp: 4163 ldlibpthname: 4041 -libpth: 2134 +#libpth: 2134 archname: 1591 exe_ext: 1256 scriptdir: 1155 @@ -816,15 +844,15 @@ intsize: 759 usevendorprefix: 642 dlsrc: 624 -cc: 541 -lib_ext: 520 +#cc: 541 +#lib_ext: 520 so: 512 -ld: 501 -ccdlflags: 500 -ldflags: 495 +#ld: 501 +#ccdlflags: 500 +#ldflags: 495 obj_ext: 495 -cccdlflags: 493 -lddlflags: 493 +#cccdlflags: 493 +#lddlflags: 493 ar: 492 dlext: 492 libc: 492 @@ -859,11 +887,11 @@ siteprefixexp: 336 installbin: 335 usedl: 332 -ccflags: 285 +#ccflags: 285 startperl: 232 optimize: 231 usemymalloc: 229 -cpprun: 228 +#cpprun: 228 sharpbang: 228 perllibs: 225 usesfio: 224 @@ -872,7 +900,7 @@ extensions: 217 usesocks: 208 shellflags: 198 -make: 191 +#make: 191 d_pwage: 189 d_pwchange: 189 d_pwclass: 189 @@ -881,10 +909,10 @@ d_pwgecos: 189 d_pwpasswd: 189 d_pwquota: 189 -gccversion: 189 +#gccversion: 189 libs: 186 useshrplib: 186 -cppflags: 185 +#cppflags: 185 ptrsize: 185 shrpenv: 185 static_ext: 185 @@ -892,6 +920,6 @@ uselargefiles: 185 alignbytes: 184 byteorder: 184 -ccversion: 184 +#ccversion: 184 config_args: 184 -cppminus: 184 +#cppminus: 184 diff -ruN perl-5.8.8/Configure AP820_source/Configure --- perl-5.8.8/Configure 2006-01-08 06:51:03.000000000 -0800 +++ AP820_source/Configure 2007-01-25 15:48:39.000000000 -0800 @@ -195,6 +195,7 @@ to='' usecrosscompile='' mistrustnm='' +config_heavy='' perllibs='' dynamic_ext='' extensions='' @@ -917,6 +918,7 @@ i_vfork='' inc_version_list='' inc_version_list_init='' +d_inc_version_list='' installprefix='' installprefixexp='' installstyle='' @@ -1093,6 +1095,7 @@ installsitearch='' sitearch='' sitearchexp='' +d_sitearch='' installsitebin='' sitebin='' sitebinexp='' @@ -3512,6 +3515,11 @@ esac EOSC +: default Config_heavy.pl +case "$config_heavy" in +'') config_heavy=Config_heavy.pl;; +esac + : function used to set $1 to $val setvar='var=$1; eval "was=\$$1"; td=$define; tu=$undef; case "$val$was" in @@ -6523,6 +6531,11 @@ else installsitearch="$sitearchexp" fi +if $test X"$sitearch" = X"$sitelib"; then + d_sitearch="$undef" +else + d_sitearch="$define" +fi $cat </dev/null 2>&1 && +elif $ar s bar$_a >/dev/null 2>&1 && $cc -o foobar $ccflags $ldflags foo$_o bar$_a $libs > /dev/null 2>&1 && $run ./foobar >/dev/null 2>&1; then - echo "a table of contents needs to be added with '$ar ts'." + echo "a table of contents needs to be added with '$ar s'." orderlib=false - ranlib="$ar ts" + ranlib="$ar s" else case "$ranlib" in :) ranlib='';; @@ -20622,6 +20638,11 @@ esac esac ;; + Win32) + case "$osname" in + cygwin) avail_ext="$avail_ext $xxx" ;; + esac + ;; XS/APItest|xs/apitest) # This is just for testing. Skip it unless we have dynamic loading. @@ -21017,6 +21038,7 @@ clocktype='$clocktype' comm='$comm' compress='$compress' +config_heavy='$config_heavy' contains='$contains' cp='$cp' cpio='$cpio' @@ -21209,6 +21231,7 @@ d_hasmntopt='$d_hasmntopt' d_htonl='$d_htonl' d_ilogbl='$d_ilogbl' +d_inc_version_list="$d_inc_version_list" d_index='$d_index' d_inetaton='$d_inetaton' d_int64_t='$d_int64_t' @@ -21363,6 +21386,7 @@ d_sigaction='$d_sigaction' d_sigprocmask='$d_sigprocmask' d_sigsetjmp='$d_sigsetjmp' +d_sitearch='$d_sitearch' d_sockatmark='$d_sockatmark' d_sockatmarkproto='$d_sockatmarkproto' d_socket='$d_socket' @@ -21756,7 +21780,7 @@ passcat='$passcat' patchlevel='$patchlevel' path_sep='$path_sep' -perl5='$perl5' +perl5='$installprefix/bin/perl' perl='$perl' perl_patchlevel='$perl_patchlevel' perladmin='$perladmin' diff -ruN perl-5.8.8/configure.com AP820_source/configure.com --- perl-5.8.8/configure.com 2006-01-08 14:27:45.000000000 -0800 +++ AP820_source/configure.com 2007-01-25 15:48:39.000000000 -0800 @@ -5765,6 +5765,7 @@ $ WC "d_hasmntopt='undef'" $ WC "d_htonl='" + d_htonl + "'" $ WC "d_ilogbl='undef'" +$ WC "d_inc_version_list='undef'" $ WC "d_index='" + d_index + "'" $ WC "d_inetaton='undef'" $ WC "d_int64_t='" + d_int64_t + "'" @@ -5903,6 +5904,7 @@ $ WC "d_sigaction='" + d_sigaction + "'" $ WC "d_sigprocmask='" + d_sigprocmask + "'" $ WC "d_sigsetjmp='" + d_sigsetjmp + "'" +$ WC "d_sitearch='define'" $ WC "d_sockatmark='undef'" $ WC "d_sockatmarkproto='undef'" $ WC "d_socket='" + d_socket + "'" diff -ruN perl-5.8.8/doio.c AP820_source/doio.c --- perl-5.8.8/doio.c 2006-01-11 08:55:50.000000000 -0800 +++ AP820_source/doio.c 2007-01-25 15:48:39.000000000 -0800 @@ -1456,6 +1456,19 @@ } #endif +static void +S_exec_failed(pTHX_ const char *cmd, int fd, int do_report) +{ + const int e = errno; + if (ckWARN(WARN_EXEC)) + Perl_warner(aTHX_ packWARN(WARN_EXEC), "Can't exec \"%s\": %s", + cmd, Strerror(e)); + if (do_report) { + PerlLIO_write(fd, (void*)&e, sizeof(int)); + PerlLIO_close(fd); + } +} + bool Perl_do_aexec5(pTHX_ SV *really, register SV **mark, register SV **sp, int fd, int do_report) @@ -1487,15 +1500,7 @@ else PerlProc_execvp(PL_Argv[0],EXEC_ARGV_CAST(PL_Argv)); PERL_FPU_POST_EXEC - if (ckWARN(WARN_EXEC)) - Perl_warner(aTHX_ packWARN(WARN_EXEC), "Can't exec \"%s\": %s", - (really ? tmps : PL_Argv[0]), Strerror(errno)); - if (do_report) { - int e = errno; - - PerlLIO_write(fd, (void*)&e, sizeof(int)); - PerlLIO_close(fd); - } + S_exec_failed(aTHX_ (really ? tmps : PL_Argv[0]), fd, do_report); } do_execfree(); #endif @@ -1564,6 +1569,7 @@ PerlProc_execl(PL_cshname,"csh", flags, ncmd, (char*)0); PERL_FPU_POST_EXEC *s = '\''; + S_exec_failed(aTHX_ PL_cshname, fd, do_report); return FALSE; } } @@ -1608,6 +1614,7 @@ PERL_FPU_PRE_EXEC PerlProc_execl(PL_sh_path, "sh", "-c", cmd, (char*)0); PERL_FPU_POST_EXEC + S_exec_failed(aTHX_ PL_sh_path, fd, do_report); return FALSE; } } @@ -1632,16 +1639,7 @@ do_execfree(); goto doshell; } - { - if (ckWARN(WARN_EXEC)) - Perl_warner(aTHX_ packWARN(WARN_EXEC), "Can't exec \"%s\": %s", - PL_Argv[0], Strerror(errno)); - if (do_report) { - int e = errno; - PerlLIO_write(fd, (void*)&e, sizeof(int)); - PerlLIO_close(fd); - } - } + S_exec_failed(aTHX_ PL_Argv[0], fd, do_report); } do_execfree(); return FALSE; @@ -1989,9 +1987,10 @@ Safefree(gary); return rc; } -#endif +#else return FALSE; #endif +#endif } #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) diff -ruN perl-5.8.8/dosish.h AP820_source/dosish.h --- perl-5.8.8/dosish.h 2004-02-17 14:37:46.000000000 -0800 +++ AP820_source/dosish.h 2007-01-25 15:48:39.000000000 -0800 @@ -192,3 +192,6 @@ #define WUNTRACED 0 #endif + +/* Don't go reading from /dev/urandom */ +#define PERL_NO_DEV_RANDOM diff -ruN perl-5.8.8/embed.fnc AP820_source/embed.fnc --- perl-5.8.8/embed.fnc 2006-01-31 06:40:27.000000000 -0800 +++ AP820_source/embed.fnc 2007-01-25 15:48:39.000000000 -0800 @@ -125,6 +125,7 @@ ApR |I32 |block_gimme pR |int |block_start |int full p |void |boot_core_UNIVERSAL +p |void |boot_core_ActivePerl p |void |boot_core_PerlIO Ap |void |call_list |I32 oldscope|NN AV* av_list pR |bool |cando |Mode_t mode|Uid_t effective|NN Stat_t* statbufp diff -ruN perl-5.8.8/embed.h AP820_source/embed.h --- perl-5.8.8/embed.h 2006-01-31 07:50:34.000000000 -0800 +++ AP820_source/embed.h 2007-01-25 15:48:39.000000000 -0800 @@ -86,6 +86,7 @@ #ifdef PERL_CORE #define block_start Perl_block_start #define boot_core_UNIVERSAL Perl_boot_core_UNIVERSAL +#define boot_core_ActivePerl Perl_boot_core_ActivePerl #define boot_core_PerlIO Perl_boot_core_PerlIO #endif #define call_list Perl_call_list @@ -2160,6 +2161,7 @@ #ifdef PERL_CORE #define block_start(a) Perl_block_start(aTHX_ a) #define boot_core_UNIVERSAL() Perl_boot_core_UNIVERSAL(aTHX) +#define boot_core_ActivePerl() Perl_boot_core_ActivePerl(aTHX) #define boot_core_PerlIO() Perl_boot_core_PerlIO(aTHX) #endif #define call_list(a,b) Perl_call_list(aTHX_ a,b) diff -ruN perl-5.8.8/ext/B/t/stash.t AP820_source/ext/B/t/stash.t --- perl-5.8.8/ext/B/t/stash.t 2005-04-08 11:25:25.000000000 -0700 +++ AP820_source/ext/B/t/stash.t 2007-01-25 15:48:40.000000000 -0800 @@ -58,6 +58,7 @@ print "# (after perlio censorings)\n"; print "# got = @got\n"; +@got = grep { ! /^ActivePerl$/ } @got if defined &ActivePerl::BUILD; @got = grep { ! /^Win32$/ } @got if $^O eq 'MSWin32'; @got = grep { ! /^NetWare$/ } @got if $^O eq 'NetWare'; @got = grep { ! /^(Cwd|File|File::Copy|OS2)$/ } @got if $^O eq 'os2'; diff -ruN perl-5.8.8/ext/DynaLoader/Makefile.PL AP820_source/ext/DynaLoader/Makefile.PL --- perl-5.8.8/ext/DynaLoader/Makefile.PL 2000-02-29 16:46:44.000000000 -0800 +++ AP820_source/ext/DynaLoader/Makefile.PL 2007-01-25 15:48:40.000000000 -0800 @@ -32,3 +32,10 @@ '; } +sub MY::static { + ' +static :: $(FIRST_MAKEFILE) $(OBJECT) + $(RM_RF) $(PERL_SRC)/$(OBJECT) + $(CP) $(OBJECT) $(PERL_SRC)/$(OBJECT) +'; +} diff -ruN perl-5.8.8/ext/IO/lib/IO/File.pm AP820_source/ext/IO/lib/IO/File.pm --- perl-5.8.8/ext/IO/lib/IO/File.pm 2005-09-06 02:11:32.000000000 -0700 +++ AP820_source/ext/IO/lib/IO/File.pm 2007-01-25 15:48:41.000000000 -0800 @@ -137,7 +137,7 @@ @ISA = qw(IO::Handle IO::Seekable Exporter); -$VERSION = "1.13"; +$VERSION = "1.13_01"; @EXPORT = @IO::Seekable::EXPORT; @@ -181,13 +181,9 @@ } elsif ($mode =~ /:/) { return open($fh, $mode, $file) if @_ == 3; croak 'usage: $fh->open(FILENAME, IOLAYERS)'; - } - if (defined($file) && length($file) - && ! File::Spec->file_name_is_absolute($file)) - { - $file = File::Spec->rel2abs($file); - } - $file = IO::Handle::_open_mode_string($mode) . " $file\0"; + } else { + return open($fh, IO::Handle::_open_mode_string($mode), $file); + } } open($fh, $file); } diff -ruN perl-5.8.8/ext/IO/lib/IO/Socket/INET.pm AP820_source/ext/IO/lib/IO/Socket/INET.pm --- perl-5.8.8/ext/IO/lib/IO/Socket/INET.pm 2005-09-06 02:11:32.000000000 -0700 +++ AP820_source/ext/IO/lib/IO/Socket/INET.pm 2007-01-25 15:48:42.000000000 -0800 @@ -25,6 +25,11 @@ udp => SOCK_DGRAM, icmp => SOCK_RAW ); +my %proto_number; +$proto_number{tcp} = Socket::IPPROTO_TCP() if defined &Socket::IPPROTO_TCP; +$proto_number{upd} = Socket::IPPROTO_UDP() if defined &Socket::IPPROTO_UDP; +$proto_number{icmp} = Socket::IPPROTO_ICMP() if defined &Socket::IPPROTO_ICMP; +my %proto_name = reverse %proto_number; sub new { my $class = shift; @@ -32,30 +37,60 @@ return $class->SUPER::new(@_); } +sub _cache_proto { + my @proto = @_; + for (map lc($_), $proto[0], split(' ', $proto[1])) { + $proto_number{$_} = $proto[2]; + } + $proto_name{$proto[2]} = $proto[0]; +} + +sub _get_proto_number { + my $name = lc(shift); + return undef unless defined $name; + return $proto_number{$name} if exists $proto_number{$name}; + + my @proto = getprotobyname($name); + return undef unless @proto; + _cache_proto(@proto); + + return $proto[2]; +} + +sub _get_proto_name { + my $num = shift; + return undef unless defined $num; + return $proto_name{$num} if exists $proto_name{$num}; + + my @proto = getprotobynumber($num); + return undef unless @proto; + _cache_proto(@proto); + + return $proto[0]; +} + sub _sock_info { my($addr,$port,$proto) = @_; my $origport = $port; - my @proto = (); my @serv = (); $port = $1 if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,); if(defined $proto && $proto =~ /\D/) { - if(@proto = getprotobyname($proto)) { - $proto = $proto[2] || undef; - } - else { + my $num = _get_proto_number($proto); + unless (defined $num) { $@ = "Bad protocol '$proto'"; return; } + $proto = $num; } if(defined $port) { my $defport = ($port =~ s,\((\d+)\)$,,) ? $1 : undef; my $pnum = ($port =~ m,^(\d+)$,)[0]; - @serv = getservbyname($port, $proto[0] || "") + @serv = getservbyname($port, _get_proto_name($proto) || "") if ($port =~ m,\D,); $port = $serv[2] || $defport || $pnum; @@ -64,8 +99,7 @@ return; } - $proto = (getprotobyname($serv[3]))[2] || undef - if @serv && !$proto; + $proto = _get_proto_number($serv[3]) if @serv && !$proto; } return ($addr || undef, @@ -129,10 +163,9 @@ or return _error($sock, $!, $@); } - $proto ||= (getprotobyname('tcp'))[2]; + $proto ||= _get_proto_number('tcp'); - my $pname = (getprotobynumber($proto))[0]; - $type = $arg->{Type} || $socket_type{lc $pname}; + $type = $arg->{Type} || $socket_type{lc _get_proto_name($proto)}; my @raddr = (); diff -ruN perl-5.8.8/ext/POSIX/hpux_portable_uname.h AP820_source/ext/POSIX/hpux_portable_uname.h --- perl-5.8.8/ext/POSIX/hpux_portable_uname.h 1969-12-31 16:00:00.000000000 -0800 +++ AP820_source/ext/POSIX/hpux_portable_uname.h 2007-01-25 15:48:42.000000000 -0800 @@ -0,0 +1,60 @@ +#include +#include +#include + + +#define UNAME_V1 "uname" +#define UNAME_V2 "uname{20040821}" +#define SNLEN_V1 15 +#define SNLEN_V2 257 +#define UTSLEN_V1 9 +#define UTSLEN_V2 257 + +typedef struct portable_utsname +{ + char *sysname; + char *nodename; + char *release; + char *version; + char *machine; + char *idnumber; + int utslen; + int snlen; + char infop[UTSLEN_V2 * 7 + UTSLEN_V2]; +} portable_utsname; + +typedef int (*uname_ptr) (void *); + +static int portable_uname(portable_utsname * info) +{ + Dl_info dlinfo; + uname_ptr thisuname; + char **infoc = NULL; + char *c; + int i; + + dladdr((void *) &malloc, &dlinfo); + + if (thisuname = (uname_ptr) dlsym(dlinfo.dli_fbase, UNAME_V2)) { + info->snlen = SNLEN_V2; + info->utslen = UTSLEN_V2; + } + else { + thisuname = (uname_ptr)&uname; + info->snlen = SNLEN_V1; + info->utslen = UTSLEN_V1; + } + + thisuname(info->infop); + + infoc = (char **) info; + c = info->infop; + for (i = 0; i < 6; i++) { + infoc[i] = c; + c += info->utslen; + } + +} + +#define uname portable_uname +#define utsname portable_utsname diff -ruN perl-5.8.8/ext/POSIX/POSIX.xs AP820_source/ext/POSIX/POSIX.xs --- perl-5.8.8/ext/POSIX/POSIX.xs 2006-01-02 05:51:19.000000000 -0800 +++ AP820_source/ext/POSIX/POSIX.xs 2007-01-25 15:48:42.000000000 -0800 @@ -17,6 +17,11 @@ #define PERLIO_NOT_STDIO 1 #include "perl.h" #include "XSUB.h" + +#ifdef __hpux +# include "hpux_portable_uname.h" +#endif + #if defined(PERL_IMPLICIT_SYS) # undef signal # undef open diff -ruN perl-5.8.8/ext/SDBM_File/Makefile.PL AP820_source/ext/SDBM_File/Makefile.PL --- perl-5.8.8/ext/SDBM_File/Makefile.PL 2001-09-01 19:05:20.000000000 -0700 +++ AP820_source/ext/SDBM_File/Makefile.PL 2007-01-25 15:48:42.000000000 -0800 @@ -21,7 +21,7 @@ ); sub MY::postamble { - if ($^O =~ /MSWin32/ && Win32::IsWin95()) { + if ($^O =~ /MSWin32/ && !defined($ENV{SYSTEMROOT})) { if ($Config{'make'} =~ /dmake/i) { # dmake-specific return <<'EOT'; diff -ruN perl-5.8.8/ext/Socket/Makefile.PL AP820_source/ext/Socket/Makefile.PL --- perl-5.8.8/ext/Socket/Makefile.PL 2002-03-19 14:12:09.000000000 -0800 +++ AP820_source/ext/Socket/Makefile.PL 2007-01-25 15:48:42.000000000 -0800 @@ -15,7 +15,7 @@ AF_LAST AF_LAT AF_LINK AF_MAX AF_NBS AF_NIT AF_NS AF_OSI AF_OSINET AF_PUP AF_ROUTE AF_SNA AF_UNIX AF_UNSPEC AF_USER AF_WAN AF_X25 - IOV_MAX IPPROTO_TCP + IOV_MAX MSG_BCAST MSG_BTAG MSG_CTLFLAGS MSG_CTLIGNORE MSG_DONTWAIT MSG_EOF MSG_EOR MSG_ERRQUEUE MSG_ETAG MSG_FIN MSG_MAXIOVLEN MSG_MCAST MSG_NOSIGNAL MSG_RST MSG_SYN @@ -45,6 +45,9 @@ TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG TCP_NODELAY TCP_STDURG UIO_MAXIOV ), + {name=>"IPPROTO_ICMP", type=>"IV", default=>["IV", 1]}, + {name=>"IPPROTO_TCP", type=>"IV", default=>["IV", 6]}, + {name=>"IPPROTO_UDP", type=>"IV", default=>["IV", 17]}, {name=>"SHUT_RD", type=>"IV", default=>["IV", "0"]}, {name=>"SHUT_WR", type=>"IV", default=>["IV", "1"]}, {name=>"SHUT_RDWR", type=>"IV", default=>["IV", "2"]}, diff -ruN perl-5.8.8/ext/Socket/Socket.pm AP820_source/ext/Socket/Socket.pm --- perl-5.8.8/ext/Socket/Socket.pm 2006-01-12 10:52:17.000000000 -0800 +++ AP820_source/ext/Socket/Socket.pm 2007-01-25 15:48:42.000000000 -0800 @@ -337,7 +337,10 @@ @EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF + IPPROTO_ICMP IPPROTO_TCP + IPPROTO_UDP + TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG diff -ruN perl-5.8.8/ext/Socket/t/Socket.t AP820_source/ext/Socket/t/Socket.t --- perl-5.8.8/ext/Socket/t/Socket.t 2003-10-15 00:52:51.000000000 -0700 +++ AP820_source/ext/Socket/t/Socket.t 2007-01-25 15:48:42.000000000 -0800 @@ -12,7 +12,7 @@ $has_alarm = $Config{d_alarm}; } -use Socket; +use Socket qw(:all); print "1..17\n"; @@ -22,7 +22,7 @@ sub alarmed { $alarmed = 1 } $SIG{ALRM} = 'alarmed' if $has_alarm; -if (socket(T,PF_INET,SOCK_STREAM,6)) { +if (socket(T, PF_INET, SOCK_STREAM, IPPROTO_TCP)) { print "ok 1\n"; arm(5); @@ -70,7 +70,7 @@ print "not ok 1\n"; } -if( socket(S,PF_INET,SOCK_STREAM,6) ){ +if( socket(S, PF_INET,SOCK_STREAM, IPPROTO_TCP) ){ print "ok 4\n"; arm(5); diff -ruN perl-5.8.8/ext/Storable/MANIFEST AP820_source/ext/Storable/MANIFEST --- perl-5.8.8/ext/Storable/MANIFEST 2005-05-20 07:46:24.000000000 -0700 +++ AP820_source/ext/Storable/MANIFEST 2007-01-25 15:48:42.000000000 -0800 @@ -15,6 +15,7 @@ t/canonical.t See if Storable works t/circular_hook.t Test thaw hook called depth-first for circular refs t/code.t Test (de)serialization of code references +t/compat01.t See if Storable is compatible with v0.1 and v0.4 dumps t/compat06.t See if Storable works t/croak.t See if Storable works t/dclone.t See if Storable works diff -ruN perl-5.8.8/ext/Storable/Storable.xs AP820_source/ext/Storable/Storable.xs --- perl-5.8.8/ext/Storable/Storable.xs 2005-09-19 03:41:33.000000000 -0700 +++ AP820_source/ext/Storable/Storable.xs 2007-01-25 15:48:42.000000000 -0800 @@ -2602,6 +2602,7 @@ */ /* Ownership of both SVs is passed to load_module, which frees them. */ load_module(PERL_LOADMOD_NOIMPORT, newSVpvn("B::Deparse",10), newSVnv(0.61)); + SPAGAIN; ENTER; SAVETMPS; @@ -4767,6 +4768,11 @@ sv = NEWSV(10002, len); SEEN(sv, cname, 0); /* Associate this new scalar with tag "tagnum" */ + if (len == 0) { + sv_setpvn(sv, "", 0); + return sv; + } + /* * WARNING: duplicates parts of sv_setpv and breaks SV data encapsulation. * @@ -5641,6 +5647,7 @@ int length; int use_network_order; int use_NV_size; + int old_magic = 0; int version_major; int version_minor = 0; @@ -5674,6 +5681,7 @@ if (memNE(buf, old_magicstr, old_len)) CROAK(("File is not a perl storable")); + old_magic++; current = buf + old_len; } use_network_order = *current; @@ -5685,9 +5693,14 @@ * indicate the version number of the binary, and therefore governs the * setting of sv_retrieve_vtbl. See magic_write(). */ - - version_major = use_network_order >> 1; - cxt->retrieve_vtbl = (SV*(**)(pTHX_ stcxt_t *cxt, char *cname)) (version_major ? sv_retrieve : sv_old_retrieve); + if (old_magic && use_network_order > 1) { + /* 0.1 dump - use_network_order is really byte order length */ + version_major = -1; + } + else { + version_major = use_network_order >> 1; + } + cxt->retrieve_vtbl = (SV*(**)(pTHX_ stcxt_t *cxt, char *cname)) (version_major > 0 ? sv_retrieve : sv_old_retrieve); TRACEME(("magic_check: netorder = 0x%x", use_network_order)); @@ -5750,7 +5763,12 @@ /* In C truth is 1, falsehood is 0. Very convienient. */ use_NV_size = version_major >= 2 && version_minor >= 2; - GETMARK(c); + if (version_major >= 0) { + GETMARK(c); + } + else { + c = use_network_order; + } length = c + 3 + use_NV_size; READ(buf, length); /* Not null-terminated */ diff -ruN perl-5.8.8/ext/Storable/t/compat01.t AP820_source/ext/Storable/t/compat01.t --- perl-5.8.8/ext/Storable/t/compat01.t 1969-12-31 16:00:00.000000000 -0800 +++ AP820_source/ext/Storable/t/compat01.t 2007-01-25 15:48:42.000000000 -0800 @@ -0,0 +1,56 @@ +#!perl -w + +BEGIN { + if ($ENV{PERL_CORE}){ + chdir('t') if -d 't'; + @INC = ('.', '../lib', '../ext/Storable/t'); + } else { + unshift @INC, 't'; + } + require Config; import Config; + if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bStorable\b/) { + print "1..0 # Skip: Storable was not built\n"; + exit 0; + } + + use Config; + if ($Config{byteorder} ne "1234") { + print "1..0 # Skip: Test only works for 32 bit little-ending machines\n"; + exit 0; + } +} + +use strict; +use Storable qw(retrieve); + +my $file = "xx-$$.pst"; +my @dumps = ( + # some sample dumps of the hash { one => 1 } + "perl-store\x041234\4\4\4\x94y\22\b\3\1\0\0\0vxz\22\b\1\1\0\0\x001Xk\3\0\0\0oneX", # 0.1 + "perl-store\0\x041234\4\4\4\x94y\22\b\3\1\0\0\0vxz\22\b\b\x81Xk\3\0\0\0oneX", # 0.4@7 +); + +print "1.." . @dumps . "\n"; + +my $testno; +for my $dump (@dumps) { + $testno++; + + open(FH, ">$file") || die "Can't create $file: $!"; + binmode(FH); + print FH $dump; + close(FH) || die "Can't write $file: $!"; + + eval { + my $data = retrieve($file); + if (ref($data) eq "HASH" && $data->{one} eq "1") { + print "ok $testno\n"; + } + else { + print "not ok $testno\n"; + } + }; + warn $@ if $@; + + unlink($file); +} diff -ruN perl-5.8.8/ext/Storable/t/malice.t AP820_source/ext/Storable/t/malice.t --- perl-5.8.8/ext/Storable/t/malice.t 2004-07-10 14:47:51.000000000 -0700 +++ AP820_source/ext/Storable/t/malice.t 2007-01-25 15:48:42.000000000 -0800 @@ -51,7 +51,7 @@ # present in files, but not in things store()ed to memory $fancy = ($] > 5.007 ? 2 : 0); -plan tests => 368 + length ($byteorder) * 4 + $fancy * 8 + 1; +plan tests => 372 + length ($byteorder) * 4 + $fancy * 8; use Storable qw (store retrieve freeze thaw nstore nfreeze); require 'testlib.pl'; @@ -306,3 +306,9 @@ # us, which will probably alert the user that something went wrong. ok(1); } + +# Unusual in that the empty string is stored with a SX_LSCALAR marker +my $hash = store_and_retrieve("pst0\5\6\3\0\0\0\1\1\0\0\0\0\0\0\0\5empty"); +ok(!$@, "no exception"); +is(ref($hash), "HASH", "got a hash"); +is($hash->{empty}, "", "got empty element"); diff -ruN perl-5.8.8/ext/Sys/Hostname/Hostname.xs AP820_source/ext/Sys/Hostname/Hostname.xs --- perl-5.8.8/ext/Sys/Hostname/Hostname.xs 2001-06-02 07:51:19.000000000 -0700 +++ AP820_source/ext/Sys/Hostname/Hostname.xs 2007-01-25 15:48:42.000000000 -0800 @@ -6,6 +6,15 @@ # include #endif +/* On HP-UX, there are 2 versions of MAXHOSTNAMELEN (64/256) + * depending on large-hostname support or not. Pick the larger + * one so we can work on either one. Bug 52118 + */ +#if defined(__hpux) +# undef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + /* a reasonable default */ #ifndef MAXHOSTNAMELEN # define MAXHOSTNAMELEN 256 diff -ruN perl-5.8.8/ext/threads/Changes AP820_source/ext/threads/Changes --- perl-5.8.8/ext/threads/Changes 2001-09-18 07:39:42.000000000 -0700 +++ AP820_source/ext/threads/Changes 2007-01-25 15:48:42.000000000 -0800 @@ -1,5 +1,87 @@ Revision history for Perl extension threads. +1.31 Fri May 19 16:06:42 EDT 2006 + - Explicit thread context + +1.29 Thu May 18 16:09:28 EDT 2006 + - Fix warning/core dump from ->create('foo') in BEGIN block + +1.28 Wed May 17 14:33:13 EDT 2006 + - Fix for build failure under older Perl versions + - Skip signalling tests if using unsafe signals + +1.27 Thu May 11 11:52:21 EDT 2006 + - Added $thr->kill() method for thread signalling + - Check for 'C' compiler when building module + +1.26 Mon May 8 13:18:29 EDT 2006 + - Fix for Win32 build WRT page size + +1.25 Thu May 4 12:34:02 EDT 2006 + - Final sync with blead + - Lock counters in tests + +1.24 Mon Apr 24 10:29:11 EDT 2006 + - assert() that thread 0 is never destructed + - Determinancy in free.t + +1.23 Thu Apr 13 16:57:00 EDT 2006 + - BUG (RE)FIX: Properly free thread's Perl interpreter + - It's an error to detach a thread twice + - More XS code cleanups + +1.22 Fri Apr 7 21:35:06 EDT 2006 + - Documented maximum stack size error + +1.21 Tue Apr 4 13:57:23 EDT 2006 + - Corrected ->_handle() to return a pointer + - Overload != + +1.19 Sat Mar 25 18:46:02 EST 2006 + - Use 'DEFINE' instead of 'CCFLAGS' in Makefile.PL + +1.18 Fri Mar 24 14:21:36 EST 2006 + - ->equal returns 0 on false for backwards compatibility + - Changed UVs to IVs in XS code (except for TID) + - Use ->create in tests + +1.17 Thu Mar 23 10:31:20 EST 2006 + - Restoration of 'core' build parameters + +1.15 Wed Mar 22 13:46:51 EST 2006 + - BUG FIX: Replaced SvPV_nolen_const macro + - Disabled closure return test again and added note in POD + +1.14 Tue Mar 21 08:40:16 EST 2006 + - BUG FIX: Corrected UV formatting string + +1.13 Mon Mar 20 15:09:42 EST 2006 + - BUG FIX: Round stack sizes to multiple of page size + - Use PTHREAD_STACK_MIN if available + +1.12 Sun Mar 19 17:34:49 EST 2006 + - Implemented $thr1->equal($thr2) in XS + - Use $ENV{PERL_CORE} in tests + +1.11 Fri Mar 17 13:24:35 EST 2006 + - BUG FIX: Properly free thread's Perl interpreter + - Removed BUGS POD item regarding returning objects from threads + - Enabled closure return test in t/problems.t + - Handle deprecation of :unique in tests + - XS code cleanup + - Better POD coverage + +1.09 Mon Mar 13 14:14:37 EST 2006 + - Initial (re-)release to CPAN + - 64-bit TIDs + - API for thread stack size (courtesy of Dean Arnold) + - Made threads->list() context sensitive + - Implemented threads->object($tid) in XS + - Added $thr->_handle() method + + +Ancient history: + 0.03 Mon Jul 2 12:00:50 CEST 2001 Fixed bug with threads->self() in main thread, thanks Hackworth! diff -ruN perl-5.8.8/ext/threads/Makefile.PL AP820_source/ext/threads/Makefile.PL --- perl-5.8.8/ext/threads/Makefile.PL 2003-04-02 22:08:54.000000000 -0800 +++ AP820_source/ext/threads/Makefile.PL 2007-01-25 15:48:42.000000000 -0800 @@ -1,28 +1,88 @@ +# Module makefile for threads (using ExtUtils::MakeMaker) + +require 5.008; + +use strict; +use warnings; + use ExtUtils::MakeMaker; -# See lib/ExtUtils/MakeMaker.pm for details of how to influence -# the contents of the Makefile that is written. + +# Used to check for a 'C' compiler +sub check_cc +{ + require File::Spec; + + my $cmd = $_[0]; + if (-x $cmd or MM->maybe_command($cmd)) { + return (1); # CC command found + } + for my $dir (File::Spec->path(), '.') { + my $abs = File::Spec->catfile($dir, $cmd); + if (-x $abs or MM->maybe_command($abs)) { + return (1); # CC command found + } + } + return; +} + +sub have_cc +{ + eval { require Config_m; }; # ExtUtils::FakeConfig (+ ActivePerl) + if ($@) { + eval { require Config; }; # Everyone else + } + my @chunks = split(/ /, $Config::Config{cc}); + # $Config{cc} may contain args; try to find out the program part + while (@chunks) { + if (check_cc("@chunks")) { + return (1); # CC command found + } + pop(@chunks); + } + return; +} + + +# Build options for different environments +my @conditional_params; +if (grep { $_ eq 'PERL_CORE=1' } @ARGV) { + # Core + push(@conditional_params, 'MAN3PODS' => {}, + 'NORECURS' => 1); +} else { + # CPAN + + # Verify that a 'C' compiler is available + if (! have_cc()) { + die("No 'C' compiler found to build 'threads'\n"); + } + + push(@conditional_params, 'DEFINE' => '-DHAS_PPPORT_H'); +} + + +# Create Makefile WriteMakefile( - 'NAME' => 'threads', - 'VERSION_FROM' => 'threads.pm', # finds $VERSION - 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1 - ($] >= 5.005 ? ## Add these new keywords supported since 5.005 - (ABSTRACT_FROM => 'threads.pm', # retrieve abstract from module - AUTHOR => 'Artur Bergman ') : ()), - 'MAN3PODS' => {}, # Pods will be built by installman - 'LIBS' => [''], # e.g., '-lm' - 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' - # Insert -I. if you add *.h files later: -# 'INC' => '', # e.g., '-I/usr/include/other' - # Un-comment this if you add C files to link with later: - # 'OBJECT' => '$(O_FILES)', # link all the C files too - - # ext/threads/shared is a completely different module. Don't - # recurse into it. - 'NORECURS' => 1, - - # Bug in MakeMaker continues to put ext/threads/shared into DIR - # even if we said NORECURS. Remove when fixed. - 'DIR' => [], + 'NAME' => 'threads', + 'AUTHOR' => 'Artur Bergman ', + 'VERSION_FROM' => 'threads.pm', + 'ABSTRACT_FROM' => 'threads.pm', + 'PM' => { + 'threads.pm' => '$(INST_LIBDIR)/threads.pm', + }, + 'PREREQ_PM' => { + 'threads::shared' => 0, + 'XSLoader' => 0, + }, + 'INSTALLDIRS' => 'perl', + + ((ExtUtils::MakeMaker->VERSION() lt '6.25') ? + ('PL_FILES' => { }) : ()), + ((ExtUtils::MakeMaker->VERSION() gt '6.30') ? + ('LICENSE' => 'perl') : ()), + + @conditional_params ); +# EOF diff -ruN perl-5.8.8/ext/threads/ppport.h AP820_source/ext/threads/ppport.h --- perl-5.8.8/ext/threads/ppport.h 1969-12-31 16:00:00.000000000 -0800 +++ AP820_source/ext/threads/ppport.h 2007-01-25 15:48:42.000000000 -0800 @@ -0,0 +1,5155 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.08 + + Automatically created by Devel::PPPort running under + perl 5.008008 on Thu Jan 19 21:43:32 2006. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.08 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h (this, obviously, cannot be undone) + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.9.3. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --patch=I + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C or a C program to be installed. + +=head2 --diff=I + +Manually set the diff program and options to use. The default +is to use C, when installed, and output unified +context diffs. + +=head2 --compat-version=I + +Tell F to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F. +This reduces the size of F dramatically and may be useful +if you want to include F in smaller modules without +increasing their distribution size too much. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I + +Show portability information for API elements matching I. +If I is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C prefix is deprecated. Also, +some API functions used to have a C prefix. Using this form is +also deprecated. You can safely use the supported API, as F +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F. + +These functions or variables will be marked C in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C or global +variants. + +For a C function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + sv_2pv_nolen() NEED_sv_2pv_nolen NEED_sv_2pv_nolen_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C +macro. Just C<#define> the macro before including C: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C. + +=back + +The good thing is that most of the above can be checked by running +F on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +To display portability information for the C function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F is causing failure during +the compilation of this module, please check if newer versions +of either this module or C are available on CPAN +before sending a bug report. + +If F was generated using the latest version of +C and is causing failure of this module, please +file a bug report using the CPAN Request Tracker at L. + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2006, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L. + +=cut + +use strict; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +# Never use C comments in this file!!!!! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +AvFILLp|5.004050||p +AvFILL||| +CLASS|||n +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002||p +Copy||| +CvPADLIST||| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvSV||| +Gv_AMupdate||| +HEf_SVKEY||5.004000| +HeHASH||5.004000| +HeKEY||5.004000| +HeKLEN||5.004000| +HePV||5.004000| +HeSVKEY_force||5.004000| +HeSVKEY_set||5.004000| +HeSVKEY||5.004000| +HeVAL||5.004000| +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LVRET||| +MARK||| +MULTICALL||5.009003| +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002||p +Move||| +NEWSV||| +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +ORIGMARK||| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERL_BCDVERSION|5.009003||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_INT_MAX|5.004000||p +PERL_INT_MIN|5.004000||p +PERL_LONG_MAX|5.004000||p +PERL_LONG_MIN|5.004000||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.007002||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.007002||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.007002||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.007002||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_QUAD_MAX|5.004000||p +PERL_QUAD_MIN|5.004000||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.004000||p +PERL_SHORT_MIN|5.004000||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_UCHAR_MAX|5.004000||p +PERL_UCHAR_MIN|5.004000||p +PERL_UINT_MAX|5.004000||p +PERL_UINT_MIN|5.004000||p +PERL_ULONG_MAX|5.004000||p +PERL_ULONG_MIN|5.004000||p +PERL_UNUSED_DECL|5.007002||p +PERL_UQUAD_MAX|5.004000||p +PERL_UQUAD_MIN|5.004000||p +PERL_USHORT_MAX|5.004000||p +PERL_USHORT_MIN|5.004000||p +PERL_VERSION|5.006000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||n +PL_Sv|5.005000||p +PL_compiling|5.004050||p +PL_copline|5.005000||p +PL_curcop|5.004050||p +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_last_in_gv|||n +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofs_sv|||n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rsfp_filters|5.004050||p +PL_rsfp|5.004050||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +POP_MULTICALL||5.009003| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.009003| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Poison|5.008000||p +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +ST||| +SVt_IV||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVHV||| +SVt_PVMG||| +SVt_PV||| +Safefree||| +Slab_Alloc||| +Slab_Free||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_force_nomg|5.007002||p +SvPV_force||| +SvPV_nolen|5.006000||p +SvPV_nomg|5.007002||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec||| +SvREFCNT_inc||| +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvSETMAGIC||| +SvSHARE||5.007003| +SvSTASH_set|5.009003|5.009003|p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK||5.007001| +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +THIS|||n +UNDERBAR|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002||p +XCPT_TRY_END|5.009002||p +XCPT_TRY_START|5.009002||p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_VERSION_BOOTCHECK||| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_pMY_CXT|5.007003||p +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHX_|5.006000||p +aTHX|5.006000||p +add_data||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_i_ncmp||| +amagic_ncmp||| +any_dup||| +ao||| +append_elem||| +append_list||| +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_delete||5.006000| +av_exists||5.006000| +av_extend||| +av_fake||| +av_fetch||| +av_fill||| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_undef||| +av_unshift||| +ax|||n +bad_type||| +bind_match||| +block_end||| +block_gimme||5.004000| +block_start||| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_xsutils||| +bytes_from_utf8||5.007001| +bytes_to_utf8||5.006001| +cache_re||| +call_argv|5.006000||p +call_atexit||5.006000| +call_body||| +call_list_body||| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +calloc||5.007002|n +cando||| +cast_i32||5.006000| +cast_iv||5.006000| +cast_ulong||5.006000| +cast_uv||5.006000| +check_type_and_open||| +check_uni||| +checkcomma||| +checkposixcc||| +ck_anoncode||| +ck_bitop||| +ck_concat||| +ck_defined||| +ck_delete||| +ck_die||| +ck_eof||| +ck_eval||| +ck_exec||| +ck_exists||| +ck_exit||| +ck_ftst||| +ck_fun||| +ck_glob||| +ck_grep||| +ck_index||| +ck_join||| +ck_lengthconst||| +ck_lfun||| +ck_listiob||| +ck_match||| +ck_method||| +ck_null||| +ck_open||| +ck_repeat||| +ck_require||| +ck_retarget||| +ck_return||| +ck_rfun||| +ck_rvconst||| +ck_sassign||| +ck_say||| +ck_select||| +ck_shift||| +ck_sort||| +ck_spair||| +ck_split||| +ck_subr||| +ck_substr||| +ck_svconst||| +ck_trunc||| +ck_unpack||| +ckwarn_d||5.009003| +ckwarn||5.009003| +cl_and||| +cl_anything||| +cl_init_zero||| +cl_init||| +cl_is_anything||| +cl_or||| +closest_cop||| +convert||| +cop_free||| +cr_textfilter||| +croak_nocontext|||vn +croak|||v +csighandler||5.009003|n +custom_op_desc||5.007003| +custom_op_name||5.007003| +cv_ckproto||| +cv_clone||| +cv_const_sv||5.004000| +cv_dump||| +cv_undef||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +deb||5.007003|v +del_sv||| +delimcpy||5.004000| +deprecate_old||| +deprecate||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_where||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_chop||| +do_close||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_kv||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_oddball||| +do_op_dump||5.006000| +do_open9||5.006000| +do_openn||5.007001| +do_open||5.004000| +do_pipe||| +do_pmop_dump||5.006000| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch_body||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptosub||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +dump_all||5.006000| +dump_eval||5.006000| +dump_fds||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs||5.006000| +dump_sub||5.006000| +dump_sv_child||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_eaccess||| +eval_pv|5.006000||p +eval_sv|5.006000||p +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +fd_on_nosuid_fs||| +feature_is_enabled||| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +find_beginning||| +find_byclass||| +find_in_my_stash||| +find_runcv||| +find_rundefsvoffset||5.009002| +find_script||| +find_uninit_var||| +first_symbol|||n +fold_constants||| +forbid_setid||| +force_ident||| +force_list||| +force_next||| +force_version||| +force_word||| +form_nocontext|||vn +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_av|5.006000||p +get_context||5.006000|n +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +gp_dup||| +gp_free||| +gp_ref||| +grok_bin|5.007003||p +grok_hex|5.007003||p +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_autoload4||5.004000| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.004000| +gv_efullname4||5.006001| +gv_efullname||| +gv_ename||| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags||5.009002| +gv_fetchpv||| +gv_fetchsv||5.009002| +gv_fullname3||5.004000| +gv_fullname4||5.006001| +gv_fullname||| +gv_handler||5.007001| +gv_init_sv||| +gv_init||| +gv_stashpvn|5.006000||p +gv_stashpv||| +gv_stashsv||| +he_dup||| +hek_dup||| +hfreeentries||| +hsplit||| +hv_assert||5.009001| +hv_auxinit||| +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.004000| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_exists_ent||5.004000| +hv_exists||| +hv_fetch_common||| +hv_fetch_ent||5.004000| +hv_fetch||| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.004000| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.004000| +hv_magic_check||| +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||5.009003| +hv_placeholders_set||5.009003| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.004000| +hv_store_flags||5.008000| +hv_store||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incl_perldb||| +incline||| +incpush_if_exists||| +incpush||| +ingroup||| +init_argv_symbols||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_lexer||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +instr||| +intro_my||| +intuit_method||| +intuit_more||| +invert||| +io_close||| +isALNUM||| +isALPHA||| +isDIGIT||| +isLOWER||| +isSPACE||| +isUPPER||| +is_an_int||| +is_gv_magical_sv||| +is_gv_magical||| +is_handle_constructor||| +is_list_assignment||| +is_lvalue_sub||5.007001| +is_uni_alnum_lc||5.006000| +is_uni_alnumc_lc||5.006000| +is_uni_alnumc||5.006000| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_alnumc||5.006000| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_char_slow||| +is_utf8_char||5.006000| +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003| +is_utf8_string_loc||5.008001| +is_utf8_string||5.006001| +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +isa_lookup||| +items|||n +ix|||n +jmaybe||| +keyword||| +leave_scope||| +lex_end||| +lex_start||| +linklist||| +listkids||| +list||| +load_module_nocontext|||vn +load_module||5.006000|v +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHu|5.009002||p +magic_clear_all_env||| +magic_clearenv||| +magic_clearpack||| +magic_clearsig||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_freeregexp||| +magic_getarylen||| +magic_getdefelem||| +magic_getglob||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_len||| +magic_methcall||| +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setamagic||| +magic_setarylen||| +magic_setbm||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdefelem||| +magic_setenv||| +magic_setfm||| +magic_setglob||| +magic_setisa||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +magicname||| +make_matcher||| +make_trie||| +malloced_size|||n +malloc||5.007002|n +markstack_grow||| +matcher_matches_sv||| +measure_struct||| +memEQ|5.004000||p +memNE|5.004000||p +mem_collxfrm||| +mess_alloc||| +mess_nocontext|||vn +mess||5.006000|v +method_common||| +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_find||| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical||| +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002| +missingterm||| +mode_from_discipline||| +modkids||| +mod||| +moreswitches||| +mul128||| +mulexp10|||n +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_betoh16|||n +my_betoh32|||n +my_betoh64|||n +my_betohi|||n +my_betohl|||n +my_betohs|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_init||| +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_htobe16|||n +my_htobe32|||n +my_htobe64|||n +my_htobei|||n +my_htobel|||n +my_htobes|||n +my_htole16|||n +my_htole32|||n +my_htole64|||n +my_htolei|||n +my_htolel|||n +my_htoles|||n +my_htonl||| +my_kid||| +my_letoh16|||n +my_letoh32|||n +my_letoh64|||n +my_letohi|||n +my_letohl|||n +my_letohs|||n +my_lstat||| +my_memcmp||5.004000|n +my_memset|||n +my_ntohl||| +my_pclose||5.004000| +my_popen_list||5.007001| +my_popen||5.004000| +my_setenv||| +my_socketpair||5.007003|n +my_sprintf||5.009003|vn +my_stat||| +my_strftime||5.007002| +my_swabn|||n +my_swap||| +my_unexec||| +my||| +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB|5.006000||p +newCVREF||| +newDEFSVOP||| +newFORM||| +newFOROP||| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGVOP||| +newGVREF||| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMYSUB||5.006000| +newNULLLIST||| +newOP||| +newPADOP||5.006000| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.006000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSUB||| +newSVOP||| +newSVREF||| +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_share||5.007001| +newSVpvn|5.006000||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.009003| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +next_symbol||| +nextargv||| +nextchar||| +ninstr||| +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +not_a_number||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +offer_nice_chunk||| +oopsAV||| +oopsCV||| +oopsHV||| +op_clear||| +op_const_sv||| +op_dump||5.006000| +op_free||| +op_null||5.007002| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +open_script||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +pack_cat||5.007003| +pack_rec||| +package||| +packlist||5.008001| +pad_add_anon||| +pad_add_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||| +pad_findlex||| +pad_findmy||| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||| +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||| +pad_swipe||| +pad_tidy||| +pad_undef||| +parse_body||| +parse_unicode_opts||| +path_is_absolute||| +peep||| +pending_ident||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pmflag||| +pmop_dump||5.006000| +pmruntime||| +pmtrans||| +pop_scope||| +pregcomp||| +pregexec||| +pregfree||| +prepend_elem||| +printf_nocontext|||vn +ptr_table_clear||| +ptr_table_fetch||| +ptr_table_free||| +ptr_table_new||| +ptr_table_split||| +ptr_table_store||| +push_scope||| +put_byte||| +pv_display||5.006000| +pv_uni_display||5.007003| +qerror||| +re_croak2||| +re_dup||| +re_intuit_start||5.006000| +re_intuit_string||5.006000| +realloc||5.007002|n +reentrant_free||| +reentrant_init||| +reentrant_retry|||vn +reentrant_size||| +ref_array_or_hash||| +refkids||| +refto||| +ref||5.009003| +reg_node||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.007003| +regclass||| +regcppop||| +regcppush||| +regcurly||| +regdump||5.005000| +regexec_flags||5.005000| +reghop3||| +reghopmaybe3||| +reghopmaybe||| +reghop||| +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regoptail||| +regpiece||| +regpposixcc||| +regprop||| +regrepeat_hard||| +regrepeat||| +regtail||| +regtry||| +reguni||| +regwhite||| +reg||| +repeatcpy||| +report_evil_fh||| +report_uninit||| +require_errno||| +require_pv||5.006000| +restore_magic||| +rninstr||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_aelem||5.004050| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hek_flags||| +save_helem||5.004050| +save_hints||5.005000| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||| +save_padsv||5.007001| +save_pptr||| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_svref||| +save_threadsv||5.005000| +save_vptr||5.006000| +savepvn||| +savepv||| +savesharedpv||5.007003| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type||| +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.008001| +scan_word||| +scope||| +screaminstr||5.005000| +seed||5.008001| +sequence_num||| +sequence||| +set_context||5.006000|n +set_csh||| +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +setdefout||| +setenv_getix||| +share_hek_flags||| +share_hek||5.004000| +si_dup||| +sighandler|||n +simplify_sort||| +skipspace||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +ss_dup||| +stack_grow||| +start_glob||| +start_subparse||5.004000| +stashpv_hvname_match||5.009003| +stdize_locale||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +stringify_regexp||| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2nv||| +sv_2pv_flags||5.007002| +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen||| +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff||| +sv_bless||| +sv_cat_decode||5.008001| +sv_catpv_mg|5.006000||p +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm||| +sv_compile_2op||5.008001| +sv_copypv||5.007003| +sv_dec||| +sv_del_backref||| +sv_derived_from||5.004000| +sv_dump||| +sv_dup||| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_gets||5.004000| +sv_grow||| +sv_i_ncmp||| +sv_inc||| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8||5.006000| +sv_len||| +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||5.007003| +sv_nv||5.005000| +sv_peek||5.005000| +sv_pos_b2u||5.006000| +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags||5.007002| +sv_pvn_force|||p +sv_pvn_nomg|5.007003||p +sv_pvn|5.006000||p +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_release_COW||| +sv_release_IVX||| +sv_replace||| +sv_report_used||| +sv_reset||| +sv_rvweaken||5.006000| +sv_setiv_mg|5.006000||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.006000||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.006000||p +sv_setpvn||| +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.006000||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.006000||p +sv_setuv|5.006000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_mg|5.006000||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.006000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_get||| +swash_init||5.006000| +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +taint_env||| +taint_proper||| +tmps_grow||5.006000| +toLOWER||| +toUPPER||| +to_byte_substr||| +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.007003| +to_utf8_lower||5.007003| +to_utf8_substr||| +to_utf8_title||5.007003| +to_utf8_upper||5.007003| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments||| +too_many_arguments||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.004000| +unwind_handler_stack||| +upg_version||5.009000| +usage||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000| +utf8_length||5.007001| +utf8_mg_pos_init||| +utf8_mg_pos||| +utf8_to_bytes||5.006001| +utf8_to_uvchr||5.007001| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vdie_common||| +vdie_croak_common||| +vdie||| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module||5.006000| +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warner_nocontext|||vn +warner||5.006000|v +warn|||v +watch||| +whichsig||| +write_no_mem||| +write_to_stderr||| +yyerror||| +yylex||| +yyparse||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %depends); +my $replace = 0; +my $hint = ''; + +while () { + if ($hint) { + if (m{^\s*\*\s(.*?)\s*$}) { + $hints{$hint} ||= ''; # suppress warning with older perls + $hints{$hint} .= "$1\n"; + } + else { + $hint = ''; + } + } + $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2; + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "$hints{$f}" if exists $hints{$f}; + $info++; + } + unless ($info) { + print "No portability information available.\n"; + } + $count++; + } + if ($count > 0) { + print "\n"; + } + else { + print "Found no API matching '$opt{'api-info'}'.\n"; + } + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( xs c h cc cpp ); +my $srcext = join '|', @srcext; + +if (@ARGV) { + my %seen; + @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV; +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /\.($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*.$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +unless (@files) { + die "No input files given!\n"; +} + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; }; + close IN; + + my %file = (orig => $c, changes => 0); + + # temporarily remove C comments from the code + my @ccom; + $c =~ s{ + ( + [^"'/]+ + | + (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+ + | + (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+ + ) + | + (/ (?: + \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / + | + /[^\r\n]* + )) + }{ + defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce"; + }egsx; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/); + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + if (exists $need{$_}) { + $file{needs}{$_} = 'static'; + } + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { + warning("Possibly wrong #define $1 in $filename"); + } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses}}) { + next unless $file{uses}{$func}; # if it's only a dependency + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + elsif (exists $replace{$func}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + else { + diag("Uses $func"); + } + hint($func); + } + + for $func (sort keys %{$file{uses_todo}}) { + warning("Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo})); + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and can_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <
$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while () { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub can_use +{ + eval "use @_;"; + return $@ eq ''; +} + +sub rec_depend +{ + my $func = shift; + my %seen; + return () unless exists $depends{$func}; + grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +sub hint +{ + $opt{quiet} and return; + $opt{hints} or return; + my $func = shift; + exists $hints{$func} or return; + $given_hints{$func}++ and return; + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print < }; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)//ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <$0" or die "cannot strip $0: $!\n"; + print OUT $self; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ + +#ifdef I_LIMITS +# include +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +