-/* $RCSfile: perl.h,v $$Revision: 4.1 $$Date: 92/08/07 18:25:56 $
+/* 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.1 92/08/07 18:25:56 lwall
- *
- * Revision 4.0.1.6 92/06/08 14:55:10 lwall
- * patch20: added Atari ST portability
- * patch20: bcopy() and memcpy() now tested for overlap safety
- * patch20: Perl now distinguishes overlapped copies from non-overlapped
- * patch20: removed implicit int declarations on functions
- *
- * Revision 4.0.1.5 91/11/11 16:41:07 lwall
- * patch19: uts wrongly defines S_ISDIR() et al
- * patch19: too many preprocessors can't expand a macro right in #if
- * patch19: added little-endian pack/unpack options
- *
- * Revision 4.0.1.4 91/11/05 18:06:10 lwall
- * patch11: various portability fixes
- * patch11: added support for dbz
- * patch11: added some support for 64-bit integers
- * patch11: hex() didn't understand leading 0x
- *
- * Revision 4.0.1.3 91/06/10 01:25:10 lwall
- * patch10: certain pattern optimizations were botched
- *
- * 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
+
+/*
+ * 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 VOIDWANT 1
-#ifdef __cplusplus
-#include "config_c++.h"
-#else
+#define VOIDUSED 1
#include "config.h"
-#endif
#ifndef BYTEORDER
# define BYTEORDER 0x1234
* 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
-char Error[1];
-#endif
-
/* 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(_AIX) || defined(__stdc__) || defined(__cplusplus)
+#if defined(__STDC__) || defined(vax11c) || defined(_AIX) || defined(__stdc__) || defined(__cplusplus)
# define STANDARD_C 1
#endif
-#if defined(STANDARD_C)
-# define P(args) args
-#else
-# define P(args) ()
-#endif
-
#if defined(HASVOLATILE) || defined(STANDARD_C)
# ifdef __cplusplus
# define VOL // to temporarily suppress warnings
#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
-# ifndef HAS_GETPGRP
-# define HAS_GETPGRP
+#ifdef USE_BSDPGRP
+# ifdef HAS_GETPGRP
+# define BSD_GETPGRP(pid) getpgrp((pid))
# endif
-# define getpgrp getpgrp2
-#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
-# define setpgrp setpgrp2
#endif
#include <stdio.h>
+
+#ifdef USE_NEXT_CTYPE
+
+#if NX_CURRENT_COMPILER_RELEASE >= 400
+#include <objc/NXCType.h>
+#else /* NX_CURRENT_COMPILER_RELEASE < 400 */
+#include <appkit/NXCType.h>
+#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 */
+#undef METHOD
+#endif
+
#include <setjmp.h>
-#ifndef MSDOS
+#ifdef I_SYS_PARAM
# ifdef PARAM_NEEDS_TYPES
# include <sys/types.h>
# endif
/* Use all the "standard" definitions? */
-#ifdef STANDARD_C
+#if defined(STANDARD_C) && defined(I_STDLIB)
# 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)
# include <string.h>
-# define MEM_SIZE size_t
#else
- typedef unsigned int MEM_SIZE;
-#endif /* STANDARD_C */
+# include <strings.h>
+#endif
+
+#if !defined(HAS_STRCHR) && defined(HAS_INDEX) && !defined(strchr)
+#define strchr index
+#define strrchr rindex
+#endif
-#if defined(HAS_MEMCMP) && defined(mips) && defined(ultrix)
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
# undef HAS_MEMCMP
#endif
+#ifdef I_MEMORY
+# include <memory.h>
+#endif
+
#ifdef HAS_MEMCPY
-# ifndef STANDARD_C
+# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memcpy
- extern char * memcpy P((char*, char*, int));
+ extern char * memcpy _((char*, char*, int));
# endif
# endif
#else
#endif /* HAS_MEMCPY */
#ifdef HAS_MEMSET
-# ifndef STANDARD_C
+# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memset
- extern char *memset P((char*, int, int));
+ extern char *memset _((char*, int, int));
# endif
# endif
# define memzero(d,l) memset(d,0,l)
#endif /* HAS_MEMSET */
#ifdef HAS_MEMCMP
-# ifndef STANDARD_C
+# if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
# ifndef memcmp
- extern int memcmp P((char*, char*, int));
+ extern int memcmp _((char*, char*, int));
# endif
# endif
#else
# ifndef memcmp
-# define memcmp(s1,s2,l) my_memcmp(s1,s2,l)
+# define memcmp my_memcmp
# 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)
# endif
#endif /* HAS_BCMP */
-#ifndef HAS_MEMMOVE
-# if defined(HAS_BCOPY) && defined(SAFE_BCOPY)
+#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(SAFE_MEMCPY)
+# 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)
# include <netinet/in.h>
#endif
+#ifdef I_SYS_STAT
#include <sys/stat.h>
+#endif
-#if defined(uts) || defined(UTekV)
+/* 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
-# define S_ISDIR(P) (((P)&S_IFMT)==S_IFDIR)
-# define S_ISCHR(P) (((P)&S_IFMT)==S_IFCHR)
-# define S_ISBLK(P) (((P)&S_IFMT)==S_IFBLK)
-# define S_ISREG(P) (((P)&S_IFMT)==S_IFREG)
-# define S_ISFIFO(P) (((P)&S_IFMT)==S_IFIFO)
-# ifdef S_IFLNK
-# define S_ISLNK(P) (((P)&S_IFMT)==S_IFLNK)
-# endif
#endif
#ifdef I_TIME
#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
#endif
+#ifndef HAS_MKFIFO
+# ifndef mkfifo
+# define mkfifo(path, mode) (mknod((path), (mode) | S_IFIFO, 0))
+# endif
+#endif /* !HAS_MKFIFO */
+
#include <errno.h>
+#ifdef HAS_SOCKET
+# ifdef I_NET_ERRNO
+# 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) STMT_START {set_errno(errcode); set_vaxc_errno(vmserrcode);} STMT_END
+#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 P((int));
-# else
+#ifdef HAS_STRERROR
+# ifdef VMS
+ char *strerror _((int,...));
+# else
+ char *strerror _((int));
+# endif
+# ifndef Strerror
+# define Strerror strerror
+# endif
+#else
+# ifdef HAS_SYS_ERRLIST
extern int sys_nerr;
extern char *sys_errlist[];
-# define strerror(e) \
+# ifndef Strerror
+# define Strerror(e) \
((e) < 0 || (e) >= sys_nerr ? "(unknown)" : sys_errlist[e])
+# endif
# endif
#endif
-#ifdef I_SYSIOCTL
+#ifdef I_SYS_IOCTL
# ifndef _IOCTL_
# include <sys/ioctl.h>
# endif
# ifdef HAS_SOCKETPAIR
# undef HAS_SOCKETPAIR
# endif
-# ifdef HAS_NDBM
-# undef HAS_NDBM
+# ifdef I_NDBM
+# undef I_NDBM
# endif
#endif
# 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
# else
# include <sys/dir.h>
# endif
-# define DIRENT direct
# endif
# endif
#endif
# undef ff_next
#endif
-#if defined(cray) || defined(gould) || defined(i860)
+#if defined(cray) || defined(gould) || defined(i860) || defined(pyr)
# define SLOPPYDIVIDE
#endif
-#if defined(cray) || defined(convex) || defined (uts) || BYTEORDER > 0xffff
-# define QUAD
+#if defined(cray) || defined(convex) || BYTEORDER > 0xffff
+# define HAS_QUAD
+#endif
+
+#ifdef UV
+#undef UV
#endif
-#ifdef QUAD
+#ifdef HAS_QUAD
# ifdef cray
-# define quad int
+# define Quad_t int
# else
-# if defined(convex) || defined (uts)
-# define quad long long
+# if defined(convex)
+# define Quad_t long long
# else
-# define quad long
+# define Quad_t long
# endif
# endif
-#endif
-
-#ifdef VOIDSIG
-# define VOIDRET void
-#else
-# define VOIDRET int
-#endif
-
-#ifdef DOSISH
-# include "dosish.h"
+ typedef Quad_t IV;
+ typedef unsigned Quad_t UV;
#else
-# include "unixish.h"
-#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 io IO;
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 gv 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 xpvcv XPVCV;
typedef struct xpvbm XPVBM;
typedef struct xpvfm XPVFM;
+typedef struct xpvio XPVIO;
typedef struct mgvtbl MGVTBL;
typedef union any ANY;
#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
+# 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
+
+#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 {
void* any_ptr;
I32 any_i32;
+ IV any_iv;
+ long any_long;
+ void (*any_dptr) _((void*));
};
#include "regexp.h"
#include "mg.h"
#include "scope.h"
-#if defined(iAPX286) || defined(M_I286) || defined(I80286)
-# define I286
+/* work around some libPW problems */
+#ifdef DOINIT
+EXT char Error[1];
#endif
-#ifndef STANDARD_C
-# ifdef CHARSPRINTF
- char *sprintf P((char *, ...));
-# else
- int sprintf P((char *, ...));
-# endif
+#if defined(iAPX286) || defined(M_I286) || defined(I80286)
+# define I286
#endif
#if defined(htonl) && !defined(HAS_HTONL)
#define U_I(what) ((unsigned int)(what))
#define U_L(what) ((U32)(what))
#else
-U32 cast_ulong P((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))
+U32 cast_ulong _((double));
+#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((double)(what)))
+IV cast_iv _((double));
+#define I_V(what) (cast_iv((double)(what)))
+UV cast_uv _((double));
+#define U_V(what) (cast_uv((double)(what)))
#endif
struct Outrec {
# define MAXSYSFD 2
#endif
-#ifndef DOSISH
-#define TMPPATH "/tmp/perl-eXXXXXX"
-#else
-#define TMPPATH "plXXXXXX"
-#endif /* MSDOS */
+#ifndef TMPPATH
+# define TMPPATH "/tmp/perl-eXXXXXX"
+#endif
#ifndef __cplusplus
-UIDTYPE getuid P(());
-UIDTYPE geteuid P(());
-GIDTYPE getgid P(());
-GIDTYPE getegid P(());
+Uid_t getuid _((void));
+Uid_t geteuid _((void));
+Gid_t getgid _((void));
+Gid_t getegid _((void));
#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
#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_L(a)
#define DEBUG_H(a)
#define DEBUG_X(a)
+#define DEBUG_D(a)
#endif
#define YYMAXDEPTH 300
}})
struct ufuncs {
- I32 (*uf_val)P((I32, SV*));
- I32 (*uf_set)P((I32, SV*));
- I32 uf_index;
+ I32 (*uf_val)_((IV, SV*));
+ I32 (*uf_set)_((IV, SV*));
+ IV uf_index;
};
/* Fix these up for __STDC__ */
-char *mktemp P((char*));
-double atof P((const char*));
+#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 */
-long time();
+Time_t time();
struct tm *gmtime(), *localtime();
char *strchr(), *strrchr();
char *strcpy(), *strcat();
# ifdef __cplusplus
extern "C" {
# endif
- double exp P((double));
- double log P((double));
- double sqrt P((double));
- double modf P((double,int*));
- double sin P((double));
- double cos P((double));
- double atan2 P((double,double));
- double pow P((double,double));
+ double exp _((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
+#ifndef __cplusplus
+char *crypt _((const char*, const char*));
+char *getenv _((const char*));
+Off_t lseek _((int,Off_t,int));
+char *getlogin _((void));
+#endif
-char *crypt P((const char*, const char*));
-char *getenv P((const char*));
-long lseek P((int,int,int));
-char *getlogin P((void));
-
-#ifdef EUNICE
+#ifdef UNLINK_ALL_VERSIONS /* Currently only makes sense for VMS */
#define UNLINK unlnk
-int unlnk P((char*));
+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
-#endif
+# ifdef HAS_SETRESGID
+# define setregid(r,e) setresgid(r,e,(Gid_t)-1)
+# define HAS_SETREGID
+# endif
#endif
#define SCAN_DEF 0
#define SCAN_REPL 2
#ifdef DEBUGGING
-#define PAD_SV(po) pad_sv(po)
+# 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]
+# define PAD_SV(po) curpad[po]
#endif
/****************/
/****************/
/* global state */
-EXT PerlInterpreter *curinterp; /* currently running interpreter */
+EXT PerlInterpreter * curinterp; /* currently running interpreter */
+/* 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 */
+#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;
-#ifndef MSDOS
+#ifdef HAS_TIMES
EXT struct tms timesbuf;
#endif
EXT STRLEN na; /* for use in SvPV when length is Not Applicable */
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 string (\"%.32s\") as %s ref while \"strict refs\" in use");
EXT char no_usym[]
- INIT("Can't use an undefined value to create a symbol");
+ 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("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 };
+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 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,
- XBLOCK,
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(XBLOCK); /* how to interpret ambiguous tokens */
+EXT expectation expect INIT(XSTATE); /* how to interpret ambiguous tokens */
+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 * comppadname; /* variable names for "my" variables */
-EXT I32 comppadnamefill;/* last "introduced" variable offset */
+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 */
+EXT I32 padix_floor; /* how low may inner block reset padix */
+EXT I32 pad_reset_pending; /* reset pad on next attempted alloc */
EXT COP compiling;
-EXT SV * evstr; /* op_fold_const() temp string cache */
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 bool in_format; /* we're compiling a run_format */
+EXT OPCODE last_lop_op; /* last list operator */
EXT bool in_my; /* we're compiling a "my" declaration */
-EXT I32 needblockscope INIT(TRUE); /* block overhead needed? */
#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
+#define HINT_STRICT_UNTIE 0x00000800
+
/**************************************************************************/
/* This regexp stuff is global since it always happens within 1 expr eval */
/**************************************************************************/
EXT I32 regnpar; /* () count. */
EXT char * regcode; /* Code-emit pointer; ®dummy = don't. */
EXT I32 regsize; /* Code size. */
-EXT I32 regfold; /* are we folding? */
-EXT I32 regsawbracket; /* Did we do {d,d} trick? */
+EXT I32 regnaughty; /* How bad is this pattern? */
EXT I32 regsawback; /* Did we see \1, ...? */
EXT char * reginput; /* String-input pointer. */
-EXT char regprev; /* char before regbol, \n if none */
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 char * reglastparen; /* Similarly for lastparen. */
+EXT U32 * reglastparen; /* Similarly for lastparen. */
EXT char * regtill; /* How far we are required to go. */
-EXT I32 regmyp_size;
-EXT char ** regmystartp;
-EXT char ** regmyendp;
+EXT U16 regflags; /* are we folding, multilining? */
+EXT char regprev; /* char before regbol, \n if none */
/***********************************************/
/* Global only to current interpreter instance */
/***********************************************/
-#ifdef EMBEDDED
+#ifdef MULTIPLICITY
#define IEXT
#define IINIT(x)
struct interpreter {
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 char Ipatchlevel[10];
+IEXT char ** Ilocalpatches;
+IEXT SV * Inrs;
+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 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 I32 Iarybase; /* $[ */
+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 I32 Irslen IINIT(1);
-IEXT bool Irspara;
+IEXT SV * Irs; /* $/ */
IEXT char * Iofs; /* $, */
-IEXT I32 Iofslen;
+IEXT STRLEN Iofslen;
IEXT char * Iors; /* $\ */
-IEXT I32 Iorslen;
+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 U32 Istatusvalue; /* $? */
IEXT struct stat Istatcache; /* _ */
IEXT GV * Istatgv;
IEXT GV * Idefgv;
IEXT GV * Iargvgv;
IEXT GV * Idefoutgv;
-IEXT GV * Icuroutgv;
IEXT GV * Iargvoutgv;
/* shortcuts to regexp stuff */
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 * Ifreestrroot;
IEXT SV ** Itmps_stack;
IEXT I32 Itmps_ix IINIT(-1);
IEXT I32 Itmps_floor IINIT(-1);
-IEXT I32 Itmps_max 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 VOL int Iin_eval; /* trap "fatal" errors? */
IEXT OP * Irestartop; /* Are we propagating an error from croak? */
IEXT int Idelaymagic; /* ($<,$>) = ... */
-IEXT bool Idirty; /* clean before rerunning */
-IEXT bool Ilocalizing; /* are we processing a local() list? */
+IEXT bool Idirty; /* In the middle of tearing things down? */
+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;
/* 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);
#undef IEXT
#undef IINIT
-#ifdef EMBEDDED
+#ifdef MULTIPLICITY
};
#else
struct interpreter {
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,
+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,
- 0, 0, 0};
-MGVTBL vtbl_sig = {0, 0, 0, 0, 0};
-MGVTBL vtbl_sigelem = {0, magic_setsig,
- 0, 0, 0};
-MGVTBL vtbl_pack = {0, 0,
- 0, 0, 0};
-MGVTBL vtbl_packelem = {magic_getpack,
+EXT MGVTBL vtbl_env = {0, 0, 0, 0, 0};
+EXT MGVTBL vtbl_envelem = {0, magic_setenv,
+ 0, magic_clearenv,
+ 0};
+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};
+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_bm = {0, magic_setbm,
+EXT MGVTBL vtbl_pos = {magic_getpos,
+ magic_setpos,
0, 0, 0};
-MGVTBL vtbl_uvar = {magic_getuvar,
+EXT MGVTBL vtbl_bm = {0, magic_setbm,
+ 0, 0, 0};
+EXT MGVTBL vtbl_uvar = {magic_getuvar,
magic_setuvar,
0, 0, 0};
+
+#ifdef OVERLOAD
+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
EXT MGVTBL vtbl_sv;
EXT MGVTBL vtbl_env;
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 29
+#ifdef DOINIT
+EXT char * AMG_names[NofAMmeth][2] = {
+ {"fallback","abs"},
+ {"bool", "nomethod"},
+ {"\"\"", "0+"},
+ {"+","+="},
+ {"-","-="},
+ {"*", "*="},
+ {"/", "/="},
+ {"%", "%="},
+ {"**", "**="},
+ {"<<", "<<="},
+ {">>", ">>="},
+ {"&", "&="},
+ {"|", "|="},
+ {"^", "^="},
+ {"<", "<="},
+ {">", ">="},
+ {"==", "!="},
+ {"<=>", "cmp"},
+ {"lt", "le"},
+ {"gt", "ge"},
+ {"eq", "ne"},
+ {"!", "~"},
+ {"++", "--"},
+ {"atan2", "cos"},
+ {"sin", "exp"},
+ {"log", "sqrt"},
+ {"x","x="},
+ {".",".="},
+ {"=","neg"}
+};
+#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,
+ 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,
+ ncmp_amg, scmp_amg,
+ slt_amg, sle_amg,
+ sgt_amg, sge_amg,
+ seq_amg, sne_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,
+ copy_amg, neg_amg
+};
+#endif /* OVERLOAD */
+
+#endif /* Include guard */