xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/gv.h (revision 0:68f95e015346)
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