Fixup Win32
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 60b0e17..d562a31 100644 (file)
--- a/perl.h
+++ b/perl.h
 
 #include "embed.h"
 
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C 
+#  define END_EXTERN_C 
+#  define EXTERN_C
+#endif
+
+#if defined(USE_THREADS) /* && !defined(PERL_CORE) && !defined(PERLDLL) */
+#ifndef CRIPPLED_CC
+#define CRIPPLED_CC
+#endif
+#endif
+
 #ifdef OP_IN_REGISTER
 #  ifdef __GNUC__
 #    define stringify_immed(s) #s
@@ -63,16 +79,6 @@ register struct op *op asm(stringify(OP_IN_REGISTER));
 #define NOOP (void)0
 
 #define WITH_THR(s) do { dTHR; s; } while (0)
-#ifdef USE_THREADS
-#ifdef FAKE_THREADS
-#include "fakethr.h"
-#else
-#include <pthread.h>
-typedef pthread_mutex_t perl_mutex;
-typedef pthread_cond_t perl_cond;
-typedef pthread_key_t perl_key;
-#endif /* FAKE_THREADS */
-#endif /* USE_THREADS */
 
 /*
  * SOFT_CAST can be used for args to prototyped functions to retain some
@@ -383,8 +389,14 @@ typedef pthread_key_t perl_key;
 #   include <netinet/in.h>
 #endif
 
+#if defined(SF_APPEND) && defined(USE_SFIO) && defined(I_SFIO)
+/* <sfio.h> defines SF_APPEND and <sys/stat.h> might define SF_APPEND
+ * (the neo-BSD seem to do this).  */
+#   undef SF_APPEND
+#endif
+
 #ifdef I_SYS_STAT
-#include <sys/stat.h>
+#   include <sys/stat.h>
 #endif
 
 /* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
@@ -450,6 +462,14 @@ typedef pthread_key_t perl_key;
 #   define SETERRNO(errcode,vmserrcode) errno = (errcode)
 #endif
 
+#ifdef USE_THREADS
+#  define ERRSV (thr->errsv)
+#  define ERRHV (thr->errhv)
+#else
+#  define ERRSV GvSV(errgv)
+#  define ERRHV GvHV(errgv)
+#endif /* USE_THREADS */
+
 #ifndef errno
        extern int errno;     /* ANSI allows errno to be an lvalue expr */
 #endif
@@ -938,7 +958,31 @@ typedef I32 (*filter_t) _((int, SV *, int));
 #     include "unixish.h"
 #   endif
 # endif
-#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++
+ * May make sense to have threads after "*ish.h" anyway
+ */
+
+#ifdef USE_THREADS
+#  ifdef FAKE_THREADS
+#    include "fakethr.h"
+#  else
+#    ifdef WIN32
+#      include <win32thread.h>
+#    else
+#      include <pthread.h>
+typedef pthread_mutex_t perl_mutex;
+typedef pthread_cond_t perl_cond;
+typedef pthread_key_t perl_key;
+#    endif /* WIN32 */
+#  endif /* FAKE_THREADS */
+#endif /* USE_THREADS */
+
+
   
 #ifdef VMS
 #   define STATUS_NATIVE       statusvalue_vms
@@ -1018,7 +1062,7 @@ union any {
 };
 
 #ifdef USE_THREADS
-#define ARGSproto struct thread *
+#define ARGSproto struct thread *thr
 #else
 #define ARGSproto void
 #endif /* USE_THREADS */
@@ -1110,13 +1154,7 @@ EXT char Error[1];
 #define U_I(what) ((unsigned int)(what))
 #define U_L(what) ((U32)(what))
 #else
-#  ifdef __cplusplus
-    extern "C" {
-#  endif
-U32 cast_ulong _((double));
-#  ifdef __cplusplus
-    }
-#  endif
+EXTERN_C U32 cast_ulong _((double));
 #define U_S(what) ((U16)cast_ulong((double)(what)))
 #define U_I(what) ((unsigned int)cast_ulong((double)(what)))
 #define U_L(what) (cast_ulong((double)(what)))
@@ -1127,15 +1165,11 @@ U32 cast_ulong _((double));
 #define I_V(what) ((IV)(what))
 #define U_V(what) ((UV)(what))
 #else
-#  ifdef __cplusplus
-    extern "C" {
-#  endif
+START_EXTERN_C
 I32 cast_i32 _((double));
 IV cast_iv _((double));
 UV cast_uv _((double));
-#  ifdef __cplusplus
-    }
-#  endif
+END_EXTERN_C
 #define I_32(what) (cast_i32((double)(what)))
 #define I_V(what) (cast_iv((double)(what)))
 #define U_V(what) (cast_uv((double)(what)))
@@ -1240,9 +1274,7 @@ char *strcpy(), *strcat();
 #ifdef I_MATH
 #    include <math.h>
 #else
-#   ifdef __cplusplus
-       extern "C" {
-#   endif
+START_EXTERN_C
            double exp _((double));
            double log _((double));
            double log10 _((double));
@@ -1254,9 +1286,7 @@ char *strcpy(), *strcat();
            double cos _((double));
            double atan2 _((double,double));
            double pow _((double,double));
-#   ifdef __cplusplus
-       };
-#   endif
+END_EXTERN_C
 #endif
 
 #ifndef __cplusplus
@@ -1310,11 +1340,6 @@ typedef Sighandler_t Sigsave_t;
 # ifndef register
 #  define register
 # endif
-# ifdef MYMALLOC
-#  ifndef DEBUGGING_MSTATS
-#   define DEBUGGING_MSTATS
-#  endif
-# endif
 # define PAD_SV(po) pad_sv(po)
 # define RUNOPS_DEFAULT runops_debug
 #else
