Support named closures
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 02a55f2..470a44d 100644 (file)
--- a/perl.h
+++ b/perl.h
  * Above symbol is defined via -D in 'x2p/Makefile.SH'
  * Decouple x2p stuff from some of perls more extreme eccentricities. 
  */
-#undef MULTIPLICITY
 #undef EMBED
+#undef NO_EMBED
+#define NO_EMBED
+#undef MULTIPLICITY
 #undef USE_STDIO
 #define USE_STDIO
 #endif /* PERL_FOR_X2P */
 
+#define VOIDUSED 1
+#include "config.h"
+
+#include "embed.h"
+
 /*
  * STMT_START { statements; } STMT_END;
  * can be used as a single statement, as in
 # endif
 #endif
 
-#include "embed.h"
-
-#define VOIDUSED 1
-#include "config.h"
+/*
+ * SOFT_CAST can be used for args to prototyped functions to retain some
+ * type checking; it only casts if the compiler does not know prototypes.
+ */
+#if defined(CAN_PROTOTYPE) && defined(DEBUGGING_COMPILE)
+#define SOFT_CAST(type)        
+#else
+#define SOFT_CAST(type)        (type)
+#endif
 
 #ifndef BYTEORDER
 #   define BYTEORDER 0x1234
 #   define VOL
 #endif
 
-#define TAINT_IF(c)    (tainted |= (c))
-#define TAINT_NOT      (tainted = 0)
-#define TAINT_PROPER(s)        if (tainting) taint_proper(no_security, s)
-#define TAINT_ENV()    if (tainting) taint_env()
+#define TAINT          (tainted = TRUE)
+#define TAINT_NOT      (tainted = FALSE)
+#define TAINT_IF(c)    if (c) { tainted = TRUE; }
+#define TAINT_ENV()    if (tainting) { taint_env(); }
+#define TAINT_PROPER(s)        if (tainting) { taint_proper(no_security, s); }
 
 /* XXX All process group stuff is handled in pp_sys.c.  Should these 
    defines move there?  If so, I could simplify this a lot. --AD  9/96.
 #include <ctype.h>
 #endif /* USE_NEXT_CTYPE */
 
-#ifdef I_LOCALE
-#include <locale.h>
-#endif
-
 #ifdef METHOD  /* Defined by OSF/1 v3.0 by ctype.h */
 #undef METHOD
 #endif
 
+#ifdef I_LOCALE
+#   include <locale.h>
+#endif
+
+#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
+#   define USE_LOCALE
+#   if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
+       && defined(HAS_STRXFRM)
+#      define USE_LOCALE_COLLATE
+#   endif
+#   if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
+#      define USE_LOCALE_CTYPE
+#   endif
+#   if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
+#      define USE_LOCALE_NUMERIC
+#   endif
+#endif /* !NO_LOCALE && HAS_SETLOCALE */
+
 #include <setjmp.h>
 
 #ifdef I_SYS_PARAM
 /* Use all the "standard" definitions? */
 #if defined(STANDARD_C) && defined(I_STDLIB)
 #   include <stdlib.h>
-#endif /* STANDARD_C */
+#endif
+
+/* This comes after <stdlib.h> so we don't try to change the standard
+ * library prototypes; we'll use our own in proto.h instead. */
 
-/* Maybe this comes after <stdlib.h> so we don't try to change 
-   the standard library prototypes?.  We'll use our own in 
-   proto.h instead.  I guess.  The patch had no explanation.
-*/
 #ifdef MYMALLOC
+
 #   ifdef HIDEMYMALLOC
-#      define malloc Perl_malloc
+#      define malloc  Mymalloc
+#      define calloc  Mycalloc
+#      define realloc Myremalloc
+#      define free    Myfree
+#   endif
+#   ifdef EMBEDMYMALLOC
+#      define malloc  Perl_malloc
+#      define calloc  Perl_calloc
 #      define realloc Perl_realloc
-#      define free Perl_free
-#      define calloc Perl_calloc
+#      define free    Perl_free
 #   endif
-#   define safemalloc malloc
+
+#   undef safemalloc
+#   undef safecalloc
+#   undef saferealloc
+#   undef safefree
+#   define safemalloc  malloc
+#   define safecalloc  calloc
 #   define saferealloc realloc
-#   define safefree free
-#   define safecalloc calloc
-#endif
+#   define safefree    free
+
+#endif /* MYMALLOC */
 
 #define MEM_SIZE Size_t
 
+#if defined(STANDARD_C) && defined(I_STDDEF)
+#   include <stddef.h>
+#   define STRUCT_OFFSET(s,m)  offsetof(s,m)
+#else
+#   define STRUCT_OFFSET(s,m)  (Size_t)(&(((s *)0)->m))
+#endif
+
 #if defined(I_STRING) || defined(__cplusplus)
 #   include <string.h>
 #else
 #define strrchr rindex
 #endif
 
-#if defined(mips) && defined(ultrix) && !defined(__STDC__)
-#   undef HAS_MEMCMP
-#endif
-
 #ifdef I_MEMORY
 #  include <memory.h>
 #endif
 #   endif
 #endif /* HAS_MEMSET */
 
-#ifdef HAS_MEMCMP
-#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
-#    ifndef memcmp
-       extern int memcmp _((char*, char*, int));
-#    endif
-#  endif
-#else
-#   ifndef memcmp
-#      define memcmp   my_memcmp
-#   endif
-#endif /* HAS_MEMCMP */
-
 #if !defined(HAS_MEMMOVE) && !defined(memmove)
 #   if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
 #      define memmove(d,s,l) bcopy(s,d,l)
 #   endif
 #endif
 
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
+#   undef HAS_MEMCMP
+#endif
+
+#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memcmp
+       extern int memcmp _((char*, char*, int));
+#    endif
+#  endif
+#  ifdef BUGGY_MSC
+  #  pragma function(memcmp)
+#  endif
+#else
+#   ifndef memcmp
+#      define memcmp   my_memcmp
+#   endif
+#endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
+
+#ifndef HAS_BCMP
+#   ifndef bcmp
+#      define bcmp(s1,s2,l) memcmp(s1,s2,l)
+#   endif
+#endif /* !HAS_BCMP */
+
 #ifdef I_NETINET_IN
 #   include <netinet/in.h>
 #endif
 #   endif
 #endif
 
-#ifndef MSDOS
-#  if defined(HAS_TIMES) && defined(I_SYS_TIMES)
+#if defined(HAS_TIMES) && defined(I_SYS_TIMES)
 #    include <sys/times.h>
-#  endif
 #endif
 
 #if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
 #   define SETERRNO(errcode,vmserrcode) STMT_START {set_errno(errcode); set_vaxc_errno(vmserrcode);} STMT_END
 #endif
 
-#ifndef MSDOS
-#   ifndef errno
+#ifndef errno
        extern int errno;     /* ANSI allows errno to be an lvalue expr */
-#   endif
 #endif
 
 #ifdef HAS_STRERROR
 #endif
 #endif
 
-#ifdef CHAR_MAX
-#  define PERL_CHAR_MAX CHAR_MAX
-#else
-#  ifdef MAXCHAR    /* Often used in <values.h> */
-#    define PERL_CHAR_MAX MAXCHAR
-#  else
-#    define PERL_CHAR_MAX        ((char) ((~(unsigned char)0) >> 1))
-#  endif
-#endif
+/*
+ * Try to figure out max and min values for the integral types.  THE CORRECT
+ * SOLUTION TO THIS MESS: ADAPT enquire.c FROM GCC INTO CONFIGURE.  The
+ * following hacks are used if neither limits.h or values.h provide them:
+ * U<TYPE>_MAX: for types >= int: ~(unsigned TYPE)0
+ *              for types <  int:  (unsigned TYPE)~(unsigned)0
+ *     The argument to ~ must be unsigned so that later signed->unsigned
+ *     conversion can't modify the value's bit pattern (e.g. -0 -> +0),
+ *     and it must not be smaller than int because ~ does integral promotion.
+ * <type>_MAX: (<type>) (U<type>_MAX >> 1)
+ * <type>_MIN: -<type>_MAX - <is_twos_complement_architecture: (3 & -1) == 3>.
+ *     The latter is a hack which happens to work on some machines but
+ *     does *not* catch any random system, or things like integer types
+ *     with NaN if that is possible.
+ *
+ * All of the types are explicitly cast to prevent accidental loss of
+ * numeric range, and in the hope that they will be less likely to confuse
+ * over-eager optimizers.
+ *
+ */
+
+#define PERL_UCHAR_MIN ((unsigned char)0)
 
