Re: stability of sort()?
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 66c6e4d..9283e8e 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -226,7 +226,7 @@ struct perl_thread;
 #endif
 
 #define NOOP (void)0
-#define dNOOP extern int Perl___notused
+#define dNOOP extern int Perl___notused __attribute__ ((unused))
 
 #ifndef pTHX
 #  define pTHX         void
@@ -718,6 +718,11 @@ typedef struct perl_mstats perl_mstats_t;
 #  define WIN32SCK_IS_STDSCK           /* don't pull in custom wsock layer */
 #endif
 
+/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one */
+#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN)
+#  define _SOCKADDR_LEN
+#endif
+
 #if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
 # include <sys/socket.h>
 # if defined(USE_SOCKS) && defined(I_SOCKS)
@@ -1023,6 +1028,13 @@ typedef struct perl_mstats perl_mstats_t;
 #undef UV
 #endif
 
+/* Configure gets this right but the UTS compiler gets it wrong.
+   -- Hal Morris <hom00@utsglobal.com> */
+#ifdef UTS
+#  undef  UVTYPE
+#  define UVTYPE unsigned
+#endif
+
 /*
     The IV type is supposed to be long enough to hold any integral
     value or a pointer.
@@ -1081,6 +1093,25 @@ 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 
+#endif
+
 #define IV_DIG (BIT_DIGITS(IVSIZE * 8))
 #define UV_DIG (BIT_DIGITS(UVSIZE * 8))
 
@@ -1837,10 +1868,12 @@ typedef pthread_key_t   perl_key;
 #endif
 
 /* This defines a way to flush all output buffers.  This may be a
- * performance issue, so we allow people to disable it.
+ * performance issue, so we allow people to disable it.  Also, if
+ * we are using stdio, there are broken implementations of fflush(NULL)
+ * out there, Solaris being the most prominent.
  */
 #ifndef PERL_FLUSHALL_FOR_CHILD
-# if defined(FFLUSH_NULL) || defined(USE_SFIO)
+# if defined(USE_PERLIO) || defined(FFLUSH_NULL) || defined(USE_SFIO)
 #  define PERL_FLUSHALL_FOR_CHILD      PerlIO_flush((PerlIO*)NULL)
 # else
 #  ifdef FFLUSH_ALL
