perl 5.000
[p5sagit/p5-mst-13.2.git] / perl.h
diff --git a/perl.h b/perl.h
index 43737aa..4c3c9aa 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -1,72 +1,76 @@
-/* $RCSfile: perl.h,v $$Revision: 4.0.1.2 $$Date: 91/06/07 11:28:33 $
+/*    perl.h
  *
- *    Copyright (c) 1991, Larry Wall
+ *    Copyright (c) 1987-1994, 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.
  *
- * $Log:       perl.h,v $
- * Revision 4.0.1.2  91/06/07  11:28:33  lwall
- * patch4: new copyright notice
- * patch4: made some allowances for "semi-standard" C
- * patch4: many, many itty-bitty portability fixes
- * 
- * Revision 4.0.1.1  91/04/11  17:49:51  lwall
- * patch1: hopefully straightened out some of the Xenix mess
- * 
- * Revision 4.0  91/03/20  01:37:56  lwall
- * 4.0 baseline.
- * 
  */
+#ifndef H_PERL
+#define H_PERL 1
+#define OVERLOAD
 
-#define VOIDWANT 1
+#include "embed.h"
+
+#define VOIDUSED 1
 #include "config.h"
 
-#ifdef MSDOS
-/* This stuff now in the MS-DOS config.h file. */
-#else /* !MSDOS */
+#ifndef BYTEORDER
+#   define BYTEORDER 0x1234
+#endif
+
+/* Overall memory policy? */
+#ifndef CONSERVATIVE
+#   define LIBERAL 1
+#endif
 
 /*
- * The following symbols are defined if your operating system supports
- * functions by that name.  All Unixes I know of support them, thus they
- * are not checked by the configuration script, but are directly defined
- * here.
- */
-#define HAS_ALARM
-#define HAS_CHOWN
-#define HAS_CHROOT
-#define HAS_FORK
-#define HAS_GETLOGIN
-#define HAS_GETPPID
-#define HAS_KILL
-#define HAS_LINK
-#define HAS_PIPE
-#define HAS_WAIT
-#define HAS_UMASK
-/*
- * The following symbols are defined if your operating system supports
- * password and group functions in general.  All Unix systems do.
+ * The following contortions are brought to you on behalf of all the
+ * standards, semi-standards, de facto standards, not-so-de-facto standards
+ * of the world, as well as all the other botches anyone ever thought of.
+ * The basic theory is that if we work hard enough here, the rest of the
+ * code can be a lot prettier.  Well, so much for theory.  Sorry, Henry...
  */
-#define HAS_GROUP
-#define HAS_PASSWD
 
-#endif /* !MSDOS */
+#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
 
-#if defined(__STDC__) || defined(_AIX) || defined(__stdc__)
+/* define this once if either system, instead of cluttering up the src */
+#if defined(MSDOS) || defined(atarist)
+#define DOSISH 1
+#endif
+
+#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
 # define STANDARD_C 1
 #endif
 
 #if defined(HASVOLATILE) || defined(STANDARD_C)
-#define VOLATILE volatile
+#   ifdef __cplusplus
+#      define VOL              // to temporarily suppress warnings
+#   else
+#      define VOL volatile
+#   endif
 #else
-#define VOLATILE
+#   define VOL
 #endif
 
-#ifdef IAMSUID
-#   ifndef TAINT
-#      define TAINT
-#   endif
-#endif
+#define TAINT_IF(c)    (tainted |= (c))
+#define TAINT_NOT      (tainted = 0)
+#define TAINT_PROPER(s)        if (tainting) taint_proper(no_security, s)
+#define TAINT_ENV()    if (tainting) taint_env()
 
 #ifndef HAS_VFORK
 #   define vfork fork
 #   ifndef HAS_GETPGRP
 #      define HAS_GETPGRP
 #   endif
-#   define getpgrp getpgrp2
 #endif
 
 #ifdef HAS_SETPGRP2
 #   ifndef HAS_SETPGRP
 #      define HAS_SETPGRP
 #   endif
-#   define setpgrp setpgrp2
 #endif
 
 #include <stdio.h>
+#ifdef USE_NEXT_CTYPE 
+#include <appkit/NXCType.h>
+#else
 #include <ctype.h>
-#include <setjmp.h>
-#ifndef MSDOS
-#ifdef PARAM_NEEDS_TYPES
-#include <sys/types.h>
 #endif
-#include <sys/param.h>
+
+#ifdef METHOD  /* Defined by OSF/1 v3.0 by ctype.h */
+#undef METHOD
+#endif
+
+#include <setjmp.h>
+
+#ifdef I_SYS_PARAM
+#   ifdef PARAM_NEEDS_TYPES
+#      include <sys/types.h>
+#   endif
+#   include <sys/param.h>
 #endif
-#ifdef STANDARD_C
-/* Use all the "standard" definitions */
-#include <stdlib.h>
-#include <string.h>
+
+
+/* Use all the "standard" definitions? */
+#if defined(STANDARD_C) && defined(I_STDLIB)
+#   include <stdlib.h>
 #endif /* STANDARD_C */
 
-#if defined(HAS_MEMCMP) && defined(mips) && BYTEORDER == 0x1234
-#undef HAS_MEMCMP
+#define MEM_SIZE Size_t
+
+#if defined(I_STRING) || defined(__cplusplus)
+#   include <string.h>
+#else
+#   include <strings.h>
 #endif
 
-#ifdef HAS_MEMCPY
+#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
+#define strchr index
+#define strrchr rindex
+#endif
 
-#  ifndef STANDARD_C
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
+#   undef HAS_MEMCMP
+#endif
+
+#ifdef HAS_MEMCPY
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
 #    ifndef memcpy
-extern char * memcpy(), *memset();
-extern int memcmp();
-#    endif /* ndef memcpy */
-#  endif /* ndef STANDARD_C */
+        extern char * memcpy _((char*, char*, int));
+#    endif
+#  endif
+#else
+#   ifndef memcpy
+#      ifdef HAS_BCOPY
+#          define memcpy(d,s,l) bcopy(s,d,l)
+#      else
+#          define memcpy(d,s,l) my_bcopy(s,d,l)
+#      endif
+#   endif
+#endif /* HAS_MEMCPY */
 
-#   ifndef bcopy
-#      define bcopy(s1,s2,l) memcpy(s2,s1,l)
+#ifdef HAS_MEMSET
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memset
+       extern char *memset _((char*, int, int));
+#    endif
+#  endif
+#  define memzero(d,l) memset(d,0,l)
+#else
+#   ifndef memzero
+#      ifdef HAS_BZERO
+#          define memzero(d,l) bzero(d,l)
+#      else
+#          define memzero(d,l) my_bzero(d,l)
+#      endif
 #   endif
-#   ifndef bzero
-#      define bzero(s,l) memset(s,0,l)
+#endif /* HAS_MEMSET */
+
+#ifdef HAS_MEMCMP
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memcmp
+       extern int memcmp _((char*, char*, int));
+#    endif
+#  endif
+#else
+#   ifndef memcmp
+#      define memcmp(s1,s2,l) my_memcmp(s1,s2,l)
 #   endif
-#endif /* HAS_MEMCPY */
+#endif /* HAS_MEMCMP */
 
-#ifndef HAS_BCMP               /* prefer bcmp slightly 'cuz it doesn't order */
+/* 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)
+#   else
+#      if defined(HAS_MEMCPY) && defined(HAS_SAFE_MEMCPY)
+#          define memmove(d,s,l) memcpy(d,s,l)
+#      else
+#          define memmove(d,s,l) my_bcopy(s,d,l)
+#      endif
+#   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
+#   ifndef major               /* Does everyone's types.h define this? */
+#      include <sys/types.h>
+#   endif
 #endif
 
 #ifdef I_NETINET_IN
-#include <netinet/in.h>
+#   include <netinet/in.h>
 #endif
 
 #include <sys/stat.h>
 
