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 + -
显示快捷键?