This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add comments explaining why win32.h/embed.h are included where they are
[perl5.git] / perl.h
diff --git a/perl.h b/perl.h
index 66c6e4d..83b51ce 100644 (file)
--- a/perl.h
+++ b/perl.h
 /* XXX This next guard can disappear if the sources are revised
    to use USE_5005THREADS throughout. -- A.D  1/6/2000
 */
-#if defined(USE_ITHREADS) && defined(USE_THREADS)
-#  include "error: USE_ITHREADS and USE_THREADS are incompatible"
+#if defined(USE_ITHREADS) && defined(USE_5005THREADS)
+#  include "error: USE_ITHREADS and USE_5005THREADS are incompatible"
 #endif
 
 /* See L<perlguts/"The Perl API"> for detailed notes on
  * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
 
 #ifdef USE_ITHREADS
-#  if !defined(MULTIPLICITY) && !defined(PERL_OBJECT)
+#  if !defined(MULTIPLICITY)
 #    define MULTIPLICITY
 #  endif
 #endif
 
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 #  ifndef PERL_IMPLICIT_CONTEXT
 #    define PERL_IMPLICIT_CONTEXT
 #  endif
 #  endif
 #endif
 
-#ifdef PERL_CAPI
-#  undef PERL_OBJECT
-#  ifndef MULTIPLICITY
-#    define MULTIPLICITY
-#  endif
-#  ifndef PERL_IMPLICIT_CONTEXT
-#    define PERL_IMPLICIT_CONTEXT
-#  endif
-#  ifndef PERL_IMPLICIT_SYS
-#    define PERL_IMPLICIT_SYS
-#  endif
-#endif
-
-#ifdef PERL_OBJECT
-#  ifndef PERL_IMPLICIT_CONTEXT
-#    define PERL_IMPLICIT_CONTEXT
-#  endif
-#  ifndef PERL_IMPLICIT_SYS
-#    define PERL_IMPLICIT_SYS
-#  endif
-#endif
-
-#ifdef PERL_OBJECT
-
-/* PERL_OBJECT explained  - DickH and DougL @ ActiveState.com
-
-Defining PERL_OBJECT turns on creation of a C++ object that
-contains all writable core perl global variables and functions.
-Stated another way, all necessary global variables and functions
-are members of a big C++ object. This object's class is CPerlObj.
-This allows a Perl Host to have multiple, independent perl
-interpreters in the same process space. This is very important on
-Win32 systems as the overhead of process creation is quite high --
-this could be even higher than the script compile and execute time
-for small scripts.
-
-The perl executable implementation on Win32 is composed of perl.exe
-(the Perl Host) and perlX.dll. (the Perl Core). This allows the
-same Perl Core to easily be embedded in other applications that use
-the perl interpreter.
-
-+-----------+
-| Perl Host |
-+-----------+
-      ^
-      |
-      v
-+-----------+   +-----------+
-| Perl Core |<->| Extension |
-+-----------+   +-----------+ ...
-
-Defining PERL_OBJECT has the following effects:
-
-PERL CORE
-1. CPerlObj is defined (this is the PERL_OBJECT)
-2. all static functions that needed to access either global
-variables or functions needed are made member functions
-3. all writable static variables are made member variables
-4. all global variables and functions are defined as:
-       #define var CPerlObj::PL_var
-       #define func CPerlObj::Perl_func
-       * these are in embed.h
-This necessitated renaming some local variables and functions that
-had the same name as a global variable or function. This was
-probably a _good_ thing anyway.
-
-
-EXTENSIONS
-1. Access to global variables and perl functions is through a
-pointer to the PERL_OBJECT. This pointer type is CPerlObj*. This is
-made transparent to extension developers by the following macros:
-       #define var pPerl->PL_var
-       #define func pPerl->Perl_func
-       * these are done in objXSUB.h
-This requires that the extension be compiled as C++, which means
-that the code must be ANSI C and not K&R C. For K&R extensions,
-please see the C API notes located in Win32/GenCAPI.pl. This script
-creates a perlCAPI.lib that provides a K & R compatible C interface
-to the PERL_OBJECT.
-2. Local variables and functions cannot have the same name as perl's
-variables or functions since the macros will redefine these. Look for
-this if you get some strange error message and it does not look like
-the code that you had written. This often happens with variables that
-are local to a function.
-
-PERL HOST
-1. The perl host is linked with perlX.lib to get perl_alloc. This
-function will return a pointer to CPerlObj (the PERL_OBJECT). It
-takes pointers to the various PerlXXX_YYY interfaces (see iperlsys.h
-for more information on this).
-2. The perl host calls the same functions as normally would be
-called in setting up and running a perl script, except that the
-functions are now member functions of the PERL_OBJECT.
-
-*/
-
-
-class CPerlObj;
-
-#define STATIC
-#define CPERLscope(x)          CPerlObj::x
-#define CALL_FPTR(fptr)                (aTHXo->*fptr)
-
-#define pTHXo                  CPerlObj *pPerl
-#define pTHXo_                 pTHXo,
-#define aTHXo                  this
-#define aTHXo_                 this,
-#define PERL_OBJECT_THIS       aTHXo
-#define PERL_OBJECT_THIS_      aTHXo_
-#define dTHXoa(a)              pTHXo = (CPerlObj*)a
-#define dTHXo                  pTHXo = PERL_GET_THX
-
-#define pTHXx          void
-#define pTHXx_
-#define aTHXx
-#define aTHXx_
-
-#else /* !PERL_OBJECT */
-
 #ifdef PERL_IMPLICIT_CONTEXT
-#  ifdef USE_THREADS
+#  ifdef USE_5005THREADS
 struct perl_thread;
-#    define pTHX       register struct perl_thread *thr
+#    define pTHX       register struct perl_thread *thr PERL_UNUSED_DECL
 #    define aTHX       thr
 #    define dTHR       dNOOP /* only backward compatibility */
 #    define dTHXa(a)   pTHX = (struct perl_thread*)a
@@ -189,7 +70,7 @@ struct perl_thread;
 #    ifndef MULTIPLICITY
 #      define MULTIPLICITY
 #    endif
-#    define pTHX       register PerlInterpreter *my_perl
+#    define pTHX       register PerlInterpreter *my_perl PERL_UNUSED_DECL
 #    define aTHX       my_perl
 #    define dTHXa(a)   pTHX = (PerlInterpreter*)a
 #  endif
@@ -212,8 +93,6 @@ struct perl_thread;
 #define PERL_OBJECT_THIS_
 #define CALL_FPTR(fptr) (*fptr)
 
-#endif /* PERL_OBJECT */
-
 #define CALLRUNOPS  CALL_FPTR(PL_runops)
 #define CALLREGCOMP CALL_FPTR(PL_regcompp)
 #define CALLREGEXEC CALL_FPTR(PL_regexecp)
@@ -225,8 +104,20 @@ struct perl_thread;
 #  define CALLPROTECT CALL_FPTR(PL_protect)
 #endif
 
+#ifdef HASATTRIBUTE
+#  define PERL_UNUSED_DECL __attribute__((unused))
+#else
+#  define PERL_UNUSED_DECL
+#endif
+
+/* gcc -Wall:
+ * for silencing unused variables that are actually used most of the time,
+ * but we cannot quite get rid of, such `ax' in PPCODE+noargs xsubs
+ */
+#define PERL_UNUSED_VAR(var) if (0) var = var
+
 #define NOOP (void)0
-#define dNOOP extern int Perl___notused
+#define dNOOP extern int Perl___notused PERL_UNUSED_DECL
 
 #ifndef pTHX
 #  define pTHX         void
@@ -241,7 +132,8 @@ struct perl_thread;
 #  define pTHX_4       4
 #endif
 
-#ifndef pTHXo
+/* these are only defined for compatibility; should not be used internally */
+#if !defined(pTHXo) && !defined(PERL_CORE)
 #  define pTHXo                pTHX
 #  define pTHXo_       pTHX_
 #  define aTHXo                aTHX
@@ -258,6 +150,15 @@ struct perl_thread;
 #  define dTHXx                dTHX
 #endif
 
+/* Under PERL_IMPLICIT_SYS (used in Windows for fork emulation)
+ * PerlIO_foo() expands to PL_StdIO->pFOO(PL_StdIO, ...).
+ * dTHXs is therefore needed for all functions using PerlIO_foo(). */
+#ifdef PERL_IMPLICIT_SYS
+#  define dTHXs                dTHX
+#else
+#  define dTHXs                dNOOP
+#endif
+
 #undef START_EXTERN_C
 #undef END_EXTERN_C
 #undef EXTERN_C
@@ -339,15 +240,15 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
  */
 
 /* define this once if either system, instead of cluttering up the src */
-#if defined(MSDOS) || defined(atarist) || defined(WIN32)
+#if defined(MSDOS) || defined(atarist) || defined(WIN32) || defined(NETWARE)
 #define DOSISH 1
 #endif
 
-#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined( EPOC)
+#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus) || defined( EPOC) || defined(NETWARE)
 # define STANDARD_C 1
 #endif
 
-#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX) || defined( EPOC) || defined(__QNX__)
+#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX) || defined( EPOC) || defined(__QNX__) || defined(NETWARE)
 # define DONT_DECLARE_STD 1
 #endif
 
@@ -417,10 +318,16 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #  endif
 #endif
 
+/* Use the reentrant APIs like localtime_r and getpwent_r */
+/* Win32 has naturally threadsafe libraries, no need to use any _r variants. */
+#if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(WIN32)
+#   define USE_REENTRANT_API
+#endif
+
 /* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
    pthread.h must be included before all other header files.
 */
-#if (defined(USE_THREADS) || defined(USE_ITHREADS)) \
+#if (defined(USE_5005THREADS) || defined(USE_ITHREADS)) \
     && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD)
 #  include <pthread.h>
 #endif
@@ -506,10 +413,21 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #   include <unistd.h>
 #endif
 
