/* perl.h
*
- * Copyright (c) 1987-1997, 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.
#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
#endif /* PERL_FOR_X2P */
#define VOIDUSED 1
-#include "config.h"
+#ifdef PERL_MICRO
+# include "uconfig.h"
+#else
+# include "config.h"
+#endif
+
+#if defined(USE_ITHREADS) && defined(USE_5005THREADS)
+# include "error: USE_ITHREADS and USE_5005THREADS are incompatible"
+#endif
+
+/* XXX This next guard can disappear if the sources are revised
+ to use USE_5005THREADS throughout. -- A.D 1/6/2000
+*/
+#if defined(USE_ITHREADS) && defined(USE_THREADS)
+# include "error: USE_ITHREADS and USE_THREADS are incompatible"
+#endif
/* See L<perlguts/"The Perl API"> for detailed notes on
* PERL_IMPLICIT_CONTEXT and PERL_IMPLICIT_SYS */
+#ifdef USE_ITHREADS
+# if !defined(MULTIPLICITY) && !defined(PERL_OBJECT)
+# define MULTIPLICITY
+# endif
+#endif
+
#ifdef USE_THREADS
# ifndef PERL_IMPLICIT_CONTEXT
# define PERL_IMPLICIT_CONTEXT
#ifdef PERL_CAPI
# undef PERL_OBJECT
+# ifndef MULTIPLICITY
+# define MULTIPLICITY
+# endif
# ifndef PERL_IMPLICIT_CONTEXT
# define PERL_IMPLICIT_CONTEXT
# endif
#define aTHXo_ this,
#define PERL_OBJECT_THIS aTHXo
#define PERL_OBJECT_THIS_ aTHXo_
-#define dTHXoa(a) pTHXo = a
-#define dTHXo dTHXoa(PERL_GET_THX)
+#define dTHXoa(a) pTHXo = (CPerlObj*)a
+#define dTHXo pTHXo = PERL_GET_THX
#define pTHXx void
#define pTHXx_
struct perl_thread;
# define pTHX register struct perl_thread *thr
# define aTHX thr
-# define dTHR dNOOP
+# define dTHR dNOOP /* only backward compatibility */
+# define dTHXa(a) pTHX = (struct perl_thread*)a
# else
# ifndef MULTIPLICITY
# define MULTIPLICITY
# endif
# define pTHX register PerlInterpreter *my_perl
# define aTHX my_perl
+# define dTHXa(a) pTHX = (PerlInterpreter*)a
# endif
-# define dTHXa(a) pTHX = a
-# define dTHX dTHXa(PERL_GET_THX)
+# define dTHX pTHX = PERL_GET_THX
# define pTHX_ pTHX,
# define aTHX_ aTHX,
+# define pTHX_1 2
+# define pTHX_2 3
+# define pTHX_3 4
+# define pTHX_4 5
#endif
#define STATIC static
#define CALLREG_INTUIT_START CALL_FPTR(PL_regint_start)
#define CALLREG_INTUIT_STRING CALL_FPTR(PL_regint_string)
#define CALLREGFREE CALL_FPTR(PL_regfree)
-#define CALLPROTECT CALL_FPTR(PL_protect)
+
+#ifdef PERL_FLEXIBLE_EXCEPTIONS
+# define CALLPROTECT CALL_FPTR(PL_protect)
+#endif
#define NOOP (void)0
#define dNOOP extern int Perl___notused
# define aTHX_
# define dTHXa(a) dNOOP
# define dTHX dNOOP
+# define pTHX_1 1
+# define pTHX_2 2
+# define pTHX_3 3
+# define pTHX_4 4
#endif
#ifndef pTHXo
# define aTHXo aTHX
# define aTHXo_ aTHX_
# define dTHXo dTHX
+# define dTHXoa(x) dTHXa(x)
#endif
#ifndef pTHXx
# 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
#endif
#define WITH_THX(s) STMT_START { dTHX; s; } STMT_END
-#define WITH_THR(s) STMT_START { dTHR; s; } STMT_END
+#define WITH_THR(s) WITH_THX(s)
/*
* SOFT_CAST can be used for args to prototyped functions to retain some
#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.
# 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.
*/
/* HP-UX 10.X CMA (Common Multithreaded Architecure) insists that
pthread.h must be included before all other header files.
*/
-#if defined(USE_THREADS) && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD)
+#if (defined(USE_THREADS) || defined(USE_ITHREADS)) \
+ && defined(PTHREAD_H_FIRST) && defined(I_PTHREAD)
# include <pthread.h>
#endif
#undef METHOD
#endif
+#ifdef PERL_MICRO
+# define NO_LOCALE
+#endif
+
#ifdef I_LOCALE
# include <locale.h>
#endif
# include <sys/param.h>
#endif
-
/* Use all the "standard" definitions? */
#if defined(STANDARD_C) && defined(I_STDLIB)
# include <stdlib.h>
#endif
+/* If this causes problems, set i_unistd=undef in the hint file. */
+#ifdef I_UNISTD
+# include <unistd.h>
+#endif
+
+#ifdef PERL_MICRO /* Last chance to export Perl_my_swap */
+# define MYSWAP
+#endif
+
#if !defined(PERL_FOR_X2P) && !defined(WIN32)
# include "embed.h"
#endif
* that causes clashes with case-insensitive linkers */
Free_t Perl_mfree (Malloc_t where);
+typedef struct perl_mstats perl_mstats_t;
+
# define safemalloc Perl_malloc
# define safecalloc Perl_calloc
# define saferealloc Perl_realloc
# endif
# endif
#else
+# undef memset
# define memset(d,c,l) my_memset(d,c,l)
#endif /* HAS_MEMSET */
#endif
#include <errno.h>
-#ifdef HAS_SOCKET
-# ifdef I_NET_ERRNO
-# include <net/errno.h>
+
+#if defined(WIN32) && (defined(PERL_OBJECT) || defined(PERL_IMPLICIT_SYS) || defined(PERL_CAPI))
+# define WIN32SCK_IS_STDSCK /* don't pull in custom wsock layer */
+#endif
+
+/* In Tru64 use the 4.4BSD struct msghdr, not the 4.3 one */
+#if defined(__osf__) && defined(__alpha) && !defined(_SOCKADDR_LEN)
+# define _SOCKADDR_LEN
+#endif
+
+#if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
+# include <sys/socket.h>
+# if defined(USE_SOCKS) && defined(I_SOCKS)
+# if !defined(INCLUDE_PROTOTYPES)
+# define INCLUDE_PROTOTYPES /* for <socks.h> */
+# define PERL_SOCKS_NEED_PROTOTYPES
+# endif
+# ifdef USE_THREADS
+# define PERL_USE_THREADS /* store our value */
+# undef USE_THREADS
+# endif
+# include <socks.h>
+# ifdef USE_THREADS
+# undef USE_THREADS /* socks.h does this on its own */
+# endif
+# ifdef PERL_USE_THREADS
+# define USE_THREADS /* restore our value */
+# undef PERL_USE_THREADS
# endif
+# ifdef PERL_SOCKS_NEED_PROTOTYPES /* keep cpp space clean */
+# undef INCLUDE_PROTOTYPES
+# undef PERL_SOCKS_NEED_PROTOTYPES
+# endif
+# endif
+# ifdef I_NETDB
+# include <netdb.h>
+# endif
+# ifndef ENOTSOCK
+# ifdef I_NET_ERRNO
+# include <net/errno.h>
+# endif
+# endif
+#endif
+
+#ifdef SETERRNO
+# undef SETERRNO /* SOCKS might have defined this */
#endif
#ifdef VMS
# endif
#endif
+#ifdef PERL_MICRO
+# ifndef DIR
+# define DIR void
+# endif
+#endif
+
#ifdef FPUTS_BOTCH
/* work around botch in SunOS 4.0.1 and 4.0.2 */
# ifndef fputs
* in the face of half-implementations.)
*/
+#ifdef I_SYSMODE
+#include <sys/mode.h>
+#endif
+
#ifndef S_IFMT
# ifdef _S_IFMT
# define S_IFMT _S_IFMT
# define S_IWUSR 0200
# define S_IXUSR 0100
# endif
-# define S_IRGRP (S_IRUSR>>3)
-# define S_IWGRP (S_IWUSR>>3)
-# define S_IXGRP (S_IXUSR>>3)
-# define S_IROTH (S_IRUSR>>6)
-# define S_IWOTH (S_IWUSR>>6)
-# define S_IXOTH (S_IXUSR>>6)
+#endif
+
+#ifndef S_IRGRP
+# ifdef S_IRUSR
+# define S_IRGRP (S_IRUSR>>3)
+# define S_IWGRP (S_IWUSR>>3)
+# define S_IXGRP (S_IXUSR>>3)
+# else
+# define S_IRGRP 0040
+# define S_IWGRP 0020
+# define S_IXGRP 0010
+# endif
+#endif
+
+#ifndef S_IROTH
+# ifdef S_IRUSR
+# define S_IROTH (S_IRUSR>>6)
+# define S_IWOTH (S_IWUSR>>6)
+# define S_IXOTH (S_IXUSR>>6)
+# else
+# define S_IROTH 0040
+# define S_IWOTH 0020
+# define S_IXOTH 0010
+# endif
#endif
#ifndef S_ISUID
# define S_ISGID 02000
#endif
+#ifndef S_IRWXU
+# define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
+#endif
+
+#ifndef S_IRWXG
+# define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
+#endif
+
+#ifndef S_IRWXO
+# define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
+#endif
+
+#ifndef S_IREAD
+# define S_IREAD S_IRUSR
+#endif
+
+#ifndef S_IWRITE
+# define S_IWRITE S_IWUSR
+#endif
+
+#ifndef S_IEXEC
+# define S_IEXEC S_IXUSR
+#endif
+
#ifdef ff_next
# undef ff_next
#endif
typedef IVTYPE IV;
typedef UVTYPE UV;
-#if defined(USE_64_BITS) && defined(HAS_QUAD)
+#if defined(USE_64_BIT_INT) && defined(HAS_QUAD)
# if QUADKIND == QUAD_IS_INT64_T && defined(INT64_MAX)
# define IV_MAX INT64_MAX
# define IV_MIN INT64_MIN
#define IV_DIG (BIT_DIGITS(IVSIZE * 8))
#define UV_DIG (BIT_DIGITS(UVSIZE * 8))
-/*
+#ifndef NO_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:
# define PTRV UV
# define INT2PTR(any,d) (any)(d)
#else
-# if PTRSIZE == LONGSIZE
+# if PTRSIZE == LONGSIZE
# define PTRV unsigned long
# else
# define PTRV unsigned
#define PTR2IV(p) INT2PTR(IV,p)
#define PTR2UV(p) INT2PTR(UV,p)
#define PTR2NV(p) NUM2PTR(NV,p)
-
+#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
+# endif
# if !(defined(HAS_LONG_DOUBLE) && (LONG_DOUBLESIZE > DOUBLESIZE))
# undef USE_LONG_DOUBLE /* Ouch! */
# endif
typedef NVTYPE NV;
+#ifdef I_IEEEFP
+# include <ieeefp.h>
+#endif
+
#ifdef USE_LONG_DOUBLE
+# ifdef I_SUNMATH
+# include <sunmath.h>
+# endif
# define NV_DIG LDBL_DIG
+# ifdef LDBL_MANT_DIG
+# define NV_MANT_DIG LDBL_MANT_DIG
+# endif
+# ifdef LDBL_MAX
+# define NV_MAX LDBL_MAX
+# define NV_MIN LDBL_MIN
+# else
+# ifdef HUGE_VALL
+# define NV_MAX HUGE_VALL
+# else
+# ifdef HUGE_VAL
+# define NV_MAX ((NV)HUGE_VAL)
+# endif
+# endif
+# endif
# 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_floor floorl
# define Perl_fmod fmodl
# endif
+/* 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)
+# else
+# define Perl_modf(x,y) ((long double)modf((double)(x),(double*)(y)))
+# endif
+# ifdef HAS_FREXPL
+# define Perl_frexp(x,y) frexpl(x,y)
+# else
+# define Perl_frexp(x,y) ((long double)frexp((double)(x),y))
+# endif
+# ifdef HAS_ISNANL
+# define Perl_isnan(x) isnanl(x)
+# else
+# ifdef HAS_ISNAN
+# define Perl_isnan(x) isnan((double)(x))
+# else
+# define Perl_isnan(x) ((x)!=(x))
+# endif
+# endif
#else
# define NV_DIG DBL_DIG
-# define Perl_modf modf
-# define Perl_frexp frexp
+# ifdef DBL_MANT_DIG
+# define NV_MANT_DIG DBL_MANT_DIG
+# endif
+# ifdef DBL_MAX
+# define NV_MAX DBL_MAX
+# define NV_MIN DBL_MIN
+# else
+# ifdef HUGE_VAL
+# define NV_MAX HUGE_VAL
+# endif
+# endif
# define Perl_cos cos
# define Perl_sin sin
# define Perl_sqrt sqrt
# define Perl_pow pow
# define Perl_floor floor
# define Perl_fmod fmod
+# define Perl_modf(x,y) modf(x,y)
+# define Perl_frexp(x,y) frexp(x,y)
+# ifdef HAS_ISNAN
+# define Perl_isnan(x) isnan(x)
+# else
+# define Perl_isnan(x) ((x)!=(x))
+# endif
#endif
-#if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && defined(HAS_ATOLF)
-# define Perl_atof atolf
-#else
-# define Perl_atof atof
+#if !defined(Perl_atof) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+# if !defined(Perl_atof) && defined(HAS_STRTOLD)
+# define Perl_atof(s) (NV)strtold(s, (char**)NULL)
+# endif
+# if !defined(Perl_atof) && defined(HAS_ATOLF)
+# define Perl_atof (NV)atolf
+# endif
+# if !defined(Perl_atof) && defined(PERL_SCNfldbl)
+# define Perl_atof PERL_SCNfldbl
+# define Perl_atof2(s,f) sscanf((s), "%"PERL_SCNfldbl, &(f))
+# endif
+#endif
+#if !defined(Perl_atof)
+# define Perl_atof atof /* we assume atof being available anywhere */
+#endif
+#if !defined(Perl_atof2)
+# 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
# 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)
#ifdef UV_IS_QUAD
-# ifdef UQUAD_MAX
-# define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
-# else
# define PERL_UQUAD_MAX (~(UV)0)
-# endif
-
-# define PERL_UQUAD_MIN ((UV)0)
-
-# ifdef QUAD_MAX
-# define PERL_QUAD_MAX ((IV)QUAD_MAX)
-# else
+# define PERL_UQUAD_MIN ((UV)0)
# define PERL_QUAD_MAX ((IV) (PERL_UQUAD_MAX >> 1))
-# endif
-
-# ifdef QUAD_MIN
-# define PERL_QUAD_MIN ((IV)QUAD_MIN)
-# else
# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
-# endif
#endif
+struct perl_mstats {
+ UV *nfree;
+ UV *ntotal;
+ IV topbucket, topbucket_ev, topbucket_odd, totfree, total, total_chain;
+ IV total_sbrk, sbrks, sbrk_good, sbrk_slack, start_slack, sbrked_remains;
+ IV minbucket;
+ /* Level 1 info */
+ UV *bucket_mem_size;
+ UV *bucket_available_size;
+ UV nbuckets;
+};
+struct RExC_state_t;
+
typedef MEM_SIZE STRLEN;
typedef struct op OP;
typedef struct loop LOOP;
typedef struct interpreter PerlInterpreter;
-typedef struct sv SV;
+#ifdef UTS
+# define STRUCT_SV perl_sv /* Amdahl's <ksync.h> has struct sv */
+#else
+# define STRUCT_SV sv
+#endif
+typedef struct STRUCT_SV SV;
typedef struct av AV;
typedef struct hv HV;
typedef struct cv CV;
#include "handy.h"
-#ifndef NO_LARGE_FILES
-# define USE_LARGE_FILES /* If available. */
-#endif
-
#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_RAWIO)
-# define USE_64_BIT_RAWIO /* explicit */
# if LSEEKSIZE == 8 && !defined(USE_64_BIT_RAWIO)
# define USE_64_BIT_RAWIO /* implicit */
# endif
# define FSEEKSIZE LSEEKSIZE
# else
# define FSEEKSIZE LONGSIZE
-# endif
+# endif
#endif
#if defined(USE_LARGE_FILES) && !defined(NO_64_BIT_STDIO)
-# define USE_64_BIT_STDIO /* explicit */
# if FSEEKSIZE == 8 && !defined(USE_64_BIT_STDIO)
# define USE_64_BIT_STDIO /* implicit */
# endif
# 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
-#endif
+#endif
-#ifndef PERL_SYS_INIT3
-# define PERL_SYS_INIT3(argvp,argcp,envp) PERL_SYS_INIT(argvp,argcp)
+#ifndef NO_ENVIRON_ARRAY
+# 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
# 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
+#if defined(USE_THREADS) || defined(USE_ITHREADS)
+# if defined(USE_THREADS)
/* pending resolution of licensing issues, we avoid the erstwhile
* atomic.h everywhere */
# define EMULATE_ATOMIC_REFCOUNTS
-
+# endif
# ifdef FAKE_THREADS
# include "fakethr.h"
# else
# endif /* OS2 */
# endif /* WIN32 */
# endif /* FAKE_THREADS */
-#endif /* USE_THREADS */
+#endif /* USE_THREADS || USE_ITHREADS */
#ifdef WIN32
-#include "win32.h"
+# include "win32.h"
#endif
#ifdef VMS
# define STATUS_NATIVE PL_statusvalue_vms
# define STATUS_NATIVE_EXPORT \
- ((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms)
+ (((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms) | (VMSISH_HUSHED ? 0x10000000 : 0))
# define STATUS_NATIVE_SET(n) \
STMT_START { \
PL_statusvalue_vms = (n); \
#define PERL_EXIT_EXPECTED 0x01
#ifndef MEMBER_TO_FPTR
-#define MEMBER_TO_FPTR(name) name
+# define MEMBER_TO_FPTR(name) name
+#endif
+
+/* format to use for version numbers in file/directory names */
+/* XXX move to Configure? */
+#ifndef PERL_FS_VER_FMT
+# define PERL_FS_VER_FMT "%d.%d.%d"
#endif
/* This defines a way to flush all output buffers. This may be a
# define PERL_WAIT_FOR_CHILDREN NOOP
#endif
-/* the traditional thread-unsafe notion of "current interpreter".
- * XXX todo: a thread-safe version that fetches it from TLS (akin to THR)
- * needs to be defined elsewhere (conditional on pthread_getspecific()
- * availability). */
+/* the traditional thread-unsafe notion of "current interpreter". */
#ifndef PERL_SET_INTERP
# define PERL_SET_INTERP(i) (PL_curinterp = (PerlInterpreter*)(i))
#endif
#if defined(PERL_IMPLICIT_CONTEXT) && !defined(PERL_GET_THX)
# ifdef USE_THREADS
-# define PERL_GET_THX THR
+# define PERL_GET_THX ((struct perl_thread *)PERL_GET_CONTEXT)
# else
# ifdef MULTIPLICITY
-# define PERL_GET_THX PERL_GET_INTERP
+# define PERL_GET_THX ((PerlInterpreter *)PERL_GET_CONTEXT)
# else
# ifdef PERL_OBJECT
-# define PERL_GET_THX ((CPerlObj*)PERL_GET_INTERP)
+# define PERL_GET_THX ((CPerlObj *)PERL_GET_CONTEXT)
+# endif
+# endif
+# endif
+# define PERL_SET_THX(t) PERL_SET_CONTEXT(t)
+#endif
+
+#ifndef SVf
+# ifdef CHECK_FORMAT
+# define SVf "p"
# else
-# define PERL_GET_THX ((void*)0)
+# define SVf "_"
# endif
+#endif
+
+#ifndef UVf
+# ifdef CHECK_FORMAT
+# define UVf UVuf
+# else
+# define UVf "Vu"
# endif
+#endif
+
+#ifndef VDf
+# ifdef CHECK_FORMAT
+# define VDf "p"
+# else
+# define VDf "vd"
# endif
#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.
+ below to be rejected by the compiler. Sigh.
*/
#ifdef HAS_PAUSE
#define Pause pause
# endif
#endif
-#if defined(CYGWIN)
+#if defined(__CYGWIN__)
/* USEMYBINMODE
* This symbol, if defined, indicates that the program should
- * use the routine my_binmode(FILE *fp, char iotype) to insure
+ * use the routine my_binmode(FILE *fp, char iotype, int mode) 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)
+# define my_binmode(fp, iotype, mode) \
+ (PerlLIO_setmode(PerlIO_fileno(fp), mode) != -1 ? TRUE : FALSE)
#endif
#ifdef UNION_ANY_DEFINITION
typedef struct magic_state MGS; /* struct magic_state defined in mg.c */
struct scan_data_t; /* Used in S_* functions in regcomp.c */
+struct regnode_charclass_class; /* Used in S_* functions in regcomp.c */
typedef I32 CHECKPOINT;
#ifndef Perl_error_log
# define Perl_error_log (PL_stderrgv \
+ && GvIOp(PL_stderrgv) \
+ && IoOFP(GvIOp(PL_stderrgv)) \
? IoOFP(GvIOp(PL_stderrgv)) \
: PerlIO_stderr())
#endif
+
+#define DEBUG_p_FLAG 0x00000001 /* 1 */
+#define DEBUG_s_FLAG 0x00000002 /* 2 */
+#define DEBUG_l_FLAG 0x00000004 /* 4 */
+#define DEBUG_t_FLAG 0x00000008 /* 8 */
+#define DEBUG_o_FLAG 0x00000010 /* 16 */
+#define DEBUG_c_FLAG 0x00000020 /* 32 */
+#define DEBUG_P_FLAG 0x00000040 /* 64 */
+#define DEBUG_m_FLAG 0x00000080 /* 128 */
+#define DEBUG_f_FLAG 0x00000100 /* 256 */
+#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_DB_RECURSE_FLAG 0x40000000
+#define DEBUG_TOP_FLAG 0x80000000 /* XXX what's this for ??? */
+
+
#ifdef DEBUGGING
-#undef YYDEBUG
-#define YYDEBUG 1
-#define DEB(a) a
-#define DEBUG(a) if (PL_debug) a
-#define DEBUG_p(a) if (PL_debug & 1) a
-#define DEBUG_s(a) if (PL_debug & 2) a
-#define DEBUG_l(a) if (PL_debug & 4) a
-#define DEBUG_t(a) if (PL_debug & 8) a
-#define DEBUG_o(a) if (PL_debug & 16) a
-#define DEBUG_c(a) if (PL_debug & 32) a
-#define DEBUG_P(a) if (PL_debug & 64) a
+
+# undef YYDEBUG
+# define YYDEBUG 1
+
+# define DEBUG_p_TEST (PL_debug & DEBUG_p_FLAG)
+# define DEBUG_s_TEST (PL_debug & DEBUG_s_FLAG)
+# define DEBUG_l_TEST (PL_debug & DEBUG_l_FLAG)
+# define DEBUG_t_TEST (PL_debug & DEBUG_t_FLAG)
+# define DEBUG_o_TEST (PL_debug & DEBUG_o_FLAG)
+# define DEBUG_c_TEST (PL_debug & DEBUG_c_FLAG)
+# define DEBUG_P_TEST (PL_debug & DEBUG_P_FLAG)
+# define DEBUG_m_TEST (PL_debug & DEBUG_m_FLAG)
+# define DEBUG_f_TEST (PL_debug & DEBUG_f_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 DEB(a) a
+# define DEBUG(a) if (PL_debug) a
+# define DEBUG_p(a) if (DEBUG_p_TEST) a
+# define DEBUG_s(a) if (DEBUG_s_TEST) a
+# define DEBUG_l(a) if (DEBUG_l_TEST) a
+# define DEBUG_t(a) if (DEBUG_t_TEST) a
+# define DEBUG_o(a) if (DEBUG_o_TEST) a
+# define DEBUG_c(a) if (DEBUG_c_TEST) a
+# define DEBUG_P(a) if (DEBUG_P_TEST) a
+
# if defined(PERL_OBJECT)
-# define DEBUG_m(a) if (PL_debug & 128) a
+# define DEBUG_m(a) if (DEBUG_m_TEST) a
# else
+ /* Temporarily turn off memory debugging in case the a
+ * does memory allocation, either directly or indirectly. */
# define DEBUG_m(a) \
STMT_START { \
- if (PERL_GET_INTERP) { dTHX; if (PL_debug & 128) { a; } } \
+ if (PERL_GET_INTERP) { dTHX; if (DEBUG_m_TEST) {PL_debug&=~DEBUG_m_FLAG; a; PL_debug|=DEBUG_m_FLAG;} } \
} STMT_END
# endif
-#define DEBUG_f(a) if (PL_debug & 256) a
-#define DEBUG_r(a) if (PL_debug & 512) a
-#define DEBUG_x(a) if (PL_debug & 1024) a
-#define DEBUG_u(a) if (PL_debug & 2048) a
-#define DEBUG_L(a) if (PL_debug & 4096) a
-#define DEBUG_H(a) if (PL_debug & 8192) a
-#define DEBUG_X(a) if (PL_debug & 16384) a
-#define DEBUG_D(a) if (PL_debug & 32768) a
+
+# define DEBUG_f(a) if (DEBUG_f_TEST) a
+# define DEBUG_r(a) if (DEBUG_r_TEST) a
+# define DEBUG_x(a) if (DEBUG_x_TEST) a
+# define DEBUG_u(a) if (DEBUG_u_TEST) a
+# define DEBUG_L(a) if (DEBUG_L_TEST) a
+# define DEBUG_H(a) if (DEBUG_H_TEST) a
+# define DEBUG_X(a) if (DEBUG_X_TEST) a
+# define DEBUG_D(a) if (DEBUG_D_TEST) a
+
# ifdef USE_THREADS
-# define DEBUG_S(a) if (PL_debug & (1<<16)) a
+# define DEBUG_S(a) if (DEBUG_S_TEST) a
# else
# define DEBUG_S(a)
# endif
-#else
-#define DEB(a)
-#define DEBUG(a)
-#define DEBUG_p(a)
-#define DEBUG_s(a)
-#define DEBUG_l(a)
-#define DEBUG_t(a)
-#define DEBUG_o(a)
-#define DEBUG_c(a)
-#define DEBUG_P(a)
-#define DEBUG_m(a)
-#define DEBUG_f(a)
-#define DEBUG_r(a)
-#define DEBUG_x(a)
-#define DEBUG_u(a)
-#define DEBUG_S(a)
-#define DEBUG_H(a)
-#define DEBUG_X(a)
-#define DEBUG_D(a)
-#define DEBUG_S(a)
-#endif
+
+# define DEBUG_T(a) if (DEBUG_T_TEST) a
+# define DEBUG_R(a) if (DEBUG_R_TEST) a
+
+#else /* DEBUGGING */
+
+# define DEBUG_p_TEST (0)
+# define DEBUG_s_TEST (0)
+# define DEBUG_l_TEST (0)
+# define DEBUG_t_TEST (0)
+# define DEBUG_o_TEST (0)
+# define DEBUG_c_TEST (0)
+# define DEBUG_P_TEST (0)
+# define DEBUG_m_TEST (0)
+# define DEBUG_f_TEST (0)
+# 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_D_TEST (0)
+# define DEBUG_S_TEST (0)
+# define DEBUG_T_TEST (0)
+# define DEBUG_R_TEST (0)
+
+# define DEB(a)
+# define DEBUG(a)
+# define DEBUG_p(a)
+# define DEBUG_s(a)
+# define DEBUG_l(a)
+# define DEBUG_t(a)
+# define DEBUG_o(a)
+# define DEBUG_c(a)
+# define DEBUG_P(a)
+# define DEBUG_m(a)
+# define DEBUG_f(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_D(a)
+# define DEBUG_S(a)
+# define DEBUG_T(a)
+# define DEBUG_R(a)
+#endif /* DEBUGGING */
+
+
#define YYMAXDEPTH 300
#ifndef assert /* <assert.h> might have been included somehow */
#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*);
# if defined(NeXT) || defined(__NeXT__) /* or whatever catches all NeXTs */
char *crypt (); /* Maybe more hosts will need the unprototyped version */
# else
-# if !defined(WIN32) || !defined(HAVE_DES_FCRYPT)
+# if !defined(WIN32)
char *crypt (const char*, const char*);
-# endif /* !WIN32 && !HAVE_CRYPT_SOURCE */
+# endif /* !WIN32 */
# endif /* !NeXT && !__NeXT__ */
# ifndef DONT_DECLARE_STD
# ifndef getenv
char *getenv (const char*);
# endif /* !getenv */
-#ifndef EPOC
+# if !defined(HAS_LSEEK_PROTO) && !defined(EPOC) && !defined(__hpux)
+# ifdef _FILE_OFFSET_BITS
+# if _FILE_OFFSET_BITS == 64
Off_t lseek (int,Off_t,int);
-#endif
+# endif
+# endif
+# endif
# endif /* !DONT_DECLARE_STD */
char *getlogin (void);
#endif /* !__cplusplus */
# define environ (*environ_pointer)
EXT char *** environ_pointer;
# else
-# if defined(__APPLE__)
+# if defined(__APPLE__) && defined(PERL_CORE)
# include <crt_externs.h> /* for the env array */
# define environ (*_NSGetEnviron())
# endif
# endif
#else
/* VMS and some other platforms don't use the environ array */
-# if !defined(VMS)
+# ifdef USE_ENVIRON_ARRAY
# if !defined(DONT_DECLARE_STD) || \
(defined(__svr4__) && defined(__GNUC__) && defined(sun)) || \
defined(__sgi) || \
- defined(__DGUX) || defined(EPOC)
+ defined(__DGUX)
extern char ** environ; /* environment variables supplied via exec */
# endif
# endif
EXT int PL_sig_num[];
#endif
-/* fast case folding tables */
+/* fast conversion and case folding tables */
#ifdef DOINIT
#ifdef EBCDIC
#define HINT_INTEGER 0x00000001
#define HINT_STRICT_REFS 0x00000002
/* #define HINT_notused4 0x00000004 */
-#define HINT_UTF8 0x00000008
+#define HINT_BYTE 0x00000008
/* #define HINT_notused10 0x00000010 */
/* Note: 20,40,80 used for NATIVE_HINTS */
#define HINT_RE_EVAL 0x00200000
#define HINT_FILETEST_ACCESS 0x00400000
+#define HINT_UTF8 0x00800000
+#define HINT_UTF8_DISTINCT 0x01000000
+#define HINT_RE_ASCIIR 0x02000000
/* Various states of an input record separator SV (rs, nrs) */
#define RsSNARF(sv) (! SvOK(sv))
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_NOCONTEXT_t) (void*);
typedef void (*DESTRUCTORFUNC_t) (pTHXo_ void*);
typedef void (*SVFUNC_t) (pTHXo_ SV*);
#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.
*/
#ifndef PERL_CALLCONV
# define PERL_CALLCONV
-#endif
+#endif
#ifndef NEXT30_NO_ATTRIBUTE
# ifndef HASATTRIBUTE /* disable GNU-cc attribute checking? */
# 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);
0, MEMBER_TO_FPTR(Perl_magic_clearenv),
0};
EXT MGVTBL PL_vtbl_sig = {0, 0, 0, 0, 0};
+#ifdef PERL_MICRO
+EXT MGVTBL PL_vtbl_sigelem = {0, 0, 0, 0, 0};
+#else
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};
+#endif
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),
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};
+EXT MGVTBL PL_vtbl_regdatum = {MEMBER_TO_FPTR(Perl_magic_regdatum_get),
+ MEMBER_TO_FPTR(Perl_magic_regdatum_set), 0, 0, 0};
#ifdef USE_LOCALE_COLLATE
EXT MGVTBL PL_vtbl_collxfrm = {0,
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;
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;
copy_amg, neg_amg,
to_sv_amg, to_av_amg,
to_hv_amg, to_gv_amg,
- to_cv_amg, iter_amg,
+ 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. */
};
#define NofAMmeth max_amg_code
+#define AMG_id2name(id) ((char*)PL_AMG_names[id]+1)
#ifdef DOINIT
EXTCONST char * PL_AMG_names[NofAMmeth] = {
- "fallback", "abs", /* "fallback" should be the first. */
- "bool", "nomethod",
- "\"\"", "0+",
- "+", "+=",
- "-", "-=",
- "*", "*=",
- "/", "/=",
- "%", "%=",
- "**", "**=",
- "<<", "<<=",
- ">>", ">>=",
- "&", "&=",
- "|", "|=",
- "^", "^=",
- "<", "<=",
- ">", ">=",
- "==", "!=",
- "<=>", "cmp",
- "lt", "le",
- "gt", "ge",
- "eq", "ne",
- "!", "~",
- "++", "--",
- "atan2", "cos",
- "sin", "exp",
- "log", "sqrt",
- "x", "x=",
- ".", ".=",
- "=", "neg",
- "${}", "@{}",
- "%{}", "*{}",
- "&{}", "<>",
+ /* Names kept in the symbol table. fallback => "()", the rest has
+ "(" prepended. The only other place in perl which knows about
+ this convention is AMG_id2name (used for debugging output and
+ 'nomethod' only), the only other place which has it hardwired is
+ overload.pm. */
+ "()", "(abs", /* "fallback" should be the first. */
+ "(bool", "(nomethod",
+ "(\"\"", "(0+",
+ "(+", "(+=",
+ "(-", "(-=",
+ "(*", "(*=",
+ "(/", "(/=",
+ "(%", "(%=",
+ "(**", "(**=",
+ "(<<", "(<<=",
+ "(>>", "(>>=",
+ "(&", "(&=",
+ "(|", "(|=",
+ "(^", "(^=",
+ "(<", "(<=",
+ "(>", "(>=",
+ "(==", "(!=",
+ "(<=>", "(cmp",
+ "(lt", "(le",
+ "(gt", "(ge",
+ "(eq", "(ne",
+ "(!", "(~",
+ "(++", "(--",
+ "(atan2", "(cos",
+ "(sin", "(exp",
+ "(log", "(sqrt",
+ "(x", "(x=",
+ "(.", "(.=",
+ "(=", "(neg",
+ "(${}", "(@{}",
+ "(%{}", "(*{}",
+ "(&{}", "(<>",
+ "(int", "DESTROY",
};
#else
EXTCONST char * PL_AMG_names[NofAMmeth];
#define AMGfallYES 3
#define AMTf_AMAGIC 1
+#define AMTf_OVERLOADED 2
#define AMT_AMAGIC(amt) ((amt)->flags & AMTf_AMAGIC)
#define AMT_AMAGIC_on(amt) ((amt)->flags |= AMTf_AMAGIC)
#define AMT_AMAGIC_off(amt) ((amt)->flags &= ~AMTf_AMAGIC)
+#define AMT_OVERLOADED(amt) ((amt)->flags & AMTf_OVERLOADED)
+#define AMT_OVERLOADED_on(amt) ((amt)->flags |= AMTf_OVERLOADED)
+#define AMT_OVERLOADED_off(amt) ((amt)->flags &= ~AMTf_OVERLOADED)
+#define StashHANDLER(stash,meth) gv_handler((stash),CAT2(meth,_amg))
/*
* some compilers like to redefine cos et alia as faster
# endif
#endif /* _FASTMATH */
-#define PERLDB_ALL 0x3f /* No _NONAME, _GOTO */
-#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 PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr. */
-#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto. */
+#define PERLDB_ALL (PERLDBf_SUB | PERLDBf_LINE | \
+ PERLDBf_NOOPT | PERLDBf_INTER | \
+ PERLDBf_SUBLINE| PERLDBf_SINGLE| \
+ PERLDBf_NAMEEVAL| PERLDBf_NAMEANON)
+ /* No _NONAME, _GOTO */
+#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 PERLDBf_NONAME 0x40 /* For _SUB: no name of the subr */
+#define PERLDBf_GOTO 0x80 /* Report goto: call DB::goto */
+#define PERLDBf_NAMEEVAL 0x100 /* Informative names for evals */
+#define PERLDBf_NAMEANON 0x200 /* Informative names for anon subs */
#define PERLDB_SUB (PL_perldb && (PL_perldb & PERLDBf_SUB))
#define PERLDB_LINE (PL_perldb && (PL_perldb & PERLDBf_LINE))
#define PERLDB_SINGLE (PL_perldb && (PL_perldb & PERLDBf_SINGLE))
#define PERLDB_SUB_NN (PL_perldb && (PL_perldb & (PERLDBf_NONAME)))
#define PERLDB_GOTO (PL_perldb && (PL_perldb & PERLDBf_GOTO))
+#define PERLDB_NAMEEVAL (PL_perldb && (PL_perldb & PERLDBf_NAMEEVAL))
+#define PERLDB_NAMEANON (PL_perldb && (PL_perldb & PERLDBf_NAMEANON))
#ifdef USE_LOCALE_NUMERIC
#define SET_NUMERIC_STANDARD() \
- STMT_START { \
- if (! PL_numeric_standard) \
- set_numeric_standard(); \
- } STMT_END
+ set_numeric_standard();
#define SET_NUMERIC_LOCAL() \
- STMT_START { \
- if (! PL_numeric_local) \
- set_numeric_local(); \
- } STMT_END
+ 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; \
+ if (was_local) SET_NUMERIC_STANDARD();
+
+#define STORE_NUMERIC_STANDARD_SET_LOCAL() \
+ bool was_standard = (PL_hints & HINT_LOCALE) && PL_numeric_standard; \
+ if (was_standard) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_LOCAL() \
+ if (was_local) SET_NUMERIC_LOCAL();
+
+#define RESTORE_NUMERIC_STANDARD() \
+ if (was_standard) SET_NUMERIC_STANDARD();
-#define RESTORE_NUMERIC_LOCAL() if ((PL_hints & HINT_LOCALE) && PL_numeric_standard) SET_NUMERIC_LOCAL()
-#define RESTORE_NUMERIC_STANDARD() if ((PL_hints & HINT_LOCALE) && PL_numeric_local) SET_NUMERIC_STANDARD()
#define Atof my_atof
#else /* !USE_LOCALE_NUMERIC */
#define SET_NUMERIC_STANDARD() /**/
#define SET_NUMERIC_LOCAL() /**/
#define IS_NUMERIC_RADIX(c) (0)
+#define STORE_NUMERIC_LOCAL_SET_STANDARD() /**/
+#define STORE_NUMERIC_STANDARD_SET_LOCAL() /**/
#define RESTORE_NUMERIC_LOCAL() /**/
#define RESTORE_NUMERIC_STANDARD() /**/
#define Atof Perl_atof
#endif /* !USE_LOCALE_NUMERIC */
-#if defined(USE_LONG_LONG) && defined(HAS_LONG_LONG) && defined(HAS_ATOLL)
-#define Atol atoll
-#else
-#define Atol atol
+#if !defined(Strtol) && defined(USE_64_BIT_INT) && defined(IV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+# ifdef __hpux
+# define strtoll __strtoll /* secret handshake */
+# endif
+# if !defined(Strtol) && defined(HAS_STRTOLL)
+# define Strtol strtoll
+# endif
+# if !defined(Strtol) && defined(HAS_STRTOQ)
+# define Strtol strtoq
+# endif
+/* is there atoq() anywhere? */
+#endif
+#if !defined(Strtol) && defined(HAS_STRTOL)
+# define Strtol strtol
+#endif
+#ifndef Atol
+/* It would be more fashionable to use Strtol() to define atol()
+ * (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)
+# define Atol atoll
+# else
+# define Atol atol
+# endif
#endif
-#if defined(USE_LONG_LONG) && defined(HAS_LONG_LONG) && defined(HAS_STRTOULL)
-#define Strtoul strtoull
-#else
-#define Strtoul strtoul
+#if !defined(Strtoul) && defined(USE_64_BIT_INT) && defined(UV_IS_QUAD) && QUADKIND == QUAD_IS_LONG_LONG
+# ifdef __hpux
+# define strtoull __strtoull /* secret handshake */
+# endif
+# if !defined(Strtoul) && defined(HAS_STRTOULL)
+# define Strtoul strtoull
+# endif
+# if !defined(Strtoul) && defined(HAS_STRTOUQ)
+# define Strtoul strtouq
+# endif
+/* is there atouq() anywhere? */
+#endif
+#if !defined(Strtoul) && defined(HAS_STRTOUL)
+# define Strtoul strtoul
+#endif
+#ifndef Atoul
+# define Atoul(s) Strtoul(s, (char **)NULL, 10)
#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
+#ifdef __GNUC__
+#define printf(fmt,args...) PerlIO_stdoutf(fmt,##args)
+#else
#define printf PerlIO_stdoutf
#endif
+#endif
+
+/* if these never got defined, they need defaults */
+#ifndef PERL_SET_CONTEXT
+# define PERL_SET_CONTEXT(i) PERL_SET_INTERP(i)
+#endif
+
+#ifndef PERL_GET_CONTEXT
+# define PERL_GET_CONTEXT PERL_GET_INTERP
+#endif
+
+#ifndef PERL_GET_THX
+# define PERL_GET_THX ((void*)NULL)
+#endif
+
+#ifndef PERL_SET_THX
+# define PERL_SET_THX(t) NOOP
+#endif
#ifndef PERL_SCRIPT_MODE
#define PERL_SCRIPT_MODE "r"
* 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
/*
* nice_chunk and nice_chunk size need to be set
* and queried under the protection of sv_mutex
*/
-#define offer_nice_chunk(chunk, chunk_size) do { \
- LOCK_SV_MUTEX; \
- if (!PL_nice_chunk) { \
- PL_nice_chunk = (char*)(chunk); \
- PL_nice_chunk_size = (chunk_size); \
- } \
- else { \
- Safefree(chunk); \
- } \
- UNLOCK_SV_MUTEX; \
- } while (0)
+#define offer_nice_chunk(chunk, chunk_size) STMT_START { \
+ void *new_chunk; \
+ U32 new_chunk_size; \
+ LOCK_SV_MUTEX; \
+ new_chunk = (void *)(chunk); \
+ new_chunk_size = (chunk_size); \
+ if (new_chunk_size > PL_nice_chunk_size) { \
+ if (PL_nice_chunk) Safefree(PL_nice_chunk); \
+ PL_nice_chunk = new_chunk; \
+ PL_nice_chunk_size = new_chunk_size; \
+ } else { \
+ Safefree(chunk); \
+ } \
+ UNLOCK_SV_MUTEX; \
+ } STMT_END
#ifdef HAS_SEM
# include <sys/ipc.h>
# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun)
# else
# ifdef USE_SEMCTL_SEMID_DS
-# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
+# ifdef EXTRA_F_IN_SEMUN_BUF
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buff)
+# else
+# define Semctl(id, num, cmd, semun) semctl(id, num, cmd, semun.buf)
+# endif
# endif
# endif
#endif
+#ifdef I_FCNTL
+# include <fcntl.h>
+#endif
+
+#ifdef I_SYS_FILE
+# include <sys/file.h>
+#endif
+
+#ifndef O_RDONLY
+/* Assume UNIX defaults */
+# define O_RDONLY 0000
+# define O_WRONLY 0001
+# define O_RDWR 0002
+# define O_CREAT 0100
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+#ifndef O_TEXT
+# define O_TEXT 0
+#endif
+
#ifdef IAMSUID
#ifdef I_SYS_STATVFS
# include <sys/statfs.h> /* for some statfs() */
#endif
#ifdef I_SYS_VFS
-# include <sys/vfs.h> /* for some statfs() */
+# ifdef __sgi
+# define sv IRIX_sv /* kludge: IRIX has an sv of its own */
+# endif
+# include <sys/vfs.h> /* for some statfs() */
+# ifdef __sgi
+# undef IRIX_sv
+# endif
#endif
#ifdef I_USTAT
# include <ustat.h> /* for ustat() */
#endif /* IAMSUID */
+#ifdef I_LIBUTIL
+# include <libutil.h> /* setproctitle() in some FreeBSDs */
+#endif
+
+#ifndef EXEC_ARGV_CAST
+#define EXEC_ARGV_CAST(x) x
+#endif
+
/* and finally... */
#define PERL_PATCHLEVEL_H_IMPLICIT
#include "patchlevel.h"
#undef PERL_PATCHLEVEL_H_IMPLICIT
+/* Mention
+
+ NV_PRESERVES_UV
+
+ HAS_ICONV
+ I_ICONV
+
+ HAS_MKSTEMP
+ HAS_MKSTEMPS
+ HAS_MKDTEMP
+
+ HAS_GETCWD
+
+ HAS_MMAP
+ HAS_MPROTECT
+ HAS_MSYNC
+ HAS_MADVISE
+ HAS_MUNMAP
+ I_SYSMMAN
+ Mmap_t
+
+ NVef
+ NVff
+ NVgf
+
+ HAS_USLEEP
+ HAS_UALARM
+
+ HAS_SETITIMER
+ HAS_GETITIMER
+
+ HAS_SENDMSG
+ HAS_RECVMSG
+ HAS_READV
+ HAS_WRITEV
+ I_SYSUIO
+ HAS_STRUCT_MSGHDR
+ HAS_STRUCT_CMSGHDR
+
+ so that Configure picks them up. */
+
#endif /* Include guard */