This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Do not block if no message queues available.
[perl5.git] / perl.h
diff --git a/perl.h b/perl.h
index 574e7f7..244c339 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -31,7 +31,9 @@
 #    define PERL_IMPLICIT_CONTEXT
 #  endif
 #  ifndef PERL_IMPLICIT_SYS
-/*#    define PERL_IMPLICIT_SYS*/              /* XXX not done yet */
+#    ifdef WIN32
+#      define PERL_IMPLICIT_SYS                /* XXX not implemented everywhere yet */
+#    endif
 #  endif
 #endif
 
@@ -40,7 +42,9 @@
 #    define PERL_IMPLICIT_CONTEXT
 #  endif
 #  ifndef PERL_IMPLICIT_SYS
-/*#    define PERL_IMPLICIT_SYS*/              /* XXX not done yet */
+#    ifdef WIN32
+#      define PERL_IMPLICIT_SYS                /* XXX not implemented everywhere yet */
+#    endif
 #  endif
 #endif
 
@@ -86,8 +90,8 @@ the perl interpreter.
 | Perl Host |
 +-----------+
       ^
-         |
-         v
+      |
+      v
 +-----------+   +-----------+
 | Perl Core |<->| Extension |
 +-----------+   +-----------+ ...
@@ -684,16 +688,16 @@ Free_t   Perl_mfree (Malloc_t where);
 
 #ifdef USE_THREADS
 #  define ERRSV (thr->errsv)
-#  define ERRHV (thr->errhv)
 #  define DEFSV THREADSV(0)
 #  define SAVE_DEFSV save_threadsv(0)
 #else
 #  define ERRSV GvSV(PL_errgv)
-#  define ERRHV GvHV(PL_errgv)
 #  define DEFSV GvSV(PL_defgv)
 #  define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
 #endif /* USE_THREADS */
 
+#define ERRHV GvHV(PL_errgv)   /* XXX unused, here for compatibility */
+
 #ifndef errno
        extern int errno;     /* ANSI allows errno to be an lvalue expr.
                               * For example in multithreaded environments
@@ -1073,9 +1077,7 @@ Free_t   Perl_mfree (Malloc_t where);
 #define PTR2NV(p)      NUM2PTR(NV,p)
   
 #ifdef USE_LONG_DOUBLE
-#  if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE)
-#    define LDoub_t long double
-#  else
+#  if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
 #     undef USE_LONG_DOUBLE /* Ouch! */
 #  endif
 #endif
@@ -1119,43 +1121,48 @@ Free_t   Perl_mfree (Malloc_t where);
    default value for printing floating point numbers in Gconvert.
    (see config.h)
 */
-#ifdef I_LIMITS
-#include <limits.h>
-#endif
-#ifdef I_FLOAT
-#include <float.h>
-#endif
-#ifndef HAS_LDBL_DIG
-#if LONG_DOUBLESIZE == 10
-#define LDBL_DIG 18 /* assume IEEE */
-#else
-#if LONG_DOUBLESIZE == 16
-#define LDBL_DIG 33 /* assume IEEE */
-#else
-#if LONG_DOUBLESIZE == DOUBLESIZE
-#define LDBL_DIG DBL_DIG /* bummer */
-#endif
-#endif
-#endif
-#endif
+# ifdef I_LIMITS
+#   include <limits.h>
+# endif
+# ifdef I_FLOAT
+#  include <float.h>
+# endif
+# ifndef HAS_LDBL_DIG
+#  if LONG_DOUBLESIZE == 10
+#   define LDBL_DIG 18 /* assume IEEE */
+#  else
+#   if LONG_DOUBLESIZE == 12
+#    define LDBL_DIG 18 /* gcc? */
+#   else
+#    if LONG_DOUBLESIZE == 16
+#     define LDBL_DIG 33 /* assume IEEE */
+#    else
+#     if LONG_DOUBLESIZE == DOUBLESIZE
+#      define LDBL_DIG DBL_DIG /* bummer */
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
 #endif
 
 #ifdef USE_LONG_DOUBLE
-#   define HAS_LDOUB
-    typedef LDoub_t NV;
+    typedef long double NV;
 #   define NVSIZE LONG_DOUBLESIZE
 #   define NV_DIG LDBL_DIG