+#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO)
+int syscall(int, ...);
+#endif
+
+#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO)
+int usleep(unsigned int);
+#endif
+
 #ifdef PERL_MICRO /* Last chance to export Perl_my_swap */
 #  define MYSWAP
 #endif
 
+/* Cannot include embed.h here on Win32 as win32.h has not 
+   yet been included and defines some config variables e.g. HAVE_INTERP_INTERN
+ */
 #if !defined(PERL_FOR_X2P) && !defined(WIN32)
 #  include "embed.h"
 #endif
@@ -714,27 +632,32 @@ typedef struct perl_mstats perl_mstats_t;
 
 #include <errno.h>
 
-#if defined(WIN32) && (defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI))
+#if defined(WIN32) && defined(PERL_IMPLICIT_SYS)
 #  define WIN32SCK_IS_STDSCK           /* don't pull in custom wsock layer */
 #endif
 
-#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
+/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one */
+#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN)
+#  define _SOCKADDR_LEN
+#endif
+
+#if defined(HAS_SOCKET) && !defined(VMS) && !defined(WIN32) /* VMS/WIN32 handle sockets via vmsish.h/win32.h */
 # include <sys/socket.h>
 # if defined(USE_SOCKS) && defined(I_SOCKS)
 #   if !defined(INCLUDE_PROTOTYPES)
 #       define INCLUDE_PROTOTYPES /* for <socks.h> */
 #       define PERL_SOCKS_NEED_PROTOTYPES
 #   endif
-#   ifdef USE_THREADS
+#   ifdef USE_5005THREADS
 #       define PERL_USE_THREADS /* store our value */
-#       undef USE_THREADS
+#       undef USE_5005THREADS
 #   endif
 #   include <socks.h>
-#   ifdef USE_THREADS
-#       undef USE_THREADS /* socks.h does this on its own */
+#   ifdef USE_5005THREADS
+#       undef USE_5005THREADS /* socks.h does this on its own */
 #   endif
 #   ifdef PERL_USE_THREADS
-#       define USE_THREADS /* restore our value */
+#       define USE_5005THREADS /* restore our value */
 #       undef PERL_USE_THREADS
 #   endif
 #   ifdef PERL_SOCKS_NEED_PROTOTYPES /* keep cpp space clean */
@@ -743,6 +666,9 @@ typedef struct perl_mstats perl_mstats_t;
 #   endif
 # endif
 # ifdef I_NETDB
+#  ifdef NETWARE
+#   include<stdio.h>
+#  endif
 #  include <netdb.h>
 # endif
 # ifndef ENOTSOCK
@@ -752,6 +678,12 @@ typedef struct perl_mstats perl_mstats_t;
 # endif
 #endif
 
+/* sockatmark() is so new (2001) that many places might have it hidden
+ * behind some -D_BLAH_BLAH_SOURCE guard. */
+#if defined(HAS_SOCKATMARK) && !defined(HAS_SOCKATMARK_PROTO)
+int sockatmark(int);
+#endif
+
 #ifdef SETERRNO
 # undef SETERRNO  /* SOCKS might have defined this */
 #endif
@@ -766,7 +698,7 @@ typedef struct perl_mstats perl_mstats_t;
 #   define SETERRNO(errcode,vmserrcode) (errno = (errcode))
 #endif
 
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 #  define ERRSV (thr->errsv)
 #  define DEFSV THREADSV(0)
 #  define SAVE_DEFSV save_threadsv(0)
@@ -774,7 +706,7 @@ typedef struct perl_mstats perl_mstats_t;
 #  define ERRSV GvSV(PL_errgv)
 #  define DEFSV GvSV(PL_defgv)
 #  define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
-#endif /* USE_THREADS */
+#endif /* USE_5005THREADS */
 
 #define ERRHV GvHV(PL_errgv)   /* XXX unused, here for compatibility */
 
@@ -1023,6 +955,17 @@ typedef struct perl_mstats perl_mstats_t;
 #undef UV
 #endif
 
+#ifdef SPRINTF_E_BUG
+#  define sprintf UTS_sprintf_wrap
+#endif
+
+/* Configure gets this right but the UTS compiler gets it wrong.
+   -- Hal Morris <hom00@utsglobal.com> */
+#ifdef UTS
+#  undef  UVTYPE
+#  define UVTYPE unsigned
+#endif
+
 /*
     The IV type is supposed to be long enough to hold any integral
     value or a pointer.
@@ -1081,6 +1024,11 @@ typedef UVTYPE UV;
 #  endif
 #endif
 
+#if defined(uts) || defined(UTS)
+#      undef UV_MAX
+#      define UV_MAX (4294967295u)
+#endif
+
 #define IV_DIG (BIT_DIGITS(IVSIZE * 8))
 #define UV_DIG (BIT_DIGITS(UVSIZE * 8))
 
@@ -1206,6 +1154,21 @@ typedef NVTYPE NV;
 #   ifdef LDBL_MANT_DIG
 #       define NV_MANT_DIG LDBL_MANT_DIG
 #   endif
+#   ifdef LDBL_MIN
+#       define NV_MIN LDBL_MIN
+#   endif
+#   ifdef LDBL_MAX
+#       define NV_MAX LDBL_MAX
+#   endif
+#   ifdef LDBL_MIN_10_EXP
+#       define NV_MIN_10_EXP LDBL_MIN_10_EXP
+#   endif
+#   ifdef LDBL_MAX_10_EXP
+#       define NV_MAX_10_EXP LDBL_MAX_10_EXP
+#   endif
+#   ifdef LDBL_EPSILON
+#       define NV_EPSILON LDBL_EPSILON
+#   endif
 #   ifdef LDBL_MAX
 #       define NV_MAX LDBL_MAX
 #       define NV_MIN LDBL_MIN
@@ -1240,13 +1203,14 @@ typedef NVTYPE NV;
 #   else
 #       define Perl_frexp(x,y) ((long double)frexp((double)(x),y))
 #   endif
-#   ifdef HAS_ISNANL
-#       define Perl_isnan(x) isnanl(x)
-#   else
-#       ifdef HAS_ISNAN
-#           define Perl_isnan(x) isnan((double)(x))
-#       else
-#           define Perl_isnan(x) ((x)!=(x))
+#   ifndef Perl_isinf
+#       ifdef HAS_ISNANL
+#           define Perl_isnan(x) isnanl(x)
+#       endif
+#   endif
+#   ifndef Perl_isinf
+#       ifdef HAS_FINITEL
+#           define Perl_isinf(x) !(finitel(x)||Perl_isnan(x))
 #       endif
 #   endif
 #else
@@ -1254,6 +1218,21 @@ typedef NVTYPE NV;
 #   ifdef DBL_MANT_DIG
 #       define NV_MANT_DIG DBL_MANT_DIG
 #   endif
+#   ifdef DBL_MIN
+#       define NV_MIN DBL_MIN
+#   endif
+#   ifdef DBL_MAX
+#       define NV_MAX DBL_MAX
+#   endif
+#   ifdef DBL_MIN_10_EXP
+#       define NV_MIN_10_EXP DBL_MIN_10_EXP
+#   endif
+#   ifdef DBL_MAX_10_EXP
+#       define NV_MAX_10_EXP DBL_MAX_10_EXP
+#   endif
+#   ifdef DBL_EPSILON
+#       define NV_EPSILON DBL_EPSILON
+#   endif
 #   ifdef DBL_MAX
 #       define NV_MAX DBL_MAX
 #       define NV_MIN DBL_MIN
@@ -1273,32 +1252,145 @@ typedef NVTYPE NV;
 #   define Perl_fmod fmod
 #   define Perl_modf(x,y) modf(x,y)
 #   define Perl_frexp(x,y) frexp(x,y)
+#endif
+
+/* rumor has it that Win32 has _fpclass() */
+
+#if !defined(Perl_fp_class) && (defined(HAS_FPCLASS)||defined(HAS_FPCLASSL))
+#    ifdef I_IEEFP
+#        include <ieeefp.h>
+#    endif
+#    ifdef I_FP
+#        include <fp.h>
+#    endif
+#    if defined(USE_LONG_DOUBLE) && defined(HAS_FPCLASSL)
+#        define Perl_fp_class()                fpclassl(x)
+#    else
+#        define Perl_fp_class()                fpclass(x)
+#    endif
+#    define Perl_fp_class_snan(x)      (Perl_fp_class(x)==FP_CLASS_SNAN)
+#    define Perl_fp_class_qnan(x)      (Perl_fp_class(x)==FP_CLASS_QNAN)
+#    define Perl_fp_class_nan(x)       (Perl_fp_class(x)==FP_CLASS_SNAN||Perl_fp_class(x)==FP_CLASS_QNAN)
+#    define Perl_fp_class_ninf(x)      (Perl_fp_class(x)==FP_CLASS_NINF)
+#    define Perl_fp_class_pinf(x)      (Perl_fp_class(x)==FP_CLASS_PINF)
+#    define Perl_fp_class_inf(x)       (Perl_fp_class(x)==FP_CLASS_NINF||Perl_fp_class(x)==FP_CLASS_PINF)
+#    define Perl_fp_class_nnorm(x)     (Perl_fp_class(x)==FP_CLASS_NNORM)
+#    define Perl_fp_class_pnorm(x)     (Perl_fp_class(x)==FP_CLASS_PNORM)
+#    define Perl_fp_class_norm(x)      (Perl_fp_class(x)==FP_CLASS_NNORM||Perl_fp_class(x)==FP_CLASS_PNORM)
+#    define Perl_fp_class_ndenorm(x)   (Perl_fp_class(x)==FP_CLASS_NDENORM)
+#    define Perl_fp_class_pdenorm(x)   (Perl_fp_class(x)==FP_CLASS_PDENORM)
+#    define Perl_fp_class_denorm(x)    (Perl_fp_class(x)==FP_CLASS_NDENORM||Perl_fp_class(x)==FP_CLASS_PDENORM)
+#    define Perl_fp_class_nzero(x)     (Perl_fp_class(x)==FP_CLASS_NZERO)
+#    define Perl_fp_class_pzero(x)     (Perl_fp_class(x)==FP_CLASS_PZERO)
+#    define Perl_fp_class_zero(x)      (Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS)
+#    include <math.h>
+#    if !defined(FP_SNAN) && defined(I_FP_CLASS)
+#        include <fp_class.h>
+#    endif
+#    define Perl_fp_class(x)           fp_class(x)
+#    define Perl_fp_class_snan(x)      (fp_class(x)==FP_SNAN)
+#    define Perl_fp_class_qnan(x)      (fp_class(x)==FP_QNAN)
+#    define Perl_fp_class_nan(x)       (fp_class(x)==FP_SNAN||fp_class(x)==FP_QNAN)
+#    define Perl_fp_class_ninf(x)      (fp_class(x)==FP_NEG_INF)
+#    define Perl_fp_class_pinf(x)      (fp_class(x)==FP_POS_INF)
+#    define Perl_fp_class_inf(x)       (fp_class(x)==FP_NEG_INF||fp_class(x)==FP_POS_INF)
+#    define Perl_fp_class_nnorm(x)     (fp_class(x)==FP_NEG_NORM)
+#    define Perl_fp_class_pnorm(x)     (fp_class(x)==FP_POS_NORM)
+#    define Perl_fp_class_norm(x)      (fp_class(x)==FP_NEG_NORM||fp_class(x)==FP_POS_NORM)
+#    define Perl_fp_class_ndenorm(x)   (fp_class(x)==FP_NEG_DENORM)
+#    define Perl_fp_class_pdenorm(x)   (fp_class(x)==FP_POS_DENORM)
+#    define Perl_fp_class_denorm(x)    (fp_class(x)==FP_NEG_DENORM||fp_class(x)==FP_POS_DENORM)
+#    define Perl_fp_class_nzero(x)     (fp_class(x)==FP_NEG_ZERO)
+#    define Perl_fp_class_pzero(x)     (fp_class(x)==FP_POS_ZERO)
+#    define Perl_fp_class_zero(x)      (fp_class(x)==FP_NEG_ZERO||fp_class(x)==FP_POS_ZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_FPCLASSIFY)
+#    include <math.h>
+#    define Perl_fp_class(x)           fpclassify(x)
+#    define Perl_fp_class_nan(x)       (fp_classify(x)==FP_SNAN|FP|_fp_classify(x)==QNAN)
+#    define Perl_fp_class_inf(x)       (fp_classify(x)==FP_INFINITE)
+#    define Perl_fp_class_norm(x)      (fp_classify(x)==FP_NORMAL)
+#    define Perl_fp_class_denorm(x)    (fp_classify(x)==FP_SUBNORMAL)
+#    define Perl_fp_class_zero(x)      (fp_classify(x)==FP_ZERO)
+#endif
+
+#if !defined(Perl_fp_class) && defined(HAS_CLASS)
+#    include <math.h>
+#    ifndef _cplusplus
+#        define Perl_fp_class(x)       class(x)
+#    else
+#        define Perl_fp_class(x)       _class(x)
+#    endif
+#    define Perl_fp_class_snan(x)      (Perl_fp_class(x)==FP_NANS)
+#    define Perl_fp_class_qnan(x)      (Perl_fp_class(x)==FP_NANQ)
+#    define Perl_fp_class_nan(x)       (Perl_fp_class(x)==FP_SNAN||Perl_fp_class(x)==FP_QNAN)
+#    define Perl_fp_class_ninf(x)      (Perl_fp_class(x)==FP_MINUS_INF)
+#    define Perl_fp_class_pinf(x)      (Perl_fp_class(x)==FP_PLUS_INF)
+#    define Perl_fp_class_inf(x)       (Perl_fp_class(x)==FP_MINUS_INF||Perl_fp_class(x)==FP_PLUS_INF)
+#    define Perl_fp_class_nnorm(x)     (Perl_fp_class(x)==FP_MINUS_NORM)
+#    define Perl_fp_class_pnorm(x)     (Perl_fp_class(x)==FP_PLUS_NORM)
+#    define Perl_fp_class_norm(x)      (Perl_fp_class(x)==FP_MINUS_NORM||Perl_fp_class(x)==FP_PLUS_NORM)
+#    define Perl_fp_class_ndenorm(x)   (Perl_fp_class(x)==FP_MINUS_DENORM)
+#    define Perl_fp_class_pdenorm(x)   (Perl_fp_class(x)==FP_PLUS_DENORM)
+#    define Perl_fp_class_denorm(x)    (Perl_fp_class(x)==FP_MINUS_DENORM||Perl_fp_class(x)==FP_PLUS_DENORM)
+#    define Perl_fp_class_nzero(x)     (Perl_fp_class(x)==FP_MINUS_ZERO)
+#    define Perl_fp_class_pzero(x)     (Perl_fp_class(x)==FP_PLUS_ZERO)
+#    define Perl_fp_class_zero(x)      (Perl_fp_class(x)==FP_MINUS_ZERO||Perl_fp_class(x)==FP_PLUS_ZERO)
+#endif
+
+/* rumor has it that Win32 has _isnan() */
+
+#ifndef Perl_isnan
 #   ifdef HAS_ISNAN