+/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
+   like UTekV) are broken, sometimes giving false positives.  Undefine
+   them here and let the code below set them to proper values.
+
+   The ghs macro stands for GreenHills Software C-1.8.5 which
+   is the C compiler for sysV88 and the various derivatives.
+   This header file bug is corrected in gcc-2.5.8 and later versions.
+   --Kaveh Ghazi (ghazi@noc.rutgers.edu) 10/3/94.  */
+
+#if defined(uts) || (defined(m88k) && defined(ghs))
+#   undef S_ISDIR
+#   undef S_ISCHR
+#   undef S_ISBLK
+#   undef S_ISREG
+#   undef S_ISFIFO
+#   undef S_ISLNK
+#endif
+
 #ifdef I_TIME
 #   include <time.h>
 #endif
 
 #ifdef I_SYS_TIME
-#   ifdef SYSTIMEKERNEL
+#   ifdef I_SYS_TIME_KERNEL
 #      define KERNEL
 #   endif
 #   include <sys/time.h>
-#   ifdef SYSTIMEKERNEL
+#   ifdef I_SYS_TIME_KERNEL
 #      undef KERNEL
 #   endif
 #endif
 
 #ifndef MSDOS
-#include <sys/times.h>
+#  if defined(HAS_TIMES) && defined(I_SYS_TIMES)
+#    include <sys/times.h>
+#  endif
 #endif
 
 #if defined(HAS_STRERROR) && (!defined(HAS_MKDIR) || !defined(HAS_RMDIR))
-#undef HAS_STRERROR
+#   undef HAS_STRERROR
 #endif
 
+#ifndef HAS_MKFIFO
+#  ifndef mkfifo
+#    define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
+#  endif
+#endif /* !HAS_MKFIFO */
+
 #include <errno.h>
-#ifndef MSDOS
-#ifndef errno
-extern int errno;     /* ANSI allows errno to be an lvalue expr */
+#ifdef HAS_SOCKET
+#   ifdef I_NET_ERRNO
+#     include <net/errno.h>
+#   endif
 #endif
+
+#ifndef MSDOS
+#   ifndef errno
+       extern int errno;     /* ANSI allows errno to be an lvalue expr */
+#   endif
 #endif
 
-#ifndef strerror
 #ifdef HAS_STRERROR
-char *strerror();
+#       ifdef VMS
+       char *strerror _((int,...));
+#       else
+       char *strerror _((int));
+#       endif
+#       ifndef Strerror
+#           define Strerror strerror
+#       endif
 #else
-extern int sys_nerr;
-extern char *sys_errlist[];
-#define strerror(e) ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
-#endif
-#endif
-
-#ifdef I_SYSIOCTL
-#ifndef _IOCTL_
-#include <sys/ioctl.h>
-#endif
+#    ifdef HAS_SYS_ERRLIST
+       extern int sys_nerr;
+       extern char *sys_errlist[];
+#       ifndef Strerror
+#           define Strerror(e) \
+               ((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
+#       endif
+#   endif
 #endif
 
-#if defined(mc300) || defined(mc500) || defined(mc700) /* MASSCOMP */
-#ifdef HAS_SOCKETPAIR
-#undef HAS_SOCKETPAIR
-#endif
-#ifdef HAS_NDBM
-#undef HAS_NDBM
-#endif
+#ifdef I_SYS_IOCTL
+#   ifndef _IOCTL_
+#      include <sys/ioctl.h>
+#   endif
 #endif
 
-#ifdef HAS_GDBM
-#ifdef I_GDBM
-#include <gdbm.h>
-#endif
-#define SOME_DBM
-#ifdef HAS_NDBM
-#undef HAS_NDBM
-#endif
-#ifdef HAS_ODBM
-#undef HAS_ODBM
-#endif
-#else
-#ifdef HAS_NDBM
-#include <ndbm.h>
-#define SOME_DBM
-#ifdef HAS_ODBM
-#undef HAS_ODBM
-#endif
-#else
-#ifdef HAS_ODBM
-#ifdef NULL
-#undef NULL            /* suppress redefinition message */
-#endif
-#include <dbm.h>
-#ifdef NULL
-#undef NULL
-#endif
-#define NULL 0         /* silly thing is, we don't even use this */
-#define SOME_DBM
-#define dbm_fetch(db,dkey) fetch(dkey)
-#define dbm_delete(db,dkey) delete(dkey)
-#define dbm_store(db,dkey,dcontent,flags) store(dkey,dcontent)
-#define dbm_close(db) dbmclose()
-#define dbm_firstkey(db) firstkey()
-#endif /* HAS_ODBM */
-#endif /* HAS_NDBM */
-#endif /* HAS_GDBM */
-#ifdef SOME_DBM
-EXT char *dbmkey;
-EXT int dbmlen;
+#if defined(mc300) || defined(mc500) || defined(mc700) || defined(mc6000)
+#   ifdef HAS_SOCKETPAIR
+#      undef HAS_SOCKETPAIR
+#   endif
+#   ifdef I_NDBM
+#      undef I_NDBM
+#   endif
 #endif
 
 #if INTSIZE == 2
-#define htoni htons
-#define ntohi ntohs
+#   define htoni htons
+#   define ntohi ntohs
 #else
-#define htoni htonl
-#define ntohi ntohl
+#   define htoni htonl
+#   define ntohi ntohl
 #endif
 
+/* Configure already sets Direntry_t */
 #if defined(I_DIRENT)
 #   include <dirent.h>
-#   define DIRENT dirent
+#   if defined(NeXT) && defined(I_SYS_DIR) /* NeXT needs dirent + sys/dir.h */
+#      include <sys/dir.h>
+#   endif
 #else
 #   ifdef I_SYS_NDIR
 #      include <sys/ndir.h>
-#      define DIRENT direct
 #   else
 #      ifdef I_SYS_DIR
 #          ifdef hp9000s500
@@ -258,15 +327,14 @@ EXT int dbmlen;
 #          else
 #              include <sys/dir.h>
 #          endif
-#          define DIRENT direct
 #      endif
 #   endif
-#endif
+#endif 
 
 #ifdef FPUTS_BOTCH
 /* work around botch in SunOS 4.0.1 and 4.0.2 */
 #   ifndef fputs
-#      define fputs(str,fp) fprintf(fp,"%s",str)
+#      define fputs(sv,fp) fprintf(fp,"%s",sv)
 #   endif
 #endif
 
@@ -370,118 +438,150 @@ EXT int dbmlen;
 #   define S_ISGID 02000
 #endif
 
-#ifdef f_next
-#undef f_next
+#ifdef ff_next
+#   undef ff_next
 #endif
 
-typedef unsigned int STRLEN;
-
-typedef struct arg ARG;
-typedef struct cmd CMD;
-typedef struct formcmd FCMD;
-typedef struct scanpat SPAT;
-typedef struct stio STIO;
-typedef struct sub SUBR;
-typedef struct string STR;
-typedef struct atbl ARRAY;
-typedef struct htbl HASH;
-typedef struct regexp REGEXP;
-typedef struct stabptrs STBP;
-typedef struct stab STAB;
-typedef struct callsave CSV;
+#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
+#   define SLOPPYDIVIDE
+#endif
 
-#include "handy.h"
-#include "regexp.h"
-#include "str.h"
-#include "util.h"
-#include "form.h"
-#include "stab.h"
-#include "spat.h"
-#include "arg.h"
-#include "cmd.h"
-#include "array.h"
-#include "hash.h"
+#if defined(cray) || defined(convex) || defined (uts) || BYTEORDER > 0xffff
+#   define QUAD
+#endif
 
-#if defined(iAPX286) || defined(M_I286) || defined(I80286)
-#   define I286
+#ifdef QUAD
+#   ifdef cray
+#      define quad int
+#   else
+#      if defined(convex) || defined (uts)
+#          define quad long long
+#      else
+#          define quad long
+#      endif
+#   endif
 #endif
 
-#ifndef        STANDARD_C
-#ifdef CHARSPRINTF
-    char *sprintf();
+#ifdef VOIDSIG
+#   define VOIDRET void
 #else
-    int sprintf();
+#   define VOIDRET int
 #endif
+
+#ifdef DOSISH
+#   include "dosish.h"
+#else
+# if defined(VMS)
+#   include "vmsish.h"
+# else
+#   include "unixish.h"
+# endif
 #endif
 
-EXT char *Yes INIT("1");
-EXT char *No INIT("");
+#ifndef HAS_PAUSE
+#define pause() sleep((32767<<16)+32767)
+#endif
 
-/* "gimme" values */
+#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
 
-/* Note: cmd.c assumes that it can use && to produce one of these values! */
-#define G_SCALAR 0
-#define G_ARRAY 1
+typedef MEM_SIZE STRLEN;
+
+typedef struct op OP;
+typedef struct cop COP;
+typedef struct unop UNOP;
+typedef struct binop BINOP;
+typedef struct listop LISTOP;
+typedef struct logop LOGOP;
+typedef struct condop CONDOP;
+typedef struct pmop PMOP;
+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 av AV;
+typedef struct hv HV;
+typedef struct cv CV;
+typedef struct regexp REGEXP;
+typedef struct gp GP;
+typedef struct sv GV;
+typedef struct io IO;
+typedef struct context CONTEXT;
+typedef struct block BLOCK;
+
+typedef struct magic MAGIC;
+typedef struct xrv XRV;
+typedef struct xpv XPV;
+typedef struct xpviv XPVIV;
+typedef struct xpvnv XPVNV;
+typedef struct xpvmg XPVMG;
+typedef struct xpvlv XPVLV;
+typedef struct xpvav XPVAV;
+typedef struct xpvhv XPVHV;
+typedef struct xpvgv XPVGV;
+typedef struct xpvcv XPVCV;
+typedef struct xpvbm XPVBM;
+typedef struct xpvfm XPVFM;
+typedef struct xpvio XPVIO;
+typedef struct mgvtbl MGVTBL;
+typedef union any ANY;
+
+typedef FILE * (*cryptswitch_t) _((FILE *rfp));
 
-#ifdef CRIPPLED_CC
-int str_true();
-#else /* !CRIPPLED_CC */
-#define str_true(str) (Str = (str), \
-       (Str->str_pok ? \
-           ((*Str->str_ptr > '0' || \
-             Str->str_cur > 1 || \
-             (Str->str_cur && *Str->str_ptr != '0')) ? 1 : 0) \
-       : \
-           (Str->str_nok ? (Str->str_u.str_nval != 0.0) : 0 ) ))
-#endif /* CRIPPLED_CC */
+#include "handy.h"
 
-#ifdef DEBUGGING
-#define str_peek(str) (Str = (str), \
-       (Str->str_pok ? \
-           Str->str_ptr : \
-           (Str->str_nok ? \
-               (sprintf(tokenbuf,"num(%g)",Str->str_u.str_nval), \
-                   (char*)tokenbuf) : \
-               "" )))
+#ifdef QUAD
+typedef quad IV;
+#else
+typedef long IV;
 #endif
 
