1*0Sstevel@tonic-gate /* gv.h 2*0Sstevel@tonic-gate * 3*0Sstevel@tonic-gate * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 4*0Sstevel@tonic-gate * 2000, 2001, 2002, by Larry Wall and others 5*0Sstevel@tonic-gate * 6*0Sstevel@tonic-gate * You may distribute under the terms of either the GNU General Public 7*0Sstevel@tonic-gate * License or the Artistic License, as specified in the README file. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate */ 10*0Sstevel@tonic-gate 11*0Sstevel@tonic-gate struct gp { 12*0Sstevel@tonic-gate SV * gp_sv; /* scalar value */ 13*0Sstevel@tonic-gate U32 gp_refcnt; /* how many globs point to this? */ 14*0Sstevel@tonic-gate struct io * gp_io; /* filehandle value */ 15*0Sstevel@tonic-gate CV * gp_form; /* format value */ 16*0Sstevel@tonic-gate AV * gp_av; /* array value */ 17*0Sstevel@tonic-gate HV * gp_hv; /* hash value */ 18*0Sstevel@tonic-gate GV * gp_egv; /* effective gv, if *glob */ 19*0Sstevel@tonic-gate CV * gp_cv; /* subroutine value */ 20*0Sstevel@tonic-gate U32 gp_cvgen; /* generational validity of cached gv_cv */ 21*0Sstevel@tonic-gate U32 gp_flags; /* XXX unused */ 22*0Sstevel@tonic-gate line_t gp_line; /* line first declared at (for -w) */ 23*0Sstevel@tonic-gate char * gp_file; /* file first declared in (for -w) */ 24*0Sstevel@tonic-gate }; 25*0Sstevel@tonic-gate 26*0Sstevel@tonic-gate #define GvXPVGV(gv) ((XPVGV*)SvANY(gv)) 27*0Sstevel@tonic-gate 28*0Sstevel@tonic-gate #define GvGP(gv) (GvXPVGV(gv)->xgv_gp) 29*0Sstevel@tonic-gate #define GvNAME(gv) (GvXPVGV(gv)->xgv_name) 30*0Sstevel@tonic-gate #define GvNAMELEN(gv) (GvXPVGV(gv)->xgv_namelen) 31*0Sstevel@tonic-gate #define GvSTASH(gv) (GvXPVGV(gv)->xgv_stash) 32*0Sstevel@tonic-gate #define GvFLAGS(gv) (GvXPVGV(gv)->xgv_flags) 33*0Sstevel@tonic-gate 34*0Sstevel@tonic-gate /* 35*0Sstevel@tonic-gate =head1 GV Functions 36*0Sstevel@tonic-gate 37*0Sstevel@tonic-gate =for apidoc Am|SV*|GvSV|GV* gv 38*0Sstevel@tonic-gate 39*0Sstevel@tonic-gate Return the SV from the GV. 40*0Sstevel@tonic-gate 41*0Sstevel@tonic-gate =cut 42*0Sstevel@tonic-gate */ 43*0Sstevel@tonic-gate 44*0Sstevel@tonic-gate #define GvSV(gv) (GvGP(gv)->gp_sv) 45*0Sstevel@tonic-gate #define GvREFCNT(gv) (GvGP(gv)->gp_refcnt) 46*0Sstevel@tonic-gate #define GvIO(gv) ((gv) && SvTYPE((SV*)gv) == SVt_PVGV && GvGP(gv) ? GvIOp(gv) : 0) 47*0Sstevel@tonic-gate #define GvIOp(gv) (GvGP(gv)->gp_io) 48*0Sstevel@tonic-gate #define GvIOn(gv) (GvIO(gv) ? GvIOp(gv) : GvIOp(gv_IOadd(gv))) 49*0Sstevel@tonic-gate 50*0Sstevel@tonic-gate #define GvFORM(gv) (GvGP(gv)->gp_form) 51*0Sstevel@tonic-gate #define GvAV(gv) (GvGP(gv)->gp_av) 52*0Sstevel@tonic-gate 53*0Sstevel@tonic-gate /* This macro is deprecated. Do not use! */ 54*0Sstevel@tonic-gate #define GvREFCNT_inc(gv) ((GV*)SvREFCNT_inc(gv)) /* DO NOT USE */ 55*0Sstevel@tonic-gate 56*0Sstevel@tonic-gate #define GvAVn(gv) (GvGP(gv)->gp_av ? \ 57*0Sstevel@tonic-gate GvGP(gv)->gp_av : \ 58*0Sstevel@tonic-gate GvGP(gv_AVadd(gv))->gp_av) 59*0Sstevel@tonic-gate #define GvHV(gv) ((GvGP(gv))->gp_hv) 60*0Sstevel@tonic-gate 61*0Sstevel@tonic-gate #define GvHVn(gv) (GvGP(gv)->gp_hv ? \ 62*0Sstevel@tonic-gate GvGP(gv)->gp_hv : \ 63*0Sstevel@tonic-gate GvGP(gv_HVadd(gv))->gp_hv) 64*0Sstevel@tonic-gate 65*0Sstevel@tonic-gate #define GvCV(gv) (GvGP(gv)->gp_cv) 66*0Sstevel@tonic-gate #define GvCVGEN(gv) (GvGP(gv)->gp_cvgen) 67*0Sstevel@tonic-gate #define GvCVu(gv) (GvGP(gv)->gp_cvgen ? Nullcv : GvGP(gv)->gp_cv) 68*0Sstevel@tonic-gate 69*0Sstevel@tonic-gate #define GvGPFLAGS(gv) (GvGP(gv)->gp_flags) 70*0Sstevel@tonic-gate 71*0Sstevel@tonic-gate #define GvLINE(gv) (GvGP(gv)->gp_line) 72*0Sstevel@tonic-gate #define GvFILE(gv) (GvGP(gv)->gp_file) 73*0Sstevel@tonic-gate #define GvFILEGV(gv) (gv_fetchfile(GvFILE(gv))) 74*0Sstevel@tonic-gate 75*0Sstevel@tonic-gate #define GvEGV(gv) (GvGP(gv)->gp_egv) 76*0Sstevel@tonic-gate #define GvENAME(gv) GvNAME(GvEGV(gv) ? GvEGV(gv) : gv) 77*0Sstevel@tonic-gate #define GvESTASH(gv) GvSTASH(GvEGV(gv) ? GvEGV(gv) : gv) 78*0Sstevel@tonic-gate 79*0Sstevel@tonic-gate #define GVf_INTRO 0x01 80*0Sstevel@tonic-gate #define GVf_MULTI 0x02 81*0Sstevel@tonic-gate #define GVf_ASSUMECV 0x04 82*0Sstevel@tonic-gate #define GVf_IN_PAD 0x08 83*0Sstevel@tonic-gate #define GVf_IMPORTED 0xF0 84*0Sstevel@tonic-gate #define GVf_IMPORTED_SV 0x10 85*0Sstevel@tonic-gate #define GVf_IMPORTED_AV 0x20 86*0Sstevel@tonic-gate #define GVf_IMPORTED_HV 0x40 87*0Sstevel@tonic-gate #define GVf_IMPORTED_CV 0x80 88*0Sstevel@tonic-gate 89*0Sstevel@tonic-gate #define GvINTRO(gv) (GvFLAGS(gv) & GVf_INTRO) 90*0Sstevel@tonic-gate #define GvINTRO_on(gv) (GvFLAGS(gv) |= GVf_INTRO) 91*0Sstevel@tonic-gate #define GvINTRO_off(gv) (GvFLAGS(gv) &= ~GVf_INTRO) 92*0Sstevel@tonic-gate 93*0Sstevel@tonic-gate #define GvMULTI(gv) (GvFLAGS(gv) & GVf_MULTI) 94*0Sstevel@tonic-gate #define GvMULTI_on(gv) (GvFLAGS(gv) |= GVf_MULTI) 95*0Sstevel@tonic-gate #define GvMULTI_off(gv) (GvFLAGS(gv) &= ~GVf_MULTI) 96*0Sstevel@tonic-gate 97*0Sstevel@tonic-gate #define GvASSUMECV(gv) (GvFLAGS(gv) & GVf_ASSUMECV) 98*0Sstevel@tonic-gate #define GvASSUMECV_on(gv) (GvFLAGS(gv) |= GVf_ASSUMECV) 99*0Sstevel@tonic-gate #define GvASSUMECV_off(gv) (GvFLAGS(gv) &= ~GVf_ASSUMECV) 100*0Sstevel@tonic-gate 101*0Sstevel@tonic-gate #define GvIMPORTED(gv) (GvFLAGS(gv) & GVf_IMPORTED) 102*0Sstevel@tonic-gate #define GvIMPORTED_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED) 103*0Sstevel@tonic-gate #define GvIMPORTED_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED) 104*0Sstevel@tonic-gate 105*0Sstevel@tonic-gate #define GvIMPORTED_SV(gv) (GvFLAGS(gv) & GVf_IMPORTED_SV) 106*0Sstevel@tonic-gate #define GvIMPORTED_SV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_SV) 107*0Sstevel@tonic-gate #define GvIMPORTED_SV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_SV) 108*0Sstevel@tonic-gate 109*0Sstevel@tonic-gate #define GvIMPORTED_AV(gv) (GvFLAGS(gv) & GVf_IMPORTED_AV) 110*0Sstevel@tonic-gate #define GvIMPORTED_AV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_AV) 111*0Sstevel@tonic-gate #define GvIMPORTED_AV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_AV) 112*0Sstevel@tonic-gate 113*0Sstevel@tonic-gate #define GvIMPORTED_HV(gv) (GvFLAGS(gv) & GVf_IMPORTED_HV) 114*0Sstevel@tonic-gate #define GvIMPORTED_HV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_HV) 115*0Sstevel@tonic-gate #define GvIMPORTED_HV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_HV) 116*0Sstevel@tonic-gate 117*0Sstevel@tonic-gate #define GvIMPORTED_CV(gv) (GvFLAGS(gv) & GVf_IMPORTED_CV) 118*0Sstevel@tonic-gate #define GvIMPORTED_CV_on(gv) (GvFLAGS(gv) |= GVf_IMPORTED_CV) 119*0Sstevel@tonic-gate #define GvIMPORTED_CV_off(gv) (GvFLAGS(gv) &= ~GVf_IMPORTED_CV) 120*0Sstevel@tonic-gate 121*0Sstevel@tonic-gate #define GvIN_PAD(gv) (GvFLAGS(gv) & GVf_IN_PAD) 122*0Sstevel@tonic-gate #define GvIN_PAD_on(gv) (GvFLAGS(gv) |= GVf_IN_PAD) 123*0Sstevel@tonic-gate #define GvIN_PAD_off(gv) (GvFLAGS(gv) &= ~GVf_IN_PAD) 124*0Sstevel@tonic-gate 125*0Sstevel@tonic-gate /* XXX: all GvFLAGS options are used, borrowing GvGPFLAGS for the moment */ 126*0Sstevel@tonic-gate 127*0Sstevel@tonic-gate #define GVf_UNIQUE 0x0001 128*0Sstevel@tonic-gate #define GvUNIQUE(gv) (GvGP(gv) && (GvGPFLAGS(gv) & GVf_UNIQUE)) 129*0Sstevel@tonic-gate #define GvUNIQUE_on(gv) (GvGPFLAGS(gv) |= GVf_UNIQUE) 130*0Sstevel@tonic-gate #define GvUNIQUE_off(gv) (GvGPFLAGS(gv) &= ~GVf_UNIQUE) 131*0Sstevel@tonic-gate 132*0Sstevel@tonic-gate #ifdef USE_ITHREADS 133*0Sstevel@tonic-gate #define GV_UNIQUE_CHECK 134*0Sstevel@tonic-gate #else 135*0Sstevel@tonic-gate #undef GV_UNIQUE_CHECK 136*0Sstevel@tonic-gate #endif 137*0Sstevel@tonic-gate 138*0Sstevel@tonic-gate #define Nullgv Null(GV*) 139*0Sstevel@tonic-gate 140*0Sstevel@tonic-gate #define DM_UID 0x003 141*0Sstevel@tonic-gate #define DM_RUID 0x001 142*0Sstevel@tonic-gate #define DM_EUID 0x002 143*0Sstevel@tonic-gate #define DM_GID 0x030 144*0Sstevel@tonic-gate #define DM_RGID 0x010 145*0Sstevel@tonic-gate #define DM_EGID 0x020 146*0Sstevel@tonic-gate #define DM_DELAY 0x100 147*0Sstevel@tonic-gate 148*0Sstevel@tonic-gate /* 149*0Sstevel@tonic-gate * symbol creation flags, for use in gv_fetchpv() and get_*v() 150*0Sstevel@tonic-gate */ 151*0Sstevel@tonic-gate #define GV_ADD 0x01 /* add, if symbol not already there */ 152*0Sstevel@tonic-gate #define GV_ADDMULTI 0x02 /* add, pretending it has been added already */ 153*0Sstevel@tonic-gate #define GV_ADDWARN 0x04 /* add, but warn if symbol wasn't already there */ 154*0Sstevel@tonic-gate #define GV_ADDINEVAL 0x08 /* add, as though we're doing so within an eval */ 155*0Sstevel@tonic-gate #define GV_NOINIT 0x10 /* add, but don't init symbol, if type != PVGV */ 156