source: trunk/third/perl/gv.h @ 14545

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