@@ -1332,6 +1357,8 @@ int runops_standard _((void));
 int runops_debug _((void));
 #endif
 
+#define PER_THREAD_MAGICALS "123456789&`'+/.,\\\";^-%=|~:\001\005!@"
+
 /****************/
 /* Truly global */
 /****************/
@@ -1346,8 +1373,9 @@ EXT perl_mutex            eval_mutex;     /* Mutex for doeval */
 EXT perl_cond          eval_cond;      /* Condition variable for doeval */
 EXT struct thread *    eval_owner;     /* Owner thread for doeval */
 EXT int                        nthreads;       /* Number of threads currently */
-EXT perl_mutex         nthreads_mutex; /* Mutex for nthreads */
+EXT perl_mutex         threads_mutex;  /* Mutex for nthreads and thread list */
 EXT perl_cond          nthreads_cond;  /* Condition variable for nthreads */
+EXT char *             per_thread_magicals INIT(PER_THREAD_MAGICALS);
 #ifdef FAKE_THREADS
 EXT struct thread *    thr;            /* Currently executing (fake) thread */
 #endif
@@ -1355,7 +1383,7 @@ EXT struct thread *       thr;            /* Currently executing (fake) thread */
 
 /* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
 #if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
-#ifndef DONT_DECLARE_STD
+#if !defined(DONT_DECLARE_STD) || (defined(__svr4__) && defined(__GNUC__) && defined(sun))
 extern char ** environ;        /* environment variables supplied via exec */
 #endif
 #else
@@ -1642,6 +1670,8 @@ EXTCONST char* block_type[];
 
 #include "perly.h"
 
+#define LEX_NOTPARSING         11      /* borrowed from toke.c */
+
 typedef enum {
     XOPERATOR,
     XTERM,
@@ -1925,11 +1955,6 @@ IEXT I32 Irunlevel;
 /* stack stuff */
 IEXT AV *      Icurstack;              /* THE STACK */
 IEXT AV *      Imainstack;     /* the stack when nothing funny is happening */
-#if 0
-IEXT SV **     Imystack_base;  /* stack->array_ary */
-IEXT SV **     Imystack_sp;    /* stack pointer now */
-IEXT SV **     Imystack_max;   /* stack->array_ary + stack->array_max */
-#endif
 
 /* format accumulators */
 IEXT SV *      Iformtarget;
@@ -1959,6 +1984,11 @@ IEXT int Ilaststatval IINIT(-1);
 IEXT I32       Ilaststype IINIT(OP_STAT);
 IEXT SV *      Imess_sv;
 
+#ifdef USE_THREADS
+/* threads stuff */
+IEXT SV *      Ithrsv;         /* holds struct thread for main thread */
+#endif /* USE_THREADS */
+
 #undef IEXT
 #undef IINIT
 
@@ -1973,10 +2003,7 @@ struct interpreter {
 #include "thread.h"
 #include "pp.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
+START_EXTERN_C
 #include "proto.h"
 
 #ifdef EMBED
@@ -1987,9 +2014,7 @@ extern "C" {
 #define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
 #endif
 
-#ifdef __cplusplus
-};
-#endif
+END_EXTERN_C
 
 /* The following must follow proto.h */
 
@@ -1999,7 +2024,8 @@ EXT MGVTBL vtbl_sv =      {magic_get,
                                magic_set,
                                        magic_len,
                                                0,      0};
-EXT MGVTBL vtbl_env =  {0,     0,      0,      magic_clear_all_env,
+EXT MGVTBL vtbl_env =  {0,     magic_set_all_env,
+                               0,      magic_clear_all_env,
                                                        0};
 EXT MGVTBL vtbl_envelem =      {0,     magic_setenv,
                                        0,      magic_clearenv,
@@ -2018,7 +2044,8 @@ EXT MGVTBL vtbl_packelem =        {magic_getpack,
 EXT MGVTBL vtbl_dbline =       {0,     magic_setdbline,
                                        0,      0,      0};
 EXT MGVTBL vtbl_isa =  {0,     magic_setisa,
-                                       0,      0,      0};
+                                       0,      magic_setisa,
+                                                       0};
 EXT MGVTBL vtbl_isaelem =      {0,     magic_setisa,
                                        0,      0,      0};
 EXT MGVTBL vtbl_arylen =       {magic_getarylen,
@@ -2237,6 +2264,22 @@ enum {
 
 #endif /* OVERLOAD */
 
+#define PERLDB_ALL     0xff
+#define PERLDBf_SUB    0x01            /* Debug sub enter/exit. */
+#define PERLDBf_LINE   0x02            /* Keep line #. */
+#define PERLDBf_NOOPT  0x04            /* Switch off optimizations. */
+#define PERLDBf_INTER  0x08            /* Preserve more data for
+                                          later inspections.  */
+#define PERLDBf_SUBLINE        0x10            /* Keep subr source lines. */
+#define PERLDBf_SINGLE 0x20            /* Start with single-step on. */
+
+#define PERLDB_SUB     (perldb && (perldb & PERLDBf_SUB))
+#define PERLDB_LINE    (perldb && (perldb & PERLDBf_LINE))
+#define PERLDB_NOOPT   (perldb && (perldb & PERLDBf_NOOPT))
+#define PERLDB_INTER   (perldb && (perldb & PERLDBf_INTER))
+#define PERLDB_SUBLINE (perldb && (perldb & PERLDBf_SUBLINE))
+#define PERLDB_SINGLE  (perldb && (perldb & PERLDBf_SINGLE))
+
 #ifdef USE_LOCALE_COLLATE
 EXT U32                collation_ix;           /* Collation generation index */
 EXT char *     collation_name;         /* Name of current collation */