-#       define Perl_isnan(x) isnan(x)
+#       define Perl_isnan(x) isnan((NV)x)
 #   else
-#       define Perl_isnan(x) ((x)!=(x))
+#       ifdef Perl_fp_class_nan
+#           define Perl_isnan(x) Perl_fp_class_nan(x)
+#       else
+#           ifdef HAS_UNORDERED
+#               define Perl_isnan(x) unordered((x), 0.0)
+#           else
+#               define Perl_isnan(x) ((x)!=(x))
+#           endif
+#       endif
 #   endif
 #endif
 
-#if !defined(Perl_atof) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
-#   if !defined(Perl_atof) && defined(HAS_STRTOLD)
-#       define Perl_atof(s) (NV)strtold(s, (char**)NULL)
-#   endif
-#   if !defined(Perl_atof) && defined(HAS_ATOLF)
-#       define Perl_atof (NV)atolf
-#   endif
-#   if !defined(Perl_atof) && defined(PERL_SCNfldbl)
-#       define Perl_atof PERL_SCNfldbl
-#       define Perl_atof2(s,f) sscanf((s), "%"PERL_SCNfldbl, &(f))
+#ifndef Perl_isinf
+#   ifdef HAS_ISINF
+#       define Perl_isinf(x) isinf((NV)x)
+#   else
+#       ifdef Perl_fp_class_inf
+#           define Perl_isinf(x) Perl_fp_class_inf(x)
+#       else
+#           define Perl_isinf(x) ((x)==NV_INF)
+#       endif
 #   endif
 #endif
-#if !defined(Perl_atof)
-#   define Perl_atof atof /* we assume atof being available anywhere */
-#endif
-#if !defined(Perl_atof2)
-#   define Perl_atof2(s,f) ((f) = (NV)Perl_atof(s))
+
+#ifndef Perl_isfinite
+#   ifdef HAS_FINITE
+#       define Perl_isfinite(x) finite((NV)x)
+#   else
+#       ifdef HAS_ISFINITE
+#           define Perl_isfinite(x) isfinite(x)
+#       else
+#           ifdef Perl_fp_class_finite
+#               define Perl_isfinite(x) Perl_fp_class_finite(x)
+#           else
+#               define Perl_isfinite(x) !(Perl_is_inf(x)||Perl_is_nan(x))
+#           endif
+#       endif
+#   endif
 #endif
 
+#define Perl_atof(s) Perl_my_atof(s)
+#define Perl_atof2(s, np) Perl_my_atof2(s, np)
+
 /* Previously these definitions used hardcoded figures.
  * It is hoped these formula are more portable, although
  * no data one way or another is presently known to me.
@@ -1505,8 +1597,11 @@ typedef struct pvop PVOP;
 typedef struct loop LOOP;
 
 typedef struct interpreter PerlInterpreter;
-#ifdef UTS
-#   define STRUCT_SV perl_sv /* Amdahl's <ksync.h> has struct sv */
+
+/* Amdahl's <ksync.h> has struct sv */
+/* SGI's <sys/sema.h> has struct sv */
+#if defined(UTS) || defined(__sgi)
+#   define STRUCT_SV perl_sv
 #else
 #   define STRUCT_SV sv
 #endif
@@ -1540,6 +1635,8 @@ typedef struct mgvtbl MGVTBL;
 typedef union any ANY;
 typedef struct ptr_tbl_ent PTR_TBL_ENT_t;
 typedef struct ptr_tbl PTR_TBL_t;
+typedef struct clone_params CLONE_PARAMS;
+
 
 #include "handy.h"
 
@@ -1699,10 +1796,32 @@ typedef struct ptr_tbl PTR_TBL_t;
 #   define NEED_ENVIRON_DUP_FOR_MODIFY
 #endif
 
+/*
+ * initialise to avoid floating-point exceptions from overflow, etc
+ */
+#ifndef PERL_FPU_INIT
+#  ifdef HAS_FPSETMASK
+#    if HAS_FLOATINGPOINT_H
+#      include <floatingpoint.h>
+#    endif
+#    define PERL_FPU_INIT fpsetmask(0);
+#  else
+#    if defined(SIGFPE) && defined(SIG_IGN)
+#      define PERL_FPU_INIT signal(SIGFPE, SIG_IGN);
+#    else
+#      define PERL_FPU_INIT
+#    endif
+#  endif
+#endif
+
 #ifndef PERL_SYS_INIT3
 #  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
 #endif
 
+#ifndef PERL_WRITE_MSG_TO_CONSOLE
+#  define PERL_WRITE_MSG_TO_CONSOLE(io, msg, len) PerlIO_write(io, msg, len)
+#endif
+
 #ifndef MAXPATHLEN
 #  ifdef PATH_MAX
 #    ifdef _POSIX_PATH_MAX
