X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.h;h=e0250aec41f13a5b4d0191fb81711d4de4f91494;hb=3226bbec67a495e52de65a4d7ece19d720e5f94d;hp=1aee654ddee29471f2dee7d5a1bcd6d87c69bd68;hpb=a080fe3d0f499f7661182f9f8b2f5f534ae785f2;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.h b/perl.h index 1aee654..e0250ae 100644 --- a/perl.h +++ b/perl.h @@ -34,20 +34,20 @@ /* 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 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 @@ -59,129 +59,10 @@ # 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 __attribute__ ((unused)) +#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 #endif @@ -506,11 +413,22 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif +#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO) +int syscall(int, ...); +#endif + +#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO) +int usleep(unsigned int); +#endif + #ifdef PERL_MICRO /* Last chance to export Perl_my_swap */ # define MYSWAP #endif -#if !defined(PERL_FOR_X2P) && !defined(WIN32) +/* Cannot include embed.h here on Win32 as win32.h has not + yet been included and defines some config variables e.g. HAVE_INTERP_INTERN + */ +#if !defined(PERL_FOR_X2P) && !(defined(WIN32)||defined(VMS)) # include "embed.h" #endif @@ -714,7 +632,7 @@ typedef struct perl_mstats perl_mstats_t; #include -#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 @@ -723,23 +641,23 @@ typedef struct perl_mstats perl_mstats_t; # 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 # if defined(USE_SOCKS) && defined(I_SOCKS) # if !defined(INCLUDE_PROTOTYPES) # define INCLUDE_PROTOTYPES /* for */ # 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 -# 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 */ @@ -748,6 +666,9 @@ typedef struct perl_mstats perl_mstats_t; # endif # endif # ifdef I_NETDB +# ifdef NETWARE +# include +# endif # include # endif # ifndef ENOTSOCK @@ -757,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 @@ -771,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) @@ -779,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 */ @@ -876,7 +803,7 @@ typedef struct perl_mstats perl_mstats_t; * in the face of half-implementations.) */ -#ifdef I_SYSMODE +#if defined(I_SYSMODE) && !defined(PERL_MICRO) #include #endif @@ -1028,6 +955,10 @@ 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 */ #ifdef UTS @@ -1093,23 +1024,9 @@ typedef UVTYPE UV; # 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)) @@ -1237,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 @@ -1271,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 @@ -1285,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 @@ -1304,32 +1252,149 @@ 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 +# endif +# ifdef I_FP +# include +# endif +# if defined(USE_LONG_DOUBLE) && defined(HAS_FPCLASSL) +# define Perl_fp_class() fpclassl(x) +# else +# define Perl_fp_class() fpclass(x) +# endif +# define Perl_fp_class_snan(x) (Perl_fp_class(x)==FP_CLASS_SNAN) +# define Perl_fp_class_qnan(x) (Perl_fp_class(x)==FP_CLASS_QNAN) +# define Perl_fp_class_nan(x) (Perl_fp_class(x)==FP_CLASS_SNAN||Perl_fp_class(x)==FP_CLASS_QNAN) +# define Perl_fp_class_ninf(x) (Perl_fp_class(x)==FP_CLASS_NINF) +# define Perl_fp_class_pinf(x) (Perl_fp_class(x)==FP_CLASS_PINF) +# define Perl_fp_class_inf(x) (Perl_fp_class(x)==FP_CLASS_NINF||Perl_fp_class(x)==FP_CLASS_PINF) +# define Perl_fp_class_nnorm(x) (Perl_fp_class(x)==FP_CLASS_NNORM) +# define Perl_fp_class_pnorm(x) (Perl_fp_class(x)==FP_CLASS_PNORM) +# define Perl_fp_class_norm(x) (Perl_fp_class(x)==FP_CLASS_NNORM||Perl_fp_class(x)==FP_CLASS_PNORM) +# define Perl_fp_class_ndenorm(x) (Perl_fp_class(x)==FP_CLASS_NDENORM) +# define Perl_fp_class_pdenorm(x) (Perl_fp_class(x)==FP_CLASS_PDENORM) +# define Perl_fp_class_denorm(x) (Perl_fp_class(x)==FP_CLASS_NDENORM||Perl_fp_class(x)==FP_CLASS_PDENORM) +# define Perl_fp_class_nzero(x) (Perl_fp_class(x)==FP_CLASS_NZERO) +# define Perl_fp_class_pzero(x) (Perl_fp_class(x)==FP_CLASS_PZERO) +# define Perl_fp_class_zero(x) (Perl_fp_class(x)==FP_CLASS_NZERO||Perl_fp_class(x)==FP_CLASS_PZERO) +#endif + +#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) && !defined(PERL_MICRO) +# include +# if !defined(FP_SNAN) && defined(I_FP_CLASS) +# include +# 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 +# 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 +# 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)) -# endif +#ifdef UNDER_CE +int isnan(double d); #endif -#if !defined(Perl_atof) -# define Perl_atof atof /* we assume atof being available anywhere */ + +#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_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. @@ -1536,8 +1601,11 @@ typedef struct pvop PVOP; typedef struct loop LOOP; typedef struct interpreter PerlInterpreter; -#ifdef UTS -# define STRUCT_SV perl_sv /* Amdahl's has struct sv */ + +/* Amdahl's has struct sv */ +/* SGI's has struct sv */ +#if defined(UTS) || defined(__sgi) +# define STRUCT_SV perl_sv #else # define STRUCT_SV sv #endif @@ -1571,6 +1639,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" @@ -1674,7 +1744,7 @@ typedef struct ptr_tbl PTR_TBL_t; # endif #endif -#if defined(OS2) +#if defined(OS2) || defined(MACOS_TRADITIONAL) # include "iperlsys.h" #endif @@ -1691,6 +1761,7 @@ typedef struct ptr_tbl PTR_TBL_t; #else # if defined(VMS) # include "vmsish.h" +# include "embed.h" # else # if defined(PLAN9) # include "./plan9/plan9ish.h" @@ -1730,10 +1801,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 +# 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 @@ -1757,18 +1850,21 @@ typedef struct ptr_tbl PTR_TBL_t; #endif /* - * USE_THREADS needs to be after unixish.h as includes + * USE_5005THREADS needs to be after unixish.h as includes * which defines NSIG - which will stop inclusion of * 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 +# else # ifdef FAKE_THREADS # include "fakethr.h" # else @@ -1799,12 +1895,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 \ @@ -1856,6 +1957,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 @@ -1898,15 +2000,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) @@ -1936,6 +2034,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. @@ -1977,23 +2083,23 @@ 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]) #define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters)) -#if !defined(OS2) +#if !defined(OS2) && !defined(MACOS_TRADITIONAL) # include "iperlsys.h" #endif #include "regexp.h" @@ -2011,6 +2117,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; @@ -2173,11 +2280,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() @@ -2217,30 +2326,50 @@ Gid_t getegid (void); #define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? */ +# define DEBUG_p_TEST_ (PL_debug & DEBUG_p_FLAG) +# define DEBUG_s_TEST_ (PL_debug & DEBUG_s_FLAG) +# define DEBUG_l_TEST_ (PL_debug & DEBUG_l_FLAG) +# define DEBUG_t_TEST_ (PL_debug & DEBUG_t_FLAG) +# define DEBUG_o_TEST_ (PL_debug & DEBUG_o_FLAG) +# define DEBUG_c_TEST_ (PL_debug & DEBUG_c_FLAG) +# define DEBUG_P_TEST_ (PL_debug & DEBUG_P_FLAG) +# define DEBUG_m_TEST_ (PL_debug & DEBUG_m_FLAG) +# define DEBUG_f_TEST_ (PL_debug & DEBUG_f_FLAG) +# define DEBUG_r_TEST_ (PL_debug & DEBUG_r_FLAG) +# define DEBUG_x_TEST_ (PL_debug & DEBUG_x_FLAG) +# define DEBUG_u_TEST_ (PL_debug & DEBUG_u_FLAG) +# define DEBUG_L_TEST_ (PL_debug & DEBUG_L_FLAG) +# define DEBUG_H_TEST_ (PL_debug & DEBUG_H_FLAG) +# define DEBUG_X_TEST_ (PL_debug & DEBUG_X_FLAG) +# define DEBUG_D_TEST_ (PL_debug & DEBUG_D_FLAG) +# define DEBUG_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) + #ifdef DEBUGGING # undef YYDEBUG # define YYDEBUG 1 -# define DEBUG_p_TEST (PL_debug & DEBUG_p_FLAG) -# define DEBUG_s_TEST (PL_debug & DEBUG_s_FLAG) -# define DEBUG_l_TEST (PL_debug & DEBUG_l_FLAG) -# define DEBUG_t_TEST (PL_debug & DEBUG_t_FLAG) -# define DEBUG_o_TEST (PL_debug & DEBUG_o_FLAG) -# define DEBUG_c_TEST (PL_debug & DEBUG_c_FLAG) -# define DEBUG_P_TEST (PL_debug & DEBUG_P_FLAG) -# define DEBUG_m_TEST (PL_debug & DEBUG_m_FLAG) -# define DEBUG_f_TEST (PL_debug & DEBUG_f_FLAG) -# define DEBUG_r_TEST (PL_debug & DEBUG_r_FLAG) -# define DEBUG_x_TEST (PL_debug & DEBUG_x_FLAG) -# define DEBUG_u_TEST (PL_debug & DEBUG_u_FLAG) -# define DEBUG_L_TEST (PL_debug & DEBUG_L_FLAG) -# define DEBUG_H_TEST (PL_debug & DEBUG_H_FLAG) -# define DEBUG_X_TEST (PL_debug & DEBUG_X_FLAG) -# define DEBUG_D_TEST (PL_debug & DEBUG_D_FLAG) -# define DEBUG_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 DEBUG_p_TEST DEBUG_p_TEST_ +# define DEBUG_s_TEST DEBUG_s_TEST_ +# define DEBUG_l_TEST DEBUG_l_TEST_ +# define DEBUG_t_TEST DEBUG_t_TEST_ +# define DEBUG_o_TEST DEBUG_o_TEST_ +# define DEBUG_c_TEST DEBUG_c_TEST_ +# define DEBUG_P_TEST DEBUG_P_TEST_ +# define DEBUG_m_TEST DEBUG_m_TEST_ +# define DEBUG_f_TEST DEBUG_f_TEST_ +# define DEBUG_r_TEST DEBUG_r_TEST_ +# define DEBUG_x_TEST DEBUG_x_TEST_ +# define DEBUG_u_TEST DEBUG_u_TEST_ +# define DEBUG_L_TEST DEBUG_L_TEST_ +# define DEBUG_H_TEST DEBUG_H_TEST_ +# define DEBUG_X_TEST DEBUG_X_TEST_ +# define DEBUG_D_TEST DEBUG_D_TEST_ +# define DEBUG_S_TEST DEBUG_S_TEST_ +# define DEBUG_T_TEST DEBUG_T_TEST_ +# define DEBUG_R_TEST DEBUG_R_TEST_ # define DEB(a) a # define DEBUG(a) if (PL_debug) a @@ -2252,16 +2381,12 @@ 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__(t, a) \ STMT_START { \ @@ -2277,7 +2402,7 @@ Gid_t getegid (void); # 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) @@ -2332,7 +2457,7 @@ Gid_t getegid (void); #endif /* DEBUGGING */ -/* These constants should be used in preference to to raw characters +/* These constants should be used in preference to raw characters * when using magic. Note that some perl guts still assume * certain character properties of these constants, namely that * isUPPER() and toLOWER() may do useful mappings. @@ -2457,6 +2582,55 @@ 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 */ @@ -2487,6 +2661,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) @@ -2882,7 +3065,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, @@ -2895,7 +3078,7 @@ 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_LOCALE 0x00000004 #define HINT_BYTES 0x00000008 /* #define HINT_notused10 0x00000010 */ /* Note: 20,40,80 used for NATIVE_HINTS */ @@ -2903,7 +3086,6 @@ enum { /* pass one of these to get_vtbl */ #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 @@ -2917,15 +3099,27 @@ 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)) +#ifdef DEBUGGING +/* A struct for keeping various DEBUGGING related stuff + * neatly packed. Currently only scratch variables for + * constructing debug output are included. */ +struct perl_debug_pad { + SV pad[3]; +}; + +#define PERL_DEBUG_PAD(i) &(PL_debug_pad.pad[i]) +#define PERL_DEBUG_PAD_ZERO(i) (sv_setpvn(PERL_DEBUG_PAD(i), "", 0), PERL_DEBUG_PAD(i)) +#endif + /* 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, @@ -2938,12 +3132,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; @@ -2953,7 +3147,7 @@ typedef void (*XSUBADDR_t) (pTHXo_ CV *); /* Interpreter exitlist entry */ typedef struct exitlistentry { - void (*fn) (pTHXo_ void*); + void (*fn) (pTHX_ void*); void *ptr; } PerlExitListEntry; @@ -2975,7 +3169,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 @@ -2983,13 +3177,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) }; @@ -2998,9 +3192,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 */ @@ -3038,10 +3232,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); @@ -3049,14 +3239,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 */ @@ -3074,32 +3258,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 @@ -3178,9 +3349,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}; @@ -3231,9 +3402,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; @@ -3437,16 +3608,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_sv && memEQ(s, SvPVX(PL_numeric_radix_sv), SvCUR(PL_numeric_radix_sv))) +#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() \ @@ -3461,12 +3634,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 */ @@ -3566,7 +3740,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 @@ -3636,6 +3812,83 @@ typedef struct am_table_short AMTS; # endif #endif +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(PERL_IMPLICIT_CONTEXT) + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#else /* USE_ITHREADS */ + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* !defined(USE_ITHREADS) */ + #ifdef I_FCNTL # include #endif @@ -3644,6 +3897,10 @@ typedef struct am_table_short AMTS; # include #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 @@ -3713,6 +3970,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" @@ -3722,9 +4004,6 @@ typedef struct am_table_short AMTS; NV_PRESERVES_UV - HAS_ICONV - I_ICONV - HAS_MKSTEMP HAS_MKSTEMPS HAS_MKDTEMP @@ -3757,6 +4036,32 @@ typedef struct am_table_short AMTS; HAS_STRUCT_MSGHDR HAS_STRUCT_CMSGHDR + HAS_NL_LANGINFO + so that Configure picks them up. */ +#ifdef UNDER_CE +#include "wince.h" +#endif + +/* ISO 6429 NEL - C1 control NExt Line */ +/* See http://www.unicode.org/unicode/reports/tr13/ */ +#ifdef EBCDIC /* In EBCDIC NEL is just an alias for LF */ +# if '^' == 95 /* CP 1047: MVS OpenEdition - OS/390 - z/OS */ +# define NEXT_LINE_CHAR 0x15 +# else /* CDRA */ +# define NEXT_LINE_CHAR 0x25 +# endif +#else +# define NEXT_LINE_CHAR 0x85 +#endif + +/* The UTF-8 bytes of the Unicode LS and PS, U+2028 and U+2029 */ +#define UNICODE_LINE_SEPA_0 0xE2 +#define UNICODE_LINE_SEPA_1 0x80 +#define UNICODE_LINE_SEPA_2 0xA8 +#define UNICODE_PARA_SEPA_0 0xE2 +#define UNICODE_PARA_SEPA_1 0x80 +#define UNICODE_PARA_SEPA_2 0xA9 + #endif /* Include guard */