* 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()
-#ifndef HAS_VFORK
-# define vfork fork
-#endif
-
-#ifdef HAS_GETPGRP2
+#if defined(HAS_GETPGRP2) && defined(HAS_SETPGRP2)
+# define getpgrp getpgrp2
+# define setpgrp setpgrp2
# ifndef HAS_GETPGRP
# define HAS_GETPGRP
# endif
-#endif
-
-#ifdef HAS_SETPGRP2
# ifndef HAS_SETPGRP
# define HAS_SETPGRP
# endif
+# ifndef USE_BSDPGRP
+# define USE_BSDPGRP
+# endif
+#else
+# if defined(HAS_GETPGRP2) || defined(HAS_SETPGRP2)
+ #include "Gack, you have one but not both of getpgrp2() and setpgrp2()."
+# endif
#endif
#include <stdio.h>
-#ifdef USE_NEXT_CTYPE
+#ifdef USE_NEXT_CTYPE
#include <appkit/NXCType.h>
#else
#include <ctype.h>
#endif
+#ifdef I_LOCALE
+#include <locale.h>
+#endif
+
#ifdef METHOD /* Defined by OSF/1 v3.0 by ctype.h */
#undef METHOD
#endif
# 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
+# ifdef HIDEMYMALLOC
+# define malloc Mymalloc
+# define realloc Myremalloc
+# define free Myfree
+# endif
+# define safemalloc malloc
+# define saferealloc realloc
+# define safefree free
+#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
# include <netinet/in.h>
#endif
+#ifdef I_SYS_STAT
#include <sys/stat.h>
+#endif
/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
like UTekV) are broken, sometimes giving false positives. Undefine
# include <net/errno.h>
# endif
#endif
+#ifndef VMS
+# define FIXSTATUS(sts) (U_L((sts) & 0xffff))
+# define SHIFTSTATUS(sts) ((sts) >> 8)
+# define SETERRNO(errcode,vmserrcode) errno = (errcode)
+#else
+# define FIXSTATUS(sts) (U_L(sts))
+# define SHIFTSTATUS(sts) (sts)
+# define SETERRNO(errcode,vmserrcode) {set_errno(errcode); set_vaxc_errno(vmserrcode);}
+#endif
#ifndef MSDOS
# ifndef errno
# endif
# endif
# endif
-#endif
+#endif
#ifdef FPUTS_BOTCH
/* work around botch in SunOS 4.0.1 and 4.0.2 */
# define HAS_QUAD
#endif
+#ifdef UV
+#undef UV
+#endif
+
#ifdef HAS_QUAD
# ifdef cray
# define Quad_t int
# define Quad_t long
# endif
# endif
-#endif
-
-#ifdef VOIDSIG
-# define VOIDRET void
+ typedef Quad_t IV;
+ typedef unsigned Quad_t UV;
#else
-# define VOIDRET int
-#endif
-
-#ifdef DOSISH
-# include "dosish.h"
-#else
-# if defined(VMS)
-# include "vmsish.h"
-# else
-# include "unixish.h"
-# endif
-#endif
-
-#ifndef HAS_PAUSE
-#define pause() sleep((32767<<16)+32767)
-#endif
-
-#ifndef IOCPARM_LEN
-# ifdef IOCPARM_MASK
- /* on BSDish systes we're safe */
-# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
-# else
- /* otherwise guess at what's safe */
-# define IOCPARM_LEN(x) 256
-# endif
+ typedef long IV;
+ typedef unsigned long UV;
#endif
typedef MEM_SIZE STRLEN;
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 lstring Lstring;
typedef struct interpreter PerlInterpreter;
typedef struct ff FF;
typedef struct sv SV;
typedef struct mgvtbl MGVTBL;
typedef union any ANY;
-typedef FILE * (*cryptswitch_t) _((FILE *rfp));
-
#include "handy.h"
-#ifdef HAS_QUAD
-typedef Quad_t IV;
+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
-typedef long IV;
+# if defined(VMS)
+# include "vmsish.h"
+# else
+# include "unixish.h"
+# endif
+#endif
+
+#ifndef HAS_PAUSE
+#define pause() sleep((32767<<16)+32767)
+#endif
+
+#ifndef IOCPARM_LEN
+# ifdef IOCPARM_MASK
+ /* on BSDish systes we're safe */
+# define IOCPARM_LEN(x) (((x) >> 16) & IOCPARM_MASK)
+# else
+ /* otherwise guess at what's safe */
+# define IOCPARM_LEN(x) 256
+# endif
#endif
union any {
#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 U_L(what) ((U32)(what))
#else
U32 cast_ulong _((double));
-#define U_S(what) ((U16)cast_ulong(what))
-#define U_I(what) ((unsigned int)cast_ulong(what))
-#define U_L(what) (cast_ulong(what))
+#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)))
#endif
#ifdef CASTI32
#define I_32(what) ((I32)(what))
#define I_V(what) ((IV)(what))
+#define U_V(what) ((UV)(what))
#else
I32 cast_i32 _((double));
-#define I_32(what) (cast_i32(what))
+#define I_32(what) (cast_i32((double)(what)))
IV cast_iv _((double));
-#define I_V(what) (cast_iv(what))
+#define I_V(what) (cast_iv((double)(what)))
+UV cast_uv _((double));
+#define U_V(what) (cast_uv((double)(what)))
#endif
struct Outrec {
#define TMPPATH "plXXXXXX"
#else
#ifdef VMS
-#define TMPPATH "/sys$scratch/perl-eXXXXXX"
+#define TMPPATH "sys$scratch:perl-eXXXXXX"
#else
#define TMPPATH "/tmp/perl-eXXXXXX"
#endif
extern "C" {
# endif
double exp _((double));
- double fmod _((double,double));
double log _((double));
double sqrt _((double));
double modf _((double,double*));
# endif
#endif
-#ifndef HAS_FMOD
-# ifdef HAS_DREM
-# define fmod(x,y) drem((x),(y))
-# else
-# define USE_MY_FMOD
-# define fmod(x,y) my_fmod(x,y)
-# endif
-#endif
-
#ifndef __cplusplus
char *crypt _((const char*, const char*));
char *getenv _((const char*));
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
+# define DEBUGGING_MSTATS
+# endif
# define PAD_SV(po) pad_sv(po)
#else
# define PAD_SV(po) curpad[po]
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 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 */
EXT char no_wrongref[]
INIT("Can't use %s ref as %s ref");
EXT char no_symref[]
- INIT("Can't use a string as %s ref while \"strict refs\" in use");
+ INIT("Can't use string (\"%.32s\") as %s ref while \"strict refs\" in use");
EXT char no_usym[]
INIT("Can't use an undefined value as %s reference");
EXT char no_aelem[]
INIT("Unsupported directory function \"%s\" called");
EXT char no_func[]
INIT("The %s function is unimplemented");
+EXT char no_myglob[]
+ INIT("\"my\" variable %s can't be in a package");
EXT SV sv_undef;
EXT SV sv_no;
#endif
#ifdef DOINIT
-EXT char *sig_name[] = {
- SIG_NAME,0
-};
+EXT char *sig_name[] = { SIG_NAME };
+EXT int sig_num[] = { SIG_NUM };
#else
EXT char *sig_name[];
+EXT int sig_num[];
#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 AV * rsfp_filters;
EXT I32 multi_start; /* 1st line of multi-line string */
EXT I32 multi_end; /* last line of multi-line string */
EXT I32 subline; /* line this subroutine began on */
EXT SV * subname; /* name of current subroutine */
+EXT CV * compcv; /* currently compiling subroutine */
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 max_intro_pending;/* end of vars to introduce */
EXT I32 padix; /* max used index in current "register" pad */
EXT I32 padix_floor; /* how low may inner block reset padix */
-EXT bool pad_reset_pending; /* reset pad on next attempted alloc */
+EXT I32 pad_reset_pending; /* reset pad on next attempted alloc */
EXT COP compiling;
EXT I32 thisexpr; /* name id for nothing_in_common() */
IEXT GV * Isiggv;
IEXT GV * Iincgv;
IEXT char * Iorigfilename;
+IEXT SV * Idiehook;
+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 SV * Inrs;
IEXT char * Isplitstr IINIT(" ");
IEXT bool Ipreprocess;
IEXT bool Iminus_n;
IEXT FILE * Ie_fp;
IEXT VOL U32 Idebug;
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 */
/* magical thingies */
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 char * Iofmt; /* $# */
IEXT I32 Imaxsysfd IINIT(MAXSYSFD); /* top fd to pass to subprocesses */
IEXT int Imultiline; /* $*--do strings hold >1 line? */
-IEXT U16 Istatusvalue; /* $? */
+IEXT U32 Istatusvalue; /* $? */
IEXT struct stat Istatcache; /* _ */
IEXT GV * Istatgv;
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 OP * Irestartop; /* Are we propagating an error from croak? */
IEXT int Idelaymagic; /* ($<,$>) = ... */
IEXT bool Idirty; /* In the middle of tearing things down? */
-IEXT bool Ilocalizing; /* are we processing a local() list? */
+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;
IEXT char * Idebdelim;
/* current interpreter roots */
+IEXT CV * Imain_cv;
IEXT OP * Imain_root;
IEXT OP * Imain_start;
IEXT OP * Ieval_root;
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,
+EXT MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
+EXT MGVTBL vtbl_sigelem = {0, magic_setsig,
0, 0, 0};
-MGVTBL vtbl_pack = {0, 0, 0, magic_wipepack,
+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,
- 0, 0, 0};
-MGVTBL vtbl_amagicelem = {0, magic_setamagic,
- 0, 0, 0};
+EXT MGVTBL vtbl_amagic = {0, magic_setamagic,
+ 0, 0, magic_setamagic};
+EXT MGVTBL vtbl_amagicelem = {0, magic_setamagic,
+ 0, 0, magic_setamagic};
#endif /* OVERLOAD */
#else
#ifdef OVERLOAD
EXT long amagic_generation;
-#define NofAMmeth 27
+#define NofAMmeth 29
#ifdef DOINIT
EXT char * AMG_names[NofAMmeth][2] = {
{"fallback","abs"},
{"**", "**="},
{"<<", "<<="},
{">>", ">>="},
+ {"&", "&="},
+ {"|", "|="},
+ {"^", "^="},
{"<", "<="},
{">", ">="},
{"==", "!="},
{"lt", "le"},
{"gt", "ge"},
{"eq", "ne"},
- {"&", "^"},
- {"|", "neg"},
{"!", "~"},
{"++", "--"},
{"atan2", "cos"},
{"sin", "exp"},
{"log", "sqrt"},
{"x","x="},
- {".",".="}
+ {".",".="},
+ {"=","neg"}
};
#else
EXT char * AMG_names[NofAMmeth][2];
pow_amg, pow_ass_amg,
lshift_amg, lshift_ass_amg,
rshift_amg, rshift_ass_amg,
+ band_amg, band_ass_amg,
+ bor_amg, bor_ass_amg,
+ bxor_amg, bxor_ass_amg,
lt_amg, le_amg,
gt_amg, ge_amg,
eq_amg, ne_amg,
slt_amg, sle_amg,
sgt_amg, sge_amg,
seq_amg, sne_amg,
- band_amg, bxor_amg,
- bor_amg, neg_amg,
not_amg, compl_amg,
inc_amg, dec_amg,
atan2_amg, cos_amg,
sin_amg, exp_amg,
log_amg, sqrt_amg,
repeat_amg, repeat_ass_amg,
- concat_amg, concat_ass_amg
+ concat_amg, concat_ass_amg,
+ copy_amg, neg_amg
};
#endif /* OVERLOAD */