/* 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
# 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
#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)
# 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 __attribute__ ((unused))
+#define dNOOP extern int Perl___notused PERL_UNUSED_DECL
#ifndef pTHX
# define pTHX void
# 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
# 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
*/
/* 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
# 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
#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
# define _SOCKADDR_LEN
#endif
-#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
+#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 */
# endif
# endif
# ifdef I_NETDB
+# ifdef NETWARE
+# include<stdio.h>
+# endif
# include <netdb.h>
# endif
# ifndef ENOTSOCK
# 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)
# 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 */
#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
# endif
#endif
-/*
- I've tracked down a weird bug in Perl5.6.1 to the UTS compiler's
- mishandling of MY_UV_MAX in util.c. It is defined as
- #ifndef MY_UV_MAX
- # define MY_UV_MAX ((UV)IV_MAX * (UV)2 + (UV)1)
- #endif
- The compiler handles {double floating point value} >= MY_UV_MAX as if
- MY_UV_MAX were the signed integer -1. In fact it will do the same
- thing with (UV)(0xffffffff), in place of MY_UV_MAX, though 0xffffffff
- *without* the typecast to UV works fine.
-
- hom00@utsglobal.com (Hal Morris) 2001-05-02
-
- */
-
-#ifdef UTS
-# define MY_UV_MAX 0xffffffff
+#if defined(uts) || defined(UTS)
+# undef UV_MAX
+# define UV_MAX (4294967295u)
#endif
#define IV_DIG (BIT_DIGITS(IVSIZE * 8))
# 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
# 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
# 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
# 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
+# 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
+
+#ifndef Perl_isinf
+# ifdef HAS_ISINF
+# define Perl_isinf(x) isinf((NV)x)
# else
-# define Perl_isnan(x) ((x)!=(x))
+# ifdef Perl_fp_class_inf
+# define Perl_isinf(x) Perl_fp_class_inf(x)
+# else
+# define Perl_isinf(x) ((x)==NV_INF)
+# endif
+# endif
+#endif
+
+#ifndef Perl_isfinite
+# ifdef HAS_FINITE
+# define Perl_isfinite(x) finite((NV)x)
+# else
+# ifdef HAS_ISFINITE
+# define Perl_isfinite(x) isfinite(x)
+# else
+# ifdef Perl_fp_class_finite
+# define Perl_isfinite(x) Perl_fp_class_finite(x)
+# else
+# define Perl_isfinite(x) !(Perl_is_inf(x)||Perl_is_nan(x))
+# endif
+# endif
# endif
#endif
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
# 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
#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
# endif /* OS2 */
# endif /* WIN32 */
# endif /* FAKE_THREADS */
-#endif /* USE_THREADS || USE_ITHREADS */
+#endif /* NETWARE */
+#endif /* USE_5005THREADS || USE_ITHREADS */
#ifdef WIN32
# include "win32.h"
#endif
+#ifdef NETWARE
+# include "netware.h"
+#endif
+
#ifdef VMS
# define STATUS_NATIVE PL_statusvalue_vms
# define STATUS_NATIVE_EXPORT \
/* flags in PL_exit_flags for nature of exit() */
#define PERL_EXIT_EXPECTED 0x01
+#define PERL_EXIT_DESTRUCT_END 0x02 /* Run END in perl_destruct */
#ifndef MEMBER_TO_FPTR
# define MEMBER_TO_FPTR(name) name
#endif
#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)
# 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.
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])
#include "scope.h"
#include "warnings.h"
#include "utf8.h"
+#include "sharedsv.h"
/* Current curly descriptor */
typedef struct curcur CURCUR;
#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()
# 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__(t, a) \
STMT_START { \
# define DEBUG_X(a) DEBUG__(DEBUG_X_TEST, a)
# define DEBUG_D(a) DEBUG__(DEBUG_D_TEST, a)
-# ifdef USE_THREADS
+# ifdef USE_5005THREADS
# define DEBUG_S(a) DEBUG__(DEBUG_S_TEST, a)
# else
# define DEBUG_S(a)
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 */
want_vtbl_collxfrm,
want_vtbl_amagic,
want_vtbl_amagicelem,
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
want_vtbl_mutex,
#endif
want_vtbl_regdata,
#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,
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;
/* Interpreter exitlist entry */
typedef struct exitlistentry {
- void (*fn) (pTHXo_ void*);
+ void (*fn) (pTHX_ void*);
void *ptr;
} PerlExitListEntry;
# 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
*/
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)
};
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
*/
# 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);
#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 */
#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)
# 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
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};
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;
#define RESTORE_NUMERIC_LOCAL() /**/
#define RESTORE_NUMERIC_STANDARD() /**/
#define Atof Perl_atof
+#define IN_LOCALE_RUNTIME 0
#endif /* !USE_LOCALE_NUMERIC */
#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
#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"
NV_PRESERVES_UV
- HAS_ICONV
- I_ICONV
-
HAS_MKSTEMP
HAS_MKSTEMPS
HAS_MKDTEMP
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 */