-#ifdef CRIPPLED_CC
-char *str_get();
-#else
-#ifdef TAINT
-#define str_get(str) (Str = (str), tainted |= Str->str_tainted, \
-       (Str->str_pok ? Str->str_ptr : str_2ptr(Str)))
-#else
-#define str_get(str) (Str = (str), (Str->str_pok ? Str->str_ptr : str_2ptr(Str)))
-#endif /* TAINT */
-#endif /* CRIPPLED_CC */
-
-#ifdef CRIPPLED_CC
-double str_gnum();
-#else /* !CRIPPLED_CC */
-#ifdef TAINT
-#define str_gnum(str) (Str = (str), tainted |= Str->str_tainted, \
-       (Str->str_nok ? Str->str_u.str_nval : str_2num(Str)))
-#else /* !TAINT */
-#define str_gnum(str) (Str = (str), (Str->str_nok ? Str->str_u.str_nval : str_2num(Str)))
-#endif /* TAINT*/
-#endif /* CRIPPLED_CC */
-EXT STR *Str;
-
-#define GROWSTR(pp,lp,len) if (*(lp) < (len)) growstr(pp,lp,len)
+union any {
+    void*      any_ptr;
+    I32                any_i32;
+    IV         any_iv;
+    long       any_long;
+    void       (*any_dptr) _((void*));
+};
 
-#ifndef MSDOS
-#define STR_GROW(str,len) if ((str)->str_len < (len)) str_grow(str,len)
-#define Str_Grow str_grow
-#else
-/* extra parentheses intentionally NOT placed around "len"! */
-#define STR_GROW(str,len) if ((str)->str_len < (unsigned long)len) \
-               str_grow(str,(unsigned long)len)
-#define Str_Grow(str,len) str_grow(str,(unsigned long)(len))
-#endif /* MSDOS */
+#include "regexp.h"
+#include "sv.h"
+#include "util.h"
+#include "form.h"
+#include "gv.h"
+#include "cv.h"
+#include "opcode.h"
+#include "op.h"
+#include "cop.h"
+#include "av.h"
+#include "hv.h"
+#include "mg.h"
+#include "scope.h"
 
-#ifndef BYTEORDER
-#define BYTEORDER 0x1234
+#if defined(iAPX286) || defined(M_I286) || defined(I80286)
+#   define I286
+#endif
+
+#ifndef        STANDARD_C
+#   ifdef CHARSPRINTF
+       char *sprintf _((char *, const char *, ...));
+#   else
+       int sprintf _((char *, const char *, ...));
+#   endif
 #endif
 
 #if defined(htonl) && !defined(HAS_HTONL)
@@ -517,338 +617,937 @@ EXT STR *Str;
 #endif
 #endif
 
+/*
+ * Little-endian byte order functions - 'v' for 'VAX', or 'reVerse'.
+ * -DWS
+ */
+#if BYTEORDER != 0x1234
+# define HAS_VTOHL
+# define HAS_VTOHS
+# define HAS_HTOVL
+# define HAS_HTOVS
+# if BYTEORDER == 0x4321
+#  define vtohl(x)     ((((x)&0xFF)<<24)       \
+                       +(((x)>>24)&0xFF)       \
+                       +(((x)&0x0000FF00)<<8)  \
+                       +(((x)&0x00FF0000)>>8)  )
+#  define vtohs(x)     ((((x)&0xFF)<<8) + (((x)>>8)&0xFF))
+#  define htovl(x)     vtohl(x)
+#  define htovs(x)     vtohs(x)
+# endif
+       /* otherwise default to functions in util.c */
+#endif
+
 #ifdef CASTNEGFLOAT
-#define U_S(what) ((unsigned short)(what))
+#define U_S(what) ((U16)(what))
 #define U_I(what) ((unsigned int)(what))
-#define U_L(what) ((unsigned long)(what))
+#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))
+#endif
+
+#ifdef CASTI32
+#define I_32(what) ((I32)(what))
+#define I_V(what) ((IV)(what))
 #else