@@ -2079,25 +2112,52 @@ struct ptr_tbl {
        /* otherwise default to functions in util.c */
 #endif
 
-#ifdef CASTNEGFLOAT
-#define U_S(what) ((U16)(what))
-#define U_I(what) ((unsigned int)(what))
-#define U_L(what) ((U32)(what))
-#else
-#define U_S(what) ((U16)cast_ulong((NV)(what)))
-#define U_I(what) ((unsigned int)cast_ulong((NV)(what)))
-#define U_L(what) (cast_ulong((NV)(what)))
-#endif
+/* *MAX Plus 1. A floating point value.
+   Hopefully expressed in a way that dodgy floating point can't mess up.
+   >> 2 rather than 1, so that value is safely less than I32_MAX after 1
+   is added to it
+   May find that some broken compiler will want the value cast to I32.
+   [after the shift, as signed >> may not be as secure as unsigned >>]
+*/
+#define I32_MAX_P1 (2.0 * (1 + (((U32)I32_MAX) >> 1)))
+#define U32_MAX_P1 (4.0 * (1 + ((U32_MAX) >> 2)))
+/* For compilers that can't correctly cast NVs over 0x7FFFFFFF (or
+   0x7FFFFFFFFFFFFFFF) to an unsigned integer. In the future, sizeof(UV)
+   may be greater than sizeof(IV), so don't assume that half max UV is max IV.
+*/
+#define U32_MAX_P1_HALF (2.0 * (1 + ((U32_MAX) >> 2)))
 
-#ifdef CASTI32
-#define I_32(what) ((I32)(what))
-#define I_V(what) ((IV)(what))
-#define U_V(what) ((UV)(what))
-#else
+#define UV_MAX_P1 (4.0 * (1 + ((UV_MAX) >> 2)))
+#define IV_MAX_P1 (2.0 * (1 + (((UV)IV_MAX) >> 1)))
+#define UV_MAX_P1_HALF (2.0 * (1 + ((UV_MAX) >> 2)))
+
+/* This may look like unnecessary jumping through hoops, but converting
+   out of range floating point values to integers *is* undefined behaviour,
+   and it is starting to bite.
+*/
+#ifndef CAST_INLINE
 #define I_32(what) (cast_i32((NV)(what)))
+#define U_32(what) (cast_ulong((NV)(what)))
 #define I_V(what) (cast_iv((NV)(what)))
 #define U_V(what) (cast_uv((NV)(what)))
-#endif
+#else
+#define I_32(n) ((n) < I32_MAX_P1 ? ((n) < I32_MIN ? I32_MIN : (I32) (n)) \
+                  : ((n) < U32_MAX_P1 ? (I32)(U32) (n) \
+                     : ((n) > 0 ? (I32) U32_MAX : 0 /* NaN */)))
+#define U_32(n) ((n) < 0.0 ? ((n) < I32_MIN ? (UV) I32_MIN : (U32)(I32) (n)) \
+                  : ((n) < U32_MAX_P1 ? (U32) (n) \
+                     : ((n) > 0 ? U32_MAX : 0 /* NaN */)))
+#define I_V(n) ((n) < IV_MAX_P1 ? ((n) < IV_MIN ? IV_MIN : (IV) (n)) \
+                  : ((n) < UV_MAX_P1 ? (IV)(UV) (n) \
+                     : ((n) > 0 ? (IV)UV_MAX : 0 /* NaN */)))
+#define U_V(n) ((n) < 0.0 ? ((n) < IV_MIN ? (UV) IV_MIN : (UV)(IV) (n)) \
+                  : ((n) < UV_MAX_P1 ? (UV) (n) \
+                     : ((n) > 0 ? UV_MAX : 0 /* NaN */)))
+#endif
+
+#define U_S(what) ((U16)U_32(what))
+#define U_I(what) ((unsigned int)U_32(what))
+#define U_L(what) U_32(what)
 
 /* These do not care about the fractional part, only about the range. */
 #define NV_WITHIN_IV(nv) (I_V(nv) >= IV_MIN && I_V(nv) <= IV_MAX)
@@ -2150,7 +2210,8 @@ Gid_t getegid (void);
 #define DEBUG_D_FLAG           0x00008000 /*  32768 */
 #define DEBUG_S_FLAG           0x00010000 /*  65536 */
 #define DEBUG_T_FLAG           0x00020000 /* 131072 */
-#define DEBUG_MASK             0x0003FFFF /* mask of all the standard flags */
+#define DEBUG_R_FLAG           0x00040000 /* 262144 */
+#define DEBUG_MASK             0x0007FFFF /* mask of all the standard flags */
 
 #define DEBUG_DB_RECURSE_FLAG  0x40000000
 #define DEBUG_TOP_FLAG         0x80000000 /* XXX what's this for ??? */
@@ -2179,6 +2240,7 @@ Gid_t getegid (void);
 #  define DEBUG_D_TEST (PL_debug & DEBUG_D_FLAG)
 #  define DEBUG_S_TEST (PL_debug & DEBUG_S_FLAG)
 #  define DEBUG_T_TEST (PL_debug & DEBUG_T_FLAG)
+#  define DEBUG_R_TEST (PL_debug & DEBUG_R_FLAG)
 
 #  define DEB(a)     a
 #  define DEBUG(a)   if (PL_debug)   a
@@ -2217,6 +2279,7 @@ Gid_t getegid (void);
 #  endif
 
 #  define DEBUG_T(a) if (DEBUG_T_TEST) a
+#  define DEBUG_R(a) if (DEBUG_R_TEST) a
 
 #else /* DEBUGGING */
 
@@ -2238,6 +2301,7 @@ Gid_t getegid (void);
 #  define DEBUG_D_TEST (0)
 #  define DEBUG_S_TEST (0)
 #  define DEBUG_T_TEST (0)
+#  define DEBUG_R_TEST (0)
 
 #  define DEB(a)
 #  define DEBUG(a)
@@ -2259,9 +2323,56 @@ Gid_t getegid (void);
 #  define DEBUG_D(a)
 #  define DEBUG_S(a)
 #  define DEBUG_T(a)
+#  define DEBUG_R(a)
 #endif /* DEBUGGING */
 
 