-#ifdef CHAR_MIN
-#  define PERL_CHAR_MIN CHAR_MIN
+#ifdef UCHAR_MAX
+#  define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
 #else
-#  ifdef MINCHAR
-#    define PERL_CHAR_MIN MINCHAR
+#  ifdef MAXUCHAR
+#    define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
 #  else
-#    define PERL_CHAR_MIN        (-PERL_CHAR_MAX - ((3 & -1) == 3))
+#    define PERL_UCHAR_MAX       ((unsigned char)~(unsigned)0)
 #  endif
 #endif
+/*
+ * CHAR_MIN and CHAR_MAX are not included here, as the (char) type may be
+ * ambiguous. It may be equivalent to (signed char) or (unsigned char)
+ * depending on local options. Until Configure detects this (or at least
+ * detects whether the "signed" keyword is available) the CHAR ranges
+ * will not be included. UCHAR functions normally.
+ *                                                           - kja
+ */
 
-#ifdef UCHAR_MAX
-#  define PERL_UCHAR_MAX UCHAR_MAX
+#define PERL_USHORT_MIN ((unsigned short)0)
+
+#ifdef USHORT_MAX
+#  define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
 #else
-#  ifdef MAXUCHAR
-#    define PERL_UCHAR_MAX MAXUCHAR
+#  ifdef MAXUSHORT
+#    define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
 #  else
-#    define PERL_UCHAR_MAX       (~(unsigned char)0)
+#    define PERL_USHORT_MAX       ((unsigned short)~(unsigned)0)
 #  endif
 #endif
 
-#define PERL_UCHAR_MIN 0
-
 #ifdef SHORT_MAX
-#  define PERL_SHORT_MAX SHORT_MAX
+#  define PERL_SHORT_MAX ((short)SHORT_MAX)
 #else
 #  ifdef MAXSHORT    /* Often used in <values.h> */
-#    define PERL_SHORT_MAX MAXSHORT
+#    define PERL_SHORT_MAX ((short)MAXSHORT)
 #  else
-#    define PERL_SHORT_MAX        ((short) ((~(unsigned short)0) >> 1))
+#    define PERL_SHORT_MAX      ((short) (PERL_USHORT_MAX >> 1))
 #  endif
 #endif
 
 #ifdef SHORT_MIN
-#  define PERL_SHORT_MIN SHORT_MIN
+#  define PERL_SHORT_MIN ((short)SHORT_MIN)
 #else
 #  ifdef MINSHORT
-#    define PERL_SHORT_MIN MINSHORT
+#    define PERL_SHORT_MIN ((short)MINSHORT)
 #  else
 #    define PERL_SHORT_MIN        (-PERL_SHORT_MAX - ((3 & -1) == 3))
 #  endif
 #endif
 
-#ifdef USHORT_MAX
-#  define PERL_USHORT_MAX USHORT_MAX
+#ifdef UINT_MAX
+#  define PERL_UINT_MAX ((unsigned int)UINT_MAX)
 #else
-#  ifdef MAXUSHORT
-#    define PERL_USHORT_MAX MAXUSHORT
+#  ifdef MAXUINT
+#    define PERL_UINT_MAX ((unsigned int)MAXUINT)
 #  else
-#    define PERL_USHORT_MAX       (~(unsigned short)0)
+#    define PERL_UINT_MAX       (~(unsigned int)0)
 #  endif
 #endif
 