-unsigned long castulong();
-#define U_S(what) ((unsigned int)castulong(what))
-#define U_I(what) ((unsigned int)castulong(what))
-#define U_L(what) (castulong(what))
-#endif
-
-CMD *add_label();
-CMD *block_head();
-CMD *append_line();
-CMD *make_acmd();
-CMD *make_ccmd();
-CMD *make_icmd();
-CMD *invert();
-CMD *addcond();
-CMD *addloop();
-CMD *wopt();
-CMD *over();
-
-STAB *stabent();
-STAB *genstab();
-
-ARG *stab2arg();
-ARG *op_new();
-ARG *make_op();
-ARG *make_match();
-ARG *make_split();
-ARG *rcatmaybe();
-ARG *listish();
-ARG *maybelistish();
-ARG *localize();
-ARG *fixeval();
-ARG *jmaybe();
-ARG *l();
-ARG *fixl();
-ARG *mod_match();
-ARG *make_list();
-ARG *cmd_to_arg();
-ARG *addflags();
-ARG *hide_ary();
-ARG *cval_to_arg();
-
-STR *str_new();
-STR *stab_str();
-
-int do_each();
-int do_subr();
-int do_match();
-int do_unpack();
-int eval();            /* this evaluates expressions */
-int do_eval();         /* this evaluates eval operator */
-int do_assign();
-
-SUBR *make_sub();
-
-FCMD *load_format();
-
-char *scanpat();
-char *scansubst();
-char *scantrans();
-char *scanstr();
-char *scanident();
-char *str_append_till();
-char *str_gets();
-char *str_grow();
-
-bool do_open();
-bool do_close();
-bool do_print();
-bool do_aprint();
-bool do_exec();
-bool do_aexec();
-
-int do_subst();
-int cando();
-int ingroup();
-
-void str_replace();
-void str_inc();
-void str_dec();
-void str_free();
-void stab_clear();
-void do_join();
-void do_sprintf();
-void do_accept();
-void do_pipe();
-void do_vecset();
-void do_unshift();
-void do_execfree();
-void magicalize();
-void magicname();
-void savelist();
-void saveitem();
-void saveint();
-void savelong();
-void savesptr();
-void savehptr();
-void restorelist();
-void repeatcpy();
-HASH *savehash();
-ARRAY *saveary();
-
-EXT char **origargv;
-EXT int origargc;
-EXT char **origenviron;
-extern char **environ;
-
-EXT line_t subline INIT(0);
-EXT STR *subname INIT(Nullstr);
-EXT int arybase INIT(0);
-
-struct outrec {
-    long       o_lines;
+I32 cast_i32 _((double));
+#define I_32(what) (cast_i32(what))
+IV cast_iv _((double));
+#define I_V(what) (cast_iv(what))
+#endif
+
+struct Outrec {
+    I32                o_lines;
     char       *o_str;
-    int                o_len;
+    U32                o_len;
 };
 
-EXT struct outrec outrec;
-EXT struct outrec toprec;
-
-EXT STAB *stdinstab INIT(Nullstab);
-EXT STAB *last_in_stab INIT(Nullstab);
-EXT STAB *defstab INIT(Nullstab);
-EXT STAB *argvstab INIT(Nullstab);
-EXT STAB *envstab INIT(Nullstab);
-EXT STAB *sigstab INIT(Nullstab);
-EXT STAB *defoutstab INIT(Nullstab);
-EXT STAB *curoutstab INIT(Nullstab);
-EXT STAB *argvoutstab INIT(Nullstab);
-EXT STAB *incstab INIT(Nullstab);
-EXT STAB *leftstab INIT(Nullstab);
-EXT STAB *amperstab INIT(Nullstab);
-EXT STAB *rightstab INIT(Nullstab);
-EXT STAB *DBstab INIT(Nullstab);
-EXT STAB *DBline INIT(Nullstab);
-EXT STAB *DBsub INIT(Nullstab);
-
-EXT HASH *defstash;            /* main symbol table */
-EXT HASH *curstash;            /* symbol table for current package */
-EXT HASH *debstash;            /* symbol table for perldb package */
-
-EXT STR *curstname;            /* name of current package */
-
-EXT STR *freestrroot INIT(Nullstr);
-EXT STR *lastretstr INIT(Nullstr);
-EXT STR *DBsingle INIT(Nullstr);
-EXT STR *DBtrace INIT(Nullstr);
-EXT STR *DBsignal INIT(Nullstr);
-
-EXT int lastspbase;
-EXT int lastsize;
-
-EXT char *hexdigit INIT("0123456789abcdef0123456789ABCDEF");
-EXT char *origfilename;
-EXT FILE * VOLATILE rsfp;
-EXT char buf[1024];
-EXT char *bufptr;
-EXT char *oldbufptr;
-EXT char *oldoldbufptr;
-EXT char *bufend;
-
-EXT STR *linestr INIT(Nullstr);
-
-EXT char *rs INIT("\n");
-EXT int rschar INIT('\n');     /* final char of rs, or 0777 if none */
-EXT int rslen INIT(1);
-EXT char *ofs INIT(Nullch);
-EXT int ofslen INIT(0);
-EXT char *ors INIT(Nullch);
-EXT int orslen INIT(0);
-EXT char *ofmt INIT(Nullch);
-EXT char *inplace INIT(Nullch);
-EXT char *nointrp INIT("");
-
-EXT bool preprocess INIT(FALSE);
-EXT bool minus_n INIT(FALSE);
-EXT bool minus_p INIT(FALSE);
-EXT bool minus_l INIT(FALSE);
-EXT bool minus_a INIT(FALSE);
-EXT bool doswitches INIT(FALSE);
-EXT bool dowarn INIT(FALSE);
-EXT bool doextract INIT(FALSE);
-EXT bool allstabs INIT(FALSE); /* init all customary symbols in symbol table?*/
-EXT bool sawampersand INIT(FALSE);     /* must save all match strings */
-EXT bool sawstudy INIT(FALSE);         /* do fbminstr on all strings */
-EXT bool sawi INIT(FALSE);             /* study must assume case insensitive */
-EXT bool sawvec INIT(FALSE);
-EXT bool localizing INIT(FALSE);       /* are we processing a local() list? */
-
 #ifndef MAXSYSFD
 #   define MAXSYSFD 2
 #endif
-EXT int maxsysfd INIT(MAXSYSFD);       /* top fd to pass to subprocesses */
 
-#ifdef CSH
-char *cshname INIT(CSH);
-int cshlen INIT(0);
-#endif /* CSH */
-
-#ifdef TAINT
-EXT bool tainted INIT(FALSE);          /* using variables controlled by $< */
+#ifdef DOSISH
+#define TMPPATH "plXXXXXX"
+#else
+#ifdef VMS
+#define TMPPATH "/sys$scratch/perl-eXXXXXX"
+#else
+#define TMPPATH "/tmp/perl-eXXXXXX"
+#endif
 #endif
 
-#ifndef MSDOS
-#define TMPPATH "/tmp/perl-eXXXXXX"
-#else
-#define TMPPATH "plXXXXXX"
-#endif /* MSDOS */
-EXT char *e_tmpname;
-EXT FILE *e_fp INIT(Nullfp);
-
-EXT char tokenbuf[256];
-EXT int expectterm INIT(TRUE);         /* how to interpret ambiguous tokens */
-EXT VOLATILE int in_eval INIT(FALSE);  /* trap fatal errors? */
-EXT int multiline INIT(0);             /* $*--do strings hold >1 line? */
-EXT int forkprocess;                   /* so do_open |- can return proc# */
-EXT int do_undump INIT(0);             /* -u or dump seen? */
-EXT int error_count INIT(0);           /* how many errors so far, max 10 */
-EXT int multi_start INIT(0);           /* 1st line of multi-line string */
-EXT int multi_end INIT(0);             /* last line of multi-line string */
-EXT int multi_open INIT(0);            /* delimiter of said string */
-EXT int multi_close INIT(0);           /* delimiter of said string */
-
-FILE *popen();
-/* char *str_get(); */
-STR *interp();
-void free_arg();
-STIO *stio_new();
-
-EXT struct stat statbuf;
-EXT struct stat statcache;
-STAB *statstab INIT(Nullstab);
-STR *statname;
-#ifndef MSDOS
-EXT struct tms timesbuf;
-#endif
-EXT int uid;
-EXT int euid;
-EXT int gid;
-EXT int egid;
-UIDTYPE getuid();
-UIDTYPE geteuid();
-GIDTYPE getgid();
-GIDTYPE getegid();
-EXT int unsafe;
+#ifndef __cplusplus
+Uid_t getuid _((void));
+Uid_t geteuid _((void));
+Gid_t getgid _((void));
+Gid_t getegid _((void));
+#endif
 
 #ifdef DEBUGGING
-EXT VOLATILE int debug INIT(0);
-EXT int dlevel INIT(0);
-EXT int dlmax INIT(128);
-EXT char *debname;
-EXT char *debdelim;
 #define YYDEBUG 1
+#define DEB(a)                         a
+#define DEBUG(a)   if (debug)          a
+#define DEBUG_p(a) if (debug & 1)      a
+#define DEBUG_s(a) if (debug & 2)      a
+#define DEBUG_l(a) if (debug & 4)      a
+#define DEBUG_t(a) if (debug & 8)      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_f(a) if (debug & 256)    a
+#define DEBUG_r(a) if (debug & 512)    a
+#define DEBUG_x(a) if (debug & 1024)   a
+#define DEBUG_u(a) if (debug & 2048)   a
+#define DEBUG_L(a) if (debug & 4096)   a
+#define DEBUG_H(a) if (debug & 8192)   a
+#define DEBUG_X(a) if (debug & 16384)  a
+#define DEBUG_D(a) if (debug & 32768)  a
+#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_L(a)
+#define DEBUG_H(a)
+#define DEBUG_X(a)
+#define DEBUG_D(a)
 #endif
-EXT int perldb INIT(0);
 #define YYMAXDEPTH 300
 
-EXT line_t cmdline INIT(NOLINE);
-
-EXT STR str_undef;
-EXT STR str_no;
-EXT STR str_yes;
-
-/* runtime control stuff */
-
-EXT struct loop {
-    char *loop_label;          /* what the loop was called, if anything */
-    int loop_sp;               /* stack pointer to copy stuff down to */
-    jmp_buf loop_env;
-} *loop_stack;
-
-EXT int loop_ptr INIT(-1);
-EXT int loop_max INIT(128);
-
-EXT jmp_buf top_env;
-
-EXT char * VOLATILE goto_targ INIT(Nullch); /* cmd_exec gets strange when set */
+#define assert(what)   DEB( {                                          \
+       if (!(what)) {                                                  \
+           croak("Assertion failed: file \"%s\", line %d",             \
+               __FILE__, __LINE__);                                    \
+           exit(1);                                                    \
+       }})
 
 struct ufuncs {
-    int (*uf_val)();
-    int (*uf_set)();
-    int uf_index;
+    I32 (*uf_val)_((IV, SV*));
+    I32 (*uf_set)_((IV, SV*));
+    IV uf_index;
 };
 