+/* These constants should be used in preference to to raw characters
+ * when using magic. Note that some perl guts still assume
+ * certain character properties of these constants, namely that
+ * isUPPER() and toLOWER() may do useful mappings.
+ *
+ * Update the magic_names table in dump.c when adding/amending these
+ */
+
+#define PERL_MAGIC_sv            '\0' /* Special scalar variable */
+#define PERL_MAGIC_overload      'A' /* %OVERLOAD hash */
+#define PERL_MAGIC_overload_elem  'a' /* %OVERLOAD hash element */
+#define PERL_MAGIC_overload_table 'c' /* Holds overload table (AMT) on stash */
+#define PERL_MAGIC_bm            'B' /* Boyer-Moore (fast string search) */
+#define PERL_MAGIC_regdata       'D' /* Regex match position data
+                                       (@+ and @- vars) */
+#define PERL_MAGIC_regdatum      'd' /* Regex match position data element */
+#define PERL_MAGIC_env           'E' /* %ENV hash */
+#define PERL_MAGIC_envelem       'e' /* %ENV hash element */
+#define PERL_MAGIC_fm            'f' /* Formline ('compiled' format) */
+#define PERL_MAGIC_regex_global          'g' /* m//g target / study()ed string */
+#define PERL_MAGIC_isa           'I' /* @ISA array */
+#define PERL_MAGIC_isaelem       'i' /* @ISA array element */
+#define PERL_MAGIC_nkeys         'k' /* scalar(keys()) lvalue */
+#define PERL_MAGIC_dbfile        'L' /* Debugger %_<filename */
+#define PERL_MAGIC_dbline        'l' /* Debugger %_<filename element */
+#define PERL_MAGIC_mutex         'm' /* ??? */
+#define PERL_MAGIC_collxfrm      'o' /* Locale transformation */
+#define PERL_MAGIC_tied                  'P' /* Tied array or hash */
+#define PERL_MAGIC_tiedelem      'p' /* Tied array or hash element */
+#define PERL_MAGIC_tiedscalar    'q' /* Tied scalar or handle */
+#define PERL_MAGIC_qr            'r' /* precompiled qr// regex */
+#define PERL_MAGIC_sig           'S' /* %SIG hash */
+#define PERL_MAGIC_sigelem       's' /* %SIG hash element */
+#define PERL_MAGIC_taint         't' /* Taintedness */
+#define PERL_MAGIC_uvar                  'U' /* Available for use by extensions */
+#define PERL_MAGIC_vec           'v' /* vec() lvalue */
+#define PERL_MAGIC_substr        'x' /* substr() lvalue */
+#define PERL_MAGIC_defelem       'y' /* Shadow "foreach" iterator variable /
+                                       smart parameter vivification */
+#define PERL_MAGIC_glob                  '*' /* GV (typeglob) */
+#define PERL_MAGIC_arylen        '#' /* Array length ($#ary) */
+#define PERL_MAGIC_pos           '.' /* pos() lvalue */
+#define PERL_MAGIC_backref       '<' /* ??? */
+#define PERL_MAGIC_ext           '~' /* Available for use by extensions */
+
+
 #define YYMAXDEPTH 300
 
 #ifndef assert  /* <assert.h> might have been included somehow */
@@ -2279,7 +2390,7 @@ struct ufuncs {
     IV uf_index;
 };
 
-/* In pre-5.7-Perls the 'U' magic didn't get the thread context.
+/* In pre-5.7-Perls the PERL_MAGIC_uvar magic didn't get the thread context.
  * XS code wanting to be backward compatible can do something
  * like the following:
 
@@ -2345,7 +2456,7 @@ END_EXTERN_C
 #  if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
 char *crypt ();       /* Maybe more hosts will need the unprototyped version */
 #  else
-#    if !defined(WIN32)
+#    if !defined(WIN32) && !defined(VMS)
 char *crypt (const char*, const char*);
 #    endif /* !WIN32 */
 #  endif /* !NeXT && !__NeXT__ */
@@ -2513,216 +2624,6 @@ EXT int   PL_sig_num[];
 
 #ifdef DOINIT
 #ifdef EBCDIC