-#define PERL_USHORT_MIN 0
+#define PERL_UINT_MIN ((unsigned int)0)
 
 #ifdef INT_MAX
-#  define PERL_INT_MAX INT_MAX
+#  define PERL_INT_MAX ((int)INT_MAX)
 #else
 #  ifdef MAXINT    /* Often used in <values.h> */
-#    define PERL_INT_MAX MAXINT
+#    define PERL_INT_MAX ((int)MAXINT)
 #  else
-#    define PERL_INT_MAX        ((int) ((~(unsigned int)0) >> 1))
+#    define PERL_INT_MAX        ((int)(PERL_UINT_MAX >> 1))
 #  endif
 #endif
 
 #ifdef INT_MIN
-#  define PERL_INT_MIN INT_MIN
+#  define PERL_INT_MIN ((int)INT_MIN)
 #else
 #  ifdef MININT
-#    define PERL_INT_MIN MININT
+#    define PERL_INT_MIN ((int)MININT)
 #  else
 #    define PERL_INT_MIN        (-PERL_INT_MAX - ((3 & -1) == 3))
 #  endif
 #endif
 
-#ifdef UINT_MAX
-#  define PERL_UINT_MAX UINT_MAX
+#ifdef ULONG_MAX
+#  define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
 #else
-#  ifdef MAXUINT
-#    define PERL_UINT_MAX MAXUINT
+#  ifdef MAXULONG
+#    define PERL_ULONG_MAX ((unsigned long)MAXULONG)
 #  else
-#    define PERL_UINT_MAX       (~(unsigned int)0)
+#    define PERL_ULONG_MAX       (~(unsigned long)0)
 #  endif
 #endif
 
-#define PERL_UINT_MIN 0
+#define PERL_ULONG_MIN ((unsigned long)0L)
 
 #ifdef LONG_MAX
-#  define PERL_LONG_MAX LONG_MAX
+#  define PERL_LONG_MAX ((long)LONG_MAX)
 #else
 #  ifdef MAXLONG    /* Often used in <values.h> */
-#    define PERL_LONG_MAX MAXLONG
+#    define PERL_LONG_MAX ((long)MAXLONG)
 #  else
-#    define PERL_LONG_MAX        ((long) ((~(unsigned long)0) >> 1))
+#    define PERL_LONG_MAX        ((long) (PERL_ULONG_MAX >> 1))
 #  endif
 #endif
 
 #ifdef LONG_MIN
-#  define PERL_LONG_MIN LONG_MIN
+#  define PERL_LONG_MIN ((long)LONG_MIN)
 #else
 #  ifdef MINLONG
-#    define PERL_LONG_MIN MINLONG
+#    define PERL_LONG_MIN ((long)MINLONG)
 #  else
 #    define PERL_LONG_MIN        (-PERL_LONG_MAX - ((3 & -1) == 3))
 #  endif
 #endif
 
-#ifdef ULONG_MAX
-#  define PERL_ULONG_MAX ULONG_MAX
-#else
-#  ifdef MAXULONG
-#    define PERL_ULONG_MAX MAXULONG
+#ifdef HAS_QUAD
+
+#  ifdef UQUAD_MAX
+#    define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
 #  else
-#    define PERL_ULONG_MAX       (~(unsigned long)0)
+#    define PERL_UQUAD_MAX     (~(UV)0)
 #  endif
-#endif
 
-#define PERL_ULONG_MIN 0L
+#  define PERL_UQUAD_MIN ((UV)0)
 
-#ifdef HAS_QUAD
 #  ifdef QUAD_MAX
-#    define PERL_QUAD_MAX QUAD_MAX
+#    define PERL_QUAD_MAX ((IV)QUAD_MAX)
 #  else
-#    define PERL_QUAD_MAX      ((IV) ((~(UV)0) >> 1))
+#    define PERL_QUAD_MAX      ((IV) (PERL_UQUAD_MAX >> 1))
 #  endif
 
 #  ifdef QUAD_MIN