@@ -1726,18 +1845,21 @@ typedef struct ptr_tbl PTR_TBL_t;
 #endif
 
 /*
- * USE_THREADS needs to be after unixish.h as <pthread.h> includes
+ * USE_5005THREADS needs to be after unixish.h as <pthread.h> includes
  * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
  * this results in many functions being undeclared which bothers C++
  * May make sense to have threads after "*ish.h" anyway
  */
 
-#if defined(USE_THREADS) || defined(USE_ITHREADS)
-#  if defined(USE_THREADS)
+#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
+#  if defined(USE_5005THREADS)
    /* pending resolution of licensing issues, we avoid the erstwhile
     * atomic.h everywhere */
 #  define EMULATE_ATOMIC_REFCOUNTS
 #  endif
+#  ifdef NETWARE
+#   include <nw5thread.h>
+#  else
 #  ifdef FAKE_THREADS
 #    include "fakethr.h"
 #  else
@@ -1768,12 +1890,17 @@ typedef pthread_key_t   perl_key;
 #      endif /* OS2 */
 #    endif /* WIN32 */
 #  endif /* FAKE_THREADS */
-#endif /* USE_THREADS || USE_ITHREADS */
+#endif /* NETWARE */
+#endif /* USE_5005THREADS || USE_ITHREADS */
 
-#ifdef WIN32
+#if defined(WIN32)
 #  include "win32.h"
 #endif
 
+#ifdef NETWARE
+#  include "netware.h"
+#endif
+
 #ifdef VMS
 #   define STATUS_NATIVE       PL_statusvalue_vms
 #   define STATUS_NATIVE_EXPORT \
@@ -1825,6 +1952,7 @@ typedef pthread_key_t     perl_key;
 
 /* flags in PL_exit_flags for nature of exit() */
 #define PERL_EXIT_EXPECTED     0x01
+#define PERL_EXIT_DESTRUCT_END  0x02  /* Run END in perl_destruct */
 
 #ifndef MEMBER_TO_FPTR
 #  define MEMBER_TO_FPTR(name)         name
@@ -1837,10 +1965,12 @@ typedef pthread_key_t   perl_key;
 #endif
 
 /* This defines a way to flush all output buffers.  This may be a
- * performance issue, so we allow people to disable it.
+ * performance issue, so we allow people to disable it.  Also, if
+ * we are using stdio, there are broken implementations of fflush(NULL)
+ * out there, Solaris being the most prominent.
  */
 #ifndef PERL_FLUSHALL_FOR_CHILD
-# if defined(FFLUSH_NULL) || defined(USE_SFIO)
+# if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
 #  define PERL_FLUSHALL_FOR_CHILD      PerlIO_flush((PerlIO*)NULL)
 # else
 #  ifdef FFLUSH_ALL
@@ -1865,15 +1995,11 @@ typedef pthread_key_t   perl_key;
 #endif
 
 #if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_GET_THX)
-#  ifdef USE_THREADS
+#  ifdef USE_5005THREADS
 #    define PERL_GET_THX               ((struct perl_thread *)PERL_GET_CONTEXT)
 #  else
 #  ifdef MULTIPLICITY
 #    define PERL_GET_THX               ((PerlInterpreter *)PERL_GET_CONTEXT)
-#  else
-#  ifdef PERL_OBJECT
-#    define PERL_GET_THX               ((CPerlObj *)PERL_GET_CONTEXT)
-#  endif
 #  endif
 #  endif
 #  define PERL_SET_THX(t)              PERL_SET_CONTEXT(t)
@@ -1903,6 +2029,14 @@ typedef pthread_key_t    perl_key;
 #  endif
 #endif
 
+#ifndef Nullformat
+#  ifdef CHECK_FORMAT
+#    define Nullformat "%s",""
+#  else
+#    define Nullformat Nullch
+#  endif
+#endif
+
 /* Some unistd.h's give a prototype for pause() even though
    HAS_PAUSE ends up undefined.  This causes the #define
    below to be rejected by the compiler.  Sigh.
@@ -1944,17 +2078,17 @@ union any {
     IV         any_iv;
     long       any_long;
     void       (*any_dptr) (void*);
-    void       (*any_dxptr) (pTHXo_ void*);
+    void       (*any_dxptr) (pTHX_ void*);
 };
 #endif
 
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 #define ARGSproto struct perl_thread *thr
 #else
 #define ARGSproto
-#endif /* USE_THREADS */
+#endif /* USE_5005THREADS */
 
-typedef I32 (*filter_t) (pTHXo_ int, SV *, int);
+typedef I32 (*filter_t) (pTHX_ int, SV *, int);
 
 #define FILTER_READ(idx, sv, len)  filter_read(idx, sv, len)
 #define FILTER_DATA(idx)          (AvARRAY(PL_rsfp_filters)[idx])
@@ -1978,6 +2112,7 @@ typedef I32 (*filter_t) (pTHXo_ int, SV *, int);
 #include "scope.h"
 #include "warnings.h"
 #include "utf8.h"
+#include "sharedsv.h"
 
 /* Current curly descriptor */
 typedef struct curcur CURCUR;
@@ -2079,25 +2214,52 @@ struct ptr_tbl {
        /* otherwise default to functions in util.c */
 #endif
 
-#ifdef CASTNEGFLOAT
-#define U_S(what) ((U16)(what))
-#define U_I(what) ((unsigned int)(what))
-#define U_L(what) ((U32)(what))
-#else
-#define U_S(what) ((U16)cast_ulong((NV)(what)))
-#define U_I(what) ((unsigned int)cast_ulong((NV)(what)))
-#define U_L(what) (cast_ulong((NV)(what)))
-#endif
+/* *MAX Plus 1. A floating point value.
+   Hopefully expressed in a way that dodgy floating point can't mess up.
+   >> 2 rather than 1, so that value is safely less than I32_MAX after 1
+   is added to it
+   May find that some broken compiler will want the value cast to I32.
+   [after the shift, as signed >> may not be as secure as unsigned >>]
+*/
+#define I32_MAX_P1 (2.0 * (1 + (((U32)I32_MAX) >> 1)))
+#define U32_MAX_P1 (4.0 * (1 + ((U32_MAX) >> 2)))
+/* For compilers that can't correctly cast NVs over 0x7FFFFFFF (or
+   0x7FFFFFFFFFFFFFFF) to an unsigned integer. In the future, sizeof(UV)
+   may be greater than sizeof(IV), so don't assume that half max UV is max IV.
+*/
+#define U32_MAX_P1_HALF (2.0 * (1 + ((U32_MAX) >> 2)))
 
-#ifdef CASTI32
-#define I_32(what) ((I32)(what))
-#define I_V(what) ((IV)(what))
-#define U_V(what) ((UV)(what))
-#else
+#define UV_MAX_P1 (4.0 * (1 + ((UV_MAX) >> 2)))
+#define IV_MAX_P1 (2.0 * (1 + (((UV)IV_MAX) >> 1)))
+#define UV_MAX_P1_HALF (2.0 * (1 + ((UV_MAX) >> 2)))
+
+/* This may look like unnecessary jumping through hoops, but converting
+   out of range floating point values to integers *is* undefined behaviour,
+   and it is starting to bite.
+*/
+#ifndef CAST_INLINE
 #define I_32(what) (cast_i32((NV)(what)))
+#define U_32(what) (cast_ulong((NV)(what)))
 #define I_V(what) (cast_iv((NV)(what)))
 #define U_V(what) (cast_uv((NV)(what)))
-#endif
+#else
+#define I_32(n) ((n) < I32_MAX_P1 ? ((n) < I32_MIN ? I32_MIN : (I32) (n)) \
+                  : ((n) < U32_MAX_P1 ? (I32)(U32) (n) \
+                     : ((n) > 0 ? (I32) U32_MAX : 0 /* NaN */)))
+#define U_32(n) ((n) < 0.0 ? ((n) < I32_MIN ? (UV) I32_MIN : (U32)(I32) (n)) \
+                  : ((n) < U32_MAX_P1 ? (U32) (n) \
+                     : ((n) > 0 ? U32_MAX : 0 /* NaN */)))
+#define I_V(n) ((n) < IV_MAX_P1 ? ((n) < IV_MIN ? IV_MIN : (IV) (n)) \
+                  : ((n) < UV_MAX_P1 ? (IV)(UV) (n) \
+                     : ((n) > 0 ? (IV)UV_MAX : 0 /* NaN */)))
+#define U_V(n) ((n) < 0.0 ? ((n) < IV_MIN ? (UV) IV_MIN : (UV)(IV) (n)) \
+                  : ((n) < UV_MAX_P1 ? (UV) (n) \
+                     : ((n) > 0 ? UV_MAX : 0 /* NaN */)))
+#endif
+
+#define U_S(what) ((U16)U_32(what))
+#define U_I(what) ((unsigned int)U_32(what))
+#define U_L(what) U_32(what)
 
 /* These do not care about the fractional part, only about the range. */
 #define NV_WITHIN_IV(nv) (I_V(nv) >= IV_MIN && I_V(nv) <= IV_MAX)
