#ifndef H_PERL
#define H_PERL 1
-/*#define PERL_IMPLICIT_CONTEXT*/
-
#ifdef PERL_FOR_X2P
/*
* This file is being used for x2p stuff.
#define VOIDUSED 1
#include "config.h"
+/* See L<perlguts/"The Perl API"> for detailed notes on
+ * PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
+
/* XXXXXX testing threads via implicit pointer */
#ifdef USE_THREADS
-#define PERL_IMPLICIT_CONTEXT
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+# ifndef PERL_IMPLICIT_SYS
+/*# define PERL_IMPLICIT_SYS*/ /* XXX not done yet */
+# endif
+#endif
+
+/* XXXXXX testing multiplicity via implicit pointer */
+#if defined(MULTIPLICITY)
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+# ifndef PERL_IMPLICIT_SYS
+/*# define PERL_IMPLICIT_SYS*/ /* XXX not done yet */
+# endif
+#endif
+
+#ifdef PERL_CAPI
+# undef PERL_OBJECT
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+# ifndef PERL_IMPLICIT_SYS
+# define PERL_IMPLICIT_SYS
+# endif
+#endif
+
+#ifdef PERL_OBJECT
+# ifndef PERL_IMPLICIT_CONTEXT
+# define PERL_IMPLICIT_CONTEXT
+# endif
+# ifndef PERL_IMPLICIT_SYS
+# define PERL_IMPLICIT_SYS
+# endif
#endif
#ifdef PERL_OBJECT
class CPerlObj;
#define STATIC
-#define CPERLscope(x) CPerlObj::x
-#define CALL_FPTR(fptr) (this->*fptr)
-
-#define pTHXo CPerlObj *pPerl
-#define pTHXo_ pTHXo,
-#define _pTHXo ,pTHXo
-#define aTHXo this
-#define aTHXo_ this,
-#define _aTHXo ,this
+#define CPERLscope(x) CPerlObj::x
+#define CALL_FPTR(fptr) (this->*fptr)
+
+#define pTHXo CPerlObj *pPerl
+#define pTHXo_ pTHXo,
+#define _pTHXo ,pTHXo
+#define aTHXo this
+#define aTHXo_ this,
+#define _aTHXo ,this
#define PERL_OBJECT_THIS aTHXo
#define PERL_OBJECT_THIS_ aTHXo_
#define _PERL_OBJECT_THIS _aTHXo
+#define dTHXoa(a) pTHXo = (CPerlObj *)a
+#define dTHXo dTHXoa(PERL_GET_INTERP)
#define pTHXx void
#define pTHXx_
#else /* !PERL_OBJECT */
+#ifdef PERL_IMPLICIT_CONTEXT
+# ifdef USE_THREADS
+struct perl_thread;
+# define pTHX register struct perl_thread *thr
+# define aTHX thr
+# define dTHXa(a) pTHX = (struct perl_thread *)a
+# define dTHX dTHXa(THR)
+# define dTHR dNOOP
+# else
+# ifndef MULTIPLICITY
+# define MULTIPLICITY
+# endif
+# define pTHX register PerlInterpreter *my_perl
+# define aTHX my_perl
+# define dTHXa(a) pTHX = (PerlInterpreter *)a
+# define dTHX dTHXa(PERL_GET_INTERP)
+# endif
+# define pTHX_ pTHX,
+# define _pTHX ,pTHX
+# define aTHX_ aTHX,
+# define _aTHX ,aTHX
+#endif
+
#define STATIC static
#define CPERLscope(x) x
#define CPERLarg void
#define NOOP (void)0
#define dNOOP extern int Perl___notused
-#ifdef PERL_IMPLICIT_CONTEXT
-# ifdef USE_THREADS
-struct perl_thread;
-# define pTHX register struct perl_thread *thr
-# define aTHX thr
-# define dTHXa(a) pTHX = (struct perl_thread *)a
-# define dTHX dTHXa(SvPVX(PL_thrsv))
-# define dTHR dNOOP
-# else
-# define MULTIPLICITY
-# define pTHX register PerlInterpreter *my_perl
-# define aTHX my_perl
-# define dTHXa(a) pTHX = (PerlInterpreter *)a
-# define dTHX dTHXa(PL_curinterp)
-# endif
-# define pTHX_ pTHX,
-# define _pTHX ,pTHX
-# define aTHX_ aTHX,
-# define _aTHX ,aTHX
-#endif
-
#ifndef pTHX
# define pTHX void
# define pTHX_
# define aTHXo aTHX
# define aTHXo_ aTHX_
# define _aTHXo _aTHX
+# define dTHXo dTHX
#endif
#ifndef pTHXx
# define aTHXx my_perl
# define aTHXx_ aTHXx,
# define _aTHXx ,aTHXx
+# define dTHXx dTHX
#endif
#undef START_EXTERN_C
# define STANDARD_C 1
#endif
-#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX) || defined( EPOC)
+#if defined(__cplusplus) || defined(WIN32) || defined(__sgi) || defined(OS2) || defined(__DGUX) || defined( EPOC) || defined(__QNX__)
# define DONT_DECLARE_STD 1
#endif
#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
+# include <strings.h>
+#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. */
#ifdef MYMALLOC
# ifdef PERL_POLLUTE_MALLOC
+# ifndef PERL_EXTMALLOC_DEF
# define Perl_malloc malloc
# define Perl_calloc calloc
# define Perl_realloc realloc
# define Perl_mfree free
+# endif
# else
# define EMBEDMYMALLOC /* for compatibility */
# endif
# define safefree safesysfree
#endif /* MYMALLOC */
-#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
-# include <strings.h>
-#endif
-
#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
#define strchr index
#define strrchr rindex
# define UV_MAX PERL_UQUAD_MAX
# define UV_MIN PERL_UQUAD_MIN
# endif
+# define IVSIZE 8
+# define UVSIZE 8
+# define IV_IS_QUAD
+# define UV_IS_QUAD
#else
typedef long IV;
typedef unsigned long UV;
# define UV_MAX PERL_ULONG_MAX
# define UV_MIN PERL_ULONG_MIN
# endif
+# if LONGSIZE == 8
+# define IV_IS_QUAD
+# define UV_IS_QUAD
+# else
+# undef IV_IS_QUAD
+# undef UV_IS_QUAD
+# endif
+# define UVSIZE LONGSIZE
+# define IVSIZE LONGSIZE
#endif
+#define IV_DIG (BIT_DIGITS(IVSIZE * 8) + 1)
+#define UV_DIG (BIT_DIGITS(IVSIZE * 8) + 1)
#ifdef USE_LONG_DOUBLE
# if defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE)
# define LDoub_t long double
+# else
+# undef USE_LONG_DOUBLE /* Ouch! */
# endif
#endif
+#ifdef OVR_DBL_DIG
+/* Use an overridden DBL_DIG */
+# ifdef DBL_DIG
+# undef DBL_DIG
+# 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)
+*/
+#ifdef I_LIMITS
+#include <limits.h>
+#endif
+#ifdef I_FLOAT
+#include <float.h>
+#endif
+#ifndef HAS_DBL_DIG
+#define DBL_DIG 15 /* A guess that works lots of places */
+#endif
+#endif
+
+#ifdef OVR_LDBL_DIG
+/* Use an overridden LDBL_DIG */
+# ifdef LDBL_DIG
+# undef LDBL_DIG
+# endif
+# define LDBL_DIG OVR_LDBL_DIG
+#else
+/* The following is all to get LDBL_DIG, in order to pick a nice
+ 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
+#endif
+
#ifdef USE_LONG_DOUBLE
# define HAS_LDOUB
typedef LDoub_t NV;
+# define NVSIZE LONG_DOUBLESIZE
+# define NV_DIG LDBL_DIG
# define Perl_modf modfl
# define Perl_frexp frexpl
# define Perl_cos cosl
# define Perl_atan2 atan2l
# define Perl_pow powl
# define Perl_floor floorl
-# define Perl_atof atof
# define Perl_fmod fmodl
#else
typedef double NV;
+# define NVSIZE DOUBLESIZE
+# define NV_DIG DBL_DIG
# define Perl_modf modf
# define Perl_frexp frexp
# define Perl_cos cos
# define Perl_atan2 atan2
# define Perl_pow pow
# define Perl_floor floor
-# define Perl_atof atof /* At some point there may be an atolf */
# define Perl_fmod fmod
#endif
+#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && defined(HAS_ATOLF)
+# define Perl_atof atolf
+#else
+# define Perl_atof atof
+#endif
+
/* 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.
typedef struct binop BINOP;
typedef struct listop LISTOP;
typedef struct logop LOGOP;
-typedef struct condop CONDOP;
typedef struct pmop PMOP;
typedef struct svop SVOP;
typedef struct gvop GVOP;
#include "handy.h"
-/* Some day when we have more 64-bit experience under our belts we may
- * be able to merge some of the USE_64_BIT_{FILES,OFFSETS,STDIO,DBM}. At
- * the moment (Oct 1998), though, keep them separate. --jhi
- */
#ifdef USE_64_BITS
-# ifdef USE_64_BIT_FILES
-# ifndef USE_64_BIT_OFFSETS
-# define USE_64_BIT_OFFSETS
-# endif
-# ifndef USE_64_BIT_STDIO
-# define USE_64_BIT_STDIO
-# endif
-# ifndef USE_64_BIT_DBM
-# define USE_64_BIT_DBM
-# endif
+# define USE_64_BIT_FILES
+#endif
+
+#if defined(USE_64_BIT_FILES) || defined(USE_LARGE_FILES)
+# define USE_64_BIT_OFFSETS
+# define USE_64_BIT_STDIO
+#endif
+
+/* I couldn't find any -Ddefine or -flags in IRIX 6.5 that would
+ * have done the necessary symbol renaming using cpp. --jhi */
+#ifdef __sgi
+#define USE_FOPEN64
+#define USE_FSEEK64
+#define USE_FTELL64
+#define USE_FSETPOS64
+#define USE_FGETPOS64
+#define USE_TMPFILE64
+#define USE_FREOPEN64
+#endif
+
+#ifdef USE_64_BIT_OFFSETS
+# ifdef HAS_OFF64_T
+# undef Off_t
+# define Off_t off64_t
+# undef LSEEKSIZE
+# define LSEEKSIZE 8
# endif
-/* Mention LSEEKSIZE here to get it included in %Config. */
-# ifdef USE_64_BIT_OFFSETS
-# ifdef HAS_FSTAT64
-# define fstat fstat64
-# endif
-# ifdef HAS_FTRUNCATE64
-# define ftruncate ftruncate64
-# endif
-# ifdef HAS_LSEEK64
-# define lseek lseek64
-# ifdef HAS_OFF64_T
-# undef Off_t
-# define Off_t off64_t
-# endif
-# endif
-# ifdef HAS_LSTAT64
-# define lstat lstat64
-# endif
- /* Some systems have open64() in libc but use that only
- * for true LP64 mode, in mixed mode (ILP32LL64, for example)
- * they use the vanilla open(). Such systems should undefine
- * d_open64 in their hints files. --jhi */
-# if defined(HAS_OPEN64)
-# define open open64
-# endif
-# ifdef HAS_OPENDIR64
-# define opendir opendir64
-# endif
-# ifdef HAS_READDIR64
-# define readdir readdir64
-# ifdef HAS_STRUCT_DIRENT64
-# define dirent dirent64
-# endif
-# endif
-# ifdef HAS_SEEKDIR64
-# define seekdir seekdir64
-# endif
-# ifdef HAS_STAT64
-# define stat stat64 /* Affects also struct stat, hopefully okay. */
-# endif
-# ifdef HAS_TELLDIR64
-# define telldir telldir64
-# endif
-# ifdef HAS_TRUNCATE64
-# define truncate truncate64
-# endif
- /* flock is not #defined here to be flock64 because it seems
- that a system may have struct flock64 but still use flock()
- and not flock64(). The actual flocking code in pp_sys.c
- must be changed. Also lockf and lockf64 must be dealt
- with in pp_sys.c. --jhi */
-# endif
-# ifdef USE_64_BIT_STDIO
-# ifdef HAS_FGETPOS64
-# define fgetpos fgetpos64
-# endif
-# ifdef HAS_FOPEN64
-# define fopen fopen64
-# endif
-# ifdef HAS_FREOPEN64
-# define freopen freopen64
-# endif
-# ifdef HAS_FSEEK64
-# define fseek fseek64
-# endif
-# ifdef HAS_FSEEKO64
-# define fseeko fseeko64
-# endif
-# ifdef HAS_FSETPOS64
-# define fsetpos fsetpos64
-# endif
-# ifdef HAS_FTELL64
-# define ftell ftell64
-# endif
-# ifdef HAS_FTELLO64
-# define ftello ftello64
-# endif
-# ifdef HAS_TMPFILE64
-# define tmpfile tmpfile64
-# endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below. Some 64-bit environments,
+ * however, do not. */
+# if defined(USE_OPEN64)
+# define open open64
# endif
-# ifdef USE_64_BIT_DBM
-# ifdef HAS_DBMINIT64
-# define dbminit dbminit64
-# endif
-# ifdef HAS_DBMCLOSE64
-# define dbmclose dbmclose64
-# endif
-# ifdef HAS_FETCH64
-# define fetch fetch64
-# endif
-# ifdef HAS_DELETE64
-# define delete delete64
-# endif
-# ifdef HAS_STORE64
-# define store store64
-# endif
-# ifdef HAS_FIRSTKEY64
-# define firstkey firstkey64
-# endif
-# ifdef HAS_NEXTKEY64
-# define nextkey nextkey64
-# endif
+# if defined(USE_LSEEK64)
+# define lseek lseek64
+# endif
+# if defined(USE_LLSEEK)
+# define lseek llseek
+# endif
+# if defined(USE_STAT64)
+# define stat stat64
+# endif
+# if defined(USE_FSTAT64)
+# define fstat fstat64
+# endif
+# if defined(USE_LSTAT64)
+# define lstat lstat64
+# endif
+# if defined(USE_FLOCK64)
+# define flock flock64
+# endif
+# if defined(USE_LOCKF64)
+# define lockf lockf64
+# endif
+# if defined(USE_FCNTL64)
+# define fcntl fcntl64
+# endif
+# if defined(USE_TRUNCATE64)
+# define truncate truncate64
+# endif
+# if defined(USE_FTRUNCATE64)
+# define ftruncate ftruncate64
+# endif
+#endif
+
+#ifdef USE_64_BIT_STDIO
+# ifdef HAS_FPOS64_T
+# undef Fpos_t
+# define Fpos_t fpos64_t
+# endif
+/* Most 64-bit environments have defines like _LARGEFILE_SOURCE that
+ * will trigger defines like the ones below. Some 64-bit environments,
+ * however, do not. */
+# if defined(USE_FOPEN64)
+# define fopen fopen64
+# endif
+# if defined(USE_FSEEK64)
+# define fseek fseek64
+# endif
+# if defined(USE_FTELL64)
+# define ftell ftell64
+# endif
+# if defined(USE_FSETPOS64)
+# define fsetpos fsetpos64
+# endif
+# if defined(USE_FGETPOS64)
+# define fgetpos fgetpos64
+# endif
+# if defined(USE_TMPFILE64)
+# define tmpfile tmpfile64
+# endif
+# if defined(USE_FREOPEN64)
+# define freopen freopen64
# endif
#endif
+#if defined(OS2)
+# include "iperlsys.h"
+#endif
+
#if defined(__OPEN_VM)
# include "vmesa/vmesaish.h"
#endif
# endif
#endif
-#ifndef FUNC_NAME_TO_PTR
-#define FUNC_NAME_TO_PTR(name) name
-#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>
# endif /* WIN32 */
# endif /* FAKE_THREADS */
#endif /* USE_THREADS */
-
+
+#ifdef WIN32
+#include "win32.h"
+#endif
+
#ifdef VMS
# define STATUS_NATIVE PL_statusvalue_vms
# define STATUS_NATIVE_EXPORT \
# define STATUS_ALL_FAILURE (PL_statusvalue = 1)
#endif
+#ifndef MEMBER_TO_FPTR
+#define MEMBER_TO_FPTR(name) name
+#endif
+
/* 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.
# ifdef FFLUSH_ALL
# define PERL_FLUSHALL_FOR_CHILD my_fflush_all()
# else
-# define PERL_FLUSHALL_FOR_CHILD (void)0
+# define PERL_FLUSHALL_FOR_CHILD NOOP
# endif
# endif
#endif
+#ifndef PERL_SET_INTERP
+# define PERL_SET_INTERP(i) (PL_curinterp = (PerlInterpreter*)(i))
+#endif
+
+#ifndef PERL_GET_INTERP
+# define PERL_GET_INTERP (PL_curinterp)
+#endif
+
/* Some unistd.h's give a prototype for pause() even though
HAS_PAUSE ends up undefined. This causes the #define
below to be rejected by the compmiler. Sigh.
# endif
#endif
-#if defined(CYGWIN32)
+#if defined(CYGWIN)
/* USEMYBINMODE
* This symbol, if defined, indicates that the program should
* use the routine my_binmode(FILE *fp, char iotype) to insure
*/
# define USEMYBINMODE / **/
# define my_binmode(fp, iotype) \
- (PerlLIO_setmode(PerlIO_fileno(fp), O_BINARY) != -1 ? TRUE : NULL)
+ (PerlLIO_setmode(PerlIO_fileno(fp), O_BINARY) != -1 ? TRUE : FALSE)
#endif
#ifdef UNION_ANY_DEFINITION
I32 any_i32;
IV any_iv;
long any_long;
- void (CPERLscope(*any_dptr)) (pTHX_ void*);
+ void (*any_dptr) (pTHXo_ void*);
};
#endif
#define ARGSproto
#endif /* USE_THREADS */
-#if defined(CYGWIN32)
-/* USEMYBINMODE
- * This symbol, if defined, indicates that the program should
- * use the routine my_binmode(FILE *fp, char iotype) to insure
- * that a file is in "binary" mode -- that is, that no translation
- * of bytes occurs on read or write operations.
- */
-#define USEMYBINMODE / **/
-#define my_binmode(fp, iotype) \
- (PerlLIO_setmode(PerlIO_fileno(fp), O_BINARY) != -1 ? TRUE : FALSE)
-#endif
-
typedef I32 (*filter_t) (pTHXo_ int, SV *, int);
#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_rsfp_filters))
-#ifdef WIN32
-#include "win32.h"
+#if !defined(OS2)
+# include "iperlsys.h"
#endif
-
-#include "iperlsys.h"
#include "regexp.h"
#include "sv.h"
#include "util.h"
#include "form.h"
#include "gv.h"
#include "cv.h"
+#include "opnames.h"
#include "op.h"
#include "cop.h"
#include "av.h"
typedef struct magic_state MGS; /* struct magic_state defined in mg.c */
-/* Length of a variant. */
-
-typedef struct {
- I32 len_min;
- I32 len_delta;
- I32 pos_min;
- I32 pos_delta;
- SV *last_found;
- I32 last_end; /* min value, <0 unless valid. */
- I32 last_start_min;
- I32 last_start_max;
- SV **longest; /* Either &l_fixed, or &l_float. */
- SV *longest_fixed;
- I32 offset_fixed;
- SV *longest_float;
- I32 offset_float_min;
- I32 offset_float_max;
- I32 flags;
-} scan_data_t;
+struct scan_data_t; /* Used in S_* functions in regcomp.c */
typedef I32 CHECKPOINT;
#define U_V(what) (cast_uv((NV)(what)))
#endif
+/* These do not care about the fractional part, only about the range. */
+#define NV_WITHIN_IV(nv) (I_V(nv) >= IV_MIN && I_V(nv) <= IV_MAX)
+#define NV_WITHIN_UV(nv) ((nv)>=0.0 && U_V(nv) >= UV_MIN && U_V(nv) <= UV_MAX)
+
+/* Believe. */
+#define IV_FITS_IN_NV
+/* Doubt. */
+#if defined(USE_LONG_DOUBLE) && \
+ defined(LDBL_MANT_DIG) && IVSIZE*8 >= LDBL_MANT_DIG
+# undef IV_FITS_IN_NV
+#else
+# if defined(DBL_MANT_DIG) && IVSIZE*8 >= DBL_MANT_DIG
+# undef IV_FITS_IN_NV
+# else
+# if IV_DIG >= NV_DIG
+# undef IV_FITS_IN_NV
+# else
+# if IVSIZE >= NVSIZE
+# undef IV_FITS_IN_NV
+# endif
+# endif
+# endif
+#endif
+
/* Used with UV/IV arguments: */
/* XXXX: need to speed it up */
#define CLUMP_2UV(iv) ((iv) < 0 ? 0 : (UV)(iv))
# if defined(PERL_OBJECT)
# define DEBUG_m(a) if (PL_debug & 128) a
# else
-# define DEBUG_m(a) if (PL_curinterp && PL_debug & 128) a
+# define DEBUG_m(a) if (PERL_GET_INTERP && PL_debug & 128) a
# endif
#define DEBUG_f(a) if (PL_debug & 256) a
#define DEBUG_r(a) if (PL_debug & 512) a
/* Various states of an input record separator SV (rs, nrs) */
#define RsSNARF(sv) (! SvOK(sv))
-#define RsSIMPLE(sv) (SvOK(sv) && SvCUR(sv))
-#define RsPARA(sv) (SvOK(sv) && ! SvCUR(sv))
+#define RsSIMPLE(sv) (SvOK(sv) && (! SvPOK(sv) || SvCUR(sv)))
+#define RsPARA(sv) (SvPOK(sv) && ! SvCUR(sv))
#define RsRECORD(sv) (SvROK(sv) && (SvIV(SvRV(sv)) > 0))
/* Enable variables which are pointers to functions */
typedef SV* (CPERLscope(*re_intuit_string_t)) (pTHX_ regexp *prog);
typedef void (CPERLscope(*regfree_t)) (pTHX_ struct regexp* r);
+#ifdef USE_PURE_BISON
+int Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp);
+#endif
+
+typedef void (*DESTRUCTORFUNC_t) (pTHXo_ void*);
+typedef void (*SVFUNC_t) (pTHXo_ SV*);
+typedef I32 (*SVCOMPARE_t) (pTHXo_ SV*, SV*);
+typedef void (*XSINIT_t) (pTHXo);
+typedef void (*ATEXIT_t) (pTHXo_ void*);
+typedef void (*XSUBADDR_t) (pTHXo_ CV *);
/* Set up PERLVAR macros for populating structs */
#define PERLVAR(var,type) type var;
+#define PERLVARA(var,n,type) type var[n];
#define PERLVARI(var,type,init) type var;
#define PERLVARIC(var,type,init) type var;
CPerlObj(IPerlMem*, IPerlEnv*, IPerlStdIO*, IPerlLIO*, IPerlDir*, IPerlSock*, IPerlProc*);
void Init(void);
void* operator new(size_t nSize, IPerlMem *pvtbl);
+ static void operator delete(void* pPerl, IPerlMem *pvtbl);
#endif /* PERL_OBJECT */
#ifdef PERL_GLOBAL_STRUCT
EXT struct perl_vars PL_Vars;
EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
#else /* PERL_CORE */
-#if !defined(__GNUC__) || !(defined(WIN32) || defined(CYGWIN32))
+#if !defined(__GNUC__) || !(defined(WIN32) || defined(CYGWIN))
EXT
#endif /* WIN32 */
struct perl_vars *PL_VarsPtr;
/* Done with PERLVAR macros for now ... */
#undef PERLVAR
+#undef PERLVARA
#undef PERLVARI
#undef PERLVARIC
# endif
#endif
-#ifdef USE_PURE_BISON
-int Perl_yylex(pTHX_ YYSTYPE *lvalp, int *lcharp);
-#endif
-
-typedef void (CPERLscope(*DESTRUCTORFUNC_t)) (pTHX_ void*);
-typedef void (CPERLscope(*SVFUNC_t)) (pTHX_ SV*);
-typedef I32 (CPERLscope(*SVCOMPARE_t)) (pTHX_ SV*, SV*);
-typedef void (*XSINIT_t) (pTHXo);
-typedef void (*ATEXIT_t) (pTHXo_ void*);
-typedef void (*XSUBADDR_t) (pTHXo_ CV *);
-
#ifdef PERL_OBJECT
#define PERL_DECL_PROT
#define perl_alloc Perl_alloc
#include "pp_proto.h"
#ifdef PERL_OBJECT
-VIRTUAL int CPerlObj::fprintf (PerlIO *pf, const char *pat, ...);
VIRTUAL int CPerlObj::do_aspawn (void *vreally, void **vmark, void **vsp);
#undef PERL_DECL_PROT
#else
*/
#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);
#define PERLVARIC(var,type,init) EXTCONST type PL_##var INIT(init);
-#ifndef PERL_GLOBAL_STRUCT
-# ifndef PERL_OBJECT
-START_EXTERN_C
-# endif
-
-# include "perlvars.h"
-
-# ifndef PERL_OBJECT
-END_EXTERN_C
-# endif
-#endif
-
#ifndef MULTIPLICITY
# include "intrpvar.h"
* be defined to maintain binary compatibility with PERL_OBJECT
* for 5.005
*/
-PERLVAR(object_compatibility[30], char)
+PERLVARA(object_compatibility,30, char)
};
+
# include "embed.h"
# if defined(WIN32) && !defined(WIN32IO_IS_STDIO)
# define errno CPerlObj::ErrorNo()
#endif /* PERL_OBJECT */
+#ifndef PERL_GLOBAL_STRUCT
+START_EXTERN_C
+
+# include "perlvars.h"
+
+END_EXTERN_C
+#endif
+
#undef PERLVAR
+#undef PERLVARA
#undef PERLVARI
#undef PERLVARIC
#endif /* !USE_LOCALE_NUMERIC */
+#if defined(USE_LONG_LONG) && defined(HAS_LONG_LONG) && defined(HAS_ATOLL)
+#define Atol atoll
+#else
+#define Atol atol
+#endif
+
+#if defined(USE_LONG_LONG) && defined(HAS_LONG_LONG) && defined(HAS_STRTOULL)
+#define Strtoul strtoull
+#else
+#define Strtoul strtoul
+#endif
+
#if !defined(PERLIO_IS_STDIO) && defined(HASATTRIBUTE)
/*
* Now we have __attribute__ out of the way