Add missing syms to global.sym; update magic doc
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 770190d..470a44d 100644 (file)
--- a/perl.h
+++ b/perl.h
 #undef NO_EMBED
 #define NO_EMBED
 #undef MULTIPLICITY
-#undef HIDEMYMALLOC
-#undef EMBEDMYMALLOC
 #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.
 #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. */
 
 #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
@@ -832,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;
@@ -1216,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 */
@@ -1255,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];
@@ -1271,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;
@@ -1333,7 +1362,7 @@ EXT SV  * psig_name[];
 /* fast case folding tables */
 
 #ifdef DOINIT
-EXT const unsigned char fold[] = {
+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,
@@ -1368,7 +1397,7 @@ EXT const unsigned char fold[] = {
        248,    249,    250,    251,    252,    253,    254,    255
 };
 #else
-EXT unsigned char fold[];
+EXTCONST unsigned char fold[];
 #endif
 
 #ifdef DOINIT
@@ -1411,7 +1440,7 @@ 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,
@@ -1446,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",
@@ -1460,7 +1489,7 @@ EXT char* block_type[] = {
        "BLOCK",
 };
 #else
-EXT char* block_type[];
+EXTCONST char* block_type[];
 #endif
 #endif
 
@@ -1488,7 +1517,6 @@ EXT I32           lex_formbrack;  /* bracket count at outer format level */
 EXT I32                lex_fakebrack;  /* outer bracket is mere delimiter */
 EXT I32                lex_casemods;   /* casemod count */
 EXT I32                lex_dojoin;     /* doing an array interpolation */
-EXT I32                lex_endscope;   /* maybe end of scope; defer lexical vars */
 EXT I32                lex_starts;     /* how many interps done on level */
 EXT SV *       lex_stuff;      /* runtime pattern from m// or s/// */
 EXT SV *       lex_repl;       /* runtime replacement from s/// */
@@ -1635,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 */
@@ -1867,8 +1895,10 @@ EXT MGVTBL vtbl_fm =     {0,     magic_setfm,
 EXT MGVTBL vtbl_uvar = {magic_getuvar,
                                magic_setuvar,
                                        0,      0,      0};
+EXT MGVTBL vtbl_itervar = {magic_getitervar,magic_setitervar,
+                                       0,      0,      magic_freeitervar};
 
-#ifdef LC_COLLATE
+#ifdef USE_LOCALE_COLLATE
 EXT MGVTBL vtbl_collxfrm = {0,
                                magic_setcollxfrm,
                                        0,      0,      0};
@@ -1904,8 +1934,9 @@ EXT MGVTBL vtbl_pos;
 EXT MGVTBL vtbl_bm;
 EXT MGVTBL vtbl_fm;
 EXT MGVTBL vtbl_uvar;
+EXT MGVTBL vtbl_itervar;
 
-#ifdef HAS_STRXFRM
+#ifdef USE_LOCALE_COLLATE
 EXT MGVTBL vtbl_collxfrm;
 #endif
 
@@ -1921,7 +1952,7 @@ 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+"},
@@ -1953,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        {
@@ -2000,32 +2031,39 @@ enum {
   copy_amg,    neg_amg
 };
 #endif /* OVERLOAD */
-  
-#ifdef LC_COLLATE
+
+#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 /* LC_COLLATE */
+#endif /* USE_LOCALE_COLLATE */
 
-#ifdef LC_NUMERIC
+#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 NUMERIC_STANDARD() \
-    STMT_START { if (! numeric_standard) perl_numeric_standard(); } STMT_END
-#define NUMERIC_LOCAL() \
-    STMT_START { if (! numeric_local) perl_numeric_local(); } STMT_END
+#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 /* !LC_NUMERIC */
+#else /* !USE_LOCALE_NUMERIC */
 
-#define NUMERIC_STANDARD()  /**/
-#define NUMERIC_LOCAL()     /**/
+#define SET_NUMERIC_STANDARD()  /**/
+#define SET_NUMERIC_LOCAL()     /**/
 
-#endif /* !LC_NUMERIC */
+#endif /* !USE_LOCALE_NUMERIC */
 
 #if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
 /*