X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/7e7bdfd74fb6c113e9fbec9b06b7f12a6be7a687..6358af1715b0184076504f68f4610f4d97c57114:/perl.h diff --git a/perl.h b/perl.h index f49c0da..79ef068 100644 --- a/perl.h +++ b/perl.h @@ -116,11 +116,6 @@ /* <--- here ends the logic shared by perl.h and makedef.pl */ -/* 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 #undef END_EXTERN_C #undef EXTERN_C @@ -246,7 +241,7 @@ Perl_pregfree(aTHX_ (prog)) #define CALLREGFREE_PVT(prog) \ - if(prog) RX_ENGINE(prog)->rxfree(aTHX_ (prog)) + if(prog && RX_ENGINE(prog)) RX_ENGINE(prog)->rxfree(aTHX_ (prog)) #define CALLREG_NUMBUF_FETCH(rx,paren,usesv) \ RX_ENGINE(rx)->numbered_buff_FETCH(aTHX_ (rx),(paren),(usesv)) @@ -299,9 +294,121 @@ : (REGEXP *)NULL) #endif +/* In case Configure was not used (we are using a "canned config" + * such as Win32, or a cross-compilation setup, for example) try going + * by the gcc major and minor versions. One useful URL is + * http://www.ohse.de/uwe/articles/gcc-attributes.html, + * but contrary to this information warn_unused_result seems + * not to be in gcc 3.3.5, at least. --jhi + * Also, when building extensions with an installed perl, this allows + * the user to upgrade gcc and get the right attributes, rather than + * relying on the list generated at Configure time. --AD + * Set these up now otherwise we get confused when some of the <*thread.h> + * includes below indirectly pull in (which needs to know if we + * have HASATTRIBUTE_FORMAT). + */ +#ifndef PERL_MICRO +#if defined __GNUC__ && !defined(__INTEL_COMPILER) +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 1 || __GNUC__ > 3 /* 3.1 -> */ +# define HASATTRIBUTE_DEPRECATED +# endif +# if __GNUC__ >= 3 /* 3.0 -> */ /* XXX Verify this version */ +# define HASATTRIBUTE_FORMAT +# if defined __MINGW32__ +# define PRINTF_FORMAT_NULL_OK +# endif +# endif +# if __GNUC__ >= 3 /* 3.0 -> */ +# define HASATTRIBUTE_MALLOC +# endif +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || __GNUC__ > 3 /* 3.3 -> */ +# define HASATTRIBUTE_NONNULL +# endif +# if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 || __GNUC__ > 2 /* 2.5 -> */ +# define HASATTRIBUTE_NORETURN +# endif +# if __GNUC__ >= 3 /* gcc 3.0 -> */ +# define HASATTRIBUTE_PURE +# endif +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */ +# define HASATTRIBUTE_UNUSED +# endif +# if __GNUC__ == 3 && __GNUC_MINOR__ == 3 && !defined(__cplusplus) +# define HASATTRIBUTE_UNUSED /* gcc-3.3, but not g++-3.3. */ +# endif +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */ +# define HASATTRIBUTE_WARN_UNUSED_RESULT +# endif +# if __GNUC__ == 3 && __GNUC_MINOR__ >= 1 || __GNUC__ > 3 /* 3.1 -> */ +# define HASATTRIBUTE_ALWAYS_INLINE +# endif +#endif +#endif /* #ifndef PERL_MICRO */ + +#ifdef HASATTRIBUTE_DEPRECATED +# define __attribute__deprecated__ __attribute__((deprecated)) +#endif +#ifdef HASATTRIBUTE_FORMAT +# define __attribute__format__(x,y,z) __attribute__((format(x,y,z))) +#endif +#ifdef HASATTRIBUTE_MALLOC +# define __attribute__malloc__ __attribute__((__malloc__)) +#endif +#ifdef HASATTRIBUTE_NONNULL +# define __attribute__nonnull__(a) __attribute__((nonnull(a))) +#endif +#ifdef HASATTRIBUTE_NORETURN +# define __attribute__noreturn__ __attribute__((noreturn)) +#endif +#ifdef HASATTRIBUTE_PURE +# define __attribute__pure__ __attribute__((pure)) +#endif +#ifdef HASATTRIBUTE_UNUSED +# define __attribute__unused__ __attribute__((unused)) +#endif +#ifdef HASATTRIBUTE_WARN_UNUSED_RESULT +# define __attribute__warn_unused_result__ __attribute__((warn_unused_result)) +#endif +#ifdef HASATTRIBUTE_ALWAYS_INLINE +# define __attribute__always_inline__ __attribute__((always_inline)) +#endif +/* If we haven't defined the attributes yet, define them to blank. */ +#ifndef __attribute__deprecated__ +# define __attribute__deprecated__ +#endif +#ifndef __attribute__format__ +# define __attribute__format__(x,y,z) +#endif +#ifndef __attribute__malloc__ +# define __attribute__malloc__ +#endif +#ifndef __attribute__nonnull__ +# define __attribute__nonnull__(a) +#endif +#ifndef __attribute__noreturn__ +# define __attribute__noreturn__ +#endif +#ifndef __attribute__pure__ +# define __attribute__pure__ +#endif +#ifndef __attribute__unused__ +# define __attribute__unused__ +#endif +#ifndef __attribute__warn_unused_result__ +# define __attribute__warn_unused_result__ +#endif +#ifndef __attribute__always_inline__ +# define __attribute__always_inline__ +#endif +/* Some OS warn on NULL format to printf */ +#ifdef PRINTF_FORMAT_NULL_OK +# define __attribute__format__null_ok__(x,y,z) __attribute__format__(x,y,z) +#else +# define __attribute__format__null_ok__(x,y,z) +#endif /* * Because of backward compatibility reasons the PERL_UNUSED_DECL @@ -315,20 +422,8 @@ * */ -#if defined(__SYMBIAN32__) && defined(__GNUC__) -# ifdef __cplusplus -# define PERL_UNUSED_DECL -# else -# define PERL_UNUSED_DECL __attribute__((unused)) -# endif -#endif - #ifndef PERL_UNUSED_DECL -# if defined(HASATTRIBUTE_UNUSED) && (!defined(__cplusplus) || __GNUC__ >= 4) -# define PERL_UNUSED_DECL __attribute__unused__ -# else -# define PERL_UNUSED_DECL -# endif +# define PERL_UNUSED_DECL __attribute__unused__ #endif /* gcc -Wall: @@ -395,6 +490,11 @@ # endif #endif +#if defined(_MSC_VER) +/* XXX older MSVC versions have a smallish macro buffer */ +#define PERL_SMALL_MACRO_BUFFER +#endif + /* on gcc (and clang), specify that a warning should be temporarily * ignored; e.g. * @@ -448,6 +548,19 @@ #define CLANG_DIAG_IGNORE_STMT(x) CLANG_DIAG_IGNORE(x) NOOP #define CLANG_DIAG_RESTORE_STMT CLANG_DIAG_RESTORE NOOP +#if defined(_MSC_VER) && (_MSC_VER >= 1300) +# define MSVC_DIAG_IGNORE(x) __pragma(warning(push)) \ + __pragma(warning(disable : x)) +# define MSVC_DIAG_RESTORE __pragma(warning(pop)) +#else +# define MSVC_DIAG_IGNORE(x) +# define MSVC_DIAG_RESTORE +#endif +#define MSVC_DIAG_IGNORE_DECL(x) MSVC_DIAG_IGNORE(x) dNOOP +#define MSVC_DIAG_RESTORE_DECL MSVC_DIAG_RESTORE dNOOP +#define MSVC_DIAG_IGNORE_STMT(x) MSVC_DIAG_IGNORE(x) NOOP +#define MSVC_DIAG_RESTORE_STMT MSVC_DIAG_RESTORE NOOP + #define NOOP /*EMPTY*/(void)0 #define dNOOP struct Perl___notused_struct @@ -520,12 +633,25 @@ #endif /* - * STMT_START { statements; } STMT_END; - * can be used as a single statement, as in - * if (x) STMT_START { ... } STMT_END; else ... - * - * Trying to select a version that gives no warnings... - */ +=head1 Miscellaneous Functions + +=for apidoc AmnUu|void|STMT_START + + STMT_START { statements; } STMT_END; + +can be used as a single statement, as in + + if (x) STMT_START { ... } STMT_END; else ... + +These are often used in macro definitions. Note that you can't return a value +out of them. + +=for apidoc AmnUhu|void|STMT_END + +=cut + + Trying to select a version that gives no warnings... +*/ #if !(defined(STMT_START) && defined(STMT_END)) # ifdef PERL_USE_GCC_BRACE_GROUPS # define STMT_START (void)( /* gcc supports "({ STATEMENTS; })" */ @@ -540,11 +666,6 @@ # define BYTEORDER 0x1234 #endif -/* Overall memory policy? */ -#ifndef CONSERVATIVE -# define LIBERAL 1 -#endif - #if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90 #define ASCIIish #else @@ -610,16 +731,24 @@ # define TAINT_WARN_get 0 # define TAINT_WARN_set(s) NOOP #else + /* Set to tainted if we are running under tainting mode */ # define TAINT (PL_tainted = PL_tainting) -# define TAINT_NOT (PL_tainted = FALSE) -# define TAINT_IF(c) if (UNLIKELY(c)) { PL_tainted = PL_tainting; } + +# define TAINT_NOT (PL_tainted = FALSE) /* Untaint */ +# define TAINT_IF(c) if (UNLIKELY(c)) { TAINT; } /* Conditionally taint */ # define TAINT_ENV() if (UNLIKELY(PL_tainting)) { taint_env(); } -# define TAINT_PROPER(s) if (UNLIKELY(PL_tainting)) { taint_proper(NULL, s); } + /* croak or warn if tainting */ +# define TAINT_PROPER(s) if (UNLIKELY(PL_tainting)) { \ + taint_proper(NULL, s); \ + } # define TAINT_set(s) (PL_tainted = (s)) -# define TAINT_get (PL_tainted) -# define TAINTING_get (PL_tainting) +# define TAINT_get (cBOOL(UNLIKELY(PL_tainted))) /* Is something tainted? */ +# define TAINTING_get (cBOOL(UNLIKELY(PL_tainting))) /* Is taint checking enabled? */ # define TAINTING_set(s) (PL_tainting = (s)) -# define TAINT_WARN_get (PL_taint_warn) +# define TAINT_WARN_get (PL_taint_warn) /* FALSE => tainting violations + are fatal + TRUE => they're just + warnings */ # define TAINT_WARN_set(s) (PL_taint_warn = (s)) #endif @@ -693,6 +822,10 @@ # define MB_CUR_MAX 1uL #endif +# ifdef I_WCHAR +# include +# endif + # include #ifdef I_STDINT @@ -719,10 +852,33 @@ # include #endif -#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE) -# define USE_LOCALE +/* If not forbidden, we enable locale handling if either 1) the POSIX 2008 + * functions are available, or 2) just the setlocale() function. This logic is + * repeated in t/loc_tools.pl and makedef.pl; The three should be kept in + * sync. */ +#if ! defined(NO_LOCALE) + +# if ! defined(NO_POSIX_2008_LOCALE) \ + && defined(HAS_NEWLOCALE) \ + && defined(HAS_USELOCALE) \ + && defined(HAS_DUPLOCALE) \ + && defined(HAS_FREELOCALE) \ + && defined(LC_ALL_MASK) + + /* For simplicity, the code is written to assume that any platform advanced + * enough to have the Posix 2008 locale functions has LC_ALL. The final + * test above makes sure that assumption is valid */ + +# define HAS_POSIX_2008_LOCALE +# define USE_LOCALE +# elif defined(HAS_SETLOCALE) +# define USE_LOCALE +# endif +#endif + +#ifdef USE_LOCALE # define HAS_SKIP_LOCALE_INIT /* Solely for XS code to test for this - capability */ + #define */ # if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \ && defined(HAS_STRXFRM) # define USE_LOCALE_COLLATE @@ -757,29 +913,25 @@ # if !defined(NO_LOCALE_TELEPHONE) && defined(LC_TELEPHONE) # define USE_LOCALE_TELEPHONE # endif -#endif /* !NO_LOCALE && HAS_SETLOCALE */ /* XXX The next few defines are unfortunately duplicated in makedef.pl, and * changes here MUST also be made there */ -#ifdef USE_LOCALE /* These locale things are all subject to change */ -# if defined(HAS_NEWLOCALE) \ - && defined(LC_ALL_MASK) \ - && defined(HAS_FREELOCALE) \ - && defined(HAS_USELOCALE) \ - && ! defined(NO_POSIX_2008_LOCALE) - - /* For simplicity, the code is written to assume that any platform advanced - * enough to have the Posix 2008 locale functions has LC_ALL. The test - * above makes sure that assumption is valid */ - -# define HAS_POSIX_2008_LOCALE -# endif -# if defined(USE_ITHREADS) \ - && ( defined(HAS_POSIX_2008_LOCALE) \ - || (defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400)) \ - && ! defined(NO_THREAD_SAFE_LOCALE) -# define USE_THREAD_SAFE_LOCALE +# if ! defined(HAS_SETLOCALE) && defined(HAS_POSIX_2008_LOCALE) +# define USE_POSIX_2008_LOCALE +# ifndef USE_THREAD_SAFE_LOCALE +# define USE_THREAD_SAFE_LOCALE +# endif + /* If compiled with + * -DUSE_THREAD_SAFE_LOCALE, will do so even + * on unthreaded builds */ +# elif (defined(USE_ITHREADS) || defined(USE_THREAD_SAFE_LOCALE)) \ + && ( defined(HAS_POSIX_2008_LOCALE) \ + || (defined(WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400)) \ + && ! defined(NO_THREAD_SAFE_LOCALE) +# ifndef USE_THREAD_SAFE_LOCALE +# define USE_THREAD_SAFE_LOCALE +# endif # ifdef HAS_POSIX_2008_LOCALE # define USE_POSIX_2008_LOCALE # endif @@ -1050,11 +1202,20 @@ EXTERN_C int usleep(unsigned int); # define STRUCT_OFFSET(s,m) offsetof(s,m) #endif -/* ptrdiff_t is C11, so undef it under pedantic builds */ +/* ptrdiff_t is C11, so undef it under pedantic builds. (Actually it is + * in C89, but apparently there are platforms where it doesn't exist. See + * thread beginning at http://nntp.perl.org/group/perl.perl5.porters/251541.) + * */ #ifdef PERL_GCC_PEDANTIC # undef HAS_PTRDIFF_T #endif +#ifdef HAS_PTRDIFF_T +# define Ptrdiff_t ptrdiff_t +#else +# define Ptrdiff_t SSize_t +#endif + #ifndef __SYMBIAN32__ # include #endif @@ -1079,7 +1240,7 @@ EXTERN_C int usleep(unsigned int); # define saferealloc Perl_realloc # define safefree Perl_mfree # define CHECK_MALLOC_TOO_LATE_FOR_(code) STMT_START { \ - if (!PL_tainting && MallocCfg_ptr[MallocCfg_cfg_env_read]) \ + if (!TAINTING_get && MallocCfg_ptr[MallocCfg_cfg_env_read]) \ code; \ } STMT_END # define CHECK_MALLOC_TOO_LATE_FOR(ch) \ @@ -1225,6 +1386,38 @@ EXTERN_C char *crypt(const char *, const char *); EXTERN_C char *crypt(const char *, const char *); #endif +/* +=head1 Errno + +=for apidoc m|void|SETERRNO|int errcode|int vmserrcode + +Set C, and on VMS set C. + +=for apidoc mn|void|dSAVEDERRNO + +Declare variables needed to save C and any operating system +specific error number. + +=for apidoc mn|void|dSAVE_ERRNO + +Declare variables needed to save C and any operating system +specific error number, and save them for optional later restoration +by C. + +=for apidoc mn|void|SAVE_ERRNO + +Save C and any operating system specific error number for +optional later restoration by C. Requires +C or C in scope. + +=for apidoc mn|void|RESTORE_ERRNO + +Restore C and any operating system specific error number that +was saved by C or C. + +=cut +*/ + #ifdef SETERRNO # undef SETERRNO /* SOCKS might have defined this */ #endif @@ -1296,6 +1489,29 @@ EXTERN_C char *crypt(const char *, const char *); # define RESTORE_ERRNO (errno = saved_errno) #endif +/* +=head1 Warning and Dieing + +=for apidoc Amn|SV *|ERRSV + +Returns the SV for C<$@>, creating it if needed. + +=for apidoc Am|void|CLEAR_ERRSV + +Clear the contents of C<$@>, setting it to the empty string. + +This replaces any read-only SV with a fresh SV and removes any magic. + +=for apidoc Am|void|SANE_ERRSV + +Clean up ERRSV so we can safely set it. + +This replaces any read-only SV with a fresh writable copy and removes +any magic. + +=cut +*/ + #define ERRSV GvSVn(PL_errgv) /* contains inlined gv_add_by_type */ @@ -1316,6 +1532,23 @@ EXTERN_C char *crypt(const char *, const char *); } \ } STMT_END +/* contains inlined gv_add_by_type */ +#define SANE_ERRSV() STMT_START { \ + SV ** const svp = &GvSV(PL_errgv); \ + if (!*svp) { \ + *svp = newSVpvs(""); \ + } else if (SvREADONLY(*svp)) { \ + SV *dupsv = newSVsv(*svp); \ + SvREFCNT_dec_NN(*svp); \ + *svp = dupsv; \ + } else { \ + SV *const errsv = *svp; \ + if (SvMAGICAL(errsv)) { \ + mg_free(errsv); \ + } \ + } \ + } STMT_END + #ifdef PERL_CORE # define DEFSV (0 + GvSVn(PL_defgv)) @@ -1344,7 +1577,7 @@ EXTERN_C char *crypt(const char *, const char *); #define UNKNOWN_ERRNO_MSG "(unknown)" -#if VMS +#ifdef VMS #define Strerror(e) strerror((e), vaxc$errno) #else #define Strerror(e) strerror(e) @@ -1541,9 +1774,17 @@ EXTERN_C char *crypt(const char *, const char *); /* This used to be conditionally defined based on whether we had a sprintf() * that correctly returns the string length (as required by C89), but we no * longer need that. XS modules can (and do) use this name, so it must remain - * a part of the API that's visible to modules. But we no longer document it - * either (because using sprintf() rather than snprintf() is almost always - * a bad idea). */ + * a part of the API that's visible to modules. + +=head1 Miscellaneous Functions + +=for apidoc ATmD|int|my_sprintf|NN char *buffer|NN const char *pat|... + +Do NOT use this due to the possibility of overflowing C. Instead use +my_snprintf() + +=cut +*/ #define my_sprintf sprintf /* @@ -1626,8 +1867,6 @@ EXTERN_C char *crypt(const char *, const char *); #ifdef HAS_STRLCAT # define my_strlcat strlcat -#else -# define my_strlcat Perl_my_strlcat #endif #if defined(PERL_CORE) || defined(PERL_EXT) @@ -1640,14 +1879,10 @@ EXTERN_C char *crypt(const char *, const char *); #ifdef HAS_STRLCPY # define my_strlcpy strlcpy -#else -# define my_strlcpy Perl_my_strlcpy #endif #ifdef HAS_STRNLEN # define my_strnlen strnlen -#else -# define my_strnlen Perl_my_strnlen #endif /* @@ -1661,13 +1896,13 @@ typedef UVTYPE UV; #if defined(USE_64_BIT_INT) && defined(HAS_QUAD) # if QUADKIND == QUAD_IS_INT64_T && defined(INT64_MAX) -# define IV_MAX INT64_MAX -# define IV_MIN INT64_MIN -# define UV_MAX UINT64_MAX +# define IV_MAX ((IV)INT64_MAX) +# define IV_MIN ((IV)INT64_MIN) +# define UV_MAX ((UV)UINT64_MAX) # ifndef UINT64_MIN # define UINT64_MIN 0 # endif -# define UV_MIN UINT64_MIN +# define UV_MIN ((UV)UINT64_MIN) # else # define IV_MAX PERL_QUAD_MAX # define IV_MIN PERL_QUAD_MIN @@ -1678,17 +1913,17 @@ typedef UVTYPE UV; # define UV_IS_QUAD #else # if defined(INT32_MAX) && IVSIZE == 4 -# define IV_MAX INT32_MAX -# define IV_MIN INT32_MIN +# define IV_MAX ((IV)INT32_MAX) +# define IV_MIN ((IV)INT32_MIN) # ifndef UINT32_MAX_BROKEN /* e.g. HP-UX with gcc messes this up */ -# define UV_MAX UINT32_MAX +# define UV_MAX ((UV)UINT32_MAX) # else -# define UV_MAX 4294967295U +# define UV_MAX ((UV)4294967295U) # endif # ifndef UINT32_MIN # define UINT32_MIN 0 # endif -# define UV_MIN UINT32_MIN +# define UV_MIN ((UV)UINT32_MIN) # else # define IV_MAX PERL_LONG_MAX # define IV_MIN PERL_LONG_MIN @@ -1704,11 +1939,10 @@ typedef UVTYPE UV; # else # undef IV_IS_QUAD # undef UV_IS_QUAD -#if !defined(PERL_CORE) || defined(USING_MSVC6) +#if !defined(PERL_CORE) /* 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. */ + However, we do need HAS_QUAD in the core for use by the drand48 code. */ # undef HAS_QUAD #endif # endif @@ -1800,11 +2034,6 @@ typedef NVTYPE NV; # include #endif -#ifdef USING_MSVC6 -/* VC6 has broken NaN semantics: NaN == NaN returns true instead of false, - * and for example NaN < IV_MIN. */ -# define NAN_COMPARE_BROKEN -#endif #if defined(__DECC) && defined(__osf__) /* Also Tru64 cc has broken NaN comparisons. */ # define NAN_COMPARE_BROKEN @@ -1943,6 +2172,7 @@ extern long double Perl_my_frexpl(long double x, int *e); # define Perl_fmod fmodq # define Perl_log logq # define Perl_log10 log10q +# define Perl_signbit signbitq # define Perl_pow powq # define Perl_sin sinq # define Perl_sinh sinhq @@ -2190,7 +2420,7 @@ extern long double Perl_my_frexpl(long double x, int *e); #endif /* Win32: _fpclass(), _isnan(), _finite(). */ -#ifdef WIN32 +#ifdef _MSC_VER # ifndef Perl_isnan # define Perl_isnan(x) _isnan(x) # endif @@ -2248,10 +2478,6 @@ extern long double Perl_my_frexpl(long double x, int *e); (Perl_fp_class_pdenorm(x) || Perl_fp_class_ndenorm(x)) #endif -#ifdef UNDER_CE -int isnan(double d); -#endif - #ifndef Perl_isnan # ifdef Perl_fp_class_nan # define Perl_isnan(x) Perl_fp_class_nan(x) @@ -2372,6 +2598,58 @@ int isnan(double d); # define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) #endif +/* +=head1 Numeric functions + +=for apidoc AmnUh||PERL_INT_MIN +=for apidoc AmnUh||PERL_LONG_MAX +=for apidoc AmnUh||PERL_LONG_MIN +=for apidoc AmnUh||PERL_QUAD_MAX +=for apidoc AmnUh||PERL_SHORT_MAX +=for apidoc AmnUh||PERL_SHORT_MIN +=for apidoc AmnUh||PERL_UCHAR_MAX +=for apidoc AmnUh||PERL_UCHAR_MIN +=for apidoc AmnUh||PERL_UINT_MAX +=for apidoc AmnUh||PERL_ULONG_MAX +=for apidoc AmnUh||PERL_ULONG_MIN +=for apidoc AmnUh||PERL_UQUAD_MAX +=for apidoc AmnUh||PERL_UQUAD_MIN +=for apidoc AmnUh||PERL_USHORT_MAX +=for apidoc AmnUh||PERL_USHORT_MIN +=for apidoc AmnUh||PERL_QUAD_MIN +=for apidoc AmnU||PERL_INT_MAX +This and +C, +C, +C, +C, +C, +C, +C, +C, +C, +C, +C, +C, +C, +C, +C, +C +give the largest and smallest number representable in the current +platform in variables of the corresponding types. + +For signed types, the smallest representable number is the most negative +number, the one furthest away from zero. + +For C99 and later compilers, these correspond to things like C, which +are available to the C code. But these constants, furnished by Perl, +allow code compiled on earlier compilers to portably have access to the same +constants. + +=cut + +*/ + typedef MEM_SIZE STRLEN; typedef struct op OP; @@ -2629,6 +2907,64 @@ typedef struct padname PADNAME; # define USE_ENVIRON_ARRAY #endif +#ifdef USE_ITHREADS + /* On some platforms it would be safe to use a read/write mutex with many + * readers possible at the same time. On other platforms, notably IBM ones, + * subsequent getenv calls destroy earlier ones. Those platforms would not + * be able to handle simultaneous getenv calls */ +# define ENV_LOCK MUTEX_LOCK(&PL_env_mutex) +# define ENV_UNLOCK MUTEX_UNLOCK(&PL_env_mutex) +# define ENV_INIT MUTEX_INIT(&PL_env_mutex); +# define ENV_TERM MUTEX_DESTROY(&PL_env_mutex); +#else +# define ENV_LOCK NOOP; +# define ENV_UNLOCK NOOP; +# define ENV_INIT NOOP; +# define ENV_TERM NOOP; +#endif + +/* Some critical sections need to lock both the locale and the environment. + * XXX khw intends to change this to lock both mutexes, but that brings up + * issues of potential deadlock, so should be done at the beginning of a + * development cycle. So for now, it just locks the environment. Note that + * many modern platforms are locale-thread-safe anyway, so locking the locale + * mutex is a no-op anyway */ +#define ENV_LOCALE_LOCK ENV_LOCK +#define ENV_LOCALE_UNLOCK ENV_UNLOCK + +/* And some critical sections care only that no one else is writing either the + * locale nor the environment. XXX Again this is for the future. This can be + * simulated with using COND_WAIT in thread.h */ +#define ENV_LOCALE_READ_LOCK ENV_LOCALE_LOCK +#define ENV_LOCALE_READ_UNLOCK ENV_LOCALE_UNLOCK + +#if defined(HAS_SIGACTION) && defined(SA_SIGINFO) + /* having sigaction(2) means that the OS supports both 1-arg and 3-arg + * signal handlers. But the perl core itself only fully supports 1-arg + * handlers, so don't enable for now. + * NB: POSIX::sigaction() supports both. + * + * # define PERL_USE_3ARG_SIGHANDLER + */ +#endif + +/* Siginfo_t: + * This is an alias for the OS's siginfo_t, except that where the OS + * doesn't support it, declare a dummy version instead. This allows us to + * have signal handler functions which always have a Siginfo_t parameter + * regardless of platform, (and which will just be passed a NULL value + * where the OS doesn't support HAS_SIGACTION). + */ + +#if defined(HAS_SIGACTION) && defined(SA_SIGINFO) + typedef siginfo_t Siginfo_t; +#else + typedef struct { + int si_signo; + } Siginfo_t; +#endif + + /* * initialise to avoid floating-point exceptions from overflow, etc */ @@ -2746,55 +3082,6 @@ freeing any remaining Perl interpreters. # endif #endif -/* In case Configure was not used (we are using a "canned config" - * such as Win32, or a cross-compilation setup, for example) try going - * by the gcc major and minor versions. One useful URL is - * http://www.ohse.de/uwe/articles/gcc-attributes.html, - * but contrary to this information warn_unused_result seems - * not to be in gcc 3.3.5, at least. --jhi - * Also, when building extensions with an installed perl, this allows - * the user to upgrade gcc and get the right attributes, rather than - * relying on the list generated at Configure time. --AD - * Set these up now otherwise we get confused when some of the <*thread.h> - * includes below indirectly pull in (which needs to know if we - * have HASATTRIBUTE_FORMAT). - */ - -#ifndef PERL_MICRO -#if defined __GNUC__ && !defined(__INTEL_COMPILER) -# if __GNUC__ == 3 && __GNUC_MINOR__ >= 1 || __GNUC__ > 3 /* 3.1 -> */ -# define HASATTRIBUTE_DEPRECATED -# endif -# if __GNUC__ >= 3 /* 3.0 -> */ /* XXX Verify this version */ -# define HASATTRIBUTE_FORMAT -# if defined __MINGW32__ -# define PRINTF_FORMAT_NULL_OK -# endif -# endif -# if __GNUC__ >= 3 /* 3.0 -> */ -# define HASATTRIBUTE_MALLOC -# endif -# if __GNUC__ == 3 && __GNUC_MINOR__ >= 3 || __GNUC__ > 3 /* 3.3 -> */ -# define HASATTRIBUTE_NONNULL -# endif -# if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 || __GNUC__ > 2 /* 2.5 -> */ -# define HASATTRIBUTE_NORETURN -# endif -# if __GNUC__ >= 3 /* gcc 3.0 -> */ -# define HASATTRIBUTE_PURE -# endif -# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */ -# define HASATTRIBUTE_UNUSED -# endif -# if __GNUC__ == 3 && __GNUC_MINOR__ == 3 && !defined(__cplusplus) -# define HASATTRIBUTE_UNUSED /* gcc-3.3, but not g++-3.3. */ -# endif -# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4 || __GNUC__ > 3 /* 3.4 -> */ -# define HASATTRIBUTE_WARN_UNUSED_RESULT -# endif -#endif -#endif /* #ifndef PERL_MICRO */ - /* 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++ @@ -3311,7 +3598,13 @@ EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex) #define HEKfARG(p) ((void*)(p)) -/* Takes three arguments: is_utf8, length, str */ +/* +=for apidoc Amnh||UTF8f +=for apidoc Amh||UTF8fARG|bool is_utf8|Size_t byte_len|char *str + +=cut + * %4p is a custom format + */ #ifndef UTF8f # define UTF8f "d%" UVuf "%4p" #endif @@ -3327,57 +3620,6 @@ EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex) # define UVf UVuf #endif -#ifdef HASATTRIBUTE_DEPRECATED -# define __attribute__deprecated__ __attribute__((deprecated)) -#endif -#ifdef HASATTRIBUTE_FORMAT -# define __attribute__format__(x,y,z) __attribute__((format(x,y,z))) -#endif -#ifdef HASATTRIBUTE_MALLOC -# define __attribute__malloc__ __attribute__((__malloc__)) -#endif -#ifdef HASATTRIBUTE_NONNULL -# define __attribute__nonnull__(a) __attribute__((nonnull(a))) -#endif -#ifdef HASATTRIBUTE_NORETURN -# define __attribute__noreturn__ __attribute__((noreturn)) -#endif -#ifdef HASATTRIBUTE_PURE -# define __attribute__pure__ __attribute__((pure)) -#endif -#ifdef HASATTRIBUTE_UNUSED -# define __attribute__unused__ __attribute__((unused)) -#endif -#ifdef HASATTRIBUTE_WARN_UNUSED_RESULT -# define __attribute__warn_unused_result__ __attribute__((warn_unused_result)) -#endif - -/* If we haven't defined the attributes yet, define them to blank. */ -#ifndef __attribute__deprecated__ -# define __attribute__deprecated__ -#endif -#ifndef __attribute__format__ -# define __attribute__format__(x,y,z) -#endif -#ifndef __attribute__malloc__ -# define __attribute__malloc__ -#endif -#ifndef __attribute__nonnull__ -# define __attribute__nonnull__(a) -#endif -#ifndef __attribute__noreturn__ -# define __attribute__noreturn__ -#endif -#ifndef __attribute__pure__ -# define __attribute__pure__ -#endif -#ifndef __attribute__unused__ -# define __attribute__unused__ -#endif -#ifndef __attribute__warn_unused_result__ -# define __attribute__warn_unused_result__ -#endif - #if !defined(DEBUGGING) && !defined(NDEBUG) # define NDEBUG 1 #endif @@ -3392,20 +3634,30 @@ EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex) # define NORETURN_FUNCTION_END NOT_REACHED; return 0 #endif -/* Some OS warn on NULL format to printf */ -#ifdef PRINTF_FORMAT_NULL_OK -# define __attribute__format__null_ok__(x,y,z) __attribute__format__(x,y,z) -#else -# define __attribute__format__null_ok__(x,y,z) -#endif - #ifdef HAS_BUILTIN_EXPECT # define EXPECT(expr,val) __builtin_expect(expr,val) #else # define EXPECT(expr,val) (expr) #endif + +/* +=head1 Miscellaneous Functions + +=for apidoc AmU|bool|LIKELY|const bool expr + +Returns the input unchanged, but at the same time it gives a branch prediction +hint to the compiler that this condition is likely to be true. + +=for apidoc AmU|bool|UNLIKELY|const bool expr + +Returns the input unchanged, but at the same time it gives a branch prediction +hint to the compiler that this condition is likely to be false. + +=cut +*/ #define LIKELY(cond) EXPECT(cBOOL(cond),TRUE) #define UNLIKELY(cond) EXPECT(cBOOL(cond),FALSE) + #ifdef HAS_BUILTIN_CHOOSE_EXPR /* placeholder */ #endif @@ -3422,8 +3674,11 @@ EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex) STATIC_ASSERT_STMT expands to a statement and is suitable for use inside a function. */ -#if (defined(static_assert) || (defined(__cplusplus) && __cplusplus >= 201103L)) && (!defined(__IBMC__) || __IBMC__ >= 1210) -/* static_assert is a macro defined in in C11 or a compiler +#if (! defined(__IBMC__) || __IBMC__ >= 1210) \ + && (( defined(static_assert) && ( defined(_ISOC11_SOURCE) \ + || (__STDC_VERSION__ - 0) >= 201101L)) \ + || (defined(__cplusplus) && __cplusplus >= 201103L)) +/* XXX static_assert is a macro defined in in C11 or a compiler builtin in C++11. But IBM XL C V11 does not support _Static_assert, no matter what says. */ @@ -3479,9 +3734,9 @@ EXTERN_C int perl_tsa_mutex_unlock(perl_mutex* mutex) # define NOT_REACHED #elif defined(DEBUGGING) && (__has_builtin(__builtin_unreachable) \ || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5 || __GNUC__ > 4)) /* 4.5 -> */ -# define NOT_REACHED STMT_START { ASSUME(0); __builtin_unreachable(); } STMT_END +# define NOT_REACHED STMT_START { ASSUME(!"UNREACHABLE"); __builtin_unreachable(); } STMT_END #else -# define NOT_REACHED ASSUME(0) +# define NOT_REACHED ASSUME(!"UNREACHABLE") #endif /* Some unistd.h's give a prototype for pause() even though @@ -3600,6 +3855,14 @@ typedef struct crypt_data { /* straight from /usr/include/crypt.h */ # define PERL_STATIC_INLINE_NO_RET PERL_STATIC_INLINE #endif +#ifndef PERL_STATIC_FORCE_INLINE +# define PERL_STATIC_FORCE_INLINE PERL_STATIC_INLINE +#endif + +#ifndef PERL_STATIC_FORCE_INLINE_NO_RET +# define PERL_STATIC_FORCE_INLINE_NO_RET PERL_STATIC_INLINE +#endif + #if !defined(OS2) # include "iperlsys.h" #endif @@ -3625,13 +3888,13 @@ typedef struct crypt_data { /* straight from /usr/include/crypt.h */ /* macros to define bit-fields in structs. */ #ifndef PERL_BITFIELD8 -# define PERL_BITFIELD8 unsigned +# define PERL_BITFIELD8 U8 #endif #ifndef PERL_BITFIELD16 -# define PERL_BITFIELD16 unsigned +# define PERL_BITFIELD16 U16 #endif #ifndef PERL_BITFIELD32 -# define PERL_BITFIELD32 unsigned +# define PERL_BITFIELD32 U32 #endif #include "sv.h" @@ -3672,11 +3935,10 @@ typedef struct magic_state MGS; /* struct magic_state defined in mg.c */ struct scan_data_t; typedef struct regnode_charclass regnode_charclass; -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_charclass_posixl regnode_charclass_class; +typedef struct regnode_charclass_posixl regnode_charclass_posixl; typedef struct regnode_ssc regnode_ssc; typedef struct RExC_state_t RExC_state_t; @@ -3838,7 +4100,9 @@ my_swap16(const U16 x) { #define U_L(what) U_32(what) #ifdef HAS_SIGNBIT -# define Perl_signbit signbit +# ifndef Perl_signbit +# define Perl_signbit signbit +# endif #endif /* These do not care about the fractional part, only about the range. */ @@ -3855,7 +4119,7 @@ my_swap16(const U16 x) { #endif #ifndef __cplusplus -#if !(defined(WIN32) || defined(UNDER_CE) || defined(SYMBIAN)) +#if !(defined(WIN32) || defined(SYMBIAN)) Uid_t getuid (void); Uid_t geteuid (void); Gid_t getgid (void); @@ -3906,7 +4170,8 @@ Gid_t getegid (void); #define DEBUG_B_FLAG 0x02000000 /*33554432*/ #define DEBUG_L_FLAG 0x04000000 /*67108864*/ #define DEBUG_i_FLAG 0x08000000 /*134217728*/ -#define DEBUG_MASK 0x0FFFEFFF /* mask of all the standard flags */ +#define DEBUG_y_FLAG 0x10000000 /*268435456*/ +#define DEBUG_MASK 0x1FFFEFFF /* mask of all the standard flags */ #define DEBUG_DB_RECURSE_FLAG 0x40000000 #define DEBUG_TOP_FLAG 0x80000000 /* -D was given --> PL_debug |= FLAG */ @@ -3938,10 +4203,12 @@ Gid_t getegid (void); # define DEBUG_B_TEST_ UNLIKELY(PL_debug & DEBUG_B_FLAG) # define DEBUG_L_TEST_ UNLIKELY(PL_debug & DEBUG_L_FLAG) # define DEBUG_i_TEST_ UNLIKELY(PL_debug & DEBUG_i_FLAG) +# define DEBUG_y_TEST_ UNLIKELY(PL_debug & DEBUG_y_FLAG) # define DEBUG_Xv_TEST_ (DEBUG_X_TEST_ && DEBUG_v_TEST_) # define DEBUG_Uv_TEST_ (DEBUG_U_TEST_ && DEBUG_v_TEST_) # define DEBUG_Pv_TEST_ (DEBUG_P_TEST_ && DEBUG_v_TEST_) # define DEBUG_Lv_TEST_ (DEBUG_L_TEST_ && DEBUG_v_TEST_) +# define DEBUG_yv_TEST_ (DEBUG_y_TEST_ && DEBUG_v_TEST_) #ifdef DEBUGGING @@ -3972,10 +4239,12 @@ Gid_t getegid (void); # define DEBUG_B_TEST DEBUG_B_TEST_ # define DEBUG_L_TEST DEBUG_L_TEST_ # define DEBUG_i_TEST DEBUG_i_TEST_ +# define DEBUG_y_TEST DEBUG_y_TEST_ # define DEBUG_Xv_TEST DEBUG_Xv_TEST_ # define DEBUG_Uv_TEST DEBUG_Uv_TEST_ # define DEBUG_Pv_TEST DEBUG_Pv_TEST_ # define DEBUG_Lv_TEST DEBUG_Lv_TEST_ +# define DEBUG_yv_TEST DEBUG_yv_TEST_ # define PERL_DEB(a) a # define PERL_DEB2(a,b) a @@ -4009,11 +4278,12 @@ Gid_t getegid (void); # define DEBUG_f(a) DEBUG__(DEBUG_f_TEST, a) -#ifndef PERL_EXT_RE_BUILD -# define DEBUG_r(a) DEBUG__(DEBUG_r_TEST, a) -#else -# define DEBUG_r(a) STMT_START {a;} STMT_END -#endif /* PERL_EXT_RE_BUILD */ +/* For re_comp.c, re_exec.c, assume -Dr has been specified */ +# ifdef PERL_EXT_RE_BUILD +# define DEBUG_r(a) STMT_START {a;} STMT_END +# else +# define DEBUG_r(a) DEBUG__(DEBUG_r_TEST, a) +# endif /* PERL_EXT_RE_BUILD */ # define DEBUG_x(a) DEBUG__(DEBUG_x_TEST, a) # define DEBUG_u(a) DEBUG__(DEBUG_u_TEST, a) @@ -4024,6 +4294,7 @@ Gid_t getegid (void); # define DEBUG_Uv(a) DEBUG__(DEBUG_Uv_TEST, a) # define DEBUG_Pv(a) DEBUG__(DEBUG_Pv_TEST, a) # define DEBUG_Lv(a) DEBUG__(DEBUG_Lv_TEST, a) +# define DEBUG_yv(a) DEBUG__(DEBUG_yv_TEST, a) # define DEBUG_S(a) DEBUG__(DEBUG_S_TEST, a) # define DEBUG_T(a) DEBUG__(DEBUG_T_TEST, a) @@ -4036,8 +4307,9 @@ Gid_t getegid (void); # define DEBUG_B(a) DEBUG__(DEBUG_B_TEST, a) # define DEBUG_L(a) DEBUG__(DEBUG_L_TEST, a) # define DEBUG_i(a) DEBUG__(DEBUG_i_TEST, a) +# define DEBUG_y(a) DEBUG__(DEBUG_y_TEST, a) -#else /* DEBUGGING */ +#else /* ! DEBUGGING below */ # define DEBUG_p_TEST (0) # define DEBUG_s_TEST (0) @@ -4066,10 +4338,12 @@ Gid_t getegid (void); # define DEBUG_B_TEST (0) # define DEBUG_L_TEST (0) # define DEBUG_i_TEST (0) +# define DEBUG_y_TEST (0) # define DEBUG_Xv_TEST (0) # define DEBUG_Uv_TEST (0) # define DEBUG_Pv_TEST (0) # define DEBUG_Lv_TEST (0) +# define DEBUG_yv_TEST (0) # define PERL_DEB(a) # define PERL_DEB2(a,b) b @@ -4100,10 +4374,12 @@ Gid_t getegid (void); # define DEBUG_B(a) # define DEBUG_L(a) # define DEBUG_i(a) +# define DEBUG_y(a) # define DEBUG_Xv(a) # define DEBUG_Uv(a) # define DEBUG_Pv(a) # define DEBUG_Lv(a) +# define DEBUG_yv(a) #endif /* DEBUGGING */ @@ -4423,12 +4699,14 @@ EXTCONST char PL_no_dir_func[] EXTCONST char PL_no_func[] INIT("The %s function is unimplemented"); EXTCONST char PL_no_myglob[] - INIT("\"%s\" %se %s can't be in a package"); + INIT("\"%s\" %s %s can't be in a package"); EXTCONST char PL_no_localize_ref[] INIT("Can't localize through a reference"); EXTCONST char PL_memory_wrap[] INIT("panic: memory wrap"); - +EXTCONST char PL_extended_cp_format[] + INIT("Code point 0x%" UVXf " is not Unicode, requires a Perl extension," + " and so is not portable"); EXTCONST char PL_Yes[] INIT("1"); EXTCONST char PL_No[] @@ -4438,6 +4716,11 @@ EXTCONST char PL_Zero[] EXTCONST char PL_hexdigit[] INIT("0123456789abcdef0123456789ABCDEF"); +EXTCONST STRLEN PL_WARN_ALL + INIT(0); +EXTCONST STRLEN PL_WARN_NONE + INIT(0); + /* This is constant on most architectures, a global on OS/2 */ #ifndef OS2 EXTCONST char PL_sh_path[] @@ -4674,7 +4957,7 @@ EXTCONST unsigned char PL_latin1_lc[]; #ifndef PERL_GLOBAL_STRUCT /* or perlvars.h */ #ifdef DOINIT -EXT unsigned char PL_fold_locale[] = { /* Unfortunately not EXTCONST. */ +EXT unsigned char PL_fold_locale[256] = { /* Unfortunately not EXTCONST. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, @@ -4709,7 +4992,7 @@ EXT unsigned char PL_fold_locale[] = { /* Unfortunately not EXTCONST. */ 248, 249, 250, 251, 252, 253, 254, 255 }; #else -EXT unsigned char PL_fold_locale[]; /* Unfortunately not EXTCONST. */ +EXT unsigned char PL_fold_locale[256]; /* Unfortunately not EXTCONST. */ #endif #endif /* !PERL_GLOBAL_STRUCT */ @@ -5433,7 +5716,7 @@ EXTCONST bool PL_valid_types_NV_set[]; #ifndef EBCDIC /* The tables below are adapted from - * http://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which requires this copyright + * https://bjoern.hoehrmann.de/utf-8/decoder/dfa/, which requires this copyright * notice: Copyright (c) 2008-2009 Bjoern Hoehrmann @@ -5460,7 +5743,7 @@ SOFTWARE. # ifdef DOINIT # if 0 /* This is the original table given in - http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ */ + https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ */ static U8 utf8d_C9[] = { /* The first part of the table maps bytes to character classes that * to reduce the size of the transition table and create bitmasks. */ @@ -5518,7 +5801,7 @@ static U8 utf8d_C9[] = { * FF 1 */ -EXTCONST U8 perl_extended_utf8_dfa_tab[] = { +EXTCONST U8 PL_extended_utf8_dfa_tab[] = { /* The first part of the table maps bytes to character classes to reduce * the size of the transition table and create bitmasks. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*00-0F*/ @@ -5602,7 +5885,7 @@ EXTCONST U8 perl_extended_utf8_dfa_tab[] = { * that can be returned immediately. * * The "Implementation details" portion of - * http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ shows how + * https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ shows how * the first portion of the table maps each possible byte into a character * class. And that the classes for those bytes which are start bytes have been * carefully chosen so they serve as well to be used as a shift value to mask @@ -5656,7 +5939,7 @@ EXTCONST U8 perl_extended_utf8_dfa_tab[] = { * F5-FF 1 */ -EXTCONST U8 strict_utf8_dfa_tab[] = { +EXTCONST U8 PL_strict_utf8_dfa_tab[] = { /* The first part of the table maps bytes to character classes to reduce * the size of the transition table and create bitmasks. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*00-0F*/ @@ -5689,7 +5972,6 @@ EXTCONST U8 strict_utf8_dfa_tab[] = { * the other continuations transitions to N1 * N5 Start byte is F0. Continuation bytes 80-8F are illegal (overlong); * [9AB]F transition to N10; the other continuations to N2. - * the other continuations transition to N2 * N6 Start byte is F[123]. Continuation bytes [89AB]F transition * to N10; the other continuations to N2. * N7 Start byte is F4. Continuation bytes 90-BF are illegal @@ -5752,7 +6034,7 @@ EXTCONST U8 strict_utf8_dfa_tab[] = { /* And below is yet another version of the above tables that accepts only UTF-8 * as defined by Corregidum #9. Hence no surrogates nor non-Unicode, but * it allows non-characters. This is isomorphic to the original table - * in http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ + * in https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ * * The classes are * 00-7F 0 @@ -5771,7 +6053,7 @@ EXTCONST U8 strict_utf8_dfa_tab[] = { * F5-FF 1 */ -EXTCONST U8 C9_utf8_dfa_tab[] = { +EXTCONST U8 PL_c9_utf8_dfa_tab[] = { /* The first part of the table maps bytes to character classes to reduce * the size of the transition table and create bitmasks. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*00-0F*/ @@ -5844,9 +6126,9 @@ EXTCONST U8 C9_utf8_dfa_tab[] = { # else /* End of is DOINIT */ -EXTCONST U8 perl_extended_utf8_dfa_tab[]; -EXTCONST U8 strict_utf8_dfa_tab[]; -EXTCONST U8 C9_utf8_dfa_tab[]; +EXTCONST U8 PL_extended_utf8_dfa_tab[]; +EXTCONST U8 PL_strict_utf8_dfa_tab[]; +EXTCONST U8 PL_c9_utf8_dfa_tab[]; # endif #endif /* end of isn't EBCDIC */ @@ -5971,11 +6253,19 @@ typedef struct am_table_short AMTS; # define KEYWORD_PLUGIN_MUTEX_LOCK MUTEX_LOCK(&PL_keyword_plugin_mutex) # define KEYWORD_PLUGIN_MUTEX_UNLOCK MUTEX_UNLOCK(&PL_keyword_plugin_mutex) # define KEYWORD_PLUGIN_MUTEX_TERM MUTEX_DESTROY(&PL_keyword_plugin_mutex) +# define USER_PROP_MUTEX_INIT MUTEX_INIT(&PL_user_prop_mutex) +# define USER_PROP_MUTEX_LOCK MUTEX_LOCK(&PL_user_prop_mutex) +# define USER_PROP_MUTEX_UNLOCK MUTEX_UNLOCK(&PL_user_prop_mutex) +# define USER_PROP_MUTEX_TERM MUTEX_DESTROY(&PL_user_prop_mutex) #else # define KEYWORD_PLUGIN_MUTEX_INIT NOOP # define KEYWORD_PLUGIN_MUTEX_LOCK NOOP # define KEYWORD_PLUGIN_MUTEX_UNLOCK NOOP # define KEYWORD_PLUGIN_MUTEX_TERM NOOP +# define USER_PROP_MUTEX_INIT NOOP +# define USER_PROP_MUTEX_LOCK NOOP +# define USER_PROP_MUTEX_UNLOCK NOOP +# define USER_PROP_MUTEX_TERM NOOP #endif #ifdef USE_LOCALE /* These locale things are all subject to change */ @@ -5993,6 +6283,27 @@ typedef struct am_table_short AMTS; # define IN_SOME_LOCALE_FORM_COMPILETIME \ cBOOL(PL_hints & (HINT_LOCALE|HINT_LOCALE_PARTIAL)) +/* +=head1 Locale-related functions and macros + +=for apidoc Amn|bool|IN_LOCALE + +Evaluates to TRUE if the plain locale pragma without a parameter (S>) is in effect. + +=for apidoc Amn|bool|IN_LOCALE_COMPILETIME + +Evaluates to TRUE if, when compiling a perl program (including an C) if +the plain locale pragma without a parameter (S>) is in effect. + +=for apidoc Amn|bool|IN_LOCALE_RUNTIME + +Evaluates to TRUE if, when executing a perl program (including an C) if +the plain locale pragma without a parameter (S>) is in effect. + +=cut +*/ + # define IN_LOCALE \ (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) # define IN_SOME_LOCALE_FORM \ @@ -6019,7 +6330,7 @@ typedef struct am_table_short AMTS; # if defined (PERL_CORE) || defined (PERL_IN_XSUB_RE) /* This internal macro should be called from places that operate under - * locale rules. It there is a problem with the current locale that + * locale rules. If there is a problem with the current locale that * hasn't been raised yet, it will output a warning this time. Because * this will so rarely be true, there is no point to optimize for time; * instead it makes sense to minimize space used and do all the work in @@ -6193,7 +6504,7 @@ typedef struct am_table_short AMTS; else { \ PL_lc_numeric_mutex_depth++; \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: avoided lc_numeric_lock; depth=%d\n", \ + "%s: %d: avoided lc_numeric_lock; new depth=%d\n", \ __FILE__, __LINE__, PL_lc_numeric_mutex_depth)); \ if (cond_to_panic_if_already_locked) { \ Perl_croak_nocontext("panic: %s: %d: Trying to change" \ @@ -6215,7 +6526,7 @@ typedef struct am_table_short AMTS; else { \ PL_lc_numeric_mutex_depth--; \ DEBUG_Lv(PerlIO_printf(Perl_debug_log, \ - "%s: %d: avoided lc_numeric_unlock; depth=%d\n", \ + "%s: %d: avoided lc_numeric_unlock; new depth=%d\n",\ __FILE__, __LINE__, PL_lc_numeric_mutex_depth)); \ } \ } STMT_END \ @@ -6314,7 +6625,15 @@ argument list, like this: On threaded perls not operating with thread-safe functionality, this macro uses a mutex to force a critical section. Therefore the matching RESTORE should be -close by, and guaranteed to be called. +close by, and guaranteed to be called; see L +for a more contained way to ensure that. + +=for apidoc Am|void|STORE_LC_NUMERIC_SET_TO_NEEDED_IN|bool in_lc_numeric + +Same as L with in_lc_numeric provided +as the precalculated value of C. It is the caller's +responsibility to ensure that the status of C and C +cannot have changed since the precalculation. =for apidoc Am|void|RESTORE_LC_NUMERIC @@ -6335,6 +6654,36 @@ expression, but with an empty argument list, like this: ... } +=for apidoc Am|void|WITH_LC_NUMERIC_SET_TO_NEEDED|block + +This macro invokes the supplied statement or block within the context +of a L .. L pair +if required, so eg: + + WITH_LC_NUMERIC_SET_TO_NEEDED( + SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis) + ); + +is equivalent to: + + { +#ifdef USE_LOCALE_NUMERIC + DECLARATION_FOR_LC_NUMERIC_MANIPULATION; + STORE_LC_NUMERIC_SET_TO_NEEDED(); +#endif + SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis); +#ifdef USE_LOCALE_NUMERIC + RESTORE_LC_NUMERIC(); +#endif + } + +=for apidoc Am|void|WITH_LC_NUMERIC_SET_TO_NEEDED_IN|bool in_lc_numeric|block + +Same as L with in_lc_numeric provided +as the precalculated value of C. It is the caller's +responsibility to ensure that the status of C and C +cannot have changed since the precalculation. + =cut */ @@ -6362,12 +6711,13 @@ expression, but with an empty argument list, like this: # define DECLARATION_FOR_LC_NUMERIC_MANIPULATION \ void (*_restore_LC_NUMERIC_function)(pTHX) = NULL -# define STORE_LC_NUMERIC_SET_TO_NEEDED() \ +# define STORE_LC_NUMERIC_SET_TO_NEEDED_IN(in) \ STMT_START { \ + bool _in_lc_numeric = (in); \ LC_NUMERIC_LOCK( \ - (IN_LC(LC_NUMERIC) && _NOT_IN_NUMERIC_UNDERLYING) \ - || _NOT_IN_NUMERIC_STANDARD); \ - if (IN_LC(LC_NUMERIC)) { \ + ( ( _in_lc_numeric && _NOT_IN_NUMERIC_UNDERLYING) \ + || (! _in_lc_numeric && _NOT_IN_NUMERIC_STANDARD))); \ + if (_in_lc_numeric) { \ if (_NOT_IN_NUMERIC_UNDERLYING) { \ Perl_set_numeric_underlying(aTHX); \ _restore_LC_NUMERIC_function \ @@ -6383,6 +6733,9 @@ expression, but with an empty argument list, like this: } \ } STMT_END +# define STORE_LC_NUMERIC_SET_TO_NEEDED() \ + STORE_LC_NUMERIC_SET_TO_NEEDED_IN(IN_LC(LC_NUMERIC)) + # define RESTORE_LC_NUMERIC() \ STMT_START { \ if (_restore_LC_NUMERIC_function) { \ @@ -6457,6 +6810,17 @@ expression, but with an empty argument list, like this: __FILE__, __LINE__, PL_numeric_standard)); \ } STMT_END +# define WITH_LC_NUMERIC_SET_TO_NEEDED_IN(in_lc_numeric, block) \ + STMT_START { \ + DECLARATION_FOR_LC_NUMERIC_MANIPULATION; \ + STORE_LC_NUMERIC_SET_TO_NEEDED_IN(in_lc_numeric); \ + block; \ + RESTORE_LC_NUMERIC(); \ + } STMT_END; + +# define WITH_LC_NUMERIC_SET_TO_NEEDED(block) \ + WITH_LC_NUMERIC_SET_TO_NEEDED_IN(IN_LC(LC_NUMERIC), block) + #else /* !USE_LOCALE_NUMERIC */ # define SET_NUMERIC_STANDARD() @@ -6465,25 +6829,53 @@ expression, but with an empty argument list, like this: # define DECLARATION_FOR_LC_NUMERIC_MANIPULATION # define STORE_LC_NUMERIC_SET_STANDARD() # define STORE_LC_NUMERIC_FORCE_TO_UNDERLYING() +# define STORE_LC_NUMERIC_SET_TO_NEEDED_IN(in_lc_numeric) # define STORE_LC_NUMERIC_SET_TO_NEEDED() # define RESTORE_LC_NUMERIC() # define LOCK_LC_NUMERIC_STANDARD() # define UNLOCK_LC_NUMERIC_STANDARD() +# define WITH_LC_NUMERIC_SET_TO_NEEDED_IN(in_lc_numeric, block) \ + STMT_START { block; } STMT_END +# define WITH_LC_NUMERIC_SET_TO_NEEDED(block) \ + STMT_START { block; } STMT_END #endif /* !USE_LOCALE_NUMERIC */ #define Atof my_atof -#ifdef USE_QUADMATH -# define Perl_strtod(s, e) strtoflt128(s, e) -#elif defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE) -# if defined(HAS_STRTOLD) -# define Perl_strtod(s, e) strtold(s, e) -# elif defined(HAS_STRTOD) -# define Perl_strtod(s, e) (NV)strtod(s, e) /* Unavoidable loss. */ -# endif -#elif defined(HAS_STRTOD) -# define Perl_strtod(s, e) strtod(s, e) +/* + +=head1 Numeric functions + +=for apidoc AmTR|NV|Strtod|NN const char * const s|NULLOK char ** e + +This is a synonym for L. + +=for apidoc AmTR|NV|Strtol|NN const char * const s|NULLOK char ** e|int base + +Platform and configuration independent C. This expands to the +appropriate C-like function based on the platform and F +options>. For example it could expand to C or C instead of +C. + +=for apidoc AmTR|NV|Strtoul|NN const char * const s|NULLOK char ** e|int base + +Platform and configuration independent C. This expands to the +appropriate C-like function based on the platform and F +options>. For example it could expand to C or C instead of +C. + +=cut + +*/ + +#define Strtod my_strtod + +#if defined(HAS_STRTOD) \ + || defined(USE_QUADMATH) \ + || (defined(HAS_STRTOLD) && defined(HAS_LONG_DOUBLE) \ + && defined(USE_LONG_DOUBLE)) +# define Perl_strtod Strtod #endif #if !defined(Strtol) && defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && \ @@ -6546,6 +6938,14 @@ expression, but with an empty argument list, like this: # define Atoul(s) Strtoul(s, NULL, 10) #endif +#define grok_bin(s,lp,fp,rp) \ + grok_bin_oct_hex(s, lp, fp, rp, 1, _CC_BINDIGIT, 'b') +#define grok_oct(s,lp,fp,rp) \ + (*(fp) |= PERL_SCAN_DISALLOW_PREFIX, \ + grok_bin_oct_hex(s, lp, fp, rp, 3, _CC_OCTDIGIT, '\0')) +#define grok_hex(s,lp,fp,rp) \ + grok_bin_oct_hex(s, lp, fp, rp, 4, _CC_XDIGIT, 'x') + #ifndef PERL_SCRIPT_MODE #define PERL_SCRIPT_MODE "r" #endif @@ -6724,7 +7124,7 @@ expression, but with an empty argument list, like this: #endif #if defined(HAS_FLOCK) && !defined(HAS_FLOCK_PROTO) -int flock(int fd, int op); +EXTERN_C int flock(int fd, int op); #endif #ifndef O_RDONLY @@ -6778,19 +7178,50 @@ int flock(int fd, int op); #define IS_NUMBER_NAN 0x20 /* this is not */ #define IS_NUMBER_TRAILING 0x40 /* number has trailing trash */ +/* +=head1 Numeric functions + +=for apidoc AmdR|bool|GROK_NUMERIC_RADIX|NN const char **sp|NN const char *send + +A synonym for L + +=cut +*/ #define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) -/* Input flags: */ +/* Number scan flags. All are used for input, the ones used for output are so + * marked */ #define PERL_SCAN_ALLOW_UNDERSCORES 0x01 /* grok_??? accept _ in numbers */ #define PERL_SCAN_DISALLOW_PREFIX 0x02 /* grok_??? reject 0x in hex etc */ -#define PERL_SCAN_SILENT_ILLDIGIT 0x04 /* grok_??? not warn about illegal digits */ -#define PERL_SCAN_SILENT_NON_PORTABLE 0x08 /* grok_??? not warn about very large - numbers which are <= UV_MAX */ + +/* grok_??? input: ignored; output: found overflow */ +#define PERL_SCAN_GREATER_THAN_UV_MAX 0x04 + +/* grok_??? don't warn about illegal digits. To preserve total backcompat, + * this isn't set on output if one is found. Instead, see + * PERL_SCAN_NOTIFY_ILLDIGIT. */ +#define PERL_SCAN_SILENT_ILLDIGIT 0x08 + #define PERL_SCAN_TRAILING 0x10 /* grok_number_flags() allow trailing and set IS_NUMBER_TRAILING */ -/* Output flags: */ -#define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 /* should this merge with above? */ +/* These are considered experimental, so not exposed publicly */ +#if defined(PERL_CORE) || defined(PERL_EXT) +/* grok_??? don't warn about very large numbers which are <= UV_MAX; + * output: found such a number */ +# define PERL_SCAN_SILENT_NON_PORTABLE 0x20 + +/* If this is set on input, and no illegal digit is found, it will be cleared + * on output; otherwise unchanged */ +# define PERL_SCAN_NOTIFY_ILLDIGIT 0x40 + +/* Don't warn on overflow; output flag still set */ +# define PERL_SCAN_SILENT_OVERFLOW 0x80 + +/* Forbid a leading underscore, which the other one doesn't */ +# define PERL_SCAN_ALLOW_MEDIAL_UNDERSCORES (0x100|PERL_SCAN_ALLOW_UNDERSCORES) +#endif + /* to let user control profiling */ #ifdef PERL_GPROF_CONTROL @@ -6800,12 +7231,8 @@ extern void moncontrol(int); #define PERL_GPROF_MONCONTROL(x) #endif -#ifdef UNDER_CE -#include "wince.h" -#endif - /* ISO 6429 NEL - C1 control NExt Line */ -/* See http://www.unicode.org/unicode/reports/tr13/ */ +/* See https://www.unicode.org/unicode/reports/tr13/ */ #define NEXT_LINE_CHAR NEXT_LINE_NATIVE #ifndef PIPESOCK_MODE @@ -6862,8 +7289,20 @@ extern void moncontrol(int); #define PERL_SIGNALS_UNSAFE_FLAG 0x0001 -/* Use instead of abs() since abs() forces its argument to be an int, - * but also beware since this evaluates its argument twice, so no x++. */ +/* +=head1 Numeric functions + +=for apidoc Am|int|PERL_ABS|int + +Typeless C or C, I. (The usage below indicates it is for +integers, but it works for any type.) Use instead of these, since the C +library ones force their argument to be what it is expecting, potentially +leading to disaster. But also beware that this evaluates its argument twice, +so no C. + +=cut +*/ + #define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) #if defined(__DECC) && defined(__osf__) @@ -6881,9 +7320,19 @@ 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))) + +/* +=head1 Miscellaneous Functions + +=for apidoc Am|bool|IS_SAFE_SYSCALL|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name + +Same as L. + +=cut + +Allows one ending \0 +*/ +#define IS_SAFE_SYSCALL(p, len, what, op_name) (Perl_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)) @@ -7149,7 +7598,9 @@ START_EXTERN_C */ /* The quadmath literals are anon structs which -Wc++-compat doesn't like. */ +# ifndef USE_CPLUSPLUS GCC_DIAG_IGNORE_DECL(-Wc++-compat); +# endif # ifdef USE_QUADMATH /* Cannot use HUGE_VALQ for PL_inf because not a compile-time @@ -7219,7 +7670,9 @@ INFNAN_NV_U8_DECL PL_nan = { 0.0/0.0 }; /* keep last */ # endif # endif +# ifndef USE_CPLUSPLUS GCC_DIAG_RESTORE_DECL; +# endif #else