#ifndef H_PERL
#define H_PERL 1
#define OVERLOAD
-#define STRANGE_MALLOC
+
+/*
+ * 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 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
# 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
typedef struct svop SVOP;
typedef struct gvop GVOP;
typedef struct pvop PVOP;
-typedef struct cvop CVOP;
typedef struct loop LOOP;
typedef struct Outrec Outrec;
# 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
# 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 char * osname; /* operating system */
EXT XPV* xiv_arenaroot; /* list of allocated xiv areas */
EXT IV ** xiv_root; /* free xiv 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
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 */
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 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 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);