Retract #8875, cannot let go of the old semantics of unpack U
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 77ef4c9..c92e4db 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1,6 +1,6 @@
 /*    perl.h
  *
- *    Copyright (c) 1987-2000, Larry Wall
+ *    Copyright (c) 1987-2001, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -11,9 +11,9 @@
 
 #ifdef PERL_FOR_X2P
 /*
- * This file is being used for x2p stuff. 
+ * This file is being used for x2p stuff.
  * Above symbol is defined via -D in 'x2p/Makefile.SH'
- * Decouple x2p stuff from some of perls more extreme eccentricities. 
+ * Decouple x2p stuff from some of perls more extreme eccentricities.
  */
 #undef MULTIPLICITY
 #undef USE_STDIO
@@ -21,7 +21,7 @@
 #endif /* PERL_FOR_X2P */
 
 #define VOIDUSED 1
-#ifdef PERL_MICRO 
+#ifdef PERL_MICRO
 #   include "uconfig.h"
 #else
 #   include "config.h"
@@ -266,8 +266,8 @@ struct perl_thread;
 #  define END_EXTERN_C }
 #  define EXTERN_C extern "C"
 #else
-#  define START_EXTERN_C 
-#  define END_EXTERN_C 
+#  define START_EXTERN_C
+#  define END_EXTERN_C
 #  define EXTERN_C extern
 #endif
 
@@ -367,7 +367,7 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #define TAINT_ENV()    if (PL_tainting) { taint_env(); }
 #define TAINT_PROPER(s)        if (PL_tainting) { taint_proper(Nullch, s); }
 
-/* XXX All process group stuff is handled in pp_sys.c.  Should these 
+/* 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.
 */
 /* Process group stuff changed from traditional BSD to POSIX.
@@ -407,7 +407,7 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER));
 #  define HAS_GETPGRP  /* Well, effectively it does . . . */
 #endif
 
-/* These are not exact synonyms, since setpgrp() and getpgrp() may 
+/* These are not exact synonyms, since setpgrp() and getpgrp() may
    have different behaviors, but perl.h used to define USE_BSDPGRP
    (prior to 5.003_05) so some extension might depend on it.
 */
@@ -741,7 +741,7 @@ typedef struct perl_mstats perl_mstats_t;
 #       undef INCLUDE_PROTOTYPES
 #       undef PERL_SOCKS_NEED_PROTOTYPES
 #   endif
-# endif 
+# endif
 # ifdef I_NETDB
 #  include <netdb.h>
 # endif
@@ -989,15 +989,15 @@ typedef struct perl_mstats perl_mstats_t;
 
 #ifndef S_IRWXU
 #   define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
-#endif 
+#endif
 
 #ifndef S_IRWXG
 #   define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
-#endif 
+#endif
 
 #ifndef S_IRWXO
 #   define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
-#endif 
+#endif
 
 #ifndef S_IREAD
 #   define S_IREAD S_IRUSR
@@ -1084,12 +1084,11 @@ typedef UVTYPE UV;
 #define IV_DIG (BIT_DIGITS(IVSIZE * 8))
 #define UV_DIG (BIT_DIGITS(UVSIZE * 8))
 
-/* We like our integers to stay integers. */
 #ifndef NO_PERL_PRESERVE_IVUV
-#define PERL_PRESERVE_IVUV
+#define PERL_PRESERVE_IVUV     /* We like our integers to stay integers. */
 #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:
@@ -1103,7 +1102,7 @@ typedef UVTYPE UV;
 #  define PTRV                 UV
 #  define INT2PTR(any,d)       (any)(d)
 #else
-#  if PTRSIZE == LONGSIZE 
+#  if PTRSIZE == LONGSIZE
 #    define PTRV               unsigned long
 #  else
 #    define PTRV               unsigned
@@ -1114,12 +1113,12 @@ typedef UVTYPE UV;
 #define PTR2IV(p)      INT2PTR(IV,p)
 #define PTR2UV(p)      INT2PTR(UV,p)
 #define PTR2NV(p)      NUM2PTR(NV,p)
-#if PTRSIZE == LONGSIZE 
+#if PTRSIZE == LONGSIZE
 #  define PTR2ul(p)    (unsigned long)(p)
 #else
 #  define PTR2ul(p)    INT2PTR(unsigned long,p)        
 #endif
-  
+
 #ifdef USE_LONG_DOUBLE
 #  if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE == DOUBLESIZE
 #      define LONG_DOUBLE_EQUALS_DOUBLE
@@ -1282,7 +1281,7 @@ typedef NVTYPE NV;
 #endif
 
 #if !defined(Perl_atof) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
-#   if !defined(Perl_atof) && defined(HAS_STRTOLD) 
+#   if !defined(Perl_atof) && defined(HAS_STRTOLD)
 #       define Perl_atof(s) (NV)strtold(s, (char**)NULL)
 #   endif
 #   if !defined(Perl_atof) && defined(HAS_ATOLF)
@@ -1300,7 +1299,7 @@ typedef NVTYPE NV;
 #   define Perl_atof2(s,f) ((f) = (NV)Perl_atof(s))
 #endif
 
-/* Previously these definitions used hardcoded figures. 
+/* Previously these definitions used hardcoded figures.
  * It is hoped these formula are more portable, although
  * no data one way or another is presently known to me.
  * The "PERL_" names are used because these calculated constants
@@ -1351,7 +1350,7 @@ typedef NVTYPE NV;
 #    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)
@@ -1558,7 +1557,7 @@ typedef struct ptr_tbl PTR_TBL_t;
 #       define FSEEKSIZE LSEEKSIZE
 #   else
 #       define FSEEKSIZE LONGSIZE
-#   endif  
+#   endif
 #endif
 
 #if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_STDIO)
@@ -1693,6 +1692,13 @@ typedef struct ptr_tbl PTR_TBL_t;
 #  define USE_ENVIRON_ARRAY
 #endif
 
+#ifdef JPL
+    /* E.g. JPL needs to operate on a copy of the real environment.
+     * JDK 1.2 and 1.3 seem to get upset if the original environment
+     * is diddled with. */
+#   define NEED_ENVIRON_DUP_FOR_MODIFY
+#endif
+
 #ifndef PERL_SYS_INIT3
 #  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
 #endif
@@ -1719,7 +1725,7 @@ typedef struct ptr_tbl PTR_TBL_t;
 #  endif
 #endif
 
-/* 
+/*
  * USE_THREADS needs to be after unixish.h as <pthread.h> includes
  * <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
  * this results in many functions being undeclared which bothers C++
@@ -1878,7 +1884,7 @@ typedef pthread_key_t     perl_key;
 #    define SVf "p"
 #  else
 #    define SVf "_"
-#  endif 
+#  endif
 #endif
 
 #ifndef UVf
@@ -1886,7 +1892,7 @@ typedef pthread_key_t     perl_key;
 #    define UVf UVuf
 #  else
 #    define UVf "Vu"
-#  endif 
+#  endif
 #endif
 
 #ifndef VDf
@@ -1894,7 +1900,7 @@ typedef pthread_key_t     perl_key;
 #    define VDf "p"
 #  else
 #    define VDf "vd"
-#  endif 
+#  endif
 #endif
 
 /* Some unistd.h's give a prototype for pause() even though
@@ -2193,11 +2199,33 @@ Gid_t getegid (void);
 #endif
 
 struct ufuncs {
-    I32 (*uf_val)(IV, SV*);
-    I32 (*uf_set)(IV, SV*);
+    I32 (*uf_val)(pTHX_ IV, SV*);
+    I32 (*uf_set)(pTHX_ IV, SV*);
     IV uf_index;
 };
 
+/* In pre-5.7-Perls the 'U' magic didn't get the thread context.
+ * XS code wanting to be backward compatible can do something
+ * like the following:
+#ifndef PERL_MG_UFUNC
+#define PERL_MG_UFUNC(name,ix,sv) I32 name(IV ix, SV *sv)
+#endif
+
+static PERL_MG_UFUNC(foo_get, index, val)
+{
+    sv_setsv(val, ...);
+    return TRUE;
+}
+
+-- Doug MacEachern
+
+*/
+
+#ifndef PERL_MG_UFUNC
+#define PERL_MG_UFUNC(name,ix,sv) I32 name(pTHX_ IV ix, SV *sv)
+#endif
+
 /* Fix these up for __STDC__ */
 #ifndef DONT_DECLARE_STD
 char *mktemp (char*);