-#    define PERL_QUAD_MIN QUAD_MIN
+#    define PERL_QUAD_MIN ((IV)QUAD_MIN)
 #  else
 #    define PERL_QUAD_MIN      (-PERL_QUAD_MAX - ((3 & -1) == 3))
 #  endif
 
-#  ifdef UQUAD_MAX
-#    define PERL_UQUAD_MAX UQUAD_MAX
-#  else
-#    define PERL_UQUAD_MAX     (~(UV)0)
-#  endif
-
-#  define PERL_UQUAD_MIN 0
 #endif
 
 typedef MEM_SIZE STRLEN;
@@ -797,6 +860,7 @@ typedef struct magic MAGIC;
 typedef struct xrv XRV;
 typedef struct xpv XPV;
 typedef struct xpviv XPVIV;
+typedef struct xpvuv XPVUV;
 typedef struct xpvnv XPVNV;
 typedef struct xpvmg XPVMG;
 typedef struct xpvlv XPVLV;
@@ -1122,20 +1186,27 @@ I32 unlnk _((char*));
 #  endif
 #endif
 
+typedef Signal_t (*Sighandler_t) _((int));
+
+#ifdef HAS_SIGACTION
+typedef struct sigaction Sigsave_t;
+#else
+typedef Sighandler_t Sigsave_t;
+#endif
+
 #define SCAN_DEF 0
 #define SCAN_TR 1
 #define SCAN_REPL 2
 
-#ifdef MYMALLOC
-# ifndef DEBUGGING_MSTATS
-#  define DEBUGGING_MSTATS
-# endif
-#endif
-
 #ifdef DEBUGGING
 # ifndef register
 #  define register
 # endif
+# ifdef MYMALLOC
+#  ifndef DEBUGGING_MSTATS
+#   define DEBUGGING_MSTATS
+#  endif
+# endif
 # define PAD_SV(po) pad_sv(po)
 #else
 # define PAD_SV(po) curpad[po]
@@ -1174,6 +1245,7 @@ EXT U32           origalen;
 EXT U32 *      profiledata;
 EXT int                maxo INIT(MAXO);/* Number of ops */
 EXT char *     osname;         /* operating system */
+EXT char *     sh_path INIT(SH_PATH); /* full path of shell */
 
 EXT XPV*       xiv_arenaroot;  /* list of allocated xiv areas */
 EXT IV **      xiv_root;       /* free xiv list--shared by interpreters */
@@ -1213,7 +1285,6 @@ EXT SV ** curpad;
 
 /* temp space */
 EXT SV *       Sv;
-EXT HE         He;
 EXT XPV *      Xpv;
 EXT char       buf[2048];      /* should be longer than PATH_MAX */
 EXT char       tokenbuf[256];
@@ -1229,43 +1300,43 @@ EXT short *     ds;
 EXT char *     dc;
 
 /* handy constants */
-EXT char *     Yes INIT("1");
-EXT char *     No INIT("");
-EXT char *     hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
-EXT char *     patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
-EXT char *     vert INIT("|");
+EXTCONST char *        Yes INIT("1");
+EXTCONST char *        No INIT("");
+EXTCONST char *        hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
+EXTCONST char *        patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
+EXTCONST char *        vert INIT("|");
 
-EXT char       warn_uninit[]
+EXTCONST char  warn_uninit[]
   INIT("Use of uninitialized value");
-EXT char       warn_nosemi[]
+EXTCONST char  warn_nosemi[]
   INIT("Semicolon seems to be missing");
-EXT char       warn_reserved[]
+EXTCONST char  warn_reserved[]
   INIT("Unquoted string \"%s\" may clash with future reserved word");
-EXT char       warn_nl[]
+EXTCONST char  warn_nl[]
   INIT("Unsuccessful %s on filename containing newline");
-EXT char       no_wrongref[]
+EXTCONST char  no_wrongref[]
   INIT("Can't use %s ref as %s ref");
-EXT char       no_symref[]
+EXTCONST char  no_symref[]
   INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
-EXT char       no_usym[]
+EXTCONST char  no_usym[]
   INIT("Can't use an undefined value as %s reference");
