/* perl.h
*
- * Copyright (c) 1987-2001, Larry Wall
+ * Copyright (c) 1987-2002, 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.
*
*/
+
#ifndef H_PERL
#define H_PERL 1
#define USE_STDIO
#endif /* PERL_FOR_X2P */
+#if defined(DGUX)
+#include <sys/fcntl.h>
+#endif
+
+#ifdef VOIDUSED
+# undef VOIDUSED
+#endif
#define VOIDUSED 1
+
#ifdef PERL_MICRO
# include "uconfig.h"
#else
/* See L<perlguts/"The Perl API"> for detailed notes on
* PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
+/* Note that from here --> to <-- the same logic is
+ * repeated in makedef.pl, so be certain to update
+ * both places when editing. */
+
+#ifdef PERL_IMPLICIT_SYS
+/* PERL_IMPLICIT_SYS implies PerlMemShared != PerlMem
+ so use slab allocator to avoid lots of MUTEX overhead
+ */
+# ifndef PL_OP_SLAB_ALLOC
+# define PL_OP_SLAB_ALLOC
+# endif
+#endif
+
#ifdef USE_ITHREADS
# if !defined(MULTIPLICITY)
# define MULTIPLICITY
# endif
#endif
+/* undef WIN32 when building on Cygwin (for libwin32) - gph */
+#ifdef __CYGWIN__
+# undef WIN32
+# undef _WIN32
+#endif
+
+/* Use the reentrant APIs like localtime_r and getpwent_r */
+/* Win32 has naturally threadsafe libraries, no need to use any _r variants. */
+#if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(NETWARE) && !defined(WIN32) && !defined(__APPLE__)
+# define USE_REENTRANT_API
+#endif
+
+/* <--- here ends the logic shared by perl.h and makedef.pl */
+
#ifdef PERL_IMPLICIT_CONTEXT
# ifdef USE_5005THREADS
struct perl_thread;
#endif
#ifdef HASATTRIBUTE
-# define PERL_UNUSED_DECL __attribute__((unused))
+# if defined(__GNUC__) && defined(__cplusplus)
+# define PERL_UNUSED_DECL
+# else
+# define PERL_UNUSED_DECL __attribute__((unused))
+# endif
#else
# define PERL_UNUSED_DECL
#endif
* Trying to select a version that gives no warnings...
*/
#if !(defined(STMT_START) && defined(STMT_END))
-# if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(__cplusplus)
+# if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC) && !defined(__cplusplus)
# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
# define STMT_END )
# else
/* Now which other defined()s do we need here ??? */
-# if (VOIDFLAGS) && (defined(sun) || defined(__sun__))
+# if (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
# define STMT_START if (1)
# define STMT_END else (void)0
# else
#if defined(HASVOLATILE) || defined(STANDARD_C)
# ifdef __cplusplus
-# define VOL // to temporarily suppress warnings
+# define VOL /* to temporarily suppress warnings */
# else
# define VOL volatile
# endif
# endif
#endif
-/* Use the reentrant APIs like localtime_r and getpwent_r */
-/* Win32 has naturally threadsafe libraries, no need to use any _r variants. */
-#if defined(USE_ITHREADS) && !defined(USE_REENTRANT_API) && !defined(WIN32)
-# define USE_REENTRANT_API
-#endif
-
/* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
pthread.h must be included before all other header files.
*/
# define MYSWAP
#endif
-/* Cannot include embed.h here on Win32 as win32.h has not
+/* Cannot include embed.h here on Win32 as win32.h has not
yet been included and defines some config variables e.g. HAVE_INTERP_INTERN
*/
#if !defined(PERL_FOR_X2P) && !(defined(WIN32)||defined(VMS))
# else
# define EMBEDMYMALLOC /* for compatibility */
# endif
+START_EXTERN_C
Malloc_t Perl_malloc (MEM_SIZE nbytes);
Malloc_t Perl_calloc (MEM_SIZE elements, MEM_SIZE size);
Malloc_t Perl_realloc (Malloc_t where, MEM_SIZE nbytes);
/* 'mfree' rather than 'free', since there is already a 'perl_free'
* that causes clashes with case-insensitive linkers */
Free_t Perl_mfree (Malloc_t where);
+END_EXTERN_C
typedef struct perl_mstats perl_mstats_t;
set_errno(errcode); \
set_vaxc_errno(vmserrcode); \
} STMT_END
+# define LIB_INVARG LIB$_INVARG
+# define RMS_DIR RMS$_DIR
+# define RMS_FAC RMS$_FAC
+# define RMS_FEX RMS$_FEX
+# define RMS_FNF RMS$_FNF
+# define RMS_IFI RMS$_IFI
+# define RMS_ISI RMS$_ISI
+# define RMS_PRV RMS$_PRV
+# define SS_ACCVIO SS$_ACCVIO
+# define SS_DEVOFFLINE SS$_DEVOFFLINE
+# define SS_IVCHAN SS$_IVCHAN
+# define SS_NORMAL SS$_NORMAL
#else
# define SETERRNO(errcode,vmserrcode) (errno = (errcode))
+# define LIB_INVARG 0
+# define RMS_DIR 0
+# define RMS_FAC 0
+# define RMS_FEX 0
+# define RMS_FNF 0
+# define RMS_IFI 0
+# define RMS_ISI 0
+# define RMS_PRV 0
+# define SS_ACCVIO 0
+# define SS_DEVOFFLINE 0
+# define SS_IVCHAN 0
+# define SS_NORMAL 0
#endif
#ifdef USE_5005THREADS
# endif
#endif
+#ifndef HAS_SOCKETPAIR
+# ifdef HAS_SOCKET
+# define socketpair Perl_my_socketpair
+# endif
+#endif
+
#if INTSIZE == 2
# define htoni htons
# define ntohi ntohs
# define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
#endif
-#ifndef S_IREAD
+/* BeOS 5.0 seems to define S_IREAD and S_IWRITE in <posix/fcntl.h>
+ * which would get included through <sys/file.h >, but that is 3000
+ * lines in the future. --jhi */
+
+#if !defined(S_IREAD) && !defined(__BEOS__)
# define S_IREAD S_IRUSR
#endif
-#ifndef S_IWRITE
+#if !defined(S_IWRITE) && !defined(__BEOS__)
# define S_IWRITE S_IWUSR
#endif
# define DBL_DIG OVR_DBL_DIG
#else
/* The following is all to get DBL_DIG, in order to pick a nice
- default value for printing floating point numbers in Gconvert.
- (see config.h)
+ default value for printing floating point numbers in Gconvert
+ (see config.h). (It also has other uses, such as figuring out if
+ a given precision of printing can be done with a double instead of
+ a long double - Allen).
*/
#ifdef I_LIMITS
#include <limits.h>
# endif
#endif
+/*
+ * This is for making sure we have a good DBL_MAX value, if possible,
+ * either for usage as NV_MAX or for usage in figuring out if we can
+ * fit a given long double into a double, if bug-fixing makes it
+ * necessary to do so. - Allen <allens@cpan.org>
+ */
+
+#ifdef I_LIMITS
+# include <limits.h>
+#endif
+
+#ifdef I_VALUES
+# if !(defined(DBL_MIN) && defined(DBL_MAX) && defined(I_LIMITS))
+# include <values.h>
+# if defined(MAXDOUBLE) && !defined(DBL_MAX)
+# define DBL_MAX MAXDOUBLE
+# endif
+# if defined(MINDOUBLE) && !defined(DBL_MIN)
+# define DBL_MIN MINDOUBLE
+# endif
+# endif
+#endif /* defined(I_VALUES) */
+
typedef NVTYPE NV;
#ifdef I_IEEEFP
# endif
# ifdef LDBL_MAX
# define NV_MAX LDBL_MAX
-# define NV_MIN LDBL_MIN
+/* Having LDBL_MAX doesn't necessarily mean that we have LDBL_MIN... -Allen */
# else
# ifdef HUGE_VALL
# define NV_MAX HUGE_VALL
/* e.g. libsunmath doesn't have modfl and frexpl as of mid-March 2000 */
# ifdef HAS_MODFL
# define Perl_modf(x,y) modfl(x,y)
+/* eg glibc 2.2 series seems to provide modfl on ppc and arm, but has no
+ prototype in <math.h> */
+# ifndef HAS_MODFL_PROTO
+long double modfl(long double, long double *);
+# endif
# else
# define Perl_modf(x,y) ((long double)modf((double)(x),(double*)(y)))
# endif
# else
# define Perl_frexp(x,y) ((long double)frexp((double)(x),y))
# endif
-# ifndef Perl_isinf
+# ifndef Perl_isnan
# ifdef HAS_ISNANL
# define Perl_isnan(x) isnanl(x)
# endif
# ifdef DBL_EPSILON
# define NV_EPSILON DBL_EPSILON
# endif
-# ifdef DBL_MAX
+# ifdef DBL_MAX /* XXX Does DBL_MAX imply having DBL_MIN? */
# define NV_MAX DBL_MAX
# define NV_MIN DBL_MIN
# else
/* rumor has it that Win32 has _fpclass() */
+/* SGI has fpclassl... but not with the same result values,
+ * and it's via a typedef (not via #define), so will need to redo Configure
+ * to use. Not worth the trouble, IMO, at least until the below is used
+ * more places. Also has fp_class_l, BTW, via fp_class.h. Feel free to check
+ * with me for the SGI manpages, SGI testing, etcetera, if you want to
+ * try getting this to work with IRIX. - Allen <allens@cpan.org> */
+
#if !defined(Perl_fp_class) && (defined(HAS_FPCLASS)||defined(HAS_FPCLASSL))
# ifdef I_IEEFP
# include <ieeefp.h>
#if !defined(Perl_fp_class) && defined(HAS_FPCLASSIFY)
# include <math.h>
# define Perl_fp_class(x) fpclassify(x)
-# define Perl_fp_class_nan(x) (fp_classify(x)==FP_SNAN|FP|_fp_classify(x)==QNAN)
+# define Perl_fp_class_nan(x) (fp_classify(x)==FP_SNAN||fp_classify(x)==FP_QNAN)
# define Perl_fp_class_inf(x) (fp_classify(x)==FP_INFINITE)
# define Perl_fp_class_norm(x) (fp_classify(x)==FP_NORMAL)
# define Perl_fp_class_denorm(x) (fp_classify(x)==FP_SUBNORMAL)
# endif
#endif
-#define Perl_atof(s) Perl_my_atof(s)
-#define Perl_atof2(s, np) Perl_my_atof2(s, np)
+/* The default is to use Perl's own atof() implementation (in numeric.c).
+ * Usually that is the one to use but for some platforms (e.g. UNICOS)
+ * it is however best to use the native implementation of atof.
+ * You can experiment with using your native one by -DUSE_PERL_ATOF=0.
+ * Some good tests to try out with either setting are t/base/num.t,
+ * t/op/numconvert.t, and t/op/pack.t. Note that if using long doubles
+ * you may need to be using a different function than atof! */
+
+#ifndef USE_PERL_ATOF
+# ifndef _UNICOS
+# define USE_PERL_ATOF
+# endif
+#else
+# if USE_PERL_ATOF == 0
+# undef USE_PERL_ATOF
+# endif
+#endif
+
+#ifdef USE_PERL_ATOF
+# define Perl_atof(s) Perl_my_atof(s)
+# define Perl_atof2(s, n) Perl_my_atof2(aTHX_ (s), &(n))
+#else
+# define Perl_atof(s) (NV)atof(s)
+# define Perl_atof2(s, n) ((n) = atof(s))
+#endif
/* Previously these definitions used hardcoded figures.
* It is hoped these formula are more portable, although
#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
# include <limits.h>
-#else
-#ifdef I_VALUES
-# include <values.h>
-#endif
#endif
+/* Included values.h above if necessary; still including limits.h down here,
+ * despite doing above, because math.h might have overriden... XXX - Allen */
/*
* Try to figure out max and min values for the integral types. THE CORRECT
#endif
#if defined(__OPEN_VM)
-# include "vmesa/vmesaish.h"
+# include "vmesa/vmesaish.h"
+# define ISHISH "vmesa"
#endif
#ifdef DOSISH
-# if defined(OS2)
-# include "os2ish.h"
-# else
-# include "dosish.h"
-# endif
-#else
-# if defined(VMS)
+# if defined(OS2)
+# include "os2ish.h"
+# else
+# include "dosish.h"
+# endif
+# define ISHISH "dos"
+#endif
+
+#if defined(VMS)
# include "vmsish.h"
# include "embed.h"
-# else
-# if defined(PLAN9)
-# include "./plan9/plan9ish.h"
+# define ISHISH "vms"
+#endif
+
+#if defined(PLAN9)
+# include "./plan9/plan9ish.h"
+# define ISHISH "plan9"
+#endif
+
+#if defined(MPE)
+# include "mpeix/mpeixish.h"
+# define ISHISH "mpeix"
+#endif
+
+#if defined(__VOS__)
+# ifdef __GNUC__
+# include "./vos/vosish.h"
# else
-# if defined(MPE)
-# include "mpeix/mpeixish.h"
-# else
-# if defined(__VOS__)
-# include "vosish.h"
-# else
-# if defined(EPOC)
-# include "epocish.h"
-# else
-# if defined(MACOS_TRADITIONAL)
-# include "macos/macish.h"
-# ifndef NO_ENVIRON_ARRAY
-# define NO_ENVIRON_ARRAY
-# endif
-# else
-# include "unixish.h"
-# endif
-# endif
-# endif
-# endif
+# include "vos/vosish.h"
# endif
-# endif
+# define ISHISH "vos"
#endif
-#ifndef NO_ENVIRON_ARRAY
-# define USE_ENVIRON_ARRAY
+#if defined(EPOC)
+# include "epocish.h"
+# define ISHISH "epoc"
+#endif
+
+#if defined(MACOS_TRADITIONAL)
+# include "macos/macish.h"
+# ifndef NO_ENVIRON_ARRAY
+# define NO_ENVIRON_ARRAY
+# endif
+# define ISHISH "macos classic"
+#endif
+
+#if defined(__BEOS__)
+# include "beos/beosish.h"
+# define ISHISH "beos"
+#endif
+
+#ifndef ISHISH
+# include "unixish.h"
+# define ISHISH "unix"
#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
+#ifndef NO_ENVIRON_ARRAY
+# define USE_ENVIRON_ARRAY
#endif
/*
#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters))
+#if defined(_AIX) && !defined(_AIX43)
+#if defined(USE_REENTRANT) || defined(_REENTRANT) || defined(_THREAD_SAFE)
+/* We cannot include <crypt.h> to get the struct crypt_data
+ * because of setkey prototype problems when threading */
+typedef struct crypt_data { /* straight from /usr/include/crypt.h */
+ /* From OSF, Not needed in AIX
+ char C[28], D[28];
+ */
+ char E[48];
+ char KS[16][48];
+ char block[66];
+ char iobuf[16];
+} CRYPTD;
+#endif /* threading */
+#endif /* AIX */
+
#if !defined(OS2) && !defined(MACOS_TRADITIONAL)
# include "iperlsys.h"
#endif
#include "util.h"
#include "form.h"
#include "gv.h"
+#include "pad.h"
#include "cv.h"
#include "opnames.h"
#include "op.h"
#include "scope.h"
#include "warnings.h"
#include "utf8.h"
-#include "sharedsv.h"
/* Current curly descriptor */
typedef struct curcur CURCUR;
# define htovs(x) vtohs(x)
# endif
/* otherwise default to functions in util.c */
+#ifndef htovs
+short htovs(short n);
+short vtohs(short n);
+long htovl(long n);
+long vtohl(long n);
+#endif
#endif
/* *MAX Plus 1. A floating point value.
#ifndef Perl_error_log
# define Perl_error_log (PL_stderrgv \
+ && isGV(PL_stderrgv) \
&& GvIOp(PL_stderrgv) \
&& IoOFP(GvIOp(PL_stderrgv)) \
? IoOFP(GvIOp(PL_stderrgv)) \
#define DEBUG_r_FLAG 0x00000200 /* 512 */
#define DEBUG_x_FLAG 0x00000400 /* 1024 */
#define DEBUG_u_FLAG 0x00000800 /* 2048 */
-#define DEBUG_L_FLAG 0x00001000 /* 4096 */
#define DEBUG_H_FLAG 0x00002000 /* 8192 */
#define DEBUG_X_FLAG 0x00004000 /* 16384 */
#define DEBUG_D_FLAG 0x00008000 /* 32768 */
#define DEBUG_S_FLAG 0x00010000 /* 65536 */
#define DEBUG_T_FLAG 0x00020000 /* 131072 */
#define DEBUG_R_FLAG 0x00040000 /* 262144 */
-#define DEBUG_MASK 0x0007FFFF /* mask of all the standard flags */
+#define DEBUG_J_FLAG 0x00080000 /* 524288 */
+#define DEBUG_v_FLAG 0x00100000 /*1048576 */
+#define DEBUG_C_FLAG 0x00200000 /*2097152 */
+#define DEBUG_MASK 0x003FEFFF /* mask of all the standard flags */
#define DEBUG_DB_RECURSE_FLAG 0x40000000
-#define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? */
-
+#define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? Signal
+ that something was done? */
# define DEBUG_p_TEST_ (PL_debug & DEBUG_p_FLAG)
# define DEBUG_s_TEST_ (PL_debug & DEBUG_s_FLAG)
# define DEBUG_r_TEST_ (PL_debug & DEBUG_r_FLAG)
# define DEBUG_x_TEST_ (PL_debug & DEBUG_x_FLAG)
# define DEBUG_u_TEST_ (PL_debug & DEBUG_u_FLAG)
-# define DEBUG_L_TEST_ (PL_debug & DEBUG_L_FLAG)
# define DEBUG_H_TEST_ (PL_debug & DEBUG_H_FLAG)
# define DEBUG_X_TEST_ (PL_debug & DEBUG_X_FLAG)
# define DEBUG_D_TEST_ (PL_debug & DEBUG_D_FLAG)
# define DEBUG_S_TEST_ (PL_debug & DEBUG_S_FLAG)
# define DEBUG_T_TEST_ (PL_debug & DEBUG_T_FLAG)
# define DEBUG_R_TEST_ (PL_debug & DEBUG_R_FLAG)
+# define DEBUG_J_TEST_ (PL_debug & DEBUG_J_FLAG)
+# define DEBUG_v_TEST_ (PL_debug & DEBUG_v_FLAG)
+# define DEBUG_C_TEST_ (PL_debug & DEBUG_C_FLAG)
+# define DEBUG_Xv_TEST_ (DEBUG_X_TEST_ && DEBUG_v_TEST_)
#ifdef DEBUGGING
# define DEBUG_r_TEST DEBUG_r_TEST_
# define DEBUG_x_TEST DEBUG_x_TEST_
# define DEBUG_u_TEST DEBUG_u_TEST_
-# define DEBUG_L_TEST DEBUG_L_TEST_
# define DEBUG_H_TEST DEBUG_H_TEST_
# define DEBUG_X_TEST DEBUG_X_TEST_
+# define DEBUG_Xv_TEST DEBUG_Xv_TEST_
# define DEBUG_D_TEST DEBUG_D_TEST_
# define DEBUG_S_TEST DEBUG_S_TEST_
# define DEBUG_T_TEST DEBUG_T_TEST_
# define DEBUG_R_TEST DEBUG_R_TEST_
+# define DEBUG_J_TEST DEBUG_J_TEST_
+# define DEBUG_v_TEST DEBUG_v_TEST_
+# define DEBUG_C_TEST DEBUG_C_TEST_
# define DEB(a) a
# define DEBUG(a) if (PL_debug) a
# define DEBUG_r(a) DEBUG__(DEBUG_r_TEST, a)
# define DEBUG_x(a) DEBUG__(DEBUG_x_TEST, a)
# define DEBUG_u(a) DEBUG__(DEBUG_u_TEST, a)
-# define DEBUG_L(a) DEBUG__(DEBUG_L_TEST, a)
# define DEBUG_H(a) DEBUG__(DEBUG_H_TEST, a)
# define DEBUG_X(a) DEBUG__(DEBUG_X_TEST, a)
+# define DEBUG_Xv(a) DEBUG__(DEBUG_Xv_TEST, a)
# define DEBUG_D(a) DEBUG__(DEBUG_D_TEST, a)
# ifdef USE_5005THREADS
# define DEBUG_T(a) DEBUG__(DEBUG_T_TEST, a)
# define DEBUG_R(a) DEBUG__(DEBUG_R_TEST, a)
+# define DEBUG_v(a) DEBUG__(DEBUG_v_TEST, a)
+# define DEBUG_C(a) DEBUG__(DEBUG_C_TEST, a)
#else /* DEBUGGING */
# define DEBUG_r_TEST (0)
# define DEBUG_x_TEST (0)
# define DEBUG_u_TEST (0)
-# define DEBUG_L_TEST (0)
# define DEBUG_H_TEST (0)
# define DEBUG_X_TEST (0)
+# define DEBUG_Xv_TEST (0)
# define DEBUG_D_TEST (0)
# define DEBUG_S_TEST (0)
# define DEBUG_T_TEST (0)
# define DEBUG_R_TEST (0)
+# define DEBUG_J_TEST (0)
+# define DEBUG_v_TEST (0)
+# define DEBUG_C_TEST (0)
# define DEB(a)
# define DEBUG(a)
# define DEBUG_r(a)
# define DEBUG_x(a)
# define DEBUG_u(a)
-# define DEBUG_L(a)
# define DEBUG_H(a)
# define DEBUG_X(a)
+# define DEBUG_Xv(a)
# define DEBUG_D(a)
# define DEBUG_S(a)
# define DEBUG_T(a)
# define DEBUG_R(a)
+# define DEBUG_v(a)
+# define DEBUG_C(a)
#endif /* DEBUGGING */
#define PERL_MAGIC_nkeys 'k' /* scalar(keys()) lvalue */
#define PERL_MAGIC_dbfile 'L' /* Debugger %_<filename */
#define PERL_MAGIC_dbline 'l' /* Debugger %_<filename element */
-#define PERL_MAGIC_mutex 'm' /* ??? */
+#define PERL_MAGIC_mutex 'm' /* for lock op */
+#define PERL_MAGIC_shared 'N' /* Shared between threads */
+#define PERL_MAGIC_shared_scalar 'n' /* Shared between threads */
#define PERL_MAGIC_collxfrm 'o' /* Locale transformation */
#define PERL_MAGIC_tied 'P' /* Tied array or hash */
#define PERL_MAGIC_tiedelem 'p' /* Tied array or hash element */
#define PERL_MAGIC_sigelem 's' /* %SIG hash element */
#define PERL_MAGIC_taint 't' /* Taintedness */
#define PERL_MAGIC_uvar 'U' /* Available for use by extensions */
+#define PERL_MAGIC_uvar_elem 'u' /* Reserved for use by extensions */
#define PERL_MAGIC_vec 'v' /* vec() lvalue */
+#define PERL_MAGIC_vstring 'V' /* SV was vstring literal */
#define PERL_MAGIC_substr 'x' /* substr() lvalue */
#define PERL_MAGIC_defelem 'y' /* Shadow "foreach" iterator variable /
smart parameter vivification */
#define PERL_MAGIC_glob '*' /* GV (typeglob) */
#define PERL_MAGIC_arylen '#' /* Array length ($#ary) */
#define PERL_MAGIC_pos '.' /* pos() lvalue */
-#define PERL_MAGIC_backref '<' /* ??? */
+#define PERL_MAGIC_backref '<' /* for weak ref data */
#define PERL_MAGIC_ext '~' /* Available for use by extensions */
#define YYMAXDEPTH 300
#ifndef assert /* <assert.h> might have been included somehow */
+#ifdef DEBUGGING
+#define assert(what) DEB( { \
+ if (!(what)) { \
+ Perl_croak(aTHX_ "Assertion " STRINGIFY(what) " failed: file \"%s\", line %d", \
+ __FILE__, __LINE__); \
+ PerlProc_exit(1); \
+ }})
+#else
#define assert(what) DEB( { \
if (!(what)) { \
Perl_croak(aTHX_ "Assertion failed: file \"%s\", line %d", \
PerlProc_exit(1); \
}})
#endif
+#endif
struct ufuncs {
I32 (*uf_val)(pTHX_ IV, SV*);
char *crypt (); /* Maybe more hosts will need the unprototyped version */
# else
# if !defined(WIN32) && !defined(VMS)
+#ifndef crypt
char *crypt (const char*, const char*);
+#endif
# endif /* !WIN32 */
# endif /* !NeXT && !__NeXT__ */
# ifndef DONT_DECLARE_STD
# endif
# endif
# endif /* !DONT_DECLARE_STD */
+#ifndef getlogin
char *getlogin (void);
+#endif
#endif /* !__cplusplus */
#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
# ifndef register
# define register
# endif
-# define PAD_SV(po) pad_sv(po)
# define RUNOPS_DEFAULT Perl_runops_debug
#else
-# define PAD_SV(po) PL_curpad[po]
# define RUNOPS_DEFAULT Perl_runops_standard
#endif
typedef int (CPERLscope(*runops_proc_t)) (pTHX);
+typedef void (CPERLscope(*share_proc_t)) (pTHX_ SV *sv);
+typedef int (CPERLscope(*thrhook_proc_t)) (pTHX);
typedef OP* (CPERLscope(*PPADDR_t)[]) (pTHX);
/* _ (for $_) must be first in the following list (DEFSV requires it) */
XBLOCK,
XATTRBLOCK,
XATTRTERM,
- XTERMBLOCK
+ XTERMBLOCK,
+ XTERMORDORDOR /* evil hack */
} expectation;
enum { /* pass one of these to get_vtbl */
};
#define PERL_DEBUG_PAD(i) &(PL_debug_pad.pad[i])
-#define PERL_DEBUG_PAD_ZERO(i) (sv_setpvn(PERL_DEBUG_PAD(i), "", 0), PERL_DEBUG_PAD(i))
+#define PERL_DEBUG_PAD_ZERO(i) (SvPVX(PERL_DEBUG_PAD(i))[0] = 0, SvCUR(PERL_DEBUG_PAD(i)) = 0, PERL_DEBUG_PAD(i))
/* Enable variables which are pointers to functions */
typedef void (CPERLscope(*peep_t))(pTHX_ OP* o);
#ifdef DOINIT
-EXT MGVTBL PL_vtbl_sv = {MEMBER_TO_FPTR(Perl_magic_get),
+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};
0, MEMBER_TO_FPTR(Perl_magic_clearsig),
0};
#endif
-EXT MGVTBL PL_vtbl_pack = {0, 0, MEMBER_TO_FPTR(Perl_magic_sizepack), MEMBER_TO_FPTR(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 = {MEMBER_TO_FPTR(Perl_magic_getpack),
- MEMBER_TO_FPTR(Perl_magic_setpack),
+ MEMBER_TO_FPTR(Perl_magic_setpack),
0, MEMBER_TO_FPTR(Perl_magic_clearpack),
0};
EXT MGVTBL PL_vtbl_dbline = {0, MEMBER_TO_FPTR(Perl_magic_setdbline),
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 = {MEMBER_TO_FPTR(Perl_magic_gettaint),MEMBER_TO_FPTR(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 = {MEMBER_TO_FPTR(Perl_magic_getsubstr), MEMBER_TO_FPTR(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 = {MEMBER_TO_FPTR(Perl_magic_getvec),
- MEMBER_TO_FPTR(Perl_magic_setvec),
+ MEMBER_TO_FPTR(Perl_magic_setvec),
0, 0, 0};
EXT MGVTBL PL_vtbl_pos = {MEMBER_TO_FPTR(Perl_magic_getpos),
MEMBER_TO_FPTR(Perl_magic_setpos),
MEMBER_TO_FPTR(Perl_magic_setuvar),
0, 0, 0};
#ifdef USE_5005THREADS
-EXT MGVTBL PL_vtbl_mutex = {0, 0, 0, 0, MEMBER_TO_FPTR(Perl_magic_mutexfree)};
+EXT MGVTBL PL_vtbl_mutex = {0, 0, 0, 0,
+ MEMBER_TO_FPTR(Perl_magic_mutexfree)};
#endif /* USE_5005THREADS */
-EXT MGVTBL PL_vtbl_defelem = {MEMBER_TO_FPTR(Perl_magic_getdefelem),MEMBER_TO_FPTR(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, MEMBER_TO_FPTR(Perl_magic_freeregexp)};
END_EXTERN_C
struct am_table {
- long was_ok_sub;
+ U32 was_ok_sub;
long was_ok_am;
U32 flags;
CV* table[NofAMmeth];
long fallback;
};
struct am_table_short {
- long was_ok_sub;
+ U32 was_ok_sub;
long was_ok_am;
U32 flags;
};
#define STORE_NUMERIC_STANDARD_SET_LOCAL() /**/
#define RESTORE_NUMERIC_LOCAL() /**/
#define RESTORE_NUMERIC_STANDARD() /**/
-#define Atof Perl_atof
+#define Atof my_atof
#define IN_LOCALE_RUNTIME 0
#endif /* !USE_LOCALE_NUMERIC */
# ifdef __hpux
# define strtoll __strtoll /* secret handshake */
# endif
+# ifdef WIN64
+# define strtoll _strtoi64 /* secret handshake */
+# endif
# if !defined(Strtol) && defined(HAS_STRTOLL)
# define Strtol strtoll
# endif
* (as is done for Atoul(), see below) but for backward compatibility
* we just assume atol(). */
# if defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG && defined(HAS_ATOLL)
+# ifdef WIN64
+# define atoll _atoi64 /* secret handshake */
+# endif
# define Atol atoll
# else
# define Atol atol
# ifdef __hpux
# define strtoull __strtoull /* secret handshake */
# endif
+# ifdef WIN64
+# define strtoull _strtoui64 /* secret handshake */
+# endif
# if !defined(Strtoul) && defined(HAS_STRTOULL)
# define Strtoul strtoull
# endif
# define Atoul(s) Strtoul(s, (char **)NULL, 10)
#endif
-#if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
+#if !defined(PERLIO_IS_STDIO)
/*
- * Now we have __attribute__ out of the way
* Remap printf
*/
#undef printf
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && !defined(PERL_GCC_PEDANTIC)
#define printf(fmt,args...) PerlIO_stdoutf(fmt,##args)
#else
#define printf PerlIO_stdoutf
* Boilerplate macros for initializing and accessing interpreter-local
* data from C. All statics in extensions should be reworked to use
* this, if you want to make the extension thread-safe. See ext/re/re.xs
- * for an example of the use of these macros.
+ * for an example of the use of these macros, and perlxs.pod for more.
*
* Code that uses these macros is responsible for the following:
- * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 1. #define MY_CXT_KEY to a unique string, e.g.
+ * "DynaLoader::_guts" XS_VERSION
* 2. Declare a typedef named my_cxt_t that is a structure that contains
* all the data that needs to be interpreter-local.
* 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
# define O_TEXT 0
#endif
+#if O_TEXT != O_BINARY
+ /* If you have different O_TEXT and O_BINARY and you are a CLRF shop,
+ * that is, you are somehow DOSish. */
+# if defined(__BEOS__) || defined(__VOS__)
+ /* BeOS has O_TEXT != O_BINARY but O_TEXT and O_BINARY have no effect;
+ * BeOS is always UNIXoid (LF), not DOSish (CRLF). */
+ /* VOS has O_TEXT != O_BINARY, and they have effect,
+ * but VOS always uses LF, never CRLF. */
+ /* If you have O_TEXT different from your O_BINARY but you still are
+ * not a CRLF shop. */
+# undef PERLIO_USING_CRLF
+# else
+ /* If you really are DOSish. */
+# define PERLIO_USING_CRLF 1
+# endif
+#endif
+
#ifdef IAMSUID
#ifdef I_SYS_STATVFS
NVff
NVgf
- HAS_USLEEP
HAS_UALARM
+ HAS_USLEEP
+ HAS_NANOSLEEP
HAS_SETITIMER
HAS_GETITIMER
HAS_STRUCT_CMSGHDR
HAS_NL_LANGINFO
-
+
HAS_DIRFD
so that Configure picks them up. */