-#   define Perl_modf modfl
-#   define Perl_frexp frexpl
-#   define Perl_cos cosl
-#   define Perl_sin sinl
-#   define Perl_sqrt sqrtl
-#   define Perl_exp expl
-#   define Perl_log logl
-#   define Perl_atan2 atan2l
-#   define Perl_pow powl
-#   define Perl_floor floorl
-#   define Perl_fmod fmodl
+#   ifdef HAS_SQRTL
+#       define Perl_modf modfl
+#       define Perl_frexp frexpl
+#       define Perl_cos cosl
+#       define Perl_sin sinl
+#       define Perl_sqrt sqrtl
+#       define Perl_exp expl
+#       define Perl_log logl
+#       define Perl_atan2 atan2l
+#       define Perl_pow powl
+#       define Perl_floor floorl
+#       define Perl_fmod fmodl
+#   endif
 #else
     typedef double NV;
 #   define NVSIZE DOUBLESIZE
@@ -1388,9 +1395,6 @@ typedef struct loop LOOP;
 
 typedef struct Outrec Outrec;
 typedef struct interpreter PerlInterpreter;
-#ifndef __BORLANDC__
-typedef struct ff FF;          /* XXX not defined anywhere, should go? */
-#endif
 typedef struct sv SV;
 typedef struct av AV;
 typedef struct hv HV;
@@ -1559,6 +1563,10 @@ typedef union any ANY;
 # endif
 #endif         
 
+#ifndef PERL_SYS_INIT3
+#  define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
+#endif
+
 #ifndef MAXPATHLEN
 #  ifdef PATH_MAX
 #    ifdef _POSIX_PATH_MAX
@@ -1684,7 +1692,6 @@ typedef pthread_key_t     perl_key;
 
 /* This defines a way to flush all output buffers.  This may be a
  * performance issue, so we allow people to disable it.
- * XXX the default needs a Configure test, as it may not work everywhere.
  */
 #ifndef PERL_FLUSHALL_FOR_CHILD
 # if defined(FFLUSH_NULL) || defined(USE_SFIO)
@@ -1766,7 +1773,8 @@ union any {
     I32                any_i32;
     IV         any_iv;
     long       any_long;
-    void       (*any_dptr) (pTHXo_ void*);
+    void       (*any_dptr) (void*);
+    void       (*any_dxptr) (pTHXo_ void*);
 };
 #endif
 
@@ -2577,6 +2585,7 @@ typedef void      (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
 int Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp);
 #endif
 
+typedef void (*DESTRUCTORFUNC_NOCONTEXT_t) (void*);
 typedef void (*DESTRUCTORFUNC_t) (pTHXo_ void*);
 typedef void (*SVFUNC_t) (pTHXo_ SV*);
 typedef I32  (*SVCOMPARE_t) (pTHXo_ SV*, SV*);
@@ -2795,85 +2804,85 @@ START_EXTERN_C
 
 #ifdef DOINIT
 