-#if '^' == 106  /* if defined(_OSD_POSIX) POSIX-BC */
-EXT unsigned char PL_e2a[] = { /* ASCII (ISO8859-1) to EBCDIC (POSIX-BC) */
-      0,      1,      2,      3,     55,     45,     46,     47,
-     22,      5,     21,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,     60,     61,     50,     38,
-     24,     25,     63,     39,     28,     29,     30,     31,
-     64,     90,    127,    123,     91,    108,     80,    125,
-     77,     93,     92,     78,    107,     96,     75,     97,
-    240,    241,    242,    243,    244,    245,    246,    247,
-    248,    249,    122,     94,     76,    126,    110,    111,
-    124,    193,    194,    195,    196,    197,    198,    199,
-    200,    201,    209,    210,    211,    212,    213,    214,
-    215,    216,    217,    226,    227,    228,    229,    230,
-    231,    232,    233,    187,    188,    189,    106,    109,
-     74,    129,    130,    131,    132,    133,    134,    135,
-    136,    137,    145,    146,    147,    148,    149,    150,
-    151,    152,    153,    162,    163,    164,    165,    166,
-    167,    168,    169,    251,     79,    253,    255,      7,
-     32,     33,     34,     35,     36,     37,      6,     23,
-     40,     41,     42,     43,     44,      9,     10,     27,
-     48,     49,     26,     51,     52,     53,     54,      8,
-     56,     57,     58,     59,      4,     20,     62,     95,
-     65,    170,    176,    177,    159,    178,    208,    181,
-    121,    180,    154,    138,    186,    202,    175,    161,
-    144,    143,    234,    250,    190,    160,    182,    179,
-    157,    218,    155,    139,    183,    184,    185,    171,
-    100,    101,     98,    102,     99,    103,    158,    104,
-    116,    113,    114,    115,    120,    117,    118,    119,
-    172,    105,    237,    238,    235,    239,    236,    191,
-    128,    224,    254,    221,    252,    173,    174,     89,
-     68,     69,     66,     70,     67,     71,    156,     72,
-     84,     81,     82,     83,     88,     85,     86,     87,
-    140,     73,    205,    206,    203,    207,    204,    225,
-    112,    192,    222,    219,    220,    141,    142,    223
-};
-EXT unsigned char PL_a2e[] = { /* EBCDIC (POSIX-BC) to ASCII (ISO8859-1) */
-      0,      1,      2,      3,    156,      9,    134,    127,
-    151,    141,    142,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,    157,     10,      8,    135,
-     24,     25,    146,    143,     28,     29,     30,     31,
-    128,    129,    130,    131,    132,    133,     23,     27,
-    136,    137,    138,    139,    140,      5,      6,      7,
-    144,    145,     22,    147,    148,    149,    150,      4,
-    152,    153,    154,    155,     20,     21,    158,     26,
-     32,    160,    226,    228,    224,    225,    227,    229,
-    231,    241,     96,     46,     60,     40,     43,    124,
-     38,    233,    234,    235,    232,    237,    238,    239,
-    236,    223,     33,     36,     42,     41,     59,    159,
-     45,     47,    194,    196,    192,    193,    195,    197,
-    199,    209,     94,     44,     37,     95,     62,     63,
-    248,    201,    202,    203,    200,    205,    206,    207,
-    204,    168,     58,     35,     64,     39,     61,     34,
-    216,     97,     98,     99,    100,    101,    102,    103,
-    104,    105,    171,    187,    240,    253,    254,    177,
-    176,    106,    107,    108,    109,    110,    111,    112,
-    113,    114,    170,    186,    230,    184,    198,    164,
-    181,    175,    115,    116,    117,    118,    119,    120,
-    121,    122,    161,    191,    208,    221,    222,    174,
-    162,    163,    165,    183,    169,    167,    182,    188,
-    189,    190,    172,     91,     92,     93,    180,    215,
-    249,     65,     66,     67,     68,     69,     70,     71,
-     72,     73,    173,    244,    246,    242,    243,    245,
-    166,     74,     75,     76,     77,     78,     79,     80,
-     81,     82,    185,    251,    252,    219,    250,    255,
-    217,    247,     83,     84,     85,     86,     87,     88,
-     89,     90,    178,    212,    214,    210,    211,    213,
-     48,     49,     50,     51,     52,     53,     54,     55,
-     56,     57,    179,    123,    220,    125,    218,    126
-};
-#endif          /* POSIX-BC */
-#if '^' == 176  /* if defined(??) (OS/400?) 037 */
-EXT unsigned char PL_e2a[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-037) */
-      0,      1,      2,      3,     55,     45,     46,     47,
-     22,      5,     37,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,     60,     61,     50,     38,
-     24,     25,     63,     39,     28,     29,     30,     31,
-     64,     90,    127,    123,     91,    108,     80,    125,
-     77,     93,     92,     78,    107,     96,     75,     97,
-    240,    241,    242,    243,    244,    245,    246,    247,
-    248,    249,    122,     94,     76,    126,    110,    111,
-    124,    193,    194,    195,    196,    197,    198,    199,
-    200,    201,    209,    210,    211,    212,    213,    214,
-    215,    216,    217,    226,    227,    228,    229,    230,
-    231,    232,    233,    186,    224,    187,    176,    109,
-    121,    129,    130,    131,    132,    133,    134,    135,
-    136,    137,    145,    146,    147,    148,    149,    150,
-    151,    152,    153,    162,    163,    164,    165,    166,
-    167,    168,    169,    192,     79,    208,    161,      7,
-     32,     33,     34,     35,     36,     21,      6,     23,
-     40,     41,     42,     43,     44,      9,     10,     27,
-     48,     49,     26,     51,     52,     53,     54,      8,
-     56,     57,     58,     59,      4,     20,     62,    255,
-     65,    170,     74,    177,    159,    178,    106,    181,
-    189,    180,    154,    138,     95,    202,    175,    188,
-    144,    143,    234,    250,    190,    160,    182,    179,
-    157,    218,    155,    139,    183,    184,    185,    171,
-    100,    101,     98,    102,     99,    103,    158,    104,
-    116,    113,    114,    115,    120,    117,    118,    119,
-    172,    105,    237,    238,    235,    239,    236,    191,
-    128,    253,    254,    251,    252,    173,    174,     89,
-     68,     69,     66,     70,     67,     71,    156,     72,
-     84,     81,     82,     83,     88,     85,     86,     87,
-    140,     73,    205,    206,    203,    207,    204,    225,
-    112,    221,    222,    219,    220,    141,    142,    223
-};
-EXT unsigned char PL_a2e[] = { /* EBCDIC (IBM-037) to ASCII (ISO8859-1) */
-      0,      1,      2,      3,    156,      9,    134,    127,
-    151,    141,    142,     11,     12,     13,     14,     15,
-     16,     17,     18,     19,    157,    133,      8,    135,
-     24,     25,    146,    143,     28,     29,     30,     31,
-    128,    129,    130,    131,    132,     10,     23,     27,
-    136,    137,    138,    139,    140,      5,      6,      7,
-    144,    145,     22,    147,    148,    149,    150,      4,
-    152,    153,    154,    155,     20,     21,    158,     26,
-     32,    160,    226,    228,    224,    225,    227,    229,
-    231,    241,    162,     46,     60,     40,     43,    124,
-     38,    233,    234,    235,    232,    237,    238,    239,
-    236,    223,     33,     36,     42,     41,     59,    172,
-     45,     47,    194,    196,    192,    193,    195,    197,
-    199,    209,    166,     44,     37,     95,     62,     63,
-    248,    201,    202,    203,    200,    205,    206,    207,
-    204,     96,     58,     35,     64,     39,     61,     34,
-    216,     97,     98,     99,    100,    101,    102,    103,
-    104,    105,    171,    187,    240,    253,    254,    177,
-    176,    106,    107,    108,    109,    110,    111,    112,
-    113,    114,    170,    186,    230,    184,    198,    164,
-    181,    126,    115,    116,    117,    118,    119,    120,
-    121,    122,    161,    191,    208,    221,    222,    174,
-     94,    163,    165,    183,    169,    167,    182,    188,
-    189,    190,     91,     93,    175,    168,    180,    215,
-    123,     65,     66,     67,     68,     69,     70,     71,
-     72,     73,    173,    244,    246,    242,    243,    245,
-    125,     74,     75,     76,     77,     78,     79,     80,
-     81,     82,    185,    251,    252,    249,    250,    255,
-     92,    247,     83,     84,     85,     86,     87,     88,
-     89,     90,    178,    212,    214,    210,    211,    213,
-     48,     49,     50,     51,     52,     53,     54,     55,
-     56,     57,    179,    219,    220,    217,    218,    159
-};
-#endif          /* 037 */
-#if '^' == 95   /* if defined(__MVS__) || defined(??) (VM/ESA?) 1047 */
-EXT unsigned char PL_e2a[] = { /* ASCII (ISO8859-1) to EBCDIC (IBM-1047) */
-    0,      1,      2,      3,      55,     45,     46,     47,
-    22,     5,      21,     11,     12,     13,     14,     15,
-    16,     17,     18,     19,     60,     61,     50,     38,
-    24,     25,     63,     39,     28,     29,     30,     31,
-    64,     90,     127,    123,    91,     108,    80,     125,
-    77,     93,     92,     78,     107,    96,     75,     97,
-    240,    241,    242,    243,    244,    245,    246,    247,
-    248,    249,    122,    94,     76,     126,    110,    111,
-    124,    193,    194,    195,    196,    197,    198,    199,
-    200,    201,    209,    210,    211,    212,    213,    214,
-    215,    216,    217,    226,    227,    228,    229,    230,
-    231,    232,    233,    173,    224,    189,    95,     109,
-    121,    129,    130,    131,    132,    133,    134,    135,
-    136,    137,    145,    146,    147,    148,    149,    150,
-    151,    152,    153,    162,    163,    164,    165,    166,
-    167,    168,    169,    192,    79,     208,    161,    7,
-    32,     33,     34,     35,     36,     37,     6,      23,
-    40,     41,     42,     43,     44,     9,      10,     27,
-    48,     49,     26,     51,     52,     53,     54,     8,
-    56,     57,     58,     59,     4,      20,     62,     255,
-    65,     170,    74,     177,    159,    178,    106,    181,
-    187,    180,    154,    138,    176,    202,    175,    188,
-    144,    143,    234,    250,    190,    160,    182,    179,
-    157,    218,    155,    139,    183,    184,    185,    171,
-    100,    101,    98,     102,    99,     103,    158,    104,
-    116,    113,    114,    115,    120,    117,    118,    119,
-    172,    105,    237,    238,    235,    239,    236,    191,
-    128,    253,    254,    251,    252,    186,    174,    89,
-    68,     69,     66,     70,     67,     71,     156,    72,
-    84,     81,     82,     83,     88,     85,     86,     87,
-    140,    73,     205,    206,    203,    207,    204,    225,
-    112,    221,    222,    219,    220,    141,    142,    223
-};
-EXT unsigned char PL_a2e[] = { /* EBCDIC (IBM-1047) to ASCII (ISO8859-1) */
-    0,      1,      2,      3,      156,    9,      134,    127,
-    151,    141,    142,    11,     12,     13,     14,     15,
-    16,     17,     18,     19,     157,    10,     8,      135,
-    24,     25,     146,    143,    28,     29,     30,     31,
-    128,    129,    130,    131,    132,    133,    23,     27,
-    136,    137,    138,    139,    140,    5,      6,      7,
-    144,    145,    22,     147,    148,    149,    150,    4,
-    152,    153,    154,    155,    20,     21,     158,    26,
-    32,     160,    226,    228,    224,    225,    227,    229,
-    231,    241,    162,    46,     60,     40,     43,     124,
-    38,     233,    234,    235,    232,    237,    238,    239,
-    236,    223,    33,     36,     42,     41,     59,     94,
-    45,     47,     194,    196,    192,    193,    195,    197,
-    199,    209,    166,    44,     37,     95,     62,     63,
-    248,    201,    202,    203,    200,    205,    206,    207,
-    204,    96,     58,     35,     64,     39,     61,     34,
-    216,    97,     98,     99,     100,    101,    102,    103,
-    104,    105,    171,    187,    240,    253,    254,    177,
-    176,    106,    107,    108,    109,    110,    111,    112,
-    113,    114,    170,    186,    230,    184,    198,    164,
-    181,    126,    115,    116,    117,    118,    119,    120,
-    121,    122,    161,    191,    208,    91,     222,    174,
-    172,    163,    165,    183,    169,    167,    182,    188,
-    189,    190,    221,    168,    175,    93,     180,    215,
-    123,    65,     66,     67,     68,     69,     70,     71,
-    72,     73,     173,    244,    246,    242,    243,    245,
-    125,    74,     75,     76,     77,     78,     79,     80,
-    81,     82,     185,    251,    252,    249,    250,    255,
-    92,     247,    83,     84,     85,     86,     87,     88,
-    89,     90,     178,    212,    214,    210,    211,    213,
-    48,     49,    50,      51,     52,     53,     54,     55,
-    56,     57,    179,     219,    220,    217,    218,    159
-};
-#endif          /* 1047 */
 EXT unsigned char PL_fold[] = { /* fast EBCDIC case folding table */
     0,      1,      2,      3,      4,      5,      6,      7,
     8,      9,      10,     11,     12,     13,     14,     15,
@@ -2795,10 +2696,6 @@ EXTCONST  unsigned char PL_fold[] = {
 #endif  /* !EBCDIC */
 #else
 EXTCONST unsigned char PL_fold[];
-#ifdef EBCDIC
-EXTCONST unsigned char PL_e2a[];
-EXTCONST unsigned char PL_a2e[];
-#endif /* EBCDIC */
 #endif
 
 #ifdef DOINIT
@@ -3537,7 +3434,7 @@ typedef struct am_table_short AMTS;
 
 #define IS_NUMERIC_RADIX(s)    \
        ((PL_hints & HINT_LOCALE) && \
-         PL_numeric_radix && memEQ(s, SvPVX(PL_numeric_radix), SvCUR(PL_numeric_radix)))
+         PL_numeric_radix_sv && memEQ(s, SvPVX(PL_numeric_radix_sv), SvCUR(PL_numeric_radix_sv)))
 
 #define STORE_NUMERIC_LOCAL_SET_STANDARD() \
        bool was_local = (PL_hints & HINT_LOCALE) && PL_numeric_local; \
@@ -3686,17 +3583,21 @@ typedef struct am_table_short AMTS;
  * nice_chunk and nice_chunk size need to be set
  * and queried under the protection of sv_mutex
  */
-#define offer_nice_chunk(chunk, chunk_size) do {       \
-       LOCK_SV_MUTEX;                                  \
-       if (!PL_nice_chunk) {                           \
-           PL_nice_chunk = (char*)(chunk);             \
-           PL_nice_chunk_size = (chunk_size);          \
-       }                                               \
-       else {                                          \
-           Safefree(chunk);                            \
-       }                                               \
-       UNLOCK_SV_MUTEX;                                \
-    } while (0)
+#define offer_nice_chunk(chunk, chunk_size) STMT_START {  \
+       void *new_chunk;                                   \
+       U32 new_chunk_size;                                \
+       LOCK_SV_MUTEX;                                     \
+       new_chunk = (void *)(chunk);                       \
+       new_chunk_size = (chunk_size);                     \
+       if (new_chunk_size > PL_nice_chunk_size) {         \
+           if (PL_nice_chunk) Safefree(PL_nice_chunk);    \
+           PL_nice_chunk = new_chunk;                     \
+           PL_nice_chunk_size = new_chunk_size;           \
+       } else {                                           \
+           Safefree(chunk);                               \
+       }                                                  \
+       UNLOCK_SV_MUTEX;                                   \
+   } STMT_END
 
 #ifdef HAS_SEM
 #   include <sys/ipc.h>
@@ -3757,6 +3658,9 @@ typedef struct am_table_short AMTS;
 #ifdef IAMSUID
 
 #ifdef I_SYS_STATVFS
+#   if defined(PERL_SCO) && !defined(_SVID3)
+#       define _SVID3
+#   endif
 #   include <sys/statvfs.h>     /* for f?statvfs() */
 #endif
 #ifdef I_SYS_MOUNT
@@ -3834,6 +3738,20 @@ typedef struct am_table_short AMTS;
    NVff
    NVgf
 
+   HAS_USLEEP
+   HAS_UALARM
+
+   HAS_SETITIMER
+   HAS_GETITIMER
+
+   HAS_SENDMSG
+   HAS_RECVMSG
+   HAS_READV
+   HAS_WRITEV
+   I_SYSUIO
+   HAS_STRUCT_MSGHDR
+   HAS_STRUCT_CMSGHDR
+
    so that Configure picks them up. */
 
 #endif /* Include guard */