#define H_PERL 1
#define OVERLOAD
+/*
+ * 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
* code can be a lot prettier. Well, so much for theory. Sorry, Henry...
*/
-#ifdef MYMALLOC
-# ifdef HIDEMYMALLOC
-# define malloc Mymalloc
-# define realloc Myremalloc
-# define free Myfree
-# endif
-# define safemalloc malloc
-# define saferealloc realloc
-# define safefree free
-#endif
-
-/* work around some libPW problems */
-#ifdef DOINIT
-EXT char Error[1];
-#endif
-
/* define this once if either system, instead of cluttering up the src */
#if defined(MSDOS) || defined(atarist)
#define DOSISH 1
#define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s)
#define TAINT_ENV() if (tainting) taint_env()
-#ifdef HAS_GETPGRP2
-# ifndef HAS_GETPGRP
-# define HAS_GETPGRP
+#ifdef USE_BSDPGRP
+# ifdef HAS_GETPGRP
+# define BSD_GETPGRP(pid) getpgrp((pid))
# endif
-#endif
-
-#ifdef HAS_SETPGRP2
-# ifndef HAS_SETPGRP
-# define HAS_SETPGRP
+# ifdef HAS_SETPGRP
+# define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp))
+# endif
+#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
# endif
#endif
#include <stdio.h>
-#ifdef USE_NEXT_CTYPE
+
+#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 /* USE_NEXT_CTYPE */
+
+#ifdef I_LOCALE
+#include <locale.h>
#endif
#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
# include <stdlib.h>
#endif /* STANDARD_C */
+/* Maybe 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. I guess. The patch had no explanation.
+*/
+#ifdef MYMALLOC
+# ifndef DONT_HIDEMYMALLOC
+# define malloc Mymalloc
+# define realloc Myremalloc
+# define free Myfree
+# define calloc Mycalloc
+# endif
+# define safemalloc malloc
+# define saferealloc realloc
+# define safefree free
+# define safecalloc calloc
+#endif
+
#define MEM_SIZE Size_t
#if defined(I_STRING) || defined(__cplusplus)
# undef HAS_MEMCMP
#endif
+#ifdef I_MEMORY
+# include <memory.h>
+#endif
+
#ifdef HAS_MEMCPY
# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memcpy
# endif
#endif /* HAS_MEMCMP */
-/* we prefer bcmp slightly for comparisons that don't care about ordering */
+/* 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)
#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
# endif
# endif
# endif
-#endif
+#endif
#ifdef FPUTS_BOTCH
/* work around botch in SunOS 4.0.1 and 4.0.2 */
# define SLOPPYDIVIDE
#endif
-#if defined(cray) || defined(convex) || defined (uts) || BYTEORDER > 0xffff
+#if defined(cray) || defined(convex) || BYTEORDER > 0xffff
# define HAS_QUAD
#endif
# 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
typedef struct svop SVOP;
typedef struct gvop GVOP;
typedef struct pvop PVOP;
-typedef struct cvop CVOP;
typedef struct loop LOOP;
typedef struct Outrec Outrec;
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;
typedef struct mgvtbl MGVTBL;
typedef union any ANY;
-typedef int (*cryptswitch_t) _((void));
-
#include "handy.h"
+typedef I32 (*filter_t) _((int, SV *, int));
+#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
+#define FILTER_DATA(idx) (AvARRAY(rsfp_filters)[idx])
+#define FILTER_ISREADER(idx) (idx >= AvFILL(rsfp_filters))
+
#ifdef DOSISH
+# if defined(OS2)
+# include "os2ish.h"
+# else
# include "dosish.h"
+# endif
#else
# 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 SH_PATH /* May be a variable. */
+# define SH_PATH BIN_SH
+#endif
+
#ifndef HAS_PAUSE
#define pause() sleep((32767<<16)+32767)
#endif
#include "mg.h"
#include "scope.h"
+/* work around some libPW problems */
+#ifdef DOINIT
+EXT char Error[1];
+#endif
+
#if defined(iAPX286) || defined(M_I286) || defined(I80286)
# define I286
#endif
# define MAXSYSFD 2
#endif
-#ifdef DOSISH
-#define TMPPATH "plXXXXXX"
-#else
-#ifdef VMS
-#define TMPPATH "sys$scratch:perl-eXXXXXX"
-#else
-#define TMPPATH "/tmp/perl-eXXXXXX"
-#endif
+#ifndef TMPPATH
+# define TMPPATH "/tmp/perl-eXXXXXX"
#endif
#ifndef __cplusplus
#endif
#ifdef DEBUGGING
+#ifndef Perl_debug_log
+#define Perl_debug_log 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
char *getlogin _((void));
#endif
-#ifdef EUNICE
+#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
#define UNLINK unlnk
I32 unlnk _((char*));
#else
#define SCAN_REPL 2
#ifdef DEBUGGING
-# ifndef register
+# ifndef register
# define register
# endif
+# ifdef MYMALLOC
+# ifndef DEBUGGING_MSTATS
+# define DEBUGGING_MSTATS
+# endif
+# 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 bool nomemok; /* let malloc context handle nomem */
EXT U32 an; /* malloc sequence number */
EXT U32 cop_seqmax; /* statement sequence number */
-EXT U32 op_seqmax; /* op sequence number */
+EXT U16 op_seqmax; /* op sequence number */
EXT U32 evalseq; /* eval sequence number */
EXT U32 sub_generation; /* inc to force methods to be looked up again */
EXT char ** origenviron;
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 */
EXT double * xnv_root; /* free xnv list--shared by interpreters */
EXT XRV * xrv_root; /* free xrv list--shared by interpreters */
EXT XPV * xpv_root; /* free xpv list--shared by interpreters */
+EXT HE * he_root; /* free he list--shared by interpreters */
+EXT char * nice_chunk; /* a nice chunk of memory to reuse */
+EXT U32 nice_chunk_size;/* how nice the chunk of memory is */
/* Stack for currently executing thread--context switch must handle this. */
EXT SV ** stack_base; /* stack->array_ary */
/* temp space */
EXT SV * Sv;
EXT XPV * Xpv;
-EXT char buf[1024];
+EXT char buf[2048]; /* should be longer than PATH_MAX */
EXT char tokenbuf[256];
EXT struct stat statbuf;
#ifdef HAS_TIMES
#endif
#ifdef DOINIT
-EXT char *sig_name[] = {
- SIG_NAME,0
-};
+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 char * oldoldbufptr;
EXT char * bufend;
EXT expectation expect INIT(XSTATE); /* how to interpret ambiguous tokens */
-EXT char * autoboot_preamble INIT(Nullch);
-EXT cryptswitch_t cryptswitch_fp;
+EXT AV * rsfp_filters;
EXT I32 multi_start; /* 1st line of multi-line string */
EXT I32 multi_end; /* last line of multi-line string */
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 */
IEXT SV * Iwarnhook;
IEXT SV * Iparsehook;
+/* 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))
+
/* switches */
IEXT char * Icddir;
IEXT bool Iminus_c;
-IEXT char Ipatchlevel[6];
-IEXT char * Inrs IINIT("\n");
-IEXT U32 Inrschar IINIT('\n'); /* final char of rs, or 0777 if none */
-IEXT I32 Inrslen IINIT(1);
+IEXT char Ipatchlevel[10];
+IEXT char ** Ilocalpatches;
+IEXT SV * Inrs;
IEXT char * Isplitstr IINIT(" ");
IEXT bool Ipreprocess;
IEXT bool Iminus_n;
IEXT Time_t Ibasetime; /* $^T */
IEXT SV * Iformfeed; /* $^L */
IEXT char * Ichopset IINIT(" \n-"); /* $: */
-IEXT char * Irs IINIT("\n"); /* $/ */
-IEXT U32 Irschar IINIT('\n'); /* final char of rs, or 0777 if none */
-IEXT STRLEN Irslen IINIT(1);
-IEXT bool Irspara;
+IEXT SV * Irs; /* $/ */
IEXT char * Iofs; /* $, */
IEXT STRLEN Iofslen;
IEXT char * Iors; /* $\ */
IEXT I32 Imaxscream IINIT(-1);
IEXT SV * Ilastscream;
+/* shortcuts to misc objects */
+IEXT GV * Ierrgv;
+
/* shortcuts to debugging objects */
IEXT GV * IDBgv;
IEXT GV * IDBline;
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;
IEXT U8 Ilocalizing; /* are we processing a local() list? */
IEXT bool Itainted; /* using variables controlled by $< */
IEXT bool Itainting; /* doing taint checks */
+IEXT char * Iop_mask IINIT(NULL); /* masked operations for safe evals */
/* trace state */
IEXT I32 Idlevel;
/* 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 Icxstack_max IINIT(128);
-IEXT jmp_buf Itop_env;
+IEXT Sigjmp_buf Itop_env;
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 */
IEXT PMOP * Ioldlastpm; /* for saving regexp context during debugger */
IEXT I32 Igensym; /* next symbol for getsym() to define */
IEXT bool Ipreambled;
+IEXT AV * Ipreambleav;
IEXT int Ilaststatval IINIT(-1);
IEXT I32 Ilaststype IINIT(OP_STAT);
/* The following must follow proto.h */
#ifdef DOINIT
-MGVTBL vtbl_sv = {magic_get,
+EXT MGVTBL vtbl_sv = {magic_get,
magic_set,
magic_len,
0, 0};
-MGVTBL vtbl_env = {0, 0, 0, 0, 0};
-MGVTBL vtbl_envelem = {0, magic_setenv,
+EXT MGVTBL vtbl_env = {0, 0, 0, 0, 0};
+EXT MGVTBL vtbl_envelem = {0, magic_setenv,
0, magic_clearenv,
0};
-MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
-MGVTBL vtbl_sigelem = {0, magic_setsig,
- 0, 0, 0};
-MGVTBL vtbl_pack = {0, 0, 0, magic_wipepack,
+EXT MGVTBL vtbl_sig = {0, 0, 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};
-MGVTBL vtbl_packelem = {magic_getpack,
+EXT MGVTBL vtbl_packelem = {magic_getpack,
magic_setpack,
0, magic_clearpack,
0};
-MGVTBL vtbl_dbline = {0, magic_setdbline,
+EXT MGVTBL vtbl_dbline = {0, magic_setdbline,
0, 0, 0};
-MGVTBL vtbl_isa = {0, magic_setisa,
+EXT MGVTBL vtbl_isa = {0, magic_setisa,
0, 0, 0};
-MGVTBL vtbl_isaelem = {0, magic_setisa,
+EXT MGVTBL vtbl_isaelem = {0, magic_setisa,
0, 0, 0};
-MGVTBL vtbl_arylen = {magic_getarylen,
+EXT MGVTBL vtbl_arylen = {magic_getarylen,
magic_setarylen,
0, 0, 0};
-MGVTBL vtbl_glob = {magic_getglob,
+EXT MGVTBL vtbl_glob = {magic_getglob,
magic_setglob,
0, 0, 0};
-MGVTBL vtbl_mglob = {0, magic_setmglob,
+EXT MGVTBL vtbl_mglob = {0, magic_setmglob,
0, 0, 0};
-MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
+EXT MGVTBL vtbl_taint = {magic_gettaint,magic_settaint,
0, 0, 0};
-MGVTBL vtbl_substr = {0, magic_setsubstr,
+EXT MGVTBL vtbl_substr = {0, magic_setsubstr,
0, 0, 0};
-MGVTBL vtbl_vec = {0, magic_setvec,
+EXT MGVTBL vtbl_vec = {0, magic_setvec,
0, 0, 0};
-MGVTBL vtbl_pos = {magic_getpos,
+EXT MGVTBL vtbl_pos = {magic_getpos,
magic_setpos,
0, 0, 0};
-MGVTBL vtbl_bm = {0, magic_setbm,
+EXT MGVTBL vtbl_bm = {0, magic_setbm,
0, 0, 0};
-MGVTBL vtbl_uvar = {magic_getuvar,
+EXT MGVTBL vtbl_uvar = {magic_getuvar,
magic_setuvar,
0, 0, 0};
#ifdef OVERLOAD
-MGVTBL vtbl_amagic = {0, magic_setamagic,
+EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
0, 0, magic_setamagic};
-MGVTBL vtbl_amagicelem = {0, magic_setamagic,
+EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
0, 0, magic_setamagic};
#endif /* OVERLOAD */