-EXT char       no_aelem[]
+EXTCONST char  no_aelem[]
   INIT("Modification of non-creatable array value attempted, subscript %d");
-EXT char       no_helem[]
+EXTCONST char  no_helem[]
   INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
-EXT char       no_modify[]
+EXTCONST char  no_modify[]
   INIT("Modification of a read-only value attempted");
-EXT char       no_mem[]
+EXTCONST char  no_mem[]
   INIT("Out of memory!\n");
-EXT char       no_security[]
+EXTCONST char  no_security[]
   INIT("Insecure dependency in %s%s");
-EXT char       no_sock_func[]
+EXTCONST char  no_sock_func[]
   INIT("Unsupported socket function \"%s\" called");
-EXT char       no_dir_func[]
+EXTCONST char  no_dir_func[]
   INIT("Unsupported directory function \"%s\" called");
-EXT char       no_func[]
+EXTCONST char  no_func[]
   INIT("The %s function is unimplemented");
-EXT char       no_myglob[]
+EXTCONST char  no_myglob[]
   INIT("\"my\" variable %s can't be in a package");
 
 EXT SV         sv_undef;
@@ -1288,8 +1359,49 @@ EXT SV  * psig_ptr[];
 EXT SV  * psig_name[];
 #endif
 
+/* fast case folding tables */
+
+#ifdef DOINIT
+EXTCONST  unsigned char fold[] = {
+       0,      1,      2,      3,      4,      5,      6,      7,
+       8,      9,      10,     11,     12,     13,     14,     15,
+       16,     17,     18,     19,     20,     21,     22,     23,
+       24,     25,     26,     27,     28,     29,     30,     31,
+       32,     33,     34,     35,     36,     37,     38,     39,
+       40,     41,     42,     43,     44,     45,     46,     47,
+       48,     49,     50,     51,     52,     53,     54,     55,
+       56,     57,     58,     59,     60,     61,     62,     63,
+       64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
+       'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
+       'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
+       'x',    'y',    'z',    91,     92,     93,     94,     95,
+       96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
+       'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
+       'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
+       'X',    'Y',    'Z',    123,    124,    125,    126,    127,
+       128,    129,    130,    131,    132,    133,    134,    135,
+       136,    137,    138,    139,    140,    141,    142,    143,
+       144,    145,    146,    147,    148,    149,    150,    151,
+       152,    153,    154,    155,    156,    157,    158,    159,
+       160,    161,    162,    163,    164,    165,    166,    167,
+       168,    169,    170,    171,    172,    173,    174,    175,
+       176,    177,    178,    179,    180,    181,    182,    183,
+       184,    185,    186,    187,    188,    189,    190,    191,
+       192,    193,    194,    195,    196,    197,    198,    199,
+       200,    201,    202,    203,    204,    205,    206,    207,
+       208,    209,    210,    211,    212,    213,    214,    215,
+       216,    217,    218,    219,    220,    221,    222,    223,    
+       224,    225,    226,    227,    228,    229,    230,    231,
+       232,    233,    234,    235,    236,    237,    238,    239,
+       240,    241,    242,    243,    244,    245,    246,    247,
+       248,    249,    250,    251,    252,    253,    254,    255
+};
+#else
+EXTCONST unsigned char fold[];
+#endif
+
 #ifdef DOINIT