@@ -2113,11 +2275,13 @@ struct ptr_tbl {
 #endif
 
 #ifndef __cplusplus
+#ifndef UNDER_CE
 Uid_t getuid (void);
 Uid_t geteuid (void);
 Gid_t getgid (void);
 Gid_t getegid (void);
 #endif
+#endif
 
 #ifndef Perl_debug_log
 #  define Perl_debug_log       PerlIO_stderr()
@@ -2150,7 +2314,8 @@ Gid_t getegid (void);
 #define DEBUG_D_FLAG           0x00008000 /*  32768 */
 #define DEBUG_S_FLAG           0x00010000 /*  65536 */
 #define DEBUG_T_FLAG           0x00020000 /* 131072 */
-#define DEBUG_MASK             0x0003FFFF /* mask of all the standard flags */
+#define DEBUG_R_FLAG           0x00040000 /* 262144 */
+#define DEBUG_MASK             0x0007FFFF /* mask of all the standard flags */
 
 #define DEBUG_DB_RECURSE_FLAG  0x40000000
 #define DEBUG_TOP_FLAG         0x80000000 /* XXX what's this for ??? */
@@ -2179,6 +2344,7 @@ Gid_t getegid (void);
 #  define DEBUG_D_TEST (PL_debug & DEBUG_D_FLAG)
 #  define DEBUG_S_TEST (PL_debug & DEBUG_S_FLAG)
 #  define DEBUG_T_TEST (PL_debug & DEBUG_T_FLAG)
+#  define DEBUG_R_TEST (PL_debug & DEBUG_R_FLAG)
 
 #  define DEB(a)     a
 #  define DEBUG(a)   if (PL_debug)   a
@@ -2190,33 +2356,35 @@ Gid_t getegid (void);
 #  define DEBUG_c(a) if (DEBUG_c_TEST) a
 #  define DEBUG_P(a) if (DEBUG_P_TEST) a
 
-#  if defined(PERL_OBJECT)
-#    define DEBUG_m(a) if (DEBUG_m_TEST) a
-#  else
      /* Temporarily turn off memory debugging in case the a
       * does memory allocation, either directly or indirectly. */
-#    define DEBUG_m(a)  \
+#  define DEBUG_m(a)  \
     STMT_START {                                                       \
         if (PERL_GET_INTERP) { dTHX; if (DEBUG_m_TEST) {PL_debug&=~DEBUG_m_FLAG; a; PL_debug|=DEBUG_m_FLAG;} } \
     } STMT_END
-#  endif
 
-#  define DEBUG_f(a) if (DEBUG_f_TEST) a
-#  define DEBUG_r(a) if (DEBUG_r_TEST) a
-#  define DEBUG_x(a) if (DEBUG_x_TEST) a
-#  define DEBUG_u(a) if (DEBUG_u_TEST) a
-#  define DEBUG_L(a) if (DEBUG_L_TEST) a
-#  define DEBUG_H(a) if (DEBUG_H_TEST) a
-#  define DEBUG_X(a) if (DEBUG_X_TEST) a
-#  define DEBUG_D(a) if (DEBUG_D_TEST) a
-
-#  ifdef USE_THREADS
-#    define DEBUG_S(a) if (DEBUG_S_TEST) a
+#  define DEBUG__(t, a) \
+       STMT_START { \
+               if (t) STMT_START {a;} STMT_END; \
+       } STMT_END
+
+#  define DEBUG_f(a) DEBUG__(DEBUG_f_TEST, a)
+#  define DEBUG_r(a) DEBUG__(DEBUG_r_TEST, a)
+#  define DEBUG_x(a) DEBUG__(DEBUG_x_TEST, a)
+#  define DEBUG_u(a) DEBUG__(DEBUG_u_TEST, a)
+#  define DEBUG_L(a) DEBUG__(DEBUG_L_TEST, a)
+#  define DEBUG_H(a) DEBUG__(DEBUG_H_TEST, a)
+#  define DEBUG_X(a) DEBUG__(DEBUG_X_TEST, a)
+#  define DEBUG_D(a) DEBUG__(DEBUG_D_TEST, a)
+
+#  ifdef USE_5005THREADS
+#    define DEBUG_S(a) DEBUG__(DEBUG_S_TEST, a)
 #  else
 #    define DEBUG_S(a)
 #  endif
 
-#  define DEBUG_T(a) if (DEBUG_T_TEST) a
+#  define DEBUG_T(a) DEBUG__(DEBUG_T_TEST, a)
+#  define DEBUG_R(a) DEBUG__(DEBUG_R_TEST, a)
 
 #else /* DEBUGGING */
 
@@ -2238,6 +2406,7 @@ Gid_t getegid (void);
 #  define DEBUG_D_TEST (0)
 #  define DEBUG_S_TEST (0)
 #  define DEBUG_T_TEST (0)
+#  define DEBUG_R_TEST (0)
 
 #  define DEB(a)
 #  define DEBUG(a)
@@ -2259,9 +2428,56 @@ Gid_t getegid (void);
 #  define DEBUG_D(a)
 #  define DEBUG_S(a)
 #  define DEBUG_T(a)
+#  define DEBUG_R(a)
 #endif /* DEBUGGING */
 
 
+/* These constants should be used in preference to to raw characters
+ * when using magic. Note that some perl guts still assume
+ * certain character properties of these constants, namely that
+ * isUPPER() and toLOWER() may do useful mappings.
+ *
+ * Update the magic_names table in dump.c when adding/amending these
+ */
+
+#define PERL_MAGIC_sv            '\0' /* Special scalar variable */
+#define PERL_MAGIC_overload      'A' /* %OVERLOAD hash */
+#define PERL_MAGIC_overload_elem  'a' /* %OVERLOAD hash element */
+#define PERL_MAGIC_overload_table 'c' /* Holds overload table (AMT) on stash */
+#define PERL_MAGIC_bm            'B' /* Boyer-Moore (fast string search) */
+#define PERL_MAGIC_regdata       'D' /* Regex match position data
+                                       (@+ and @- vars) */
+#define PERL_MAGIC_regdatum      'd' /* Regex match position data element */
+#define PERL_MAGIC_env           'E' /* %ENV hash */
+#define PERL_MAGIC_envelem       'e' /* %ENV hash element */
+#define PERL_MAGIC_fm            'f' /* Formline ('compiled' format) */
+#define PERL_MAGIC_regex_global          'g' /* m//g target / study()ed string */
+#define PERL_MAGIC_isa           'I' /* @ISA array */
+#define PERL_MAGIC_isaelem       'i' /* @ISA array element */
+#define PERL_MAGIC_nkeys         'k' /* scalar(keys()) lvalue */
+#define PERL_MAGIC_dbfile        'L' /* Debugger %_<filename */
+#define PERL_MAGIC_dbline        'l' /* Debugger %_<filename element */
+#define PERL_MAGIC_mutex         'm' /* ??? */
+#define PERL_MAGIC_collxfrm      'o' /* Locale transformation */
+#define PERL_MAGIC_tied                  'P' /* Tied array or hash */
+#define PERL_MAGIC_tiedelem      'p' /* Tied array or hash element */
+#define PERL_MAGIC_tiedscalar    'q' /* Tied scalar or handle */
+#define PERL_MAGIC_qr            'r' /* precompiled qr// regex */
+#define PERL_MAGIC_sig           'S' /* %SIG hash */
+#define PERL_MAGIC_sigelem       's' /* %SIG hash element */
+#define PERL_MAGIC_taint         't' /* Taintedness */
+#define PERL_MAGIC_uvar                  'U' /* Available for use by extensions */
+#define PERL_MAGIC_vec           'v' /* vec() lvalue */
+#define PERL_MAGIC_substr        'x' /* substr() lvalue */
+#define PERL_MAGIC_defelem       'y' /* Shadow "foreach" iterator variable /
+                                       smart parameter vivification */
+#define PERL_MAGIC_glob                  '*' /* GV (typeglob) */
+#define PERL_MAGIC_arylen        '#' /* Array length ($#ary) */
+#define PERL_MAGIC_pos           '.' /* pos() lvalue */
+#define PERL_MAGIC_backref       '<' /* ??? */
+#define PERL_MAGIC_ext           '~' /* Available for use by extensions */
+
+
 #define YYMAXDEPTH 300
 
 #ifndef assert  /* <assert.h> might have been included somehow */
@@ -2279,7 +2495,7 @@ struct ufuncs {
     IV uf_index;
 };
 
-/* In pre-5.7-Perls the 'U' magic didn't get the thread context.
+/* In pre-5.7-Perls the PERL_MAGIC_uvar magic didn't get the thread context.
  * XS code wanting to be backward compatible can do something
  * like the following:
 
@@ -2341,11 +2557,60 @@ START_EXTERN_C
 END_EXTERN_C
 #endif
 
+#if !defined(NV_INF) && defined(USE_LONG_DOUBLE) && defined(LDBL_INFINITY)
+#  define NV_INF LDBL_INFINITY
+#endif
+#if !defined(NV_INF) && defined(DBL_INFINITY)
+#  define NV_INF (NV)DBL_INFINITY
+#endif
+#if !defined(NV_INF) && defined(INFINITY)
+#  define NV_INF (NV)INFINITY
+#endif
+#if !defined(NV_INF) && defined(INF)
+#  define NV_INF (NV)INF
+#endif
+#if !defined(NV_INF) && defined(USE_LONG_DOUBLE) && defined(HUGE_VALL)
+#  define NV_INF (NV)HUGE_VALL
+#endif
+#if !defined(NV_INF) && defined(HUGE_VAL)
+#  define NV_INF (NV)HUGE_VAL
+#endif
+
+#if !defined(NV_NAN) && defined(USE_LONG_DOUBLE)
+#   if !defined(NV_NAN) && defined(LDBL_NAN)
+#       define NV_NAN LDBL_NAN
+#   endif
+#   if !defined(NV_NAN) && defined(LDBL_QNAN)
+#       define NV_NAN LDBL_QNAN
+#   endif
+#   if !defined(NV_NAN) && defined(LDBL_SNAN)
+#       define NV_NAN LDBL_SNAN
+#   endif
+#endif
+#if !defined(NV_NAN) && defined(DBL_NAN)
+#  define NV_NAN (NV)DBL_NAN
+#endif
+#if !defined(NV_NAN) && defined(DBL_QNAN)
+#  define NV_NAN (NV)DBL_QNAN
+#endif
+#if !defined(NV_NAN) && defined(DBL_SNAN)
+#  define NV_NAN (NV)DBL_SNAN
+#endif
+#if !defined(NV_NAN) && defined(QNAN)
+#  define NV_NAN (NV)QNAN
+#endif
+#if !defined(NV_NAN) && defined(SNAN)
+#  define NV_NAN (NV)SNAN
+#endif
+#if !defined(NV_NAN) && defined(NAN)
+#  define NV_NAN (NV)NAN
+#endif
+
 #ifndef __cplusplus
 #  if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
 char *crypt ();       /* Maybe more hosts will need the unprototyped version */
 #  else
-#    if !defined(WIN32)
+#    if !defined(WIN32) && !defined(VMS)
 char *crypt (const char*, const char*);
 #    endif /* !WIN32 */
 #  endif /* !NeXT && !__NeXT__ */
@@ -2371,6 +2636,15 @@ I32 unlnk (char*);
 #define UNLINK PerlLIO_unlink
 #endif
 
+/* some versions of glibc are missing the setresuid() proto */
+#if defined(HAS_SETRESUID) && !defined(HAS_SETRESUID_PROTO)
+int setresuid(uid_t ruid, uid_t euid, uid_t suid);
+#endif
+/* some versions of glibc are missing the setresgid() proto */
+#if defined(HAS_SETRESGID) && !defined(HAS_SETRESGID_PROTO)
+int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
+#endif
+
 #ifndef HAS_SETREUID
 #  ifdef HAS_SETRESUID
 #    define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
@@ -2513,216 +2787,6 @@ EXT int   PL_sig_num[];
 
 #ifdef DOINIT
 #ifdef EBCDIC
-#if '^' == 106  /* if defined(_OSD_POSIX) POSIX-BC */
-EXT unsigned char PL_e2a[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */
-      0,      1,      2,      3,     55,     45,     46,     47,
-     22,      5,     21,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,     60,     61,     50,     38,
-     24,     25,     63,     39,     28,     29,     30,     31,
-     64,     90,    127,    123,     91,    108,     80,    125,
-     77,     93,     92,     78,    107,     96,     75,     97,
-    240,    241,    242,    243,    244,    245,    246,    247,
-    248,    249,    122,     94,     76,    126,    110,    111,
-    124,    193,    194,    195,    196,    197,    198,    199,
-    200,    201,    209,    210,    211,    212,    213,    214,
-    215,    216,    217,    226,    227,    228,    229,    230,
-    231,    232,    233,    187,    188,    189,    106,    109,
-     74,    129,    130,    131,    132,    133,    134,    135,
-    136,    137,    145,    146,    147,    148,    149,    150,
-    151,    152,    153,    162,    163,    164,    165,    166,
-    167,    168,    169,    251,     79,    253,    255,      7,
-     32,     33,     34,     35,     36,     37,      6,     23,
-     40,     41,     42,     43,     44,      9,     10,     27,
-     48,     49,     26,     51,     52,     53,     54,      8,
-     56,     57,     58,     59,      4,     20,     62,     95,
-     65,    170,    176,    177,    159,    178,    208,    181,
-    121,    180,    154,    138,    186,    202,    175,    161,
-    144,    143,    234,    250,    190,    160,    182,    179,
-    157,    218,    155,    139,    183,    184,    185,    171,
-    100,    101,     98,    102,     99,    103,    158,    104,
-    116,    113,    114,    115,    120,    117,    118,    119,
-    172,    105,    237,    238,    235,    239,    236,    191,
-    128,    224,    254,    221,    252,    173,    174,     89,
-     68,     69,     66,     70,     67,     71,    156,     72,
-     84,     81,     82,     83,     88,     85,     86,     87,
-    140,     73,    205,    206,    203,    207,    204,    225,
-    112,    192,    222,    219,    220,    141,    142,    223
-};
-EXT unsigned char PL_a2e[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */
-      0,      1,      2,      3,    156,      9,    134,    127,
-    151,    141,    142,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,    157,     10,      8,    135,
-     24,     25,    146,    143,     28,     29,     30,     31,
-    128,    129,    130,    131,    132,    133,     23,     27,
-    136,    137,    138,    139,    140,      5,      6,      7,
-    144,    145,     22,    147,    148,    149,    150,      4,
-    152,    153,    154,    155,     20,     21,    158,     26,
-     32,    160,    226,    228,    224,    225,    227,    229,
-    231,    241,     96,     46,     60,     40,     43,    124,
-     38,    233,    234,    235,    232,    237,    238,    239,
-    236,    223,     33,     36,     42,     41,     59,    159,
-     45,     47,    194,    196,    192,    193,    195,    197,
-    199,    209,     94,     44,     37,     95,     62,     63,
-    248,    201,    202,    203,    200,    205,    206,    207,
-    204,    168,     58,     35,     64,     39,     61,     34,
-    216,     97,     98,     99,    100,    101,    102,    103,
-    104,    105,    171,    187,    240,    253,    254,    177,
-    176,    106,    107,    108,    109,    110,    111,    112,
-    113,    114,    170,    186,    230,    184,    198,    164,
-    181,    175,    115,    116,    117,    118,    119,    120,
-    121,    122,    161,    191,    208,    221,    222,    174,
-    162,    163,    165,    183,    169,    167,    182,    188,
-    189,    190,    172,     91,     92,     93,    180,    215,
-    249,     65,     66,     67,     68,     69,     70,     71,
-     72,     73,    173,    244,    246,    242,    243,    245,
-    166,     74,     75,     76,     77,     78,     79,     80,
-     81,     82,    185,    251,    252,    219,    250,    255,
-    217,    247,     83,     84,     85,     86,     87,     88,
-     89,     90,    178,    212,    214,    210,    211,    213,
-     48,     49,     50,     51,     52,     53,     54,     55,
-     56,     57,    179,    123,    220,    125,    218,    126
-};
-#endif          /* POSIX-BC */
-#if '^' == 176  /* if defined(??) (OS/400?) 037 */
-EXT unsigned char PL_e2a[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */
-      0,      1,      2,      3,     55,     45,     46,     47,
-     22,      5,     37,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,     60,     61,     50,     38,
-     24,     25,     63,     39,     28,     29,     30,     31,
-     64,     90,    127,    123,     91,    108,     80,    125,
-     77,     93,     92,     78,    107,     96,     75,     97,
-    240,    241,    242,    243,    244,    245,    246,    247,
-    248,    249,    122,     94,     76,    126,    110,    111,
-    124,    193,    194,    195,    196,    197,    198,    199,
-    200,    201,    209,    210,    211,    212,    213,    214,
-    215,    216,    217,    226,    227,    228,    229,    230,
-    231,    232,    233,    186,    224,    187,    176,    109,
-    121,    129,    130,    131,    132,    133,    134,    135,
-    136,    137,    145,    146,    147,    148,    149,    150,
-    151,    152,    153,    162,    163,    164,    165,    166,
-    167,    168,    169,    192,     79,    208,    161,      7,
-     32,     33,     34,     35,     36,     21,      6,     23,
-     40,     41,     42,     43,     44,      9,     10,     27,
-     48,     49,     26,     51,     52,     53,     54,      8,
-     56,     57,     58,     59,      4,     20,     62,    255,
-     65,    170,     74,    177,    159,    178,    106,    181,
-    189,    180,    154,    138,     95,    202,    175,    188,
-    144,    143,    234,    250,    190,    160,    182,    179,
-    157,    218,    155,    139,    183,    184,    185,    171,
-    100,    101,     98,    102,     99,    103,    158,    104,
-    116,    113,    114,    115,    120,    117,    118,    119,
-    172,    105,    237,    238,    235,    239,    236,    191,
-    128,    253,    254,    251,    252,    173,    174,     89,
-     68,     69,     66,     70,     67,     71,    156,     72,
-     84,     81,     82,     83,     88,     85,     86,     87,
-    140,     73,    205,    206,    203,    207,    204,    225,
-    112,    221,    222,    219,    220,    141,    142,    223
-};
-EXT unsigned char PL_a2e[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */
-      0,      1,      2,      3,    156,      9,    134,    127,
-    151,    141,    142,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,    157,    133,      8,    135,
-     24,     25,    146,    143,     28,     29,     30,     31,
-    128,    129,    130,    131,    132,     10,     23,     27,
-    136,    137,    138,    139,    140,      5,      6,      7,
-    144,    145,     22,    147,    148,    149,    150,      4,
-    152,    153,    154,    155,     20,     21,    158,     26,
-     32,    160,    226,    228,    224,    225,    227,    229,
-    231,    241,    162,     46,     60,     40,     43,    124,
-     38,    233,    234,    235,    232,    237,    238,    239,
-    236,    223,     33,     36,     42,     41,     59,    172,
-     45,     47,    194,    196,    192,    193,    195,    197,
-    199,    209,    166,     44,     37,     95,     62,     63,
-    248,    201,    202,    203,    200,    205,    206,    207,
-    204,     96,     58,     35,     64,     39,     61,     34,
-    216,     97,     98,     99,    100,    101,    102,    103,
-    104,    105,    171,    187,    240,    253,    254,    177,
-    176,    106,    107,    108,    109,    110,    111,    112,
-    113,    114,    170,    186,    230,    184,    198,    164,
-    181,    126,    115,    116,    117,    118,    119,    120,
-    121,    122,    161,    191,    208,    221,    222,    174,
-     94,    163,    165,    183,    169,    167,    182,    188,
-    189,    190,     91,     93,    175,    168,    180,    215,
-    123,     65,     66,     67,     68,     69,     70,     71,
-     72,     73,    173,    244,    246,    242,    243,    245,
-    125,     74,     75,     76,     77,     78,     79,     80,
-     81,     82,    185,    251,    252,    249,    250,    255,
-     92,    247,     83,     84,     85,     86,     87,     88,
-     89,     90,    178,    212,    214,    210,    211,    213,
-     48,     49,     50,     51,     52,     53,     54,     55,
-     56,     57,    179,    219,    220,    217,    218,    159
-};
-#endif          /* 037 */
-#if '^' == 95   /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
-EXT unsigned char PL_e2a[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-1047) */
-    0,      1,      2,      3,      55,     45,     46,     47,
-    22,     5,      21,     11,     12,     13,     14,     15,
-    16,     17,     18,     19,     60,     61,     50,     38,
-    24,     25,     63,     39,     28,     29,     30,     31,
-    64,     90,     127,    123,    91,     108,    80,     125,
-    77,     93,     92,     78,     107,    96,     75,     97,
-    240,    241,    242,    243,    244,    245,    246,    247,
-    248,    249,    122,    94,     76,     126,    110,    111,
-    124,    193,    194,    195,    196,    197,    198,    199,
-    200,    201,    209,    210,    211,    212,    213,    214,
-    215,    216,    217,    226,    227,    228,    229,    230,
-    231,    232,    233,    173,    224,    189,    95,     109,
-    121,    129,    130,    131,    132,    133,    134,    135,
-    136,    137,    145,    146,    147,    148,    149,    150,
-    151,    152,    153,    162,    163,    164,    165,    166,
-    167,    168,    169,    192,    79,     208,    161,    7,
-    32,     33,     34,     35,     36,     37,     6,      23,
-    40,     41,     42,     43,     44,     9,      10,     27,
-    48,     49,     26,     51,     52,     53,     54,     8,
-    56,     57,     58,     59,     4,      20,     62,     255,
-    65,     170,    74,     177,    159,    178,    106,    181,
-    187,    180,    154,    138,    176,    202,    175,    188,
-    144,    143,    234,    250,    190,    160,    182,    179,
-    157,    218,    155,    139,    183,    184,    185,    171,
-    100,    101,    98,     102,    99,     103,    158,    104,
-    116,    113,    114,    115,    120,    117,    118,    119,
-    172,    105,    237,    238,    235,    239,    236,    191,
-    128,    253,    254,    251,    252,    186,    174,    89,
-    68,     69,     66,     70,     67,     71,     156,    72,
-    84,     81,     82,     83,     88,     85,     86,     87,
-    140,    73,     205,    206,    203,    207,    204,    225,
-    112,    221,    222,    219,    220,    141,    142,    223
-};
-EXT unsigned char PL_a2e[] = { /* EBCDIC (IBM-1047) to ASCII (ISO8859-1) */
-    0,      1,      2,      3,      156,    9,      134,    127,
-    151,    141,    142,    11,     12,     13,     14,     15,
-    16,     17,     18,     19,     157,    10,     8,      135,
-    24,     25,     146,    143,    28,     29,     30,     31,
-    128,    129,    130,    131,    132,    133,    23,     27,
-    136,    137,    138,    139,    140,    5,      6,      7,
-    144,    145,    22,     147,    148,    149,    150,    4,
-    152,    153,    154,    155,    20,     21,     158,    26,
-    32,     160,    226,    228,    224,    225,    227,    229,
-    231,    241,    162,    46,     60,     40,     43,     124,
-    38,     233,    234,    235,    232,    237,    238,    239,
-    236,    223,    33,     36,     42,     41,     59,     94,
-    45,     47,     194,    196,    192,    193,    195,    197,
-    199,    209,    166,    44,     37,     95,     62,     63,
-    248,    201,    202,    203,    200,    205,    206,    207,
-    204,    96,     58,     35,     64,     39,     61,     34,
-    216,    97,     98,     99,     100,    101,    102,    103,
-    104,    105,    171,    187,    240,    253,    254,    177,
-    176,    106,    107,    108,    109,    110,    111,    112,
-    113,    114,    170,    186,    230,    184,    198,    164,
-    181,    126,    115,    116,    117,    118,    119,    120,
-    121,    122,    161,    191,    208,    91,     222,    174,
-    172,    163,    165,    183,    169,    167,    182,    188,
-    189,    190,    221,    168,    175,    93,     180,    215,
-    123,    65,     66,     67,     68,     69,     70,     71,
-    72,     73,     173,    244,    246,    242,    243,    245,
-    125,    74,     75,     76,     77,     78,     79,     80,
-    81,     82,     185,    251,    252,    249,    250,    255,
-    92,     247,    83,     84,     85,     86,     87,     88,
-    89,     90,     178,    212,    214,    210,    211,    213,
-    48,     49,    50,      51,     52,     53,     54,     55,
-    56,     57,    179,     219,    220,    217,    218,    159
-};
-#endif          /* 1047 */
 EXT unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
     0,      1,      2,      3,      4,      5,      6,      7,
     8,      9,      10,     11,     12,     13,     14,     15,