@@ -2352,7 +2380,7 @@ EXT char *** environ_pointer;
 #    if !defined(DONT_DECLARE_STD) || \
         (defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
         defined(__sgi) || \
-        defined(__DGUX) 
+        defined(__DGUX)
 extern char ** environ;        /* environment variables supplied via exec */
 #    endif
 #  endif
@@ -2757,9 +2785,9 @@ struct perl_vars *PL_VarsPtr;
 #endif /* PERL_GLOBAL_STRUCT */
 
 #if defined(MULTIPLICITY) || defined(PERL_OBJECT)
-/* If we have multiple interpreters define a struct 
+/* If we have multiple interpreters define a struct
    holding variables which must be per-interpreter
-   If we don't have threads anything that would have 
+   If we don't have threads anything that would have
    be per-thread is per-interpreter.
 */
 
@@ -2808,7 +2836,7 @@ typedef void *Thread;
 
 #ifndef PERL_CALLCONV
 #  define PERL_CALLCONV
-#endif 
+#endif
 
 #ifndef NEXT30_NO_ATTRIBUTE
 #  ifndef HASATTRIBUTE       /* disable GNU-cc attribute checking? */
@@ -2845,11 +2873,11 @@ typedef void *Thread;
 #  include "embedvar.h"
 #endif
 
-/* Now include all the 'global' variables 
+/* Now include all the 'global' variables
  * If we don't have threads or multiple interpreters
- * these include variables that would have been their struct-s 
+ * these include variables that would have been their struct-s
  */
-                         
+
 #define PERLVAR(var,type) EXT type PL_##var;
 #define PERLVARA(var,n,type) EXT type PL_##var[n];
 #define PERLVARI(var,type,init) EXT type  PL_##var INIT(init);
@@ -2984,6 +3012,9 @@ EXT MGVTBL PL_vtbl_amagicelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
 EXT MGVTBL PL_vtbl_backref =     {0,   0,
                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_killbackrefs)};
 
+EXT MGVTBL PL_vtbl_ovrld   =     {0,   0,
+                                       0,      0,      MEMBER_TO_FPTR(Perl_magic_freeovrld)};
+
 #else /* !DOINIT */
 
 EXT MGVTBL PL_vtbl_sv;
@@ -3007,6 +3038,7 @@ EXT MGVTBL PL_vtbl_pos;
 EXT MGVTBL PL_vtbl_bm;
 EXT MGVTBL PL_vtbl_fm;
 EXT MGVTBL PL_vtbl_uvar;
+EXT MGVTBL PL_vtbl_ovrld;
 
 #ifdef USE_THREADS
 EXT MGVTBL PL_vtbl_mutex;
@@ -3060,8 +3092,9 @@ enum {
   copy_amg,    neg_amg,
   to_sv_amg,   to_av_amg,
   to_hv_amg,   to_gv_amg,
-  to_cv_amg,   iter_amg,    
-  DESTROY_amg, max_amg_code
+  to_cv_amg,   iter_amg,
+  int_amg,     DESTROY_amg,
+  max_amg_code
   /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
 };
 
@@ -3107,7 +3140,7 @@ EXTCONST char * PL_AMG_names[NofAMmeth] = {
   "(${}",      "(@{}",
   "(%{}",      "(*{}",
   "(&{}",      "(<>",
-  "DESTROY",
+  "(int",      "DESTROY",
 };
 #else
 EXTCONST char * PL_AMG_names[NofAMmeth];
@@ -3213,9 +3246,9 @@ typedef struct am_table_short AMTS;
 #define SET_NUMERIC_LOCAL() \
        set_numeric_local();
 
-#define IS_NUMERIC_RADIX(c)    \
+#define IS_NUMERIC_RADIX(s)    \
        ((PL_hints & HINT_LOCALE) && \
-         PL_numeric_radix && (c) == PL_numeric_radix)
+         PL_numeric_radix && memEQ(s, SvPVX(PL_numeric_radix), SvCUR(PL_numeric_radix)))
 
 #define STORE_NUMERIC_LOCAL_SET_STANDARD() \
        bool was_local = (PL_hints & HINT_LOCALE) && PL_numeric_local; \
@@ -3292,9 +3325,9 @@ typedef struct am_table_short AMTS;
 #endif
 
 #if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
-/* 
- * Now we have __attribute__ out of the way 
- * Remap printf 
+/*
+ * Now we have __attribute__ out of the way
+ * Remap printf
  */
 #undef printf
 #define printf PerlIO_stdoutf
@@ -3335,8 +3368,15 @@ typedef struct am_table_short AMTS;
  * Keep this check simple, or it may slow down execution
  * massively.
  */
+
+#ifndef PERL_MICRO
+#   ifndef PERL_OLD_SIGNALS
+#       define PERL_ASYNC_CHECK() if (PL_sig_pending) despatch_signals()
+#   endif
+#endif
+
 #ifndef PERL_ASYNC_CHECK
-#define PERL_ASYNC_CHECK()  NOOP
+#   define PERL_ASYNC_CHECK()  NOOP
 #endif
 
 /*
@@ -3477,7 +3517,7 @@ typedef struct am_table_short AMTS;
 #undef PERL_PATCHLEVEL_H_IMPLICIT
 
 /* Mention
-   
+
    NV_PRESERVES_UV
 
    HAS_ICONV