-EXT unsigned char fold[] = {   /* fast case folding table */
+EXT unsigned char fold_locale[] = {
        0,      1,      2,      3,      4,      5,      6,      7,
        8,      9,      10,     11,     12,     13,     14,     15,
        16,     17,     18,     19,     20,     21,     22,     23,
@@ -1324,11 +1436,11 @@ EXT unsigned char fold[] = {    /* fast case folding table */
        248,    249,    250,    251,    252,    253,    254,    255
 };
 #else
-EXT unsigned char fold[];
+EXT unsigned char fold_locale[];
 #endif
 
 #ifdef DOINIT
-EXT unsigned char freq[] = {   /* letter frequencies for mixed English/C */
+EXTCONST unsigned char freq[] = {      /* letter frequencies for mixed English/C */
        1,      2,      84,     151,    154,    155,    156,    157,
        165,    246,    250,    3,      158,    7,      18,     29,
        40,     51,     62,     73,     85,     96,     107,    118,
@@ -1363,12 +1475,12 @@ EXT unsigned char freq[] = {    /* letter frequencies for mixed English/C */
        138,    139,    141,    142,    143,    144,    145,    146
 };
 #else
-EXT unsigned char freq[];
+EXTCONST unsigned char freq[];
 #endif
 
 #ifdef DEBUGGING
 #ifdef DOINIT
-EXT char* block_type[] = {
+EXTCONST char* block_type[] = {
        "NULL",
        "SUB",
        "EVAL",
@@ -1377,7 +1489,7 @@ EXT char* block_type[] = {
        "BLOCK",
 };
 #else
-EXT char* block_type[];
+EXTCONST char* block_type[];
 #endif
 #endif
 
@@ -1469,7 +1581,7 @@ EXT U32           hints;          /* various compilation flags */
 #define HINT_BLOCK_SCOPE       0x00000100
 #define HINT_STRICT_SUBS       0x00000200
 #define HINT_STRICT_VARS       0x00000400
-#define HINT_STRICT_UNTIE      0x00000800
+#define HINT_LOCALE            0x00000800
 
 /**************************************************************************/
 /* This regexp stuff is global since it always happens within 1 expr eval */
@@ -1544,7 +1656,6 @@ IEXT bool Idowarn;
 IEXT bool      Idoextract;
 IEXT bool      Isawampersand;  /* must save all match strings */
 IEXT bool      Isawstudy;      /* do fbm_instr on all strings */
-IEXT bool      Isawi;          /* study must assume case insensitive */
 IEXT bool      Isawvec;
 IEXT bool      Iunsafe;
 IEXT char *    Iinplace;
@@ -1552,7 +1663,7 @@ IEXT char *       Ie_tmpname;
 IEXT PerlIO *  Ie_fp;
 IEXT U32       Iperldb;
        /* This value may be raised by extensions for testing purposes */
-IEXT int       Iperl_destruct_level;   /* 0=none, 1=full, 2=full with checks */
+IEXT int       Iperl_destruct_level IINIT(1);  /* 0=none, 1=full, 2=full with checks */
 
 /* magical thingies */
 IEXT Time_t    Ibasetime;              /* $^T */
@@ -1732,6 +1843,7 @@ extern "C" {
 /* The following must follow proto.h */
 
 #ifdef DOINIT
+
 EXT MGVTBL vtbl_sv =   {magic_get,
                                magic_set,
                                        magic_len,
@@ -1765,6 +1877,8 @@ EXT MGVTBL vtbl_glob =    {magic_getglob,
                                        0,      0,      0};
 EXT MGVTBL vtbl_mglob =        {0,     magic_setmglob,
                                        0,      0,      0};
+EXT MGVTBL vtbl_nkeys =        {0,     magic_setnkeys,
+                                       0,      0,      0};
 EXT MGVTBL vtbl_taint =        {magic_gettaint,magic_settaint,
                                        0,      0,      0};
 EXT MGVTBL vtbl_substr =       {0,     magic_setsubstr,
@@ -1776,9 +1890,19 @@ EXT MGVTBL vtbl_pos =    {magic_getpos,
                                        0,      0,      0};
 EXT MGVTBL vtbl_bm =   {0,     magic_setbm,
                                        0,      0,      0};
+EXT MGVTBL vtbl_fm =   {0,     magic_setfm,
+                                       0,      0,      0};
 EXT MGVTBL vtbl_uvar = {magic_getuvar,
                                magic_setuvar,
                                        0,      0,      0};
+EXT MGVTBL vtbl_itervar = {magic_getitervar,magic_setitervar,
+                                       0,      0,      magic_freeitervar};
+
+#ifdef USE_LOCALE_COLLATE
+EXT MGVTBL vtbl_collxfrm = {0,
+                               magic_setcollxfrm,
+                                       0,      0,      0};
+#endif
 
 #ifdef OVERLOAD
 EXT MGVTBL vtbl_amagic =       {0,     magic_setamagic,
@@ -1787,7 +1911,8 @@ EXT MGVTBL vtbl_amagicelem =   {0,     magic_setamagic,
                                         0,      0,      magic_setamagic};
 #endif /* OVERLOAD */
 
-#else
+#else /* !DOINIT */
+
 EXT MGVTBL vtbl_sv;
 EXT MGVTBL vtbl_env;
 EXT MGVTBL vtbl_envelem;
@@ -1801,26 +1926,33 @@ EXT MGVTBL vtbl_isaelem;
 EXT MGVTBL vtbl_arylen;
 EXT MGVTBL vtbl_glob;
 EXT MGVTBL vtbl_mglob;
+EXT MGVTBL vtbl_nkeys;
 EXT MGVTBL vtbl_taint;
 EXT MGVTBL vtbl_substr;
 EXT MGVTBL vtbl_vec;
 EXT MGVTBL vtbl_pos;
 EXT MGVTBL vtbl_bm;
+EXT MGVTBL vtbl_fm;
 EXT MGVTBL vtbl_uvar;
+EXT MGVTBL vtbl_itervar;
+
+#ifdef USE_LOCALE_COLLATE
+EXT MGVTBL vtbl_collxfrm;
+#endif
 
 #ifdef OVERLOAD
 EXT MGVTBL vtbl_amagic;
 EXT MGVTBL vtbl_amagicelem;
 #endif /* OVERLOAD */
 
-#endif
+#endif /* !DOINIT */
 
 #ifdef OVERLOAD
 EXT long amagic_generation;
 
 #define NofAMmeth 29
 #ifdef DOINIT
-EXT char * AMG_names[NofAMmeth][2] = {
+EXTCONST char * AMG_names[NofAMmeth][2] = {
   {"fallback","abs"},
   {"bool", "nomethod"},
   {"\"\"", "0+"},
@@ -1852,7 +1984,7 @@ EXT char * AMG_names[NofAMmeth][2] = {
   {"=","neg"}
 };
 #else
-EXT char * AMG_names[NofAMmeth][2];
+EXTCONST char * AMG_names[NofAMmeth][2];
 #endif /* def INITAMAGIC */
 
 struct  am_table        {
@@ -1900,6 +2032,39 @@ enum {
 };
 #endif /* OVERLOAD */
 
+#ifdef USE_LOCALE_COLLATE
+EXT U32                collation_ix;           /* Collation generation index */
+EXT char *     collation_name;         /* Name of current collation */
+EXT bool       collation_standard INIT(TRUE); /* Assume simple collation */
+EXT Size_t     collxfrm_base;          /* Basic overhead in *xfrm() */
+EXT Size_t     collxfrm_mult INIT(2);  /* Expansion factor in *xfrm() */
+#endif /* USE_LOCALE_COLLATE */
+
+#ifdef USE_LOCALE_NUMERIC
+
+EXT char *     numeric_name;           /* Name of current numeric locale */
+EXT bool       numeric_standard INIT(TRUE); /* Assume simple numerics */
+EXT bool       numeric_local INIT(TRUE);    /* Assume local numerics */
+
+#define SET_NUMERIC_STANDARD() \
+    STMT_START {                               \
+       if (! numeric_standard)                 \
+           perl_set_numeric_standard();        \
+    } STMT_END
+
+#define SET_NUMERIC_LOCAL() \
+    STMT_START {                               \
+       if (! numeric_local)                    \
+           perl_set_numeric_local();           \
+    } STMT_END
+
+#else /* !USE_LOCALE_NUMERIC */
+
+#define SET_NUMERIC_STANDARD()  /**/
+#define SET_NUMERIC_LOCAL()     /**/
+
+#endif /* !USE_LOCALE_NUMERIC */
+
 #if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
 /* 
  * Now we have __attribute__ out of the way