@@ -2795,10 +2859,6 @@ EXTCONST  unsigned char PL_fold[] = {
 #endif  /* !EBCDIC */
 #else
 EXTCONST unsigned char PL_fold[];
-#ifdef EBCDIC
-EXTCONST unsigned char PL_e2a[];
-EXTCONST unsigned char PL_a2e[];
-#endif /* EBCDIC */
 #endif
 
 #ifdef DOINIT
@@ -2980,7 +3040,7 @@ enum {            /* pass one of these to get_vtbl */
     want_vtbl_collxfrm,
     want_vtbl_amagic,
     want_vtbl_amagicelem,
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
     want_vtbl_mutex,
 #endif
     want_vtbl_regdata,
@@ -2993,15 +3053,14 @@ enum {          /* pass one of these to get_vtbl */
 #define HINT_PRIVATE_MASK      0x000000ff
 #define HINT_INTEGER           0x00000001
 #define HINT_STRICT_REFS       0x00000002
-/* #define HINT_notused4       0x00000004 */
-#define HINT_BYTE              0x00000008
+#define HINT_LOCALE            0x00000004
+#define HINT_BYTES             0x00000008
 /* #define HINT_notused10      0x00000010 */
                                /* Note: 20,40,80 used for NATIVE_HINTS */
 
 #define HINT_BLOCK_SCOPE       0x00000100
 #define HINT_STRICT_SUBS       0x00000200
 #define HINT_STRICT_VARS       0x00000400
-#define HINT_LOCALE            0x00000800
 
 #define HINT_NEW_INTEGER       0x00001000
 #define HINT_NEW_FLOAT         0x00002000
@@ -3015,15 +3074,15 @@ enum {          /* pass one of these to get_vtbl */
 
 #define HINT_FILETEST_ACCESS   0x00400000
 #define HINT_UTF8              0x00800000
-#define HINT_UTF8_DISTINCT     0x01000000
 
-/* Various states of an input record separator SV (rs, nrs) */
+/* Various states of the input record separator SV (rs) */
 #define RsSNARF(sv)   (! SvOK(sv))
 #define RsSIMPLE(sv)  (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))
 #define RsPARA(sv)    (SvPOK(sv) && ! SvCUR(sv))
 #define RsRECORD(sv)  (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
 
 /* Enable variables which are pointers to functions */
+typedef void (CPERLscope(*peep_t))(pTHX_ OP* o);
 typedef regexp*(CPERLscope(*regcomp_t)) (pTHX_ char* exp, char* xend, PMOP* pm);
 typedef I32 (CPERLscope(*regexec_t)) (pTHX_ regexp* prog, char* stringarg,
                                      char* strend, char* strbeg, I32 minend,
@@ -3036,12 +3095,12 @@ typedef SV*     (CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog);
 typedef void   (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
 
 typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
-typedef void (*DESTRUCTORFUNC_t) (pTHXo_ void*);
-typedef void (*SVFUNC_t) (pTHXo_ SV*);
-typedef I32  (*SVCOMPARE_t) (pTHXo_ SV*, SV*);
-typedef void (*XSINIT_t) (pTHXo);
-typedef void (*ATEXIT_t) (pTHXo_ void*);
-typedef void (*XSUBADDR_t) (pTHXo_ CV *);
+typedef void (*DESTRUCTORFUNC_t) (pTHX_ void*);
+typedef void (*SVFUNC_t) (pTHX_ SV*);
+typedef I32  (*SVCOMPARE_t) (pTHX_ SV*, SV*);
+typedef void (*XSINIT_t) (pTHX);
+typedef void (*ATEXIT_t) (pTHX_ void*);
+typedef void (*XSUBADDR_t) (pTHX_ CV *);
 
 /* Set up PERLVAR macros for populating structs */
 #define PERLVAR(var,type) type var;
@@ -3051,7 +3110,7 @@ typedef void (*XSUBADDR_t) (pTHXo_ CV *);
 
 /* Interpreter exitlist entry */
 typedef struct exitlistentry {
-    void (*fn) (pTHXo_ void*);
+    void (*fn) (pTHX_ void*);
     void *ptr;
 } PerlExitListEntry;
 
@@ -3073,7 +3132,7 @@ struct perl_vars *PL_VarsPtr;
 #  endif /* PERL_CORE */
 #endif /* PERL_GLOBAL_STRUCT */
 
-#if defined(MULTIPLICITY) || defined(PERL_OBJECT)
+#if defined(MULTIPLICITY)
 /* If we have multiple interpreters define a struct
    holding variables which must be per-interpreter
    If we don't have threads anything that would have
@@ -3081,13 +3140,13 @@ struct perl_vars *PL_VarsPtr;
 */
 
 struct interpreter {
-#  ifndef USE_THREADS
+#  ifndef USE_5005THREADS
 #    include "thrdvar.h"
 #  endif
 #  include "intrpvar.h"
 /*
  * The following is a buffer where new variables must
- * be defined to maintain binary compatibility with PERL_OBJECT
+ * be defined to maintain binary compatibility with previous versions
  */
 PERLVARA(object_compatibility,30,      char)
 };
@@ -3096,9 +3155,9 @@ PERLVARA(object_compatibility,30, char)
 struct interpreter {
     char broiled;
 };
-#endif /* MULTIPLICITY || PERL_OBJECT */
+#endif /* MULTIPLICITY */
 
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 /* If we have threads define a struct with all the variables
  * that have to be per-thread
  */
@@ -3136,10 +3195,6 @@ typedef void *Thread;
 #  endif
 #endif
 
-#ifdef PERL_OBJECT
-#  define PERL_DECL_PROT
-#endif
-
 #undef PERL_CKDEF
 #undef PERL_PPDEF
 #define PERL_CKDEF(s)  OP *s (pTHX_ OP *o);
@@ -3147,14 +3202,8 @@ typedef void *Thread;
 
 #include "proto.h"
 
-#ifdef PERL_OBJECT
-#  undef PERL_DECL_PROT
-#endif
-
-#ifndef PERL_OBJECT
 /* this has structure inits, so it cannot be included before here */
-#  include "opcode.h"
-#endif
+#include "opcode.h"
 
 /* The following must follow proto.h as #defines mess up syntax */
 
@@ -3172,32 +3221,19 @@ typedef void *Thread;
 #define PERLVARI(var,type,init) EXT type  PL_##var INIT(init);
 #define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
 
-#if !defined(MULTIPLICITY) && !defined(PERL_OBJECT)
+#if !defined(MULTIPLICITY)
 START_EXTERN_C
 #  include "intrpvar.h"
-#  ifndef USE_THREADS
+#  ifndef USE_5005THREADS
 #    include "thrdvar.h"
 #  endif
 END_EXTERN_C
 #endif
 
-#ifdef PERL_OBJECT
+#if defined(WIN32)
+/* Now all the config stuff is setup we can include embed.h */
 #  include "embed.h"
-
-#  ifdef DOINIT
-#    include "INTERN.h"
-#  else
-#    include "EXTERN.h"
-#  endif
-
-/* this has structure inits, so it cannot be included before here */
-#  include "opcode.h"
-
-#else
-#  if defined(WIN32)
-#    include "embed.h"
-#  endif
-#endif  /* PERL_OBJECT */
+#endif
 
 #ifndef PERL_GLOBAL_STRUCT
 START_EXTERN_C
@@ -3276,9 +3312,9 @@ EXT MGVTBL PL_vtbl_fm =   {0,     MEMBER_TO_FPTR(Perl_magic_setfm),
 EXT MGVTBL PL_vtbl_uvar =      {MEMBER_TO_FPTR(Perl_magic_getuvar),
                                MEMBER_TO_FPTR(Perl_magic_setuvar),
                                        0,      0,      0};
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 EXT MGVTBL PL_vtbl_mutex =     {0,     0,      0,      0,      MEMBER_TO_FPTR(Perl_magic_mutexfree)};
-#endif /* USE_THREADS */
+#endif /* USE_5005THREADS */
 EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),MEMBER_TO_FPTR(Perl_magic_setdefelem),
                                        0,      0,      0};
 
@@ -3329,9 +3365,9 @@ EXT MGVTBL PL_vtbl_fm;
 EXT MGVTBL PL_vtbl_uvar;
 EXT MGVTBL PL_vtbl_ovrld;
 
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 EXT MGVTBL PL_vtbl_mutex;
-#endif /* USE_THREADS */
+#endif /* USE_5005THREADS */
 
 EXT MGVTBL PL_vtbl_defelem;
 EXT MGVTBL PL_vtbl_regexp;
@@ -3535,16 +3571,18 @@ typedef struct am_table_short AMTS;
 #define SET_NUMERIC_LOCAL() \
        set_numeric_local();
 
-#define IS_NUMERIC_RADIX(s)    \
-       ((PL_hints & HINT_LOCALE) && \
-         PL_numeric_radix && memEQ(s, SvPVX(PL_numeric_radix), SvCUR(PL_numeric_radix)))
+#define IN_LOCALE_RUNTIME      (PL_curcop->op_private & HINT_LOCALE)
+#define IN_LOCALE_COMPILETIME  (PL_hints & HINT_LOCALE)
+
+#define IN_LOCALE \
+       (PL_curcop == &PL_compiling ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
 
 #define STORE_NUMERIC_LOCAL_SET_STANDARD() \
-       bool was_local = (PL_hints & HINT_LOCALE) && PL_numeric_local; \
+       bool was_local = PL_numeric_local && IN_LOCALE; \
        if (was_local) SET_NUMERIC_STANDARD();
 
 #define STORE_NUMERIC_STANDARD_SET_LOCAL() \
-       bool was_standard = (PL_hints & HINT_LOCALE) && PL_numeric_standard; \
+       bool was_standard = PL_numeric_standard && IN_LOCALE; \
        if (was_standard) SET_NUMERIC_LOCAL();
 
 #define RESTORE_NUMERIC_LOCAL() \
@@ -3559,12 +3597,13 @@ typedef struct am_table_short AMTS;
 
 #define SET_NUMERIC_STANDARD()         /**/
 #define SET_NUMERIC_LOCAL()            /**/
-#define IS_NUMERIC_RADIX(c)            (0)
+#define IS_NUMERIC_RADIX(a, b)         (0)
 #define STORE_NUMERIC_LOCAL_SET_STANDARD()     /**/
 #define STORE_NUMERIC_STANDARD_SET_LOCAL()     /**/
 #define RESTORE_NUMERIC_LOCAL()                /**/
 #define RESTORE_NUMERIC_STANDARD()     /**/
 #define Atof                           Perl_atof
+#define IN_LOCALE_RUNTIME              0
 
 #endif /* !USE_LOCALE_NUMERIC */
 
@@ -3664,7 +3703,9 @@ typedef struct am_table_short AMTS;
 
 #ifndef PERL_MICRO
 #   ifndef PERL_OLD_SIGNALS
-#       define PERL_ASYNC_CHECK() if (PL_sig_pending) despatch_signals()
+#              ifndef PERL_ASYNC_CHECK
+#                      define PERL_ASYNC_CHECK() if (PL_sig_pending) despatch_signals()
+#              endif
 #   endif
 #endif
 
@@ -3686,17 +3727,21 @@ typedef struct am_table_short AMTS;
  * nice_chunk and nice_chunk size need to be set
  * and queried under the protection of sv_mutex
  */
-#define offer_nice_chunk(chunk, chunk_size) do {       \
-       LOCK_SV_MUTEX;                                  \
-       if (!PL_nice_chunk) {                           \
-           PL_nice_chunk = (char*)(chunk);             \
-           PL_nice_chunk_size = (chunk_size);          \
-       }                                               \
-       else {                                          \
-           Safefree(chunk);                            \
-       }                                               \
-       UNLOCK_SV_MUTEX;                                \
-    } while (0)
+#define offer_nice_chunk(chunk, chunk_size) STMT_START {  \
+       void *new_chunk;                                   \
+       U32 new_chunk_size;                                \
+       LOCK_SV_MUTEX;                                     \
+       new_chunk = (void *)(chunk);                       \
+       new_chunk_size = (chunk_size);                     \
+       if (new_chunk_size > PL_nice_chunk_size) {         \
+           if (PL_nice_chunk) Safefree(PL_nice_chunk);    \
+           PL_nice_chunk = new_chunk;                     \
+           PL_nice_chunk_size = new_chunk_size;           \
+       } else {                                           \
+           Safefree(chunk);                               \
+       }                                                  \
+       UNLOCK_SV_MUTEX;                                   \
+   } STMT_END
 
 #ifdef HAS_SEM
 #   include <sys/ipc.h>
@@ -3738,6 +3783,10 @@ typedef struct am_table_short AMTS;
 #  include <sys/file.h>
 #endif
 
+#if defined(HAS_FLOCK) && !defined(HAS_FLOCK_PROTO)
+int flock(int fd, int op);
+#endif
+
 #ifndef O_RDONLY
 /* Assume UNIX defaults */
 #    define O_RDONLY   0000
@@ -3757,6 +3806,9 @@ typedef struct am_table_short AMTS;
 #ifdef IAMSUID
 
 #ifdef I_SYS_STATVFS
+#   if defined(PERL_SCO) && !defined(_SVID3)
+#       define _SVID3
+#   endif
 #   include <sys/statvfs.h>     /* for f?statvfs() */
 #endif
 #ifdef I_SYS_MOUNT
@@ -3804,6 +3856,31 @@ typedef struct am_table_short AMTS;
 #define EXEC_ARGV_CAST(x) x
 #endif
 
+#define IS_NUMBER_IN_UV                      0x01 /* number within UV range (maybe not
+                                             int).  value returned in pointed-
+                                             to UV */
+#define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 /* pointed to UV undefined */
+#define IS_NUMBER_NOT_INT            0x04 /* saw . or E notation */
+#define IS_NUMBER_NEG                0x08 /* leading minus sign */
+#define IS_NUMBER_INFINITY           0x10 /* this is big */
+#define IS_NUMBER_NAN                 0x20 /* this is not */
+
+#define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+
+/* Input flags: */
+#define PERL_SCAN_ALLOW_UNDERSCORES   0x01 /* grok_??? accept _ in numbers */
+#define PERL_SCAN_DISALLOW_PREFIX     0x02 /* grok_??? reject 0x in hex etc */
+/* Output flags: */
+#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */
+
+/* to let user control profiling */
+#ifdef PERL_GPROF_CONTROL
+extern void moncontrol(int);
+#define PERL_GPROF_MONCONTROL(x) moncontrol(x)
+#else
+#define PERL_GPROF_MONCONTROL(x)
+#endif
+
 /* and finally... */
 #define PERL_PATCHLEVEL_H_IMPLICIT
 #include "patchlevel.h"
@@ -3813,9 +3890,6 @@ typedef struct am_table_short AMTS;
 
    NV_PRESERVES_UV
 
-   HAS_ICONV
-   I_ICONV
-
    HAS_MKSTEMP
    HAS_MKSTEMPS
    HAS_MKDTEMP
@@ -3834,6 +3908,26 @@ typedef struct am_table_short AMTS;
    NVff
    NVgf
 
+   HAS_USLEEP
+   HAS_UALARM
+
+   HAS_SETITIMER
+   HAS_GETITIMER
+
+   HAS_SENDMSG
+   HAS_RECVMSG
+   HAS_READV
+   HAS_WRITEV
+   I_SYSUIO
+   HAS_STRUCT_MSGHDR
+   HAS_STRUCT_CMSGHDR
+
+   HAS_NL_LANGINFO
+
    so that Configure picks them up. */
 
+#ifdef UNDER_CE
+#include "wince.h"
+#endif
+
 #endif /* Include guard */