# if PERL_GCC_VERSION_GE(4,7,0)
# define HASATTRIBUTE_ALWAYS_INLINE
# endif
+# if PERL_GCC_VERSION_GE(3,3,0)
+# define HASATTRIBUTE_VISIBILITY
+# endif
# endif
#endif /* #ifndef PERL_MICRO */
# define __attribute__always_inline__ __attribute__((always_inline))
# endif
#endif
+#if defined(HASATTRIBUTE_VISIBILITY) && !defined(_WIN32) && !defined(__CYGWIN__)
+/* On Windows instead of this, we use __declspec(dllexport) and a .def file
+ * Cygwin works by exporting every global symbol, see the definition of ldflags
+ * near the end of hints/cygwin.sh and the visibility attribute doesn't appear
+ * to control that.
+ */
+# define __attribute__visibility__(x) __attribute__((visibility(x)))
+#endif
/* If we haven't defined the attributes yet, define them to blank. */
#ifndef __attribute__deprecated__
#ifndef __attribute__always_inline__
# define __attribute__always_inline__
#endif
+#ifndef __attribute__visibility__
+# define __attribute__visibility__(x)
+#endif
/* Some OS warn on NULL format to printf */
#ifdef PRINTF_FORMAT_NULL_OK
=cut
The __typeof__() is used instead of typeof() since typeof() is not
-available under strict C89, and because of compilers masquerading
+available under strict ISO C, and because of compilers masquerading
as gcc (clang and icc), we want exactly the gcc extension
__typeof__ and nothing else.
/*
=for apidoc_section $directives
-=for apidoc AmnUu|void|STMT_START
-=for apidoc_item ||STMT_END
+=for apidoc AmnUu|void|STMT_END
+=for apidoc_item | |STMT_START
These allow a series of statements in a macro to be used as a single statement,
as in
=back
-=for apidoc AmnuU|bool|PERL_USE_GCC_BRACE_GROUPS
+=for apidoc_section $genconfig
+=for apidoc Amn#||PERL_USE_GCC_BRACE_GROUPS
This C pre-processor value, if defined, indicates that it is permissible to use
the GCC brace groups extension. However, use of this extension is DISCOURAGED.
get out-of-sync. All these issues are solved by using a C<static inline>
function instead.
+Perl can be configured to not use this feature by passing the parameter
+C<-Accflags=-DPERL_GCC_BRACE_GROUPS_FORBIDDEN> to F<Configure>.
+
+=for apidoc Amnh#||PERL_GCC_BRACE_GROUPS_FORBIDDEN
+
Example usage:
=over
# define BYTEORDER 0x1234
#endif
+/*
+=for apidoc_section $genconfig
+=for apidoc Amn#||ASCIIish
+
+A preprocessor symbol that is defined iff the system is an ASCII platform; this
+symbol would not be defined on C<L</EBCDIC>> platforms.
+
+=cut
+*/
#if 'A' == 65 && 'I' == 73 && 'J' == 74 && 'Z' == 90
-#define ASCIIish
+# define ASCIIish
#else
-#undef ASCIIish
+# undef ASCIIish
#endif
/*
# endif
/* Now create LC_foo_INDEX_ #defines for just those categories on this system */
-# ifdef USE_LOCALE_NUMERIC
-# define LC_NUMERIC_INDEX_ 0
-# define PERL_DUMMY_NUMERIC_ LC_NUMERIC_INDEX_
-# else
-# define PERL_DUMMY_NUMERIC_ -1
-# endif
# ifdef USE_LOCALE_CTYPE
-# define LC_CTYPE_INDEX_ PERL_DUMMY_NUMERIC_ + 1
+# define LC_CTYPE_INDEX_ 0
# define PERL_DUMMY_CTYPE_ LC_CTYPE_INDEX_
# else
-# define PERL_DUMMY_CTYPE_ PERL_DUMMY_NUMERIC_
+# define PERL_DUMMY_CTYPE_ -1
+# endif
+# ifdef USE_LOCALE_NUMERIC
+# define LC_NUMERIC_INDEX_ PERL_DUMMY_CTYPE_ + 1
+# define PERL_DUMMY_NUMERIC_ LC_NUMERIC_INDEX_
+# else
+# define PERL_DUMMY_NUMERIC_ PERL_DUMMY_CTYPE_
# endif
# ifdef USE_LOCALE_COLLATE
-# define LC_COLLATE_INDEX_ PERL_DUMMY_CTYPE_ + 1
+# define LC_COLLATE_INDEX_ PERL_DUMMY_NUMERIC_ + 1
# define PERL_DUMMY_COLLATE_ LC_COLLATE_INDEX_
# else
-# define PERL_DUMMY_COLLATE_ PERL_DUMMY_CTYPE_
+# define PERL_DUMMY_COLLATE_ PERL_DUMMY_NUMERIC_
# endif
# ifdef USE_LOCALE_TIME
# define LC_TIME_INDEX_ PERL_DUMMY_COLLATE_ + 1
# define USE_POSIX_2008_LOCALE
# endif
# endif
-#endif
+
+/* Allow use of glib's undocumented querylocale() equivalent if asked for, and
+ * appropriate */
+# ifdef USE_POSIX_2008_LOCALE
+# if defined(HAS_QUERYLOCALE) \
+ /* Has this internal undocumented item for nl_langinfo() */ \
+ || ( defined(_NL_LOCALE_NAME) \
+ /* And asked for */ \
+ && defined(USE_NL_LOCALE_NAME) \
+ /* We need the below because we will be calling it within a \
+ * macro, can't have it get messed up by another thread. */ \
+ && defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \
+ /* On systems that accept any locale name, the real \
+ * underlying locale is often returned by this internal \
+ * item, so we can't use it */ \
+ && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME))
+# define USE_QUERYLOCALE
+# endif
+# endif
/* Microsoft documentation reads in the change log for VS 2015:
* "The localeconv function declared in locale.h now works correctly when
* function would return the lconv data for the global locale, not the
* thread's locale."
*/
-#if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900
+# if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900
# define TS_W32_BROKEN_LOCALECONV
+# endif
+#endif
+
+#ifdef PERL_CORE
+
+/* Both typedefs are used in locale.c only, but defined here so that embed.fnc
+ * can generate the proper prototypes. */
+
+typedef enum {
+ DONT_RECALC_LC_ALL,
+ YES_RECALC_LC_ALL,
+
+ /* Used in tight loops through all sub-categories, where LC_ALL won't be
+ * fully known until all subcategories are handled. */
+ RECALCULATE_LC_ALL_ON_FINAL_INTERATION
+} recalc_lc_all_t;
+
+
+typedef enum { /* Is the locale UTF8? */
+ LOCALE_NOT_UTF8,
+ LOCALE_IS_UTF8,
+ LOCALE_UTF8NESS_UNKNOWN
+} locale_utf8ness_t;
+
#endif
#include <setjmp.h>
#endif
/*
+=for apidoc AmnU||U32of
+=for apidoc_item ||U32uf
+=for apidoc_item ||U32xf
+=for apidoc_item ||U32Xf
+
+These symbols define the format strings used for printing variables declared
+as U32; respectively as octal, unsigned, hex (lowercase C<a-f>), and hex
+(uppercase C<a-f>).
+
+=cut
+*/
+
+#if U32SIZE == UVSIZE
+# define U32uf UVuf
+# define U32of UVof
+# define U32xf UVxf
+# define U32Xf UVXf
+#elif U32SIZE == INTSIZE
+# define U32uf "u"
+# define U32of "o"
+# define U32xf "x"
+# define U32Xf "X"
+#elif U32SIZE == LONGSIZE
+# define U32uf "lu"
+# define U32of "lo"
+# define U32xf "lx"
+# define U32Xf "lX"
+#else
+# error Cant figure out formatting strings for U32SIZE
+#endif
+
+/*
+=for apidoc AmnU||I32df
+
+This symbol defines the format string used for printing a variable declared as
+I32
+
+=cut
+*/
+
+#if I32SIZE == IVSIZE
+# define I32df IVdf
+#elif I32SIZE == INTSIZE
+# define I32df "d"
+#elif I32SIZE == LONGSIZE
+# define I32df "ld"
+#else
+# error Cant figure out formatting string for I32SIZE
+#endif
+
+/*
* The macros INT2PTR and NUM2PTR are (despite their names)
* bi-directional: they will convert int/float to or from pointers.
* However the conversion to int/float are named explicitly:
#endif
/* The default is to use Perl's own atof() implementation (in numeric.c).
- * Usually that is the one to use but for some platforms (e.g. UNICOS)
- * it is however best to use the native implementation of atof.
+ * This knows about if 'use locale' is in effect or not, and handles the radix
+ * character accordingly. On some platforms (e.g. UNICOS) it is however best
+ * to use the native implementation of atof, as long as you accept that the
+ * current underlying locale will affect the radix character. Perl's version
+ * uses a dot for a radix, execpt within the lexical scope of a Perl C<use
+ * locale> statement.
+ *
* You can experiment with using your native one by -DUSE_PERL_ATOF=0.
* Some good tests to try out with either setting are t/base/num.t,
* t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles
#endif
#ifdef USE_PERL_ATOF
-# define Perl_atof(s) Perl_my_atof(s)
+# define Perl_atof(s) Perl_my_atof(aTHX_ s)
# define Perl_atof2(s, n) Perl_my_atof3(aTHX_ (s), &(n), 0)
#else
# define Perl_atof(s) (NV)atof(s)
#define my_atof2(a,b) my_atof3(a,b,0)
/*
+=for apidoc AmTR|NV|Atof|NN const char * const s
+
+This is a synonym for L</C<my_atof>>.
+
+=cut
+
+*/
+
+#define Atof my_atof
+
+/*
=for apidoc_section $numeric
=for apidoc AmT|NV|Perl_acos|NV x
=for apidoc_item |NV|Perl_asin|NV x
the highest precision one available is used.
=cut
+
*/
/*
/*
=for apidoc_section $integer
-=for apidoc AmnU||PERL_INT_MAX
-=for apidoc_item ||PERL_INT_MIN
-=for apidoc_item ||PERL_LONG_MAX
-=for apidoc_item ||PERL_LONG_MIN
-=for apidoc_item ||PERL_SHORT_MAX
-=for apidoc_item ||PERL_SHORT_MIN
-=for apidoc_item ||PERL_UCHAR_MAX
-=for apidoc_item ||PERL_UCHAR_MIN
-=for apidoc_item ||PERL_UINT_MAX
-=for apidoc_item ||PERL_UINT_MIN
-=for apidoc_item ||PERL_ULONG_MAX
-=for apidoc_item ||PERL_ULONG_MIN
-=for apidoc_item ||PERL_USHORT_MAX
-=for apidoc_item ||PERL_USHORT_MIN
-=for apidoc_item ||PERL_QUAD_MAX
-=for apidoc_item ||PERL_QUAD_MIN
-=for apidoc_item ||PERL_UQUAD_MAX
-=for apidoc_item ||PERL_UQUAD_MIN
+=for apidoc Amn |int|PERL_INT_MAX
+=for apidoc_item |int|PERL_INT_MIN
+=for apidoc_item |long|PERL_LONG_MAX
+=for apidoc_item |long|PERL_LONG_MIN
+=for apidoc_item |IV|PERL_QUAD_MAX
+=for apidoc_item |IV|PERL_QUAD_MIN
+=for apidoc_item |short|PERL_SHORT_MAX
+=for apidoc_item |short|PERL_SHORT_MIN
+=for apidoc_item |U8|PERL_UCHAR_MAX
+=for apidoc_item |U8|PERL_UCHAR_MIN
+=for apidoc_item |unsigned int|PERL_UINT_MAX
+=for apidoc_item |unsigned int|PERL_UINT_MIN
+=for apidoc_item |unsigned long|PERL_ULONG_MAX
+=for apidoc_item |unsigned long|PERL_ULONG_MIN
+=for apidoc_item |UV|PERL_UQUAD_MAX
+=for apidoc_item |UV|PERL_UQUAD_MIN
+=for apidoc_item |unsigned short|PERL_USHORT_MAX
+=for apidoc_item |unsigned short|PERL_USHORT_MIN
These give the largest and smallest number representable in the current
platform in variables of the corresponding types.
#define SVfARG(p) ((void*)(p))
+/* Render an SV as a quoted and escaped string suitable for an error message.
+ * Only shows the first PERL_QUOTEDPREFIX_LEN characters, and adds ellipses if the
+ * string is too long.
+ */
+#ifndef PERL_QUOTEDPREFIX_LEN
+# define PERL_QUOTEDPREFIX_LEN 256
+#endif
+#ifndef SVf_QUOTEDPREFIX
+# define SVf_QUOTEDPREFIX "5p"
+#endif
+
+/* like %s but runs through the quoted prefix logic */
+#ifndef PVf_QUOTEDPREFIX
+# define PVf_QUOTEDPREFIX "1p"
+#endif
+
#ifndef HEKf
# define HEKf "2p"
#endif
+#ifndef HEKf_QUOTEDPREFIX
+# define HEKf_QUOTEDPREFIX "7p"
+#endif
+
/* Not ideal, but we cannot easily include a number in an already-numeric
* format sequence. */
#ifndef HEKf256
# define HEKf256 "3p"
#endif
+#ifndef HEKf256_QUOTEDPREFIX
+# define HEKf256_QUOTEDPREFIX "8p"
+#endif
+
#define HEKfARG(p) ((void*)(p))
/* Documented in perlguts
*
- * %4p is a custom format
+ * %4p and %9p are custom formats for handling UTF8 parameters.
+ * They only occur when prefixed by specific other formats.
*/
#ifndef UTF8f
# define UTF8f "d%" UVuf "%4p"
#endif
+#ifndef UTF8f_QUOTEDPREFIX
+# define UTF8f_QUOTEDPREFIX "d%" UVuf "%9p"
+#endif
#define UTF8fARG(u,l,p) (int)cBOOL(u), (UV)(l), (void*)(p)
#define PNf UTF8f
#define PNfARG(pn) (int)1, (UV)PadnameLEN(pn), (void *)PadnamePV(pn)
+
#ifdef PERL_CORE
/* not used; but needed for backward compatibility with XS code? - RMB
=for apidoc_section $io_formats
#ifdef DEBUGGING
# define ASSUME(x) assert(x)
+#elif __has_builtin(__builtin_assume)
+# if defined(__clang__) || defined(__clang)
+# define ASSUME(x) CLANG_DIAG_IGNORE(-Wassume) \
+ __builtin_assume (x) \
+ CLANG_DIAG_RESTORE
+# else
+# define ASSUME(x) __builtin_assume(x)
+# endif
#elif defined(_MSC_VER)
# define ASSUME(x) __assume(x)
#elif defined(__ARMCC_VERSION) /* untested */
# ifdef MYMALLOC
" MYMALLOC"
# endif
+# ifdef NO_HASH_SEED
+ " NO_HASH_SEED"
+# endif
# ifdef PERLIO_LAYERS
" PERLIO_LAYERS"
# endif
# ifdef PERL_DEBUG_READONLY_OPS
" PERL_DEBUG_READONLY_OPS"
# endif
+# ifdef PERL_HASH_FUNC_DEFINE
+/* note that this is different from the others, PERL_HASH_FUNC_DEFINE
+ * is a string which says which define was defined. */
+ " " PERL_HASH_FUNC_DEFINE
+# endif
+# ifdef PERL_HASH_USE_SBOX32
+ " PERL_HASH_USE_SBOX32"
+# else
+ " PERL_HASH_NO_SBOX32"
+# endif
# ifdef PERL_IMPLICIT_SYS
" PERL_IMPLICIT_SYS"
# endif
* instead it makes sense to minimize space used and do all the work in
* the rarely called function */
# ifdef USE_LOCALE_CTYPE
-# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE \
+# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_ \
STMT_START { \
if (UNLIKELY(PL_warn_locale)) { \
Perl__warn_problematic_locale(); \
} \
} STMT_END
# else
-# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE
+# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_
# endif
# define IN_LC_COMPILETIME(category) 0
# define IN_LC_RUNTIME(category) 0
# define IN_LC(category) 0
-# define _CHECK_AND_WARN_PROBLEMATIC_LOCALE
+# define CHECK_AND_WARN_PROBLEMATIC_LOCALE_
# define _CHECK_AND_OUTPUT_WIDE_LOCALE_UTF8_MSG(s, send)
# define _CHECK_AND_OUTPUT_WIDE_LOCALE_CP_MSG(c)
#endif
+#define locale_panic_(m) Perl_locale_panic((m), __FILE__, __LINE__, errno)
/* Locale/thread synchronization macros. */
#if ! ( defined(USE_LOCALE) \
* separate mutexes for some of them, the only changes needed are here.
* Define just the necessary macros. The compiler should then croak if the
* #ifdef's in the code are incorrect */
-# if defined(HAS_LOCALECONV) && ( ! defined(HAS_POSIX_2008_LOCALE) \
+# if defined(HAS_LOCALECONV) && ( ! defined(USE_POSIX_2008_LOCALE) \
|| ! defined(HAS_LOCALECONV_L) \
|| defined(TS_W32_BROKEN_LOCALECONV))
# define LOCALECONV_LOCK LOCALE_LOCK_
# define LOCALECONV_UNLOCK LOCALE_UNLOCK_
# endif
# if defined(HAS_NL_LANGINFO) && ( ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \
- || ! defined(HAS_POSIX_2008_LOCALE))
+ || ! defined(USE_POSIX_2008_LOCALE))
# define NL_LANGINFO_LOCK LOCALE_LOCK_
# define NL_LANGINFO_UNLOCK LOCALE_UNLOCK_
# endif
"%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" \
- " LC_NUMERIC incompatibly", \
- __FILE__, __LINE__); \
+ locale_panic_("Trying to change LC_NUMERIC incompatibly");\
} \
} \
} STMT_END
} STMT_END
# define LOCALE_TERM STMT_START { \
- MUTEX_DESTROY(&PL_locale_mutex); \
- LOCALE_TERM_LC_NUMERIC_; \
LOCALE_TERM_POSIX_2008_; \
+ LOCALE_TERM_LC_NUMERIC_; \
+ MUTEX_DESTROY(&PL_locale_mutex); \
} STMT_END
#endif
* khw believes the reason for the variables instead of the bits in a single
* word is to avoid having to have masking instructions. */
-# define _NOT_IN_NUMERIC_STANDARD (! PL_numeric_standard)
+# define NOT_IN_NUMERIC_STANDARD_ (! PL_numeric_standard)
/* We can lock the category to stay in the C locale, making requests to the
* contrary be noops, in the dynamic scope by setting PL_numeric_standard to 2.
* */
-# define _NOT_IN_NUMERIC_UNDERLYING \
+# define NOT_IN_NUMERIC_UNDERLYING_ \
(! PL_numeric_underlying && PL_numeric_standard < 2)
# define DECLARATION_FOR_LC_NUMERIC_MANIPULATION \
STMT_START { \
bool _in_lc_numeric = (in); \
LC_NUMERIC_LOCK( \
- ( ( _in_lc_numeric && _NOT_IN_NUMERIC_UNDERLYING) \
- || (! _in_lc_numeric && _NOT_IN_NUMERIC_STANDARD))); \
+ ( ( _in_lc_numeric && NOT_IN_NUMERIC_UNDERLYING_) \
+ || (! _in_lc_numeric && NOT_IN_NUMERIC_STANDARD_))); \
if (_in_lc_numeric) { \
- if (_NOT_IN_NUMERIC_UNDERLYING) { \
+ if (NOT_IN_NUMERIC_UNDERLYING_) { \
Perl_set_numeric_underlying(aTHX); \
_restore_LC_NUMERIC_function \
= &Perl_set_numeric_standard; \
} \
} \
else { \
- if (_NOT_IN_NUMERIC_STANDARD) { \
+ if (NOT_IN_NUMERIC_STANDARD_) { \
Perl_set_numeric_standard(aTHX); \
_restore_LC_NUMERIC_function \
= &Perl_set_numeric_underlying; \
LC_NUMERIC_UNLOCK; \
} STMT_END
-/* The next two macros set unconditionally. These should be rarely used, and
- * only after being sure that this is what is needed */
+/* The next two macros should be rarely used, and only after being sure that
+ * this is what is needed */
# define SET_NUMERIC_STANDARD() \
STMT_START { \
DEBUG_Lv(PerlIO_printf(Perl_debug_log, \
"%s: %d: lc_numeric standard=%d\n", \
__FILE__, __LINE__, PL_numeric_standard)); \
- Perl_set_numeric_standard(aTHX); \
+ if (UNLIKELY(NOT_IN_NUMERIC_STANDARD_)) { \
+ Perl_set_numeric_standard(aTHX); \
+ } \
DEBUG_Lv(PerlIO_printf(Perl_debug_log, \
"%s: %d: lc_numeric standard=%d\n", \
__FILE__, __LINE__, PL_numeric_standard)); \
} STMT_END
# define SET_NUMERIC_UNDERLYING() \
- STMT_START { \
- if (_NOT_IN_NUMERIC_UNDERLYING) { \
+ STMT_START { \
+ /*assert(PL_locale_mutex_depth > 0);*/ \
+ if (NOT_IN_NUMERIC_UNDERLYING_) { \
Perl_set_numeric_underlying(aTHX); \
} \
} STMT_END
* the RESTORE_foo ones called to switch back, but only if need be */
# define STORE_LC_NUMERIC_SET_STANDARD() \
STMT_START { \
- LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_STANDARD); \
- if (_NOT_IN_NUMERIC_STANDARD) { \
+ LC_NUMERIC_LOCK(NOT_IN_NUMERIC_STANDARD_); \
+ if (NOT_IN_NUMERIC_STANDARD_) { \
_restore_LC_NUMERIC_function = &Perl_set_numeric_underlying;\
Perl_set_numeric_standard(aTHX); \
} \
/* Rarely, we want to change to the underlying locale even outside of 'use
* locale'. This is principally in the POSIX:: functions */
# define STORE_LC_NUMERIC_FORCE_TO_UNDERLYING() \
- STMT_START { \
- LC_NUMERIC_LOCK(_NOT_IN_NUMERIC_UNDERLYING); \
- if (_NOT_IN_NUMERIC_UNDERLYING) { \
+ STMT_START { \
+ LC_NUMERIC_LOCK(NOT_IN_NUMERIC_UNDERLYING_); \
+ if (NOT_IN_NUMERIC_UNDERLYING_) { \
Perl_set_numeric_underlying(aTHX); \
_restore_LC_NUMERIC_function = &Perl_set_numeric_standard; \
} \
#define ENV_LOCALE_READ_LOCK ENV_LOCALE_LOCK
#define ENV_LOCALE_READ_UNLOCK ENV_LOCALE_UNLOCK
-#define Atof my_atof
-
/*
=for apidoc_section $numeric
#endif
/* ISO 6429 NEL - C1 control NExt Line */
-/* See https://www.unicode.org/reports/tr13/ */
+/* See https://www.unicode.org/unicode/reports/tr13/ */
#define NEXT_LINE_CHAR NEXT_LINE_NATIVE
#ifndef PIPESOCK_MODE
#define PERL_PV_ESCAPE_NONASCII 0x000400
#define PERL_PV_ESCAPE_FIRSTCHAR 0x000800
-#define PERL_PV_ESCAPE_ALL 0x001000
+#define PERL_PV_ESCAPE_ALL 0x001000
#define PERL_PV_ESCAPE_NOBACKSLASH 0x002000
#define PERL_PV_ESCAPE_NOCLEAR 0x004000
#define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR
/* Escape PV with all hex, including NUL. */
#define PERL_PV_ESCAPE_DWIM_ALL_HEX 0x020000
+/* Do not escape word characters, alters meaning of other flags */
+#define PERL_PV_ESCAPE_NON_WC 0x040000
+#define PERL_PV_ESCAPE_TRUNC_MIDDLE 0x080000
+
+#define PERL_PV_PRETTY_QUOTEDPREFIX ( \
+ PERL_PV_PRETTY_ELLIPSES | \
+ PERL_PV_PRETTY_QUOTE | \
+ PERL_PV_ESCAPE_NONASCII | \
+ PERL_PV_ESCAPE_NON_WC | \
+ PERL_PV_ESCAPE_TRUNC_MIDDLE | \
+ 0)
+
/* used by pv_display in dump.c*/
#define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
#endif /* DOUBLE_HAS_NAN */
+/* these are used to faciliate the env var PERL_RAND_SEED,
+ * which allows consistent behavior from code that calls
+ * srand() with no arguments, either explicitly or implicitly.
+ */
+#define PERL_SRAND_OVERRIDE_NEXT() PERL_XORSHIFT32_A(PL_srand_override_next);
+
+#define PERL_SRAND_OVERRIDE_NEXT_INIT() STMT_START { \
+ PL_srand_override = PL_srand_override_next; \
+ PERL_SRAND_OVERRIDE_NEXT(); \
+} STMT_END
+
+#define PERL_SRAND_OVERRIDE_GET(into) STMT_START { \
+ into= PL_srand_override; \
+ PERL_SRAND_OVERRIDE_NEXT_INIT(); \
+} STMT_END
+
+#define PERL_SRAND_OVERRIDE_NEXT_CHILD() STMT_START { \
+ PERL_XORSHIFT32_B(PL_srand_override_next); \
+ PERL_SRAND_OVERRIDE_NEXT_INIT(); \
+} STMT_END
+
+#define PERL_SRAND_OVERRIDE_NEXT_PARENT() \
+ PERL_SRAND_OVERRIDE_NEXT()
+
/*