X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/b3e384bf4606fb924aded7c2fa2cdf2d008c6ffb..b7a15f05fbb487889ecf330bb4e071c2a209a50e:/perl.h diff --git a/perl.h b/perl.h index e76d0ba..b40f141 100644 --- a/perl.h +++ b/perl.h @@ -22,11 +22,6 @@ #define USE_STDIO #endif /* PERL_FOR_X2P */ -#ifdef VOIDUSED -# undef VOIDUSED -#endif -#define VOIDUSED 1 - #ifdef PERL_MICRO # include "uconfig.h" #else @@ -95,7 +90,7 @@ # define USE_HEAP_INSTEAD_OF_STACK #endif -#/* Use the reentrant APIs like localtime_r and getpwent_r */ +/* 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(NETWARE) && !defined(WIN32) && !defined(PERL_DARWIN) # define USE_REENTRANT_API @@ -103,15 +98,9 @@ /* <--- here ends the logic shared by perl.h and makedef.pl */ -/* - * PERL_DARWIN for MacOSX (__APPLE__ exists but is not officially sanctioned) - * (The -DPERL_DARWIN comes from the hints/darwin.sh.) - * __bsdi__ for BSD/OS - */ -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(PERL_DARWIN) || defined(__bsdi__) || defined(BSD41) || defined(BSD42) || defined(BSD43) || defined(BSD44) -# ifndef BSDish -# define BSDish -# endif +/* Microsoft Visual C++ 6.0 needs special treatment in numerous places */ +#if defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1300 +# define USING_MSVC6 #endif #undef START_EXTERN_C @@ -221,9 +210,9 @@ #define CALLREGCOMP(sv, flags) Perl_pregcomp(aTHX_ (sv),(flags)) #define CALLREGCOMP_ENG(prog, sv, flags) (prog)->comp(aTHX_ sv, flags) -#define CALLREGEXEC(prog,stringarg,strend,strbeg,minend,screamer,data,flags) \ +#define CALLREGEXEC(prog,stringarg,strend,strbeg,minend,sv,data,flags) \ RX_ENGINE(prog)->exec(aTHX_ (prog),(stringarg),(strend), \ - (strbeg),(minend),(screamer),(data),(flags)) + (strbeg),(minend),(sv),(data),(flags)) #define CALLREG_INTUIT_START(prog,sv,strbeg,strpos,strend,flags,data) \ RX_ENGINE(prog)->intuit(aTHX_ (prog), (sv), (strbeg), (strpos), \ (strend),(flags),(data)) @@ -434,14 +423,6 @@ # endif #endif -#ifdef OP_IN_REGISTER -# ifdef __GNUC__ -# define stringify_immed(s) #s -# define stringify(s) stringify_immed(s) -struct op *Perl_op asm(stringify(OP_IN_REGISTER)); -# endif -#endif - /* gcc (-ansi) -pedantic doesn't allow gcc statement expressions, * g++ allows them but seems to have problems with them * (insane errors ensue). @@ -473,14 +454,8 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # define STMT_START (void)( /* gcc supports "({ STATEMENTS; })" */ # define STMT_END ) # else - /* Now which other defined()s do we need here ??? */ -# if (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) -# define STMT_START if (1) -# define STMT_END else (void)0 -# else # define STMT_START do # define STMT_END while (0) -# endif # endif #endif @@ -641,11 +616,7 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif -#ifndef _TYPES_ /* If types.h defines this it's easy. */ -# ifndef major /* Does everyone's types.h define this? */ -# include -# endif -#endif +#include #ifdef __cplusplus # ifndef I_STDARG @@ -691,6 +662,8 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); #if !defined(NO_LOCALE) && defined(HAS_SETLOCALE) # define USE_LOCALE +# define HAS_SKIP_LOCALE_INIT /* Solely for XS code to test for this + capability */ # if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \ && defined(HAS_STRXFRM) # define USE_LOCALE_COLLATE @@ -701,6 +674,12 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC) # define USE_LOCALE_NUMERIC # endif +# if !defined(NO_LOCALE_MESSAGES) && defined(LC_MESSAGES) +# define USE_LOCALE_MESSAGES +# endif +# if !defined(NO_LOCALE_MONETARY) && defined(LC_MONETARY) +# define USE_LOCALE_MONETARY +# endif #endif /* !NO_LOCALE && HAS_SETLOCALE */ #include @@ -712,6 +691,16 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # include #endif +/* On BSD-derived systems, defines BSD to a year-month + value something like 199306. This may be useful if no more-specific + feature test is available. +*/ +#if defined(BSD) +# ifndef BSDish +# define BSDish +# endif +#endif + /* Use all the "standard" definitions? */ #if defined(STANDARD_C) && defined(I_STDLIB) # include @@ -731,11 +720,11 @@ struct op *Perl_op asm(stringify(OP_IN_REGISTER)); # undef _SC_ARG_MAX /* Symbian has _SC_ARG_MAX but no sysconf() */ #endif -#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) && !defined(PERL_MICRO) +#if defined(HAS_SYSCALL) && !defined(HAS_SYSCALL_PROTO) EXTERN_C int syscall(int, ...); #endif -#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) && !defined(PERL_MICRO) +#if defined(HAS_USLEEP) && !defined(HAS_USLEEP_PROTO) EXTERN_C int usleep(unsigned int); #endif @@ -961,9 +950,6 @@ EXTERN_C int usleep(unsigned int); extern int memcmp (char*, char*, int); # endif # endif -# ifdef BUGGY_MSC -# pragma function(memcmp) -# endif #else # ifndef memcmp # define memcmp my_memcmp @@ -1125,7 +1111,7 @@ EXTERN_C char **environ; #endif #if defined(__cplusplus) -# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) +# if defined(BSDish) EXTERN_C char **environ; # elif defined(__CYGWIN__) EXTERN_C char *crypt(const char *, const char *); @@ -1160,12 +1146,6 @@ EXTERN_C char *crypt(const char *, const char *); # define SS_IVCHAN SS$_IVCHAN # define SS_NORMAL SS$_NORMAL #else -# define SETERRNO(errcode,vmserrcode) (errno = (errcode)) -# define dSAVEDERRNO int saved_errno -# define dSAVE_ERRNO int saved_errno = errno -# define SAVE_ERRNO (saved_errno = errno) -# define RESTORE_ERRNO (errno = saved_errno) - # define LIB_INVARG 0 # define RMS_DIR 0 # define RMS_FAC 0 @@ -1180,6 +1160,31 @@ EXTERN_C char *crypt(const char *, const char *); # define SS_NORMAL 0 #endif +#ifdef WIN32 +# define dSAVEDERRNO int saved_errno; DWORD saved_win32_errno +# define dSAVE_ERRNO int saved_errno = errno; DWORD saved_win32_errno = GetLastError() +# define SAVE_ERRNO ( saved_errno = errno, saved_win32_errno = GetLastError() ) +# define RESTORE_ERRNO ( errno = saved_errno, SetLastError(saved_win32_errno) ) +#endif + +#ifdef OS2 +# define dSAVEDERRNO int saved_errno; unsigned long saved_os2_errno +# define dSAVE_ERRNO int saved_errno = errno; unsigned long saved_os2_errno = Perl_rc +# define SAVE_ERRNO ( saved_errno = errno, saved_os2_errno = Perl_rc ) +# define RESTORE_ERRNO ( errno = saved_errno, Perl_rc = saved_os2_errno ) +#endif + +#ifndef SETERRNO +# define SETERRNO(errcode,vmserrcode) (errno = (errcode)) +#endif + +#ifndef dSAVEDERRNO +# define dSAVEDERRNO int saved_errno +# define dSAVE_ERRNO int saved_errno = errno +# define SAVE_ERRNO (saved_errno = errno) +# define RESTORE_ERRNO (errno = saved_errno) +#endif + #define ERRSV GvSVn(PL_errgv) #define CLEAR_ERRSV() STMT_START { \ @@ -1298,26 +1303,13 @@ EXTERN_C char *crypt(const char *, const char *); # endif #endif -#ifdef PERL_MICRO -# ifndef DIR -# define DIR void -# endif -#endif - -#ifdef FPUTS_BOTCH -/* work around botch in SunOS 4.0.1 and 4.0.2 */ -# ifndef fputs -# define fputs(sv,fp) fprintf(fp,"%s",sv) -# endif -#endif - /* * The following gobbledygook brought to you on behalf of __STDC__. * (I could just use #ifndef __STDC__, but this is more bulletproof * in the face of half-implementations.) */ -#if defined(I_SYSMODE) && !defined(PERL_MICRO) +#if defined(I_SYSMODE) #include #endif @@ -1461,10 +1453,6 @@ EXTERN_C char *crypt(const char *, const char *); # define S_IEXEC S_IXUSR #endif -#ifdef ff_next -# undef ff_next -#endif - #if defined(cray) || defined(gould) || defined(i860) || defined(pyr) # define SLOPPYDIVIDE #endif @@ -1589,16 +1577,17 @@ typedef UVTYPE UV; # else # undef IV_IS_QUAD # undef UV_IS_QUAD +#if !defined(PERL_CORE) || defined(USING_MSVC6) +/* We think that removing this decade-old undef this will cause too much + breakage on CPAN for too little gain. (See RT #119753) + However, we do need HAS_QUAD in the core for use by the drand48 code, + but not for Win32 VC6 because it has poor __int64 support. */ # undef HAS_QUAD +#endif # endif #endif -#ifndef HAS_QUAD -# undef PERL_NEED_MY_HTOLE64 -# undef PERL_NEED_MY_LETOH64 -# undef PERL_NEED_MY_HTOBE64 -# undef PERL_NEED_MY_BETOH64 -#endif +#define SSize_t_MAX (SSize_t)(~(size_t)0 >> 1) #define IV_DIG (BIT_DIGITS(IVSIZE * 8)) #define UV_DIG (BIT_DIGITS(UVSIZE * 8)) @@ -1913,7 +1902,7 @@ EXTERN_C long double modfl(long double, long double *); # 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) +#if !defined(Perl_fp_class) && defined(HAS_FP_CLASS) # include # if !defined(FP_SNAN) && defined(I_FP_CLASS) # include @@ -2222,9 +2211,6 @@ int isnan(double d); #endif -struct RExC_state_t; -struct _reg_trie_data; - typedef MEM_SIZE STRLEN; #ifdef PERL_MAD @@ -2278,6 +2264,7 @@ typedef struct xpvuv XPVUV; typedef struct xpvnv XPVNV; typedef struct xpvmg XPVMG; typedef struct xpvlv XPVLV; +typedef struct xpvinvlist XINVLIST; typedef struct xpvav XPVAV; typedef struct xpvhv XPVHV; typedef struct xpvgv XPVGV; @@ -2425,42 +2412,22 @@ typedef SV PADNAME; # else # include "dosish.h" # endif -# define ISHISH "dos" -#endif - -#if defined(VMS) +#elif defined(VMS) # include "vmsish.h" -# define ISHISH "vms" -#endif - -#if defined(PLAN9) +#elif defined(PLAN9) # include "./plan9/plan9ish.h" -# define ISHISH "plan9" -#endif - -#if defined(__VOS__) +#elif defined(__VOS__) # ifdef __GNUC__ # include "./vos/vosish.h" # else # include "vos/vosish.h" # endif -# define ISHISH "vos" -#endif - -#ifdef __SYMBIAN32__ +#elif defined(__SYMBIAN32__) # include "symbian/symbianish.h" -# define ISHISH "symbian" -#endif - - -#if defined(__HAIKU__) +#elif defined(__HAIKU__) # include "haiku/haikuish.h" -# define ISHISH "haiku" -#endif - -#ifndef ISHISH +#else # include "unixish.h" -# define ISHISH "unix" #endif /* NSIG logic from Configure --> */ @@ -2944,6 +2911,8 @@ 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 */ +#define PERL_EXIT_WARN 0x04 /* Warn if Perl_my_exit() or Perl_my_failure_exit() called */ +#define PERL_EXIT_ABORT 0x08 /* Call abort() if Perl_my_exit() or Perl_my_failure_exit() called */ #ifndef PERL_CORE /* format to use for version numbers in file/directory names */ @@ -3046,15 +3015,6 @@ typedef pthread_key_t perl_key; #ifdef PERL_CORE /* not used; but needed for backward compatibility with XS code? - RMB */ -# undef VDf -#else -# ifndef VDf -# define VDf "vd" -# endif -#endif - -#ifdef PERL_CORE -/* not used; but needed for backward compatibility with XS code? - RMB */ # undef UVf #else # ifndef UVf @@ -3311,8 +3271,23 @@ struct _sublex_info { typedef struct magic_state MGS; /* struct magic_state defined in mg.c */ -struct scan_data_t; /* Used in S_* functions in regcomp.c */ -struct regnode_charclass_class; /* Used in S_* functions in regcomp.c */ +#if defined(PERL_IN_REGCOMP_C) || defined(PERL_IN_REGEXEC_C) + +/* These have to be predeclared, as they are used in proto.h which is #included + * before their definitions in regcomp.h. */ + +struct scan_data_t; +struct regnode_charclass_class; + +/* A hopefully less confusing name. The sub-classes are all Posix classes only + * used under /l matching */ +typedef struct regnode_charclass_class regnode_charclass_posixl; + +typedef struct regnode_ssc regnode_ssc; +typedef struct RExC_state_t RExC_state_t; +struct _reg_trie_data; + +#endif struct ptr_tbl_ent { struct ptr_tbl_ent* next; @@ -4064,7 +4039,7 @@ EXT char *** environ_pointer; /* VMS and some other platforms don't use the environ array */ # ifdef USE_ENVIRON_ARRAY # if !defined(DONT_DECLARE_STD) || \ - (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \ + (defined(__svr4__) && defined(__GNUC__) && defined(__sun)) || \ defined(__sgi) extern char ** environ; /* environment variables supplied via exec */ # endif @@ -4273,7 +4248,6 @@ EXTCONST unsigned char PL_fold_latin1[] = { 248-32, 249-32, 250-32, 251-32, 252-32, 253-32, 254-32, 255 /* y with diaeresis */ }; -#endif /* !EBCDIC, but still in DOINIT */ /* If these tables are accessed through ebcdic, the access will be converted to * latin1 first */ @@ -4348,13 +4322,14 @@ EXTCONST unsigned char PL_mod_latin1_uc[] = { 240-32, 241-32, 242-32, 243-32, 244-32, 245-32, 246-32, 247, 248-32, 249-32, 250-32, 251-32, 252-32, 253-32, 254-32, 255 }; +#endif /* !EBCDIC, but still in DOINIT */ #else /* ! DOINIT */ -#ifndef EBCDIC +# ifndef EBCDIC EXTCONST unsigned char PL_fold[]; EXTCONST unsigned char PL_fold_latin1[]; -#endif EXTCONST unsigned char PL_mod_latin1_uc[]; EXTCONST unsigned char PL_latin1_lc[]; +# endif #endif #ifndef PERL_GLOBAL_STRUCT /* or perlvars.h */ @@ -4657,6 +4632,8 @@ EXTCONST char *const PL_phase_names[]; # define PL_amagic_generation PL_na #endif /* !PERL_CORE */ +#define PL_hints PL_compiling.cop_hints + END_EXTERN_C /*****************************************************************************/ @@ -4685,6 +4662,7 @@ typedef enum { XATTRBLOCK, XATTRTERM, XTERMBLOCK, + XPOSTDEREF, XTERMORDORDOR /* evil hack */ /* update exp_name[] in toke.c if adding to this enum */ } expectation; @@ -5043,19 +5021,19 @@ EXTCONST U8 PL_magic_data[256]; #endif #ifdef DOINIT - /* NL BD IV NV PV PI PN MG RX GV LV AV HV CV FM IO */ + /* NL IV NV PV INV PI PN MG RX GV LV AV HV CV FM IO */ EXTCONST bool -PL_valid_types_IVX[] = { 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_IVX[] = { 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; EXTCONST bool -PL_valid_types_NVX[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_NVX[] = { 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0 }; EXTCONST bool -PL_valid_types_PVX[] = { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1 }; +PL_valid_types_PVX[] = { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1 }; EXTCONST bool -PL_valid_types_RV[] = { 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }; +PL_valid_types_RV[] = { 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }; EXTCONST bool -PL_valid_types_IV_set[] = { 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }; +PL_valid_types_IV_set[] = { 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1 }; EXTCONST bool -PL_valid_types_NV_set[] = { 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; +PL_valid_types_NV_set[] = { 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; #else @@ -5656,6 +5634,12 @@ extern void moncontrol(int); # define do_aexec(really, mark,sp) do_aexec5(really, mark, sp, 0, 0) #endif +/* check embedded \0 characters in pathnames passed to syscalls, + but allow one ending \0 */ +#define IS_SAFE_SYSCALL(p, len, what, op_name) (S_is_safe_syscall(aTHX_ (p), (len), (what), (op_name))) + +#define IS_SAFE_PATHNAME(p, len, op_name) IS_SAFE_SYSCALL((p), (len), "pathname", (op_name)) + #if defined(OEMVS) #define NO_ENV_ARRAY_IN_MAIN #endif