#define H_PERL 1
#define OVERLOAD
+#ifdef PERL_FOR_X2P
+/*
+ * 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.
+ */
+#undef MULTIPLICITY
+#undef EMBED
+#undef USE_STDIO
+#define USE_STDIO
+#endif /* PERL_FOR_X2P */
+
+/*
+ * STMT_START { statements; } STMT_END;
+ * can be used as a single statement, as in
+ * if (x) STMT_START { ... } STMT_END; else ...
+ *
+ * Trying to select a version that gives no warnings...
+ */
+#if !(defined(STMT_START) && defined(STMT_END))
+# if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+# 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__))
+# define STMT_START if (1)
+# define STMT_END else (void)0
+# else
+# define STMT_START do
+# define STMT_END while (0)
+# endif
+# endif
+#endif
+
#include "embed.h"
#define VOIDUSED 1
#define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s)
#define TAINT_ENV() if (tainting) taint_env()
-#ifdef USE_BSDPGRP
-# ifdef HAS_GETPGRP
-# define BSD_GETPGRP(pid) getpgrp((pid))
-# endif
-# ifdef HAS_SETPGRP
-# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
-# endif
+/* 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.
+ perlfunc.pod documents the traditional BSD-style syntax, so we'll
+ try to preserve that, if possible.
+*/
+#ifdef HAS_SETPGID
+# define BSD_SETPGRP(pid, pgrp) setpgid((pid), (pgrp))
#else
-# ifdef HAS_GETPGRP2
-# define BSD_GETPGRP(pid) getpgrp2((pid))
-# ifndef HAS_GETPGRP
-# define HAS_GETPGRP
-# endif
-# endif
-# ifdef HAS_SETPGRP2
-# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
-# ifndef HAS_SETPGRP
-# define HAS_SETPGRP
-# endif
+# if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP)
+# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
+# else
+# ifdef HAS_SETPGRP2 /* DG/UX */
+# define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp))
+# endif
+# endif
+#endif
+#if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP)
+# define HAS_SETPGRP /* Well, effectively it does . . . */
+#endif
+
+/* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes
+ our life easier :-) so we'll try it.
+*/
+#ifdef HAS_GETPGID
+# define BSD_GETPGRP(pid) getpgid((pid))
+#else
+# if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP)
+# define BSD_GETPGRP(pid) getpgrp((pid))
+# else
+# ifdef HAS_GETPGRP2 /* DG/UX */
+# define BSD_GETPGRP(pid) getpgrp2((pid))
+# endif
+# endif
+#endif
+#if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP)
+# define HAS_GETPGRP /* Well, effectively it does . . . */
+#endif
+
+/* 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.
+*/
+#if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP)
+# ifndef USE_BSDPGRP
+# define USE_BSDPGRP
+# endif
+#endif
+
+#ifndef _TYPES_ /* If types.h defines this it's easy. */
+# ifndef major /* Does everyone's types.h define this? */
+# include <sys/types.h>
# endif
#endif
-#include <stdio.h>
+#ifdef __cplusplus
+# ifndef I_STDARG
+# define I_STDARG 1
+# endif
+#endif
+
+#ifdef I_STDARG
+# include <stdarg.h>
+#else
+# ifdef I_VARARGS
+# include <varargs.h>
+# endif
+#endif
+
+#include "perlio.h"
+
#ifdef USE_NEXT_CTYPE
+
+#if NX_CURRENT_COMPILER_RELEASE >= 400
+#include <objc/NXCType.h>
+#else /* NX_CURRENT_COMPILER_RELEASE < 400 */
#include <appkit/NXCType.h>
-#else
+#endif /* NX_CURRENT_COMPILER_RELEASE >= 400 */
+
+#else /* !USE_NEXT_CTYPE */
#include <ctype.h>
-#endif
+#endif /* USE_NEXT_CTYPE */
#ifdef I_LOCALE
#include <locale.h>
*/
#ifdef MYMALLOC
# ifdef HIDEMYMALLOC
-# define malloc Mymalloc
-# define realloc Myremalloc
-# define free Myfree
+# define malloc Perl_malloc
+# define realloc Perl_realloc
+# define free Perl_free
+# define calloc Perl_calloc
# endif
# define safemalloc malloc
# define saferealloc realloc
# define safefree free
+# define safecalloc calloc
#endif
#define MEM_SIZE Size_t
# endif
#endif /* HAS_MEMCMP */
-/* XXX we prefer bcmp slightly for comparisons that don't care about ordering */
-#ifndef HAS_BCMP
-# ifndef bcmp
-# define bcmp(s1,s2,l) memcmp(s1,s2,l)
-# endif
-#endif /* HAS_BCMP */
-
#if !defined(HAS_MEMMOVE) && !defined(memmove)
# if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
# define memmove(d,s,l) bcopy(s,d,l)
# endif
#endif
-#ifndef _TYPES_ /* If types.h defines this it's easy. */
-# ifndef major /* Does everyone's types.h define this? */
-# include <sys/types.h>
-# endif
-#endif
-
#ifdef I_NETINET_IN
# include <netinet/in.h>
#endif
#else
# define FIXSTATUS(sts) (U_L(sts))
# define SHIFTSTATUS(sts) (sts)
-# define SETERRNO(errcode,vmserrcode) {set_errno(errcode); set_vaxc_errno(vmserrcode);}
+# define SETERRNO(errcode,vmserrcode) STMT_START {set_errno(errcode); set_vaxc_errno(vmserrcode);} STMT_END
#endif
#ifndef MSDOS
# define SLOPPYDIVIDE
#endif
-#if defined(cray) || defined(convex) || defined (uts) || BYTEORDER > 0xffff
+#if defined(cray) || defined(convex) || BYTEORDER > 0xffff
# define HAS_QUAD
#endif
#undef UV
#endif
+/* XXX QUAD stuff is not currently supported on most systems.
+ Specifically, perl internals don't support long long. Among
+ the many problems is that some compilers support long long,
+ but the underlying library functions (such as sprintf) don't.
+ Some things do work (such as quad pack/unpack on convex);
+ also some systems use long long for the fpos_t typedef. That
+ seems to work too.
+
+ The IV type is supposed to be long enough to hold any integral
+ value or a pointer.
+ --Andy Dougherty August 1996
+*/
+
#ifdef HAS_QUAD
# ifdef cray
# define Quad_t int
# else
-# if defined(convex) || defined (uts)
+# if defined(convex)
# define Quad_t long long
# else
# define Quad_t long
# endif
typedef Quad_t IV;
typedef unsigned Quad_t UV;
+# define IV_MAX PERL_QUAD_MAX
+# define IV_MIN PERL_QUAD_MIN
+# define UV_MAX PERL_UQUAD_MAX
+# define UV_MIN PERL_UQUAD_MIN
#else
typedef long IV;
typedef unsigned long UV;
+# define IV_MAX PERL_LONG_MAX
+# define IV_MIN PERL_LONG_MIN
+# define UV_MAX PERL_ULONG_MAX
+# define UV_MIN PERL_ULONG_MIN
+#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.
+ * The "PERL_" names are used because these calculated constants
+ * do not meet the ANSI requirements for LONG_MAX, etc., which
+ * need to be constants acceptable to #if - kja
+ * define PERL_LONG_MAX 2147483647L
+ * define PERL_LONG_MIN (-LONG_MAX - 1)
+ * define PERL ULONG_MAX 4294967295L
+ */
+
+#ifdef I_LIMITS /* Needed for cast_xxx() functions below. */
+# include <limits.h>
+#else
+#ifdef I_VALUES
+# include <values.h>
+#endif
+#endif
+
+#ifdef CHAR_MAX
+# define PERL_CHAR_MAX CHAR_MAX
+#else
+# ifdef MAXCHAR /* Often used in <values.h> */
+# define PERL_CHAR_MAX MAXCHAR
+# else
+# define PERL_CHAR_MAX ((char) ((~(unsigned char)0) >> 1))
+# endif
+#endif
+
+#ifdef CHAR_MIN
+# define PERL_CHAR_MIN CHAR_MIN
+#else
+# ifdef MINCHAR
+# define PERL_CHAR_MIN MINCHAR
+# else
+# define PERL_CHAR_MIN (-PERL_CHAR_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef UCHAR_MAX
+# define PERL_UCHAR_MAX UCHAR_MAX
+#else
+# ifdef MAXUCHAR
+# define PERL_UCHAR_MAX MAXUCHAR
+# else
+# define PERL_UCHAR_MAX (~(unsigned char)0)
+# endif
+#endif
+
+#define PERL_UCHAR_MIN 0
+
+#ifdef SHORT_MAX
+# define PERL_SHORT_MAX SHORT_MAX
+#else
+# ifdef MAXSHORT /* Often used in <values.h> */
+# define PERL_SHORT_MAX MAXSHORT
+# else
+# define PERL_SHORT_MAX ((short) ((~(unsigned short)0) >> 1))
+# endif
+#endif
+
+#ifdef SHORT_MIN
+# define PERL_SHORT_MIN SHORT_MIN
+#else
+# ifdef MINSHORT
+# define PERL_SHORT_MIN MINSHORT
+# else
+# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef USHORT_MAX
+# define PERL_USHORT_MAX USHORT_MAX
+#else
+# ifdef MAXUSHORT
+# define PERL_USHORT_MAX MAXUSHORT
+# else
+# define PERL_USHORT_MAX (~(unsigned short)0)
+# endif
+#endif
+
+#define PERL_USHORT_MIN 0
+
+#ifdef INT_MAX
+# define PERL_INT_MAX INT_MAX
+#else
+# ifdef MAXINT /* Often used in <values.h> */
+# define PERL_INT_MAX MAXINT
+# else
+# define PERL_INT_MAX ((int) ((~(unsigned int)0) >> 1))
+# endif
+#endif
+
+#ifdef INT_MIN
+# define PERL_INT_MIN INT_MIN
+#else
+# ifdef MININT
+# define PERL_INT_MIN MININT
+# else
+# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef UINT_MAX
+# define PERL_UINT_MAX UINT_MAX
+#else
+# ifdef MAXUINT
+# define PERL_UINT_MAX MAXUINT
+# else
+# define PERL_UINT_MAX (~(unsigned int)0)
+# endif
+#endif
+
+#define PERL_UINT_MIN 0
+
+#ifdef LONG_MAX
+# define PERL_LONG_MAX LONG_MAX
+#else
+# ifdef MAXLONG /* Often used in <values.h> */
+# define PERL_LONG_MAX MAXLONG
+# else
+# define PERL_LONG_MAX ((long) ((~(unsigned long)0) >> 1))
+# endif
+#endif
+
+#ifdef LONG_MIN
+# define PERL_LONG_MIN LONG_MIN
+#else
+# ifdef MINLONG
+# define PERL_LONG_MIN MINLONG
+# else
+# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+# endif
+#endif
+
+#ifdef ULONG_MAX
+# define PERL_ULONG_MAX ULONG_MAX
+#else
+# ifdef MAXULONG
+# define PERL_ULONG_MAX MAXULONG
+# else
+# define PERL_ULONG_MAX (~(unsigned long)0)
+# endif
+#endif
+
+#define PERL_ULONG_MIN 0L
+
+#ifdef HAS_QUAD
+# ifdef QUAD_MAX
+# define PERL_QUAD_MAX QUAD_MAX
+# else
+# define PERL_QUAD_MAX ((IV) ((~(UV)0) >> 1))
+# endif
+
+# ifdef QUAD_MIN
+# define PERL_QUAD_MIN QUAD_MIN
+# else
+# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+# endif
+
+# ifdef UQUAD_MAX
+# define PERL_UQUAD_MAX UQUAD_MAX
+# else
+# define PERL_UQUAD_MAX (~(UV)0)
+# endif
+
+# define PERL_UQUAD_MIN 0
#endif
typedef MEM_SIZE STRLEN;
typedef struct cv CV;
typedef struct regexp REGEXP;
typedef struct gp GP;
-typedef struct sv GV;
+typedef struct gv GV;
typedef struct io IO;
typedef struct context CONTEXT;
typedef struct block BLOCK;
# if defined(VMS)
# include "vmsish.h"
# else
-# include "unixish.h"
+# if defined(PLAN9)
+# include "./plan9/plan9ish.h"
+# else
+# include "unixish.h"
+# endif
# endif
#endif
-
-#ifndef HAS_PAUSE
-#define pause() sleep((32767<<16)+32767)
+
+/* 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.
+*/
+#ifdef HAS_PAUSE
+#define Pause pause
+#else
+#define Pause() sleep((32767<<16)+32767)
#endif
#ifndef IOCPARM_LEN
#define U_I(what) ((unsigned int)(what))
#define U_L(what) ((U32)(what))
#else
+# ifdef __cplusplus
+ extern "C" {
+# endif
U32 cast_ulong _((double));
+# ifdef __cplusplus
+ }
+# endif
#define U_S(what) ((U16)cast_ulong((double)(what)))
#define U_I(what) ((unsigned int)cast_ulong((double)(what)))
#define U_L(what) (cast_ulong((double)(what)))
#define I_V(what) ((IV)(what))
#define U_V(what) ((UV)(what))
#else
+# ifdef __cplusplus
+ extern "C" {
+# endif
I32 cast_i32 _((double));
-#define I_32(what) (cast_i32((double)(what)))
IV cast_iv _((double));
-#define I_V(what) (cast_iv((double)(what)))
UV cast_uv _((double));
+# ifdef __cplusplus
+ }
+# endif
+#define I_32(what) (cast_i32((double)(what)))
+#define I_V(what) (cast_iv((double)(what)))
#define U_V(what) (cast_uv((double)(what)))
#endif
#endif
#ifdef DEBUGGING
+#ifndef Perl_debug_log
+#define Perl_debug_log PerlIO_stderr()
+#endif
#define YYDEBUG 1
#define DEB(a) a
#define DEBUG(a) if (debug) a
#define DEBUG_o(a) if (debug & 16) a
#define DEBUG_c(a) if (debug & 32) a
#define DEBUG_P(a) if (debug & 64) a
-#define DEBUG_m(a) if (debug & 128) a
+#define DEBUG_m(a) if (curinterp && debug & 128) a
#define DEBUG_f(a) if (debug & 256) a
#define DEBUG_r(a) if (debug & 512) a
#define DEBUG_x(a) if (debug & 1024) a
#endif
#define YYMAXDEPTH 300
+#ifndef assert /* <assert.h> might have been included somehow */
#define assert(what) DEB( { \
if (!(what)) { \
croak("Assertion failed: file \"%s\", line %d", \
__FILE__, __LINE__); \
exit(1); \
}})
+#endif
struct ufuncs {
I32 (*uf_val)_((IV, SV*));
#endif
#ifndef __cplusplus
+#ifdef __NeXT__ /* or whatever catches all NeXTs */
+char *crypt (); /* Maybe more hosts will need the unprototyped version */
+#else
char *crypt _((const char*, const char*));
+#endif
char *getenv _((const char*));
Off_t lseek _((int,Off_t,int));
char *getlogin _((void));
#define SCAN_TR 1
#define SCAN_REPL 2
+#ifdef MYMALLOC
+# ifndef DEBUGGING_MSTATS
+# define DEBUGGING_MSTATS
+# endif
+#endif
+
#ifdef DEBUGGING
# ifndef register
# define register
# endif
-# ifdef MYMALLOC
-# define DEBUGGING_MSTATS
-# endif
# define PAD_SV(po) pad_sv(po)
#else
# define PAD_SV(po) curpad[po]
/* global state */
EXT PerlInterpreter * curinterp; /* currently running interpreter */
-#ifndef VMS /* VMS doesn't use environ array */
+/* VMS doesn't use environ array and NeXT has problems with crt0.o globals */
+#if !defined(VMS) && !(defined(NeXT) && defined(__DYNAMIC__))
extern char ** environ; /* environment variables supplied via exec */
-#endif
+#else
+# if defined(NeXT) && defined(__DYNAMIC__)
+
+# include <mach-o/dyld.h>
+EXT char *** environ_pointer;
+# define environ (*environ_pointer)
+# endif
+#endif /* environ processing */
+
EXT int uid; /* current real user id */
EXT int euid; /* current effective user id */
EXT int gid; /* current real group id */
EXT U32 origalen;
EXT U32 * profiledata;
EXT int maxo INIT(MAXO);/* Number of ops */
+EXT char * osname; /* operating system */
EXT XPV* xiv_arenaroot; /* list of allocated xiv areas */
EXT IV ** xiv_root; /* free xiv list--shared by interpreters */
/* temp space */
EXT SV * Sv;
+EXT HE He;
EXT XPV * Xpv;
EXT char buf[2048]; /* should be longer than PATH_MAX */
EXT char tokenbuf[256];
#ifdef DOINIT
EXT char *sig_name[] = { SIG_NAME };
EXT int sig_num[] = { SIG_NUM };
+EXT SV * psig_ptr[sizeof(sig_num)/sizeof(*sig_num)];
+EXT SV * psig_name[sizeof(sig_num)/sizeof(*sig_num)];
#else
EXT char *sig_name[];
EXT int sig_num[];
+EXT SV * psig_ptr[];
+EXT SV * psig_name[];
#endif
#ifdef DOINIT
EXT I32 nexttype[5]; /* type of next token */
EXT I32 nexttoke;
-EXT FILE * VOL rsfp INIT(Nullfp);
+EXT PerlIO * VOL rsfp INIT(Nullfp);
EXT SV * linestr;
EXT char * bufptr;
EXT char * oldbufptr;
EXT AV * comppad; /* storage for lexically scoped temporaries */
EXT AV * comppad_name; /* variable names for "my" variables */
EXT I32 comppad_name_fill;/* last "introduced" variable offset */
+EXT I32 comppad_name_floor;/* start of vars in innermost block */
EXT I32 min_intro_pending;/* start of vars to introduce */
EXT I32 max_intro_pending;/* end of vars to introduce */
EXT I32 padix; /* max used index in current "register" pad */
#define HINT_BLOCK_SCOPE 0x00000100
#define HINT_STRICT_SUBS 0x00000200
#define HINT_STRICT_VARS 0x00000400
+#define HINT_STRICT_UNTIE 0x00000800
/**************************************************************************/
/* This regexp stuff is global since it always happens within 1 expr eval */
EXT U16 regflags; /* are we folding, multilining? */
EXT char regprev; /* char before regbol, \n if none */
+EXT bool do_undump; /* -u or dump seen? */
+EXT VOL U32 debug;
+
/***********************************************/
/* Global only to current interpreter instance */
/***********************************************/
IEXT char * Icddir;
IEXT bool Iminus_c;
IEXT char Ipatchlevel[10];
+IEXT char ** Ilocalpatches;
IEXT SV * Inrs;
IEXT char * Isplitstr IINIT(" ");
IEXT bool Ipreprocess;
IEXT bool Isawi; /* study must assume case insensitive */
IEXT bool Isawvec;
IEXT bool Iunsafe;
-IEXT bool Ido_undump; /* -u or dump seen? */
IEXT char * Iinplace;
IEXT char * Ie_tmpname;
-IEXT FILE * Ie_fp;
-IEXT VOL U32 Idebug;
+IEXT PerlIO * Ie_fp;
IEXT U32 Iperldb;
/* This value may be raised by extensions for testing purposes */
IEXT int Iperl_destruct_level; /* 0=none, 1=full, 2=full with checks */
IEXT SV * Icurstname; /* name of current package */
IEXT AV * Ibeginav; /* names of BEGIN subroutines */
IEXT AV * Iendav; /* names of END subroutines */
-IEXT AV * Ipad; /* storage for lexically scoped temporaries */
-IEXT AV * Ipadname; /* variable names for "my" variables */
+IEXT HV * Istrtab; /* shared string table */
/* memory management */
IEXT SV ** Itmps_stack;
/* runtime control stuff */
IEXT COP * VOL Icurcop IINIT(&compiling);
+IEXT COP * Icurcopdb IINIT(NULL);
IEXT line_t Icopline IINIT(NOLINE);
IEXT CONTEXT * Icxstack;
IEXT I32 Icxstack_ix IINIT(-1);
IEXT I32 Irunlevel;
/* stack stuff */
-IEXT AV * Istack; /* THE STACK */
+IEXT AV * Icurstack; /* THE STACK */
IEXT AV * Imainstack; /* the stack when nothing funny is happening */
IEXT SV ** Imystack_base; /* stack->array_ary */
IEXT SV ** Imystack_sp; /* stack pointer now */
extern "C" {
#endif
-#ifdef __cplusplus
-# ifndef I_STDARG
-# define I_STDARG 1
-# endif
-#endif
-
-#ifdef I_STDARG
-# include <stdarg.h>
-#else
-# ifdef I_VARARGS
-# include <varargs.h>
-# endif
-#endif
-
#include "proto.h"
#ifdef EMBED
0, magic_clearenv,
0};
EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
-EXT MGVTBL vtbl_sigelem = {0, magic_setsig,
- 0, 0, 0};
+EXT MGVTBL vtbl_sigelem = {magic_getsig,
+ magic_setsig,
+ 0, magic_clearsig,
+ 0};
EXT MGVTBL vtbl_pack = {0, 0, 0, magic_wipepack,
0};
EXT MGVTBL vtbl_packelem = {magic_getpack,
};
#endif /* OVERLOAD */
+#if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
+/*
+ * Now we have __attribute__ out of the way
+ * Remap printf
+ */
+#define printf PerlIO_stdoutf
+#endif
+
#endif /* Include guard */
+