📄 perl.h
字号:
# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
# endif
#endif
#ifdef INT_MIN
# define PERL_INT_MIN ((int)INT_MIN)
#else
# ifdef MININT
# define PERL_INT_MIN ((int)MININT)
# else
# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
# endif
#endif
#ifdef ULONG_MAX
# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
#else
# ifdef MAXULONG
# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
# else
# define PERL_ULONG_MAX (~(unsigned long)0)
# endif
#endif
#define PERL_ULONG_MIN ((unsigned long)0L)
#ifdef LONG_MAX
# define PERL_LONG_MAX ((long)LONG_MAX)
#else
# ifdef MAXLONG /* Often used in <values.h> */
# define PERL_LONG_MAX ((long)MAXLONG)
# else
# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
# endif
#endif
#ifdef LONG_MIN
# define PERL_LONG_MIN ((long)LONG_MIN)
#else
# ifdef MINLONG
# define PERL_LONG_MIN ((long)MINLONG)
# else
# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
# endif
#endif
#ifdef HAS_QUAD
# ifdef UQUAD_MAX
# define PERL_UQUAD_MAX ((UV)UQUAD_MAX)
# else
# define PERL_UQUAD_MAX (~(UV)0)
# endif
# define PERL_UQUAD_MIN ((UV)0)
# ifdef QUAD_MAX
# define PERL_QUAD_MAX ((IV)QUAD_MAX)
# else
# define PERL_QUAD_MAX ((IV) (PERL_UQUAD_MAX >> 1))
# endif
# ifdef QUAD_MIN
# define PERL_QUAD_MIN ((IV)QUAD_MIN)
# else
# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
# endif
#endif
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 loop LOOP;
typedef struct Outrec Outrec;
typedef struct interpreter PerlInterpreter;
#ifndef __BORLANDC__
typedef struct ff FF; /* XXX not defined anywhere, should go? */
#endif
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 gv GV;
typedef struct io IO;
typedef struct context PERL_CONTEXT;
typedef struct block BLOCK;
typedef struct magic MAGIC;
typedef struct xrv XRV;
typedef struct xpv XPV;
typedef struct xpviv XPVIV;
typedef struct xpvuv XPVUV;
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;
#include "handy.h"
#ifdef PERL_OBJECT
typedef I32 (*filter_t) _((CPerlObj*, int, SV *, int));
#else
typedef I32 (*filter_t) _((int, SV *, int));
#endif
#define FILTER_READ(idx, sv, len) filter_read(idx, sv, len)
#define FILTER_DATA(idx) (AvARRAY(PL_rsfp_filters)[idx])
#define FILTER_ISREADER(idx) (idx >= AvFILLp(PL_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
# if defined(MPE)
# include "mpeix/mpeixish.h"
# else
# include "unixish.h"
# endif
# endif
# endif
#endif
#ifndef FUNC_NAME_TO_PTR
#define FUNC_NAME_TO_PTR(name) name
#endif
/*
* USE_THREADS needs to be after unixish.h as <pthread.h> includes
* <sys/signal.h> which defines NSIG - which will stop inclusion of <signal.h>
* this results in many functions being undeclared which bothers C++
* May make sense to have threads after "*ish.h" anyway
*/
#ifdef USE_THREADS
/* pending resolution of licensing issues, we avoid the erstwhile
* atomic.h everywhere */
# define EMULATE_ATOMIC_REFCOUNTS
# ifdef FAKE_THREADS
# include "fakethr.h"
# else
# ifdef WIN32
# include <win32thread.h>
# else
# ifdef OS2
# include "os2thread.h"
# else
# include <pthread.h>
typedef pthread_t perl_os_thread;
typedef pthread_mutex_t perl_mutex;
typedef pthread_cond_t perl_cond;
typedef pthread_key_t perl_key;
# endif /* OS2 */
# endif /* WIN32 */
# endif /* FAKE_THREADS */
#endif /* USE_THREADS */
#ifdef VMS
# define STATUS_NATIVE PL_statusvalue_vms
# define STATUS_NATIVE_EXPORT \
((I32)PL_statusvalue_vms == -1 ? 44 : PL_statusvalue_vms)
# define STATUS_NATIVE_SET(n) \
STMT_START { \
PL_statusvalue_vms = (n); \
if ((I32)PL_statusvalue_vms == -1) \
PL_statusvalue = -1; \
else if (PL_statusvalue_vms & STS$M_SUCCESS) \
PL_statusvalue = 0; \
else if ((PL_statusvalue_vms & STS$M_SEVERITY) == 0) \
PL_statusvalue = 1 << 8; \
else \
PL_statusvalue = (PL_statusvalue_vms & STS$M_SEVERITY) << 8; \
} STMT_END
# define STATUS_POSIX PL_statusvalue
# ifdef VMSISH_STATUS
# define STATUS_CURRENT (VMSISH_STATUS ? STATUS_NATIVE : STATUS_POSIX)
# else
# define STATUS_CURRENT STATUS_POSIX
# endif
# define STATUS_POSIX_SET(n) \
STMT_START { \
PL_statusvalue = (n); \
if (PL_statusvalue != -1) { \
PL_statusvalue &= 0xFFFF; \
PL_statusvalue_vms = PL_statusvalue ? 44 : 1; \
} \
else PL_statusvalue_vms = -1; \
} STMT_END
# define STATUS_ALL_SUCCESS (PL_statusvalue = 0, PL_statusvalue_vms = 1)
# define STATUS_ALL_FAILURE (PL_statusvalue = 1, PL_statusvalue_vms = 44)
#else
# define STATUS_NATIVE STATUS_POSIX
# define STATUS_NATIVE_EXPORT STATUS_POSIX
# define STATUS_NATIVE_SET STATUS_POSIX_SET
# define STATUS_POSIX PL_statusvalue
# define STATUS_POSIX_SET(n) \
STMT_START { \
PL_statusvalue = (n); \
if (PL_statusvalue != -1) \
PL_statusvalue &= 0xFFFF; \
} STMT_END
# define STATUS_CURRENT STATUS_POSIX
# define STATUS_ALL_SUCCESS (PL_statusvalue = 0)
# define STATUS_ALL_FAILURE (PL_statusvalue = 1)
#endif
/* Some unistd.h's give a prototype for pause() even though
HAS_PAUSE ends up undefined. This causes the #define
below to be rejected by the compmiler. Sigh.
*/
#ifdef HAS_PAUSE
#define Pause pause
#else
#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
#ifdef UNION_ANY_DEFINITION
UNION_ANY_DEFINITION;
#else
union any {
void* any_ptr;
I32 any_i32;
IV any_iv;
long any_long;
void (CPERLscope(*any_dptr)) _((void*));
};
#endif
#ifdef USE_THREADS
#define ARGSproto struct perl_thread *thr
#else
#define ARGSproto void
#endif /* USE_THREADS */
/* Work around some cygwin32 problems with importing global symbols */
#if defined(CYGWIN32) && defined(DLLIMPORT)
# include "cw32imp.h"
#endif
#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"
#include "bytecode.h"
#include "byterun.h"
/* Current curly descriptor */
typedef struct curcur CURCUR;
struct curcur {
int parenfloor; /* how far back to strip paren data */
int cur; /* how many instances of scan we've matched */
int min; /* the minimal number of scans to match */
int max; /* the maximal number of scans to match */
int minmod; /* whether to work our way up or down */
regnode * scan; /* the thing to match */
regnode * next; /* what has to match after it */
char * lastloc; /* where we started matching this scan */
CURCUR * oldcc; /* current curly before we started this one */
};
typedef struct _sublex_info SUBLEXINFO;
struct _sublex_info {
I32 super_state; /* lexer state to save */
I32 sub_inwhat; /* "lex_inwhat" to use */
OP *sub_op; /* "lex_op" to use */
};
#ifdef PERL_OBJECT
struct magic_state {
SV* mgs_sv;
U32 mgs_flags;
};
typedef struct magic_state MGS;
typedef struct {
I32 len_min;
I32 len_delta;
I32 pos_min;
I32 pos_delta;
SV *last_found;
I32 last_end; /* min value, <0 unless valid. */
I32 last_start_min;
I32 last_start_max;
SV **longest; /* Either &l_fixed, or &l_float. */
SV *longest_fixed;
I32 offset_fixed;
SV *longest_float;
I32 offset_float_min;
I32 offset_float_max;
I32 flags;
} scan_data_t;
typedef I32 CHECKPOINT;
#endif /* PERL_OBJECT */
/* work around some libPW problems */
#ifdef DOINIT
EXT char Error[1];
#endif
#if defined(iAPX286) || defined(M_I286) || defined(I80286)
# define I286
#endif
#if defined(htonl) && !defined(HAS_HTONL)
#define HAS_HTONL
#endif
#if defined(htons) && !defined(HAS_HTONS)
#define HAS_HTONS
#endif
#if defined(ntohl) && !defined(HAS_NTOHL)
#define HAS_NTOHL
#endif
#if defined(ntohs) && !defined(HAS_NTOHS)
#define HAS_NTOHS
#endif
#ifndef HAS_HTONL
#if (BYTEORDER & 0xffff) != 0x4321
#define HAS_HTONS
#define HAS_HTONL
#define HAS_NTOHS
#define HAS_NTOHL
#define MYSWAP
#define htons my_swap
#define htonl my_htonl
#define ntohs my_swap
#define ntohl my_ntohl
#endif
#else
#if (BYTEORDER & 0xffff) == 0x4321
#undef HAS_HTONS
#undef HAS_HTONL
#undef HAS_NTOHS
#undef HAS_NTOHL
#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) ((U16)(what))
#define U_I(what) ((unsigned int)(what))
#define U_L(what) ((U32)(what))
#else
EXTERN_C 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
START_EXTERN_C
I32 cast_i32 _((double));
IV cast_iv _((double));
UV cast_uv _((double));
END_EXTERN_C
#define I_32(what) (cast_i32((double)(what)))
#define I_V(what) (cast_iv((double)(what)))
#define U_V(what) (cast_uv((double)(what)))
#endif
struct Outrec {
I32 o_lines;
char *o_str;
U32 o_len;
};
#ifndef MAXSYSFD
# define MAXSYSFD 2
#endif
#ifndef TMPPATH
# define TMPPATH "/tmp/perl-eXXXXXX"
#endif
#ifndef __cplusplus
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 PerlIO_stderr()
#endif
#undef YYDEBUG
#define YYDEBUG 1
#define DEB(a) a
#define DEBUG(a) if (PL_debug) a
#define DEBUG_p(a) if (PL_debug & 1) a
#define DEBUG_s(a) if (PL_debug & 2) a
#define DEBUG_l(a) if (PL_debug & 4) a
#define DEBUG_t(a) if (PL_debug & 8) a
#define DEBUG_o(a) if (PL_debug & 16) a
#define DEBUG_c(a) if (PL_debug & 32) a
#define DEBUG_P(a) if (PL_debug & 64) a
#define DEBUG_m(a) if (PL_curinterp && PL_debug & 128) a
#define DEBUG_f(a) if (PL_debug & 256) a
#define DEBUG_r(a) if (PL_debug & 512) a
#define DEBUG_x(a) if (PL_debug & 1024) a
#define DEBUG_u(a) if (PL_debug & 2048) a
#define DEBUG_L(a) if (PL_debug & 4096) a
#define DEBUG_H(a) if (PL_debug & 8192) a
#define DEBUG_X(a) if (PL_debug & 16384) a
#define DEBUG_D(a) if (PL_debug & 32768) a
# ifdef USE_THREADS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -