sv.h

来自「MSYS在windows下模拟了一个类unix的终端」· C头文件 代码 · 共 1,102 行 · 第 1/3 页

H
1,102
字号
/*    sv.h * *    Copyright (c) 1991-2001, 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. * */#ifdef sv_flags#undef sv_flags		/* Convex has this in <signal.h> for sigvec() */#endif/*=for apidoc AmU||svtypeAn enum of flags for Perl types.  These are found in the file B<sv.h> in the C<svtype> enum.  Test these flags with the C<SvTYPE> macro.=for apidoc AmU||SVt_PVPointer type flag for scalars.  See C<svtype>.=for apidoc AmU||SVt_IVInteger type flag for scalars.  See C<svtype>.=for apidoc AmU||SVt_NVDouble type flag for scalars.  See C<svtype>.=for apidoc AmU||SVt_PVMGType flag for blessed scalars.  See C<svtype>.=for apidoc AmU||SVt_PVAVType flag for arrays.  See C<svtype>.=for apidoc AmU||SVt_PVHVType flag for hashes.  See C<svtype>.=for apidoc AmU||SVt_PVCVType flag for code refs.  See C<svtype>.=cut*/typedef enum {	SVt_NULL,	/* 0 */	SVt_IV,		/* 1 */	SVt_NV,		/* 2 */	SVt_RV,		/* 3 */	SVt_PV,		/* 4 */	SVt_PVIV,	/* 5 */	SVt_PVNV,	/* 6 */	SVt_PVMG,	/* 7 */	SVt_PVBM,	/* 8 */	SVt_PVLV,	/* 9 */	SVt_PVAV,	/* 10 */	SVt_PVHV,	/* 11 */	SVt_PVCV,	/* 12 */	SVt_PVGV,	/* 13 */	SVt_PVFM,	/* 14 */	SVt_PVIO	/* 15 */} svtype;/* Using C's structural equivalence to help emulate C++ inheritance here... */struct STRUCT_SV {    void*	sv_any;		/* pointer to something */    U32		sv_refcnt;	/* how many references to us */    U32		sv_flags;	/* what we are */};struct gv {    XPVGV*	sv_any;		/* pointer to something */    U32		sv_refcnt;	/* how many references to us */    U32		sv_flags;	/* what we are */};struct cv {    XPVCV*	sv_any;		/* pointer to something */    U32		sv_refcnt;	/* how many references to us */    U32		sv_flags;	/* what we are */};struct av {    XPVAV*	sv_any;		/* pointer to something */    U32		sv_refcnt;	/* how many references to us */    U32		sv_flags;	/* what we are */};struct hv {    XPVHV*	sv_any;		/* pointer to something */    U32		sv_refcnt;	/* how many references to us */    U32		sv_flags;	/* what we are */};struct io {    XPVIO*	sv_any;		/* pointer to something */    U32		sv_refcnt;	/* how many references to us */    U32		sv_flags;	/* what we are */};/*=for apidoc Am|U32|SvREFCNT|SV* svReturns the value of the object's reference count.=for apidoc Am|SV*|SvREFCNT_inc|SV* svIncrements the reference count of the given SV.=for apidoc Am|void|SvREFCNT_dec|SV* svDecrements the reference count of the given SV.=for apidoc Am|svtype|SvTYPE|SV* svReturns the type of the SV.  See C<svtype>.=for apidoc Am|void|SvUPGRADE|SV* sv|svtype typeUsed to upgrade an SV to a more complex form.  Uses C<sv_upgrade> toperform the upgrade if necessary.  See C<svtype>.=cut*/#define SvANY(sv)	(sv)->sv_any#define SvFLAGS(sv)	(sv)->sv_flags#define SvREFCNT(sv)	(sv)->sv_refcnt#ifdef USE_THREADS#  if defined(VMS)#    define ATOMIC_INC(count) __ATOMIC_INCREMENT_LONG(&count)#    define ATOMIC_DEC_AND_TEST(res,count) res=(1==__ATOMIC_DECREMENT_LONG(&count)) #  else#    ifdef EMULATE_ATOMIC_REFCOUNTS #      define ATOMIC_INC(count) STMT_START {	\	  MUTEX_LOCK(&PL_svref_mutex);		\	  ++count;				\	  MUTEX_UNLOCK(&PL_svref_mutex);		\       } STMT_END#      define ATOMIC_DEC_AND_TEST(res,count) STMT_START {	\	  MUTEX_LOCK(&PL_svref_mutex);			\	  res = (--count == 0);				\	  MUTEX_UNLOCK(&PL_svref_mutex);			\       } STMT_END#    else#      define ATOMIC_INC(count) atomic_inc(&count)#      define ATOMIC_DEC_AND_TEST(res,count) (res = atomic_dec_and_test(&count))#    endif /* EMULATE_ATOMIC_REFCOUNTS */#  endif /* VMS */#else#  define ATOMIC_INC(count) (++count)#  define ATOMIC_DEC_AND_TEST(res, count) (res = (--count == 0))#endif /* USE_THREADS */#ifdef __GNUC__#  define SvREFCNT_inc(sv)		\    ({					\	SV *nsv = (SV*)(sv);		\	if (nsv)			\	     ATOMIC_INC(SvREFCNT(nsv));	\	nsv;				\    })#else#  if defined(CRIPPLED_CC) || defined(USE_THREADS)#    if defined(VMS) && defined(__ALPHA)#      define SvREFCNT_inc(sv) \          (PL_Sv=(SV*)(sv), (PL_Sv && __ATOMIC_INCREMENT_LONG(&(SvREFCNT(PL_Sv)))), (SV *)PL_Sv)#    else#      define SvREFCNT_inc(sv) sv_newref((SV*)sv)#    endif#  else#    define SvREFCNT_inc(sv)	\	((PL_Sv=(SV*)(sv)), (PL_Sv && ATOMIC_INC(SvREFCNT(PL_Sv))), (SV*)PL_Sv)#  endif#endif#define SvREFCNT_dec(sv)	sv_free((SV*)sv)#define SVTYPEMASK	0xff#define SvTYPE(sv)	((sv)->sv_flags & SVTYPEMASK)#define SvUPGRADE(sv, mt) (SvTYPE(sv) >= mt || sv_upgrade(sv, mt))#define SVs_PADBUSY	0x00000100	/* reserved for tmp or my already */#define SVs_PADTMP	0x00000200	/* in use as tmp */#define SVs_PADMY	0x00000400	/* in use a "my" variable */#define SVs_TEMP	0x00000800	/* string is stealable? */#define SVs_OBJECT	0x00001000	/* is "blessed" */#define SVs_GMG		0x00002000	/* has magical get method */#define SVs_SMG		0x00004000	/* has magical set method */#define SVs_RMG		0x00008000	/* has random magical methods */#define SVf_IOK		0x00010000	/* has valid public integer value */#define SVf_NOK		0x00020000	/* has valid public numeric value */#define SVf_POK		0x00040000	/* has valid public pointer value */#define SVf_ROK		0x00080000	/* has a valid reference pointer */#define SVf_FAKE	0x00100000	/* glob or lexical is just a copy */#define SVf_OOK		0x00200000	/* has valid offset value */#define SVf_BREAK	0x00400000	/* refcnt is artificially low */#define SVf_READONLY	0x00800000	/* may not be modified */#define SVp_IOK		0x01000000	/* has valid non-public integer value */#define SVp_NOK		0x02000000	/* has valid non-public numeric value */#define SVp_POK		0x04000000	/* has valid non-public pointer value */#define SVp_SCREAM	0x08000000	/* has been studied? */#define SVf_UTF8        0x20000000      /* SvPVX is UTF-8 encoded */#define SVf_THINKFIRST	(SVf_READONLY|SVf_ROK|SVf_FAKE|SVf_UTF8)#define SVf_OK		(SVf_IOK|SVf_NOK|SVf_POK|SVf_ROK| \			 SVp_IOK|SVp_NOK|SVp_POK)#define SVf_AMAGIC	0x10000000      /* has magical overloaded methods */#define PRIVSHIFT 8/* Some private flags. *//* SVpad_OUR may be set on SVt_PV{NV,MG,GV} types */#define SVpad_OUR	0x80000000	/* pad name is "our" instead of "my" */#define SVf_IVisUV	0x80000000	/* use XPVUV instead of XPVIV */#define SVpfm_COMPILED	0x80000000	/* FORMLINE is compiled */#define SVpbm_VALID	0x80000000#define SVpbm_TAIL	0x40000000#define SVrepl_EVAL	0x40000000	/* Replacement part of s///e */#define SVphv_SHAREKEYS 0x20000000	/* keys live on shared string table */#define SVphv_LAZYDEL	0x40000000	/* entry in xhv_eiter must be deleted */#define SVprv_WEAKREF   0x80000000      /* Weak reference */struct xrv {    SV *	xrv_rv;		/* pointer to another SV */};struct xpv {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */};struct xpviv {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */};struct xpvuv {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    UV		xuv_uv;		/* unsigned value or pv offset */};struct xpvnv {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV    	xnv_nv;		/* numeric value, if any */};/* These structure must match the beginning of struct xpvhv in hv.h. */struct xpvmg {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV    	xnv_nv;		/* numeric value, if any */    MAGIC*	xmg_magic;	/* linked list of magicalness */    HV*		xmg_stash;	/* class package */};struct xpvlv {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV    	xnv_nv;		/* numeric value, if any */    MAGIC*	xmg_magic;	/* linked list of magicalness */    HV*		xmg_stash;	/* class package */    STRLEN	xlv_targoff;    STRLEN	xlv_targlen;    SV*		xlv_targ;    char	xlv_type;};struct xpvgv {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV		xnv_nv;		/* numeric value, if any */    MAGIC*	xmg_magic;	/* linked list of magicalness */    HV*		xmg_stash;	/* class package */    GP*		xgv_gp;    char*	xgv_name;    STRLEN	xgv_namelen;    HV*		xgv_stash;    U8		xgv_flags;};struct xpvbm {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV		xnv_nv;		/* numeric value, if any */    MAGIC*	xmg_magic;	/* linked list of magicalness */    HV*		xmg_stash;	/* class package */    I32		xbm_useful;	/* is this constant pattern being useful? */    U16		xbm_previous;	/* how many characters in string before rare? */    U8		xbm_rare;	/* rarest character in string */};/* This structure much match XPVCV in cv.h */typedef U16 cv_flags_t;struct xpvfm {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV		xnv_nv;		/* numeric value, if any */    MAGIC*	xmg_magic;	/* linked list of magicalness */    HV*		xmg_stash;	/* class package */    HV *	xcv_stash;    OP *	xcv_start;    OP *	xcv_root;    void      (*xcv_xsub)(pTHXo_ CV*);    ANY		xcv_xsubany;    GV *	xcv_gv;    char *	xcv_file;    long	xcv_depth;	/* >= 2 indicates recursive call */    AV *	xcv_padlist;    CV *	xcv_outside;#ifdef USE_THREADS    perl_mutex *xcv_mutexp;	/* protects xcv_owner */    struct perl_thread *xcv_owner;	/* current owner thread */#endif /* USE_THREADS */    cv_flags_t	xcv_flags;    I32		xfm_lines;};struct xpvio {    char *	xpv_pv;		/* pointer to malloced string */    STRLEN	xpv_cur;	/* length of xpv_pv as a C string */    STRLEN	xpv_len;	/* allocated size */    IV		xiv_iv;		/* integer value or pv offset */    NV		xnv_nv;		/* numeric value, if any */    MAGIC*	xmg_magic;	/* linked list of magicalness */    HV*		xmg_stash;	/* class package */    PerlIO *	xio_ifp;	/* ifp and ofp are normally the same */    PerlIO *	xio_ofp;	/* but sockets need separate streams */    /* Cray addresses everything by word boundaries (64 bits) and     * code and data pointers cannot be mixed (which is exactly what     * Perl_filter_add() tries to do with the dirp), hence the following

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?