-EXT ARRAY *stack;              /* THE STACK */
-
-EXT ARRAY * VOLATILE savestack;                /* to save non-local values on */
-
-EXT ARRAY *tosave;             /* strings to save on recursive subroutine */
-
-EXT ARRAY *lineary;            /* lines of script for debugger */
-EXT ARRAY *dbargs;             /* args to call listed by caller function */
-
-EXT ARRAY *fdpid;              /* keep fd-to-pid mappings for mypopen */
-EXT HASH *pidstatus;           /* keep pid-to-status mappings for waitpid */
-
-EXT int *di;                   /* for tmp use in debuggers */
-EXT char *dc;
-EXT short *ds;
-
 /* Fix these up for __STDC__ */
-EXT long basetime INIT(0);
-char *mktemp();
+#ifndef __cplusplus
+char *mktemp _((char*));
+double atof _((const char*));
+#endif
+
 #ifndef STANDARD_C
 /* All of these are in stdlib.h or time.h for ANSI C */
-double atof();
-long time();
+Time_t time();
 struct tm *gmtime(), *localtime();
-char *index(), *rindex();
+char *strchr(), *strrchr();
 char *strcpy(), *strcat();
 #endif /* ! STANDARD_C */
 
+
+#ifdef I_MATH
+#    include <math.h>
+#else
+#   ifdef __cplusplus
+       extern "C" {
+#   endif
+           double exp _((double));
+           double fmod _((double,double));
+           double log _((double));
+           double sqrt _((double));
+           double modf _((double,double*));
+           double sin _((double));
+           double cos _((double));
+           double atan2 _((double,double));
+           double pow _((double,double));
+#   ifdef __cplusplus
+       };
+#   endif
+#endif
+
+#if !defined(HAS_FMOD) && defined(HAS_DREM)
+#define fmod(x,y) drem((x),(y))
+#endif
+
+#ifndef __cplusplus
+char *crypt _((const char*, const char*));
+char *getenv _((const char*));
+Off_t lseek _((int,Off_t,int));
+char *getlogin _((void));
+#endif
+
 #ifdef EUNICE
 #define UNLINK unlnk
-int unlnk();
+I32 unlnk _((char*));
 #else
 #define UNLINK unlink
 #endif
 
 #ifndef HAS_SETREUID
-#ifdef HAS_SETRESUID
-#define setreuid(r,e) setresuid(r,e,-1)
-#define HAS_SETREUID
-#endif
+#  ifdef HAS_SETRESUID
+#    define setreuid(r,e) setresuid(r,e,(Uid_t)-1)
+#    define HAS_SETREUID
+#  endif
 #endif
 #ifndef HAS_SETREGID
-#ifdef HAS_SETRESGID
-#define setregid(r,e) setresgid(r,e,-1)
-#define HAS_SETREGID
+#  ifdef HAS_SETRESGID
+#    define setregid(r,e) setresgid(r,e,(Gid_t)-1)
+#    define HAS_SETREGID
+#  endif
+#endif
+
+#define SCAN_DEF 0
+#define SCAN_TR 1
+#define SCAN_REPL 2
+
+#ifdef DEBUGGING
+# ifndef register 
+#  define register
+# endif
+# define PAD_SV(po) pad_sv(po)
+#else
+# define PAD_SV(po) curpad[po]
+#endif
+
+/****************/
+/* Truly global */
+/****************/
+
+/* global state */
+EXT PerlInterpreter *  curinterp;      /* currently running interpreter */
+#ifndef VMS  /* VMS doesn't use environ array */
+extern char ** environ;        /* environment variables supplied via exec */
+#endif
+EXT int                uid;            /* current real user id */
+EXT int                euid;           /* current effective user id */
+EXT int                gid;            /* current real group id */
+EXT int                egid;           /* current effective 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 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 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 */
+
+/* Stack for currently executing thread--context switch must handle this.     */
+EXT SV **      stack_base;     /* stack->array_ary */
+EXT SV **      stack_sp;       /* stack pointer now */
+EXT SV **      stack_max;      /* stack->array_ary + stack->array_max */
+
+/* likewise for these */
+
+EXT OP *       op;             /* current op--oughta be in a global register */
+
+EXT I32 *      scopestack;     /* blocks we've entered */
+EXT I32                scopestack_ix;
+EXT I32                scopestack_max;
+
+EXT ANY*       savestack;      /* to save non-local values on */
+EXT I32                savestack_ix;
+EXT I32                savestack_max;
+
+EXT OP **      retstack;       /* returns we've pushed */
+EXT I32                retstack_ix;
+EXT I32                retstack_max;
+
+EXT I32 *      markstack;      /* stackmarks we're remembering */
+EXT I32 *      markstack_ptr;  /* stackmarks we're remembering */
+EXT I32 *      markstack_max;  /* stackmarks we're remembering */
+
+EXT SV **      curpad;
+
+/* temp space */
+EXT SV *       Sv;
+EXT XPV *      Xpv;
+EXT char       buf[1024];
+EXT char       tokenbuf[256];
+EXT struct stat        statbuf;
+#ifndef MSDOS
+EXT struct tms timesbuf;
+#endif
+EXT STRLEN na;         /* for use in SvPV when length is Not Applicable */
+
+/* for tmp use in stupid debuggers */
+EXT int *      di;
+EXT short *    ds;
+EXT char *     dc;
+
+/* handy constants */
+EXT char *     Yes INIT("1");
+EXT char *     No INIT("");
+EXT char *     hexdigit INIT("0123456789abcdef0123456789ABCDEFx");
+EXT char *     patleave INIT("\\.^$@dDwWsSbB+*?|()-nrtfeaxc0123456789[{]}");
+EXT char *     vert INIT("|");
+
+EXT char       warn_uninit[]
+  INIT("Use of uninitialized value");
+EXT char       warn_nosemi[]
+  INIT("Semicolon seems to be missing");
+EXT char       warn_reserved[]
+  INIT("Unquoted string \"%s\" may clash with future reserved word");
+EXT char       warn_nl[]
+  INIT("Unsuccessful %s on filename containing newline");
+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");
+EXT char       no_usym[]
+  INIT("Can't use an undefined value as %s reference");
+EXT char       no_aelem[]
+  INIT("Modification of non-creatable array value attempted, subscript %d");
+EXT char       no_helem[]
+  INIT("Modification of non-creatable hash value attempted, subscript \"%s\"");
+EXT char       no_modify[]
+  INIT("Modification of a read-only value attempted");
+EXT char       no_mem[]
+  INIT("Out of memory!\n");
+EXT char       no_security[]
+  INIT("Insecure dependency in %s%s");
+EXT char       no_sock_func[]
+  INIT("Unsupported socket function \"%s\" called");
+EXT char       no_dir_func[]
+  INIT("Unsupported directory function \"%s\" called");
+EXT char       no_func[]
+  INIT("The %s function is unimplemented");
+
+EXT SV         sv_undef;
+EXT SV         sv_no;
+EXT SV         sv_yes;
+#ifdef CSH
+    EXT char * cshname INIT(CSH);
+    EXT I32    cshlen;
+#endif
+
+#ifdef DOINIT
+EXT char *sig_name[] = {
+    SIG_NAME,0
+};
+#else
+EXT char *sig_name[];
+#endif
+
+#ifdef DOINIT
+EXT unsigned char fold[] = {   /* fast case folding table */
+       0,      1,      2,      3,      4,      5,      6,      7,
+       8,      9,      10,     11,     12,     13,     14,     15,
+       16,     17,     18,     19,     20,     21,     22,     23,
+       24,     25,     26,     27,     28,     29,     30,     31,
+       32,     33,     34,     35,     36,     37,     38,     39,
+       40,     41,     42,     43,     44,     45,     46,     47,
+       48,     49,     50,     51,     52,     53,     54,     55,
+       56,     57,     58,     59,     60,     61,     62,     63,
+       64,     'a',    'b',    'c',    'd',    'e',    'f',    'g',
+       'h',    'i',    'j',    'k',    'l',    'm',    'n',    'o',
+       'p',    'q',    'r',    's',    't',    'u',    'v',    'w',
+       'x',    'y',    'z',    91,     92,     93,     94,     95,
+       96,     'A',    'B',    'C',    'D',    'E',    'F',    'G',
+       'H',    'I',    'J',    'K',    'L',    'M',    'N',    'O',
+       'P',    'Q',    'R',    'S',    'T',    'U',    'V',    'W',
+       'X',    'Y',    'Z',    123,    124,    125,    126,    127,
+       128,    129,    130,    131,    132,    133,    134,    135,
+       136,    137,    138,    139,    140,    141,    142,    143,
+       144,    145,    146,    147,    148,    149,    150,    151,
+       152,    153,    154,    155,    156,    157,    158,    159,
+       160,    161,    162,    163,    164,    165,    166,    167,
+       168,    169,    170,    171,    172,    173,    174,    175,
+       176,    177,    178,    179,    180,    181,    182,    183,
+       184,    185,    186,    187,    188,    189,    190,    191,
+       192,    193,    194,    195,    196,    197,    198,    199,
+       200,    201,    202,    203,    204,    205,    206,    207,
+       208,    209,    210,    211,    212,    213,    214,    215,
+       216,    217,    218,    219,    220,    221,    222,    223,    
+       224,    225,    226,    227,    228,    229,    230,    231,
+       232,    233,    234,    235,    236,    237,    238,    239,
+       240,    241,    242,    243,    244,    245,    246,    247,
+       248,    249,    250,    251,    252,    253,    254,    255
+};
+#else
+EXT unsigned char fold[];
+#endif
+
+#ifdef DOINIT
+EXT unsigned char freq[] = {   /* letter frequencies for mixed English/C */
+       1,      2,      84,     151,    154,    155,    156,    157,
+       165,    246,    250,    3,      158,    7,      18,     29,
+       40,     51,     62,     73,     85,     96,     107,    118,
+       129,    140,    147,    148,    149,    150,    152,    153,
+       255,    182,    224,    205,    174,    176,    180,    217,
+       233,    232,    236,    187,    235,    228,    234,    226,
+       222,    219,    211,    195,    188,    193,    185,    184,
+       191,    183,    201,    229,    181,    220,    194,    162,
+       163,    208,    186,    202,    200,    218,    198,    179,
+       178,    214,    166,    170,    207,    199,    209,    206,
+       204,    160,    212,    216,    215,    192,    175,    173,
+       243,    172,    161,    190,    203,    189,    164,    230,
+       167,    248,    227,    244,    242,    255,    241,    231,
+       240,    253,    169,    210,    245,    237,    249,    247,
+       239,    168,    252,    251,    254,    238,    223,    221,
+       213,    225,    177,    197,    171,    196,    159,    4,
+       5,      6,      8,      9,      10,     11,     12,     13,
+       14,     15,     16,     17,     19,     20,     21,     22,
+       23,     24,     25,     26,     27,     28,     30,     31,
+       32,     33,     34,     35,     36,     37,     38,     39,
+       41,     42,     43,     44,     45,     46,     47,     48,
+       49,     50,     52,     53,     54,     55,     56,     57,
+       58,     59,     60,     61,     63,     64,     65,     66,
+       67,     68,     69,     70,     71,     72,     74,     75,
+       76,     77,     78,     79,     80,     81,     82,     83,
+       86,     87,     88,     89,     90,     91,     92,     93,
+       94,     95,     97,     98,     99,     100,    101,    102,
+       103,    104,    105,    106,    108,    109,    110,    111,
+       112,    113,    114,    115,    116,    117,    119,    120,
+       121,    122,    123,    124,    125,    126,    127,    128,
+       130,    131,    132,    133,    134,    135,    136,    137,
+       138,    139,    141,    142,    143,    144,    145,    146
+};
+#else
+EXT unsigned char freq[];
+#endif
+
+#ifdef DEBUGGING
+#ifdef DOINIT
+EXT char* block_type[] = {
+       "NULL",
+       "SUB",
+       "EVAL",
+       "LOOP",
+       "SUBST",
+       "BLOCK",
+};
+#else
+EXT char* block_type[];
+#endif
+#endif
+
+/*****************************************************************************/
+/* This lexer/parser stuff is currently global since yacc is hard to reenter */
+/*****************************************************************************/
+/* XXX This needs to be revisited, since BEGIN makes yacc re-enter... */
+
+#include "perly.h"
+
+typedef enum {
+    XOPERATOR,
+    XTERM,
+    XREF,
+    XSTATE,
+    XBLOCK,
+    XTERMBLOCK
+} expectation;
+
+EXT U32                lex_state;      /* next token is determined */
+EXT U32                lex_defer;      /* state after determined token */
+EXT expectation        lex_expect;     /* expect after determined token */
+EXT I32                lex_brackets;   /* bracket count */
+EXT I32                lex_formbrack;  /* bracket count at outer format level */
+EXT I32                lex_fakebrack;  /* outer bracket is mere delimiter */
+EXT I32                lex_casemods;   /* casemod count */
+EXT I32                lex_dojoin;     /* doing an array interpolation */
+EXT I32                lex_starts;     /* how many interps done on level */
+EXT SV *       lex_stuff;      /* runtime pattern from m// or s/// */
+EXT SV *       lex_repl;       /* runtime replacement from s/// */
+EXT OP *       lex_op;         /* extra info to pass back on op */
+EXT OP *       lex_inpat;      /* in pattern $) and $| are special */
+EXT I32                lex_inwhat;     /* what kind of quoting are we in */
+EXT char *     lex_brackstack; /* what kind of brackets to pop */
+EXT char *     lex_casestack;  /* what kind of case mods in effect */
+
+/* What we know when we're in LEX_KNOWNEXT state. */
+EXT YYSTYPE    nextval[5];     /* value of next token, if any */
+EXT I32                nexttype[5];    /* type of next token */
+EXT I32                nexttoke;
+
+EXT FILE * VOL rsfp INIT(Nullfp);
+EXT SV *       linestr;
+EXT char *     bufptr;
+EXT char *     oldbufptr;
+EXT char *     oldoldbufptr;
+EXT char *     bufend;
+EXT expectation expect INIT(XSTATE);   /* how to interpret ambiguous tokens */
+EXT char *     autoboot_preamble INIT(Nullch);
+
+EXT I32                multi_start;    /* 1st line of multi-line string */
+EXT I32                multi_end;      /* last line of multi-line string */
+EXT I32                multi_open;     /* delimiter of said string */
+EXT I32                multi_close;    /* delimiter of said string */
+
+EXT GV *       scrgv;
+EXT I32                error_count;    /* how many errors so far, max 10 */
+EXT I32                subline;        /* line this subroutine began on */
+EXT SV *       subname;        /* name of current 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                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 */
+EXT I32                padix_floor;    /* how low may inner block reset padix */
+EXT bool       pad_reset_pending; /* reset pad on next attempted alloc */
+EXT COP                compiling;
+
+EXT I32                thisexpr;       /* name id for nothing_in_common() */
+EXT char *     last_uni;       /* position of last named-unary operator */
+EXT char *     last_lop;       /* position of last list operator */
+EXT OPCODE     last_lop_op;    /* last list operator */
+EXT bool       in_my;          /* we're compiling a "my" declaration */
+#ifdef FCRYPT
+EXT I32                cryptseen;      /* has fast crypt() been initialized? */
+#endif
+
+EXT U32                hints;          /* various compilation flags */
+
+                               /* Note: the lowest 8 bits are reserved for
+                                  stuffing into op->op_private */
+#define HINT_INTEGER           0x00000001
+#define HINT_STRICT_REFS       0x00000002
+
+#define HINT_BLOCK_SCOPE       0x00000100
+#define HINT_STRICT_SUBS       0x00000200
+#define HINT_STRICT_VARS       0x00000400
+
+/**************************************************************************/
+/* This regexp stuff is global since it always happens within 1 expr eval */
+/**************************************************************************/
+
+EXT char *     regprecomp;     /* uncompiled string. */
+EXT char *     regparse;       /* Input-scan pointer. */
+EXT char *     regxend;        /* End of input for compile */
+EXT I32                regnpar;        /* () count. */
+EXT char *     regcode;        /* Code-emit pointer; &regdummy = don't. */
+EXT I32                regsize;        /* Code size. */
+EXT I32                regnaughty;     /* How bad is this pattern? */
+EXT I32                regsawback;     /* Did we see \1, ...? */
+
+EXT char *     reginput;       /* String-input pointer. */
+EXT char *     regbol;         /* Beginning of input, for ^ check. */
+EXT char *     regeol;         /* End of input, for $ check. */
+EXT char **    regstartp;      /* Pointer to startp array. */
+EXT char **    regendp;        /* Ditto for endp. */
+EXT U32 *      reglastparen;   /* Similarly for lastparen. */
+EXT char *     regtill;        /* How far we are required to go. */
+EXT U16                regflags;       /* are we folding, multilining? */
+EXT char       regprev;        /* char before regbol, \n if none */
+
+/***********************************************/
+/* Global only to current interpreter instance */
+/***********************************************/
+
+#ifdef MULTIPLICITY
+#define IEXT
+#define IINIT(x)
+struct interpreter {
+#else
+#define IEXT EXT
+#define IINIT(x) INIT(x)
+#endif
+
+/* pseudo environmental stuff */
+IEXT int       Iorigargc;
+IEXT char **   Iorigargv;
+IEXT GV *      Ienvgv;
+IEXT GV *      Isiggv;
+IEXT GV *      Iincgv;
+IEXT char *    Iorigfilename;
+
+/* 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 *    Isplitstr IINIT(" ");
+IEXT bool      Ipreprocess;
+IEXT bool      Iminus_n;
+IEXT bool      Iminus_p;
+IEXT bool      Iminus_l;
+IEXT bool      Iminus_a;
+IEXT bool      Iminus_F;
+IEXT bool      Idoswitches;
+IEXT bool      Idowarn;
+IEXT bool      Idoextract;
+IEXT bool      Isawampersand;  /* must save all match strings */
+IEXT bool      Isawstudy;      /* do fbm_instr on all strings */
+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 U32       Iperldb;
+
+/* 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 char *    Iofs;                   /* $, */
+IEXT STRLEN    Iofslen;
+IEXT char *    Iors;                   /* $\ */
+IEXT STRLEN    Iorslen;
+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 struct stat Istatcache;           /* _ */
+IEXT GV *      Istatgv;
+IEXT SV *      Istatname IINIT(Nullsv);
+
+/* shortcuts to various I/O objects */
+IEXT GV *      Istdingv;
+IEXT GV *      Ilast_in_gv;
+IEXT GV *      Idefgv;
+IEXT GV *      Iargvgv;
+IEXT GV *      Idefoutgv;
+IEXT GV *      Iargvoutgv;
+
+/* shortcuts to regexp stuff */
+IEXT GV *      Ileftgv;
+IEXT GV *      Iampergv;
+IEXT GV *      Irightgv;
+IEXT PMOP *    Icurpm;         /* what to do \ interps from */
+IEXT I32 *     Iscreamfirst;
+IEXT I32 *     Iscreamnext;
+IEXT I32       Imaxscream IINIT(-1);
+IEXT SV *      Ilastscream;
+
+/* shortcuts to debugging objects */
+IEXT GV *      IDBgv;
+IEXT GV *      IDBline;
+IEXT GV *      IDBsub;
+IEXT SV *      IDBsingle;
+IEXT SV *      IDBtrace;
+IEXT SV *      IDBsignal;
+IEXT AV *      Ilineary;       /* lines of script for debugger */
+IEXT AV *      Idbargs;        /* args to call listed by caller function */
+
+/* symbol tables */
+IEXT HV *      Idefstash;      /* main symbol table */
+IEXT HV *      Icurstash;      /* symbol table for current package */
+IEXT HV *      Idebstash;      /* symbol table for perldb package */
+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 */
+
+/* memory management */
+IEXT SV **     Itmps_stack;
+IEXT I32       Itmps_ix IINIT(-1);
+IEXT I32       Itmps_floor IINIT(-1);
+IEXT I32       Itmps_max;
+IEXT I32       Isv_count;      /* how many SV* are currently allocated */
+IEXT I32       Isv_objcount;   /* how many objects are currently allocated */
+IEXT SV*       Isv_root;       /* storage for SVs belonging to interp */
+IEXT SV*       Isv_arenaroot;  /* list of areas for garbage collection */
+
+/* funky return mechanisms */
+IEXT I32       Ilastspbase;
+IEXT I32       Ilastsize;
+IEXT int       Iforkprocess;   /* so do_open |- can return proc# */
+
+/* subprocess state */
+IEXT AV *      Ifdpid;         /* keep fd-to-pid mappings for my_popen */
+IEXT HV *      Ipidstatus;     /* keep pid-to-status mappings for waitpid */
+
+/* internal state */
+IEXT VOL int   Iin_eval;       /* trap "fatal" errors? */
+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 bool      Itainted;       /* using variables controlled by $< */
+IEXT bool      Itainting;      /* doing taint checks */
+
+/* trace state */
+IEXT I32       Idlevel;
+IEXT I32       Idlmax IINIT(128);
+IEXT char *    Idebname;
+IEXT char *    Idebdelim;
+
+/* current interpreter roots */
+IEXT OP *      Imain_root;
+IEXT OP *      Imain_start;
+IEXT OP *      Ieval_root;
+IEXT OP *      Ieval_start;
+
+/* runtime control stuff */
+IEXT COP * VOL Icurcop IINIT(&compiling);
+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 I32       Irunlevel;
+
+/* stack stuff */
+IEXT AV *      Istack;         /* 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 SV **     Imystack_max;   /* stack->array_ary + stack->array_max */
+
+/* format accumulators */
+IEXT SV *      Iformtarget;
+IEXT SV *      Ibodytarget;
+IEXT SV *      Itoptarget;
+
+/* statics moved here for shared library purposes */
+IEXT SV                Istrchop;       /* return value from chop */
+IEXT int       Ifilemode;      /* so nextargv() can preserve mode */
+IEXT int       Ilastfd;        /* what to preserve mode on */
+IEXT char *    Ioldname;       /* what to preserve mode on */
+IEXT char **   IArgv;          /* stuff to free from do_aexec, vfork safe */
+IEXT char *    ICmd;           /* stuff to free from do_aexec, vfork safe */
+IEXT OP *      Isortcop;       /* user defined sort routine */
+IEXT HV *      Isortstash;     /* which is in some package or other */
+IEXT GV *      Ifirstgv;       /* $a */
+IEXT GV *      Isecondgv;      /* $b */
+IEXT AV *      Isortstack;     /* temp stack during pp_sort() */
+IEXT AV *      Isignalstack;   /* temp stack during sighandler() */
+IEXT SV *      Imystrk;        /* temp key string for do_each() */
+IEXT I32       Idumplvl;       /* indentation level on syntax tree dump */
+IEXT PMOP *    Ioldlastpm;     /* for saving regexp context during debugger */
+IEXT I32       Igensym;        /* next symbol for getsym() to define */
+IEXT bool      Ipreambled;
+IEXT int       Ilaststatval IINIT(-1);
+IEXT I32       Ilaststype IINIT(OP_STAT);
+
+#undef IEXT
+#undef IINIT
+
+#ifdef MULTIPLICITY
+};
+#else
+struct interpreter {
+    char broiled;
+};
+#endif
+
+#include "pp.h"
+
+#ifdef __cplusplus
+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
+#define Perl_sv_setptrobj(rv,ptr,name) Perl_sv_setref_iv(rv,name,(IV)ptr)
+#define Perl_sv_setptrref(rv,ptr) Perl_sv_setref_iv(rv,Nullch,(IV)ptr)
+#else
+#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
+#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
+#endif
+
+#ifdef __cplusplus
+};
+#endif
+
+/* The following must follow proto.h */
+
+#ifdef DOINIT
+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,
+                                       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,
+                                                       0};
+MGVTBL vtbl_packelem = {magic_getpack,
+                               magic_setpack,
+                                       0,      magic_clearpack,
+                                                       0};
+MGVTBL vtbl_dbline =   {0,     magic_setdbline,
+                                       0,      0,      0};
+MGVTBL vtbl_isa =      {0,     magic_setisa,
+                                       0,      0,      0};
+MGVTBL vtbl_isaelem =  {0,     magic_setisa,
+                                       0,      0,      0};
+MGVTBL vtbl_arylen =   {magic_getarylen,
+                               magic_setarylen,
+                                       0,      0,      0};
+MGVTBL vtbl_glob =     {magic_getglob,
+                               magic_setglob,
+                                       0,      0,      0};
+MGVTBL vtbl_mglob =    {0,     magic_setmglob,
+                                       0,      0,      0};
+MGVTBL vtbl_taint =    {magic_gettaint,magic_settaint,
+                                       0,      0,      0};
+MGVTBL vtbl_substr =   {0,     magic_setsubstr,
+                                       0,      0,      0};
+MGVTBL vtbl_vec =      {0,     magic_setvec,
+                                       0,      0,      0};
+MGVTBL vtbl_pos =      {magic_getpos,
+                               magic_setpos,
+                                       0,      0,      0};
+MGVTBL vtbl_bm =       {0,     magic_setbm,
+                                       0,      0,      0};
+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};
+#endif /* OVERLOAD */
+
+#else
+EXT MGVTBL vtbl_sv;
+EXT MGVTBL vtbl_env;
+EXT MGVTBL vtbl_envelem;
+EXT MGVTBL vtbl_sig;
+EXT MGVTBL vtbl_sigelem;
+EXT MGVTBL vtbl_pack;
+EXT MGVTBL vtbl_packelem;
+EXT MGVTBL vtbl_dbline;
+EXT MGVTBL vtbl_isa;
+EXT MGVTBL vtbl_isaelem;
+EXT MGVTBL vtbl_arylen;
+EXT MGVTBL vtbl_glob;
+EXT MGVTBL vtbl_mglob;
+EXT MGVTBL vtbl_taint;
+EXT MGVTBL vtbl_substr;
+EXT MGVTBL vtbl_vec;
+EXT MGVTBL vtbl_pos;
+EXT MGVTBL vtbl_bm;
+EXT MGVTBL vtbl_uvar;
+
+#ifdef OVERLOAD
+EXT MGVTBL vtbl_amagic;
+EXT MGVTBL vtbl_amagicelem;
+#endif /* OVERLOAD */
+
+#endif
+
+#ifdef OVERLOAD
+EXT long amagic_generation;
+
+#define NofAMmeth 27
+#ifdef DOINIT
+EXT char * AMG_names[NofAMmeth][2] = {
+  {"fallback","abs"},
+  {"bool", "nomethod"},
+  {"\"\"", "0+"},
+  {"+","+="},
+  {"-","-="},
+  {"*", "*="},
+  {"/", "/="},
+  {"%", "%="},
+  {"**", "**="},
+  {"<<", "<<="},
+  {">>", ">>="},
+  {"<", "<="},
+  {">", ">="},
+  {"==", "!="},
+  {"<=>", "cmp"},
+  {"lt", "le"},
+  {"gt", "ge"},
+  {"eq", "ne"},
+  {"&", "^"},
+  {"|", "neg"},
+  {"!", "~"},
+  {"++", "--"},
+  {"atan2", "cos"},
+  {"sin", "exp"},
+  {"log", "sqrt"},
+  {"x","x="},
+  {".",".="}
+};
+#else
+EXT char * AMG_names[NofAMmeth][2];
+#endif /* def INITAMAGIC */
+
+struct  am_table        {
+  long was_ok_sub;
+  long was_ok_am;
+  CV* table[NofAMmeth*2];
+  long fallback;
+};
+typedef struct am_table AMT;
+
+#define AMGfallNEVER   1
+#define AMGfallNO      2
+#define AMGfallYES     3
+
+enum {
+  fallback_amg,        abs_amg,
+  bool__amg,   nomethod_amg,
+  string_amg,  numer_amg,
+  add_amg,     add_ass_amg,
+  subtr_amg,   subtr_ass_amg,
+  mult_amg,    mult_ass_amg,
+  div_amg,     div_ass_amg,
+  mod_amg,     mod_ass_amg,
+  pow_amg,     pow_ass_amg,
+  lshift_amg,  lshift_ass_amg,
+  rshift_amg,  rshift_ass_amg,
+  lt_amg,      le_amg,
+  gt_amg,      ge_amg,
+  eq_amg,      ne_amg,
+  ncmp_amg,    scmp_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
+};
+#endif /* OVERLOAD */
+
+#endif /* Include guard */