-EXT MGVTBL PL_vtbl_sv =        {Perl_magic_get,
-                               Perl_magic_set,
-                                       Perl_magic_len,
+EXT MGVTBL PL_vtbl_sv =        {MEMBER_TO_FPTR(Perl_magic_get),
+                               MEMBER_TO_FPTR(Perl_magic_set),
+                                       MEMBER_TO_FPTR(Perl_magic_len),
                                                0,      0};
-EXT MGVTBL PL_vtbl_env =       {0,     Perl_magic_set_all_env,
-                               0,      Perl_magic_clear_all_env,
+EXT MGVTBL PL_vtbl_env =       {0,     MEMBER_TO_FPTR(Perl_magic_set_all_env),
+                               0,      MEMBER_TO_FPTR(Perl_magic_clear_all_env),
                                                        0};
-EXT MGVTBL PL_vtbl_envelem =   {0,     Perl_magic_setenv,
-                                       0,      Perl_magic_clearenv,
+EXT MGVTBL PL_vtbl_envelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setenv),
+                                       0,      MEMBER_TO_FPTR(Perl_magic_clearenv),
                                                        0};
 EXT MGVTBL PL_vtbl_sig =       {0,     0,               0, 0, 0};
-EXT MGVTBL PL_vtbl_sigelem =   {Perl_magic_getsig,
-                                       Perl_magic_setsig,
-                                       0,      Perl_magic_clearsig,
+EXT MGVTBL PL_vtbl_sigelem =   {MEMBER_TO_FPTR(Perl_magic_getsig),
+                                       MEMBER_TO_FPTR(Perl_magic_setsig),
+                                       0,      MEMBER_TO_FPTR(Perl_magic_clearsig),
                                                        0};
-EXT MGVTBL PL_vtbl_pack =      {0,     0,      Perl_magic_sizepack,    Perl_magic_wipepack,
+EXT MGVTBL PL_vtbl_pack =      {0,     0,      MEMBER_TO_FPTR(Perl_magic_sizepack),    MEMBER_TO_FPTR(Perl_magic_wipepack),
                                                        0};
-EXT MGVTBL PL_vtbl_packelem =  {Perl_magic_getpack,
-                               Perl_magic_setpack,
-                                       0,      Perl_magic_clearpack,
+EXT MGVTBL PL_vtbl_packelem =  {MEMBER_TO_FPTR(Perl_magic_getpack),
+                               MEMBER_TO_FPTR(Perl_magic_setpack),
+                                       0,      MEMBER_TO_FPTR(Perl_magic_clearpack),
                                                        0};
-EXT MGVTBL PL_vtbl_dbline =    {0,     Perl_magic_setdbline,
+EXT MGVTBL PL_vtbl_dbline =    {0,     MEMBER_TO_FPTR(Perl_magic_setdbline),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_isa =       {0,     Perl_magic_setisa,
-                                       0,      Perl_magic_setisa,
+EXT MGVTBL PL_vtbl_isa =       {0,     MEMBER_TO_FPTR(Perl_magic_setisa),
+                                       0,      MEMBER_TO_FPTR(Perl_magic_setisa),
                                                        0};
-EXT MGVTBL PL_vtbl_isaelem =   {0,     Perl_magic_setisa,
+EXT MGVTBL PL_vtbl_isaelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setisa),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_arylen =    {Perl_magic_getarylen,
-                               Perl_magic_setarylen,
+EXT MGVTBL PL_vtbl_arylen =    {MEMBER_TO_FPTR(Perl_magic_getarylen),
+                               MEMBER_TO_FPTR(Perl_magic_setarylen),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_glob =      {Perl_magic_getglob,
-                               Perl_magic_setglob,
+EXT MGVTBL PL_vtbl_glob =      {MEMBER_TO_FPTR(Perl_magic_getglob),
+                               MEMBER_TO_FPTR(Perl_magic_setglob),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_mglob =     {0,     Perl_magic_setmglob,
+EXT MGVTBL PL_vtbl_mglob =     {0,     MEMBER_TO_FPTR(Perl_magic_setmglob),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_nkeys =     {Perl_magic_getnkeys,
-                               Perl_magic_setnkeys,
+EXT MGVTBL PL_vtbl_nkeys =     {MEMBER_TO_FPTR(Perl_magic_getnkeys),
+                               MEMBER_TO_FPTR(Perl_magic_setnkeys),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_taint =     {Perl_magic_gettaint,Perl_magic_settaint,
+EXT MGVTBL PL_vtbl_taint =     {MEMBER_TO_FPTR(Perl_magic_gettaint),MEMBER_TO_FPTR(Perl_magic_settaint),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_substr =    {Perl_magic_getsubstr, Perl_magic_setsubstr,
+EXT MGVTBL PL_vtbl_substr =    {MEMBER_TO_FPTR(Perl_magic_getsubstr), MEMBER_TO_FPTR(Perl_magic_setsubstr),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_vec =       {Perl_magic_getvec,
-                               Perl_magic_setvec,
+EXT MGVTBL PL_vtbl_vec =       {MEMBER_TO_FPTR(Perl_magic_getvec),
+                               MEMBER_TO_FPTR(Perl_magic_setvec),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_pos =       {Perl_magic_getpos,
-                               Perl_magic_setpos,
+EXT MGVTBL PL_vtbl_pos =       {MEMBER_TO_FPTR(Perl_magic_getpos),
+                               MEMBER_TO_FPTR(Perl_magic_setpos),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_bm =        {0,     Perl_magic_setbm,
+EXT MGVTBL PL_vtbl_bm =        {0,     MEMBER_TO_FPTR(Perl_magic_setbm),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_fm =        {0,     Perl_magic_setfm,
+EXT MGVTBL PL_vtbl_fm =        {0,     MEMBER_TO_FPTR(Perl_magic_setfm),
                                        0,      0,      0};
-EXT MGVTBL PL_vtbl_uvar =      {Perl_magic_getuvar,
-                               Perl_magic_setuvar,
+EXT MGVTBL PL_vtbl_uvar =      {MEMBER_TO_FPTR(Perl_magic_getuvar),
+                               MEMBER_TO_FPTR(Perl_magic_setuvar),
                                        0,      0,      0};
 #ifdef USE_THREADS
-EXT MGVTBL PL_vtbl_mutex =     {0,     0,      0,      0,      Perl_magic_mutexfree};
+EXT MGVTBL PL_vtbl_mutex =     {0,     0,      0,      0,      MEMBER_TO_FPTR(Perl_magic_mutexfree)};
 #endif /* USE_THREADS */
-EXT MGVTBL PL_vtbl_defelem = {Perl_magic_getdefelem,Perl_magic_setdefelem,
+EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),MEMBER_TO_FPTR(Perl_magic_setdefelem),
                                        0,      0,      0};
 
-EXT MGVTBL PL_vtbl_regexp = {0,0,0,0, Perl_magic_freeregexp};
-EXT MGVTBL PL_vtbl_regdata = {0, 0, Perl_magic_regdata_cnt, 0, 0};
-EXT MGVTBL PL_vtbl_regdatum = {Perl_magic_regdatum_get, 0, 0, 0, 0};
+EXT MGVTBL PL_vtbl_regexp = {0,0,0,0, MEMBER_TO_FPTR(Perl_magic_freeregexp)};
+EXT MGVTBL PL_vtbl_regdata = {0, 0, MEMBER_TO_FPTR(Perl_magic_regdata_cnt), 0, 0};
+EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get), 0, 0, 0, 0};
 
 #ifdef USE_LOCALE_COLLATE
 EXT MGVTBL PL_vtbl_collxfrm = {0,
-                               Perl_magic_setcollxfrm,
+                               MEMBER_TO_FPTR(Perl_magic_setcollxfrm),
                                        0,      0,      0};
 #endif
 
-EXT MGVTBL PL_vtbl_amagic =       {0,     Perl_magic_setamagic,
-                                        0,      0,      Perl_magic_setamagic};
-EXT MGVTBL PL_vtbl_amagicelem =   {0,     Perl_magic_setamagic,
-                                        0,      0,      Perl_magic_setamagic};
+EXT MGVTBL PL_vtbl_amagic =       {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
+                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_setamagic)};
+EXT MGVTBL PL_vtbl_amagicelem =   {0,     MEMBER_TO_FPTR(Perl_magic_setamagic),
+                                        0,      0,      MEMBER_TO_FPTR(Perl_magic_setamagic)};
 
 EXT MGVTBL PL_vtbl_backref =     {0,   0,
-                                       0,      0,      Perl_magic_killbackrefs};
+                                       0,      0,      MEMBER_TO_FPTR(Perl_magic_killbackrefs)};
 
 #else /* !DOINIT */
 
@@ -3154,12 +3163,21 @@ typedef struct am_table_short AMTS;
 #   include <sys/sem.h>
 #   ifndef HAS_UNION_SEMUN     /* Provide the union semun. */
     union semun {
-       int val;
-       struct semid_ds *buf;
-       unsigned short *array;
+       int             val;
+       struct semid_ds *buf;
+       unsigned short  *array;
     };
 #   endif
 #   ifdef USE_SEMCTL_SEMUN
+#      ifdef IRIX32_SEMUN_BROKEN_BY_GCC
+            union gccbug_semun {
+               int             val;
+               struct semid_ds *buf;
+               unsigned short  *array;
+               char            __dummy[5];
+           };
+#           define semun gccbug_semun
+#      endif
 #       define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
 #   else
 #       ifdef USE_SEMCTL_SEMID_DS
@@ -3168,20 +3186,6 @@ typedef struct am_table_short AMTS;
 #   endif
 #endif
 
-/* Mention
-
-   INSTALL_USR_BIN_PERL
-
-   I_SYS_MMAN
-   HAS_MMAP
-   HAS_MUNMAP
-   HAS_MPROTECT
-   HAS_MSYNC
-   HAS_MADVISE
-   Mmap_t
-
-   here so that Configure picks them up. */
-
 #ifdef IAMSUID
 
 #ifdef I_SYS_STATVFS
@@ -3193,6 +3197,28 @@ typedef struct am_table_short AMTS;
 #ifdef I_MNTENT
 #   include <mntent.h>          /* for getmntent() */
 #endif
+#ifdef I_SYS_STATFS
+#   include <sys/statfs.h>      /* for some statfs() */
+#endif
+#ifdef I_SYS_VFS
+#   include <sys/vfs.h>         /* for some statfs() */
+#endif
+#ifdef I_USTAT
+#   include <ustat.h>           /* for ustat() */
+#endif
+
+#if !defined(PERL_MOUNT_NOSUID) && defined(MOUNT_NOSUID)
+#    define PERL_MOUNT_NOSUID MOUNT_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID)
+#    define PERL_MOUNT_NOSUID MNT_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID)
+#   define PERL_MOUNT_NOSUID MS_NOSUID
+#endif
+#if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID)
+#   define PERL_MOUNT_NOSUID M_NOSUID
+#endif
 
 #endif /* IAMSUID */