X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl.h;h=8f1cad367ef8c6e388023f7a70766b846fe63125;hb=40b7a5f5e789eb31046d021a15e48b502ad8e1e9;hp=88d32a48525ad35be3068f047d3f58ab60575b1b;hpb=640374d0dfc3428416b596d67c06b3c817f44bd8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/perl.h b/perl.h index 88d32a4..8f1cad3 100644 --- a/perl.h +++ b/perl.h @@ -225,8 +225,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 @@ -258,6 +270,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 +360,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 @@ -506,6 +527,14 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #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 @@ -748,6 +777,9 @@ typedef struct perl_mstats perl_mstats_t; # endif # endif # ifdef I_NETDB +# ifdef NETWARE +# include +# endif # include # endif # ifndef ENOTSOCK @@ -757,6 +789,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 @@ -1093,23 +1131,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)) @@ -1311,24 +1335,8 @@ typedef NVTYPE NV; # 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 -#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)) -#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 @@ -1730,6 +1738,22 @@ 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); +# elif PERL_IGNORE_FPUSIG +# define PERL_FPU_INIT signal(PERL_IGNORE_FPUSIG, SIG_IGN); +# else +# define PERL_FPU_INIT +# endif +#endif + #ifndef PERL_SYS_INIT3 # define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp) #endif @@ -1769,6 +1793,9 @@ typedef struct ptr_tbl PTR_TBL_t; * atomic.h everywhere */ # define EMULATE_ATOMIC_REFCOUNTS # endif +# ifdef NETWARE +# include +# else # ifdef FAKE_THREADS # include "fakethr.h" # else @@ -1799,12 +1826,17 @@ typedef pthread_key_t perl_key; # endif /* OS2 */ # endif /* WIN32 */ # endif /* FAKE_THREADS */ +#endif /* NETWARE */ #endif /* USE_THREADS || 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 \ @@ -2487,10 +2519,12 @@ I32 unlnk (char*); #define UNLINK PerlLIO_unlink #endif -#ifndef HAS_SETRESUID_PROTO /* some versions of glibc */ +/* 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 -#ifndef HAS_SETRESUID_PROTO /* some versions of glibc */ +/* 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 @@ -2902,7 +2936,8 @@ 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_BYTES 0x00000008 /* #define HINT_notused10 0x00000010 */ /* Note: 20,40,80 used for NATIVE_HINTS */ @@ -2910,7 +2945,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 @@ -3444,16 +3478,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() \ @@ -3468,12 +3504,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 */ @@ -3573,7 +3610,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 @@ -3651,6 +3690,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 @@ -3720,6 +3763,24 @@ 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 GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) + +/* 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" @@ -3764,6 +3825,10 @@ typedef struct am_table_short AMTS; HAS_STRUCT_MSGHDR HAS_STRUCT_CMSGHDR + USE_REENTRANT_API + + HAS_NL_LANGINFO + so that Configure picks them up. */ #endif /* Include guard */