a3e1cef9c008096ddd9260dd6e02d6cb665338ca
[p5sagit/p5-mst-13.2.git] / gv.h
1 /* $RCSfile: gv.h,v $$Revision: 4.1 $$Date: 92/08/07 18:26:42 $
2  *
3  *    Copyright (c) 1991, 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  * $Log:        gv.h,v $
9  * Revision 4.1  92/08/07  18:26:42  lwall
10  * 
11  * Revision 4.0.1.3  92/06/08  15:33:44  lwall
12  * patch20: fixed confusion between a *var's real name and its effective name
13  * patch20: ($<,$>) = ... didn't work on some architectures
14  * 
15  * Revision 4.0.1.2  91/11/05  18:36:15  lwall
16  * patch11: length($x) was sometimes wrong for numeric $x
17  * 
18  * Revision 4.0.1.1  91/06/07  11:56:35  lwall
19  * patch4: new copyright notice
20  * patch4: length($`), length($&), length($') now optimized to avoid string copy
21  * 
22  * Revision 4.0  91/03/20  01:39:49  lwall
23  * 4.0 baseline.
24  * 
25  */
26
27 struct gp {
28     SV *        gp_sv;          /* scalar value */
29     U32         gp_refcnt;      /* how many globs point to this? */
30     struct io * gp_io;          /* filehandle value */
31     CV *        gp_form;        /* format value */
32     AV *        gp_av;          /* array value */
33     HV *        gp_hv;          /* associative array value */
34     GV *        gp_egv;         /* effective gv, if *glob */
35     CV *        gp_cv;          /* subroutine value */
36     I32         gp_lastexpr;    /* used by nothing_in_common() */
37     line_t      gp_line;        /* line first declared at (for -w) */
38     char        gp_flags;
39 };
40
41 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
42 #define MICROPORT
43 #endif
44
45 #define GvXPVGV(gv)     ((XPVGV*)SvANY(gv))
46
47 #define GvMAGIC(gv)     (GvGP(gv)->gp_magic)
48 #define GvSV(gv)        (GvGP(gv)->gp_sv)
49 #define GvREFCNT(gv)    (GvGP(gv)->gp_refcnt)
50 #define GvIO(gv)        (GvGP(gv)->gp_io)
51 #define GvIOn(gv)       (GvIO(gv) ?                     \
52                          GvIO(gv) :                     \
53                          (GvIO(gv) = newIO()))
54
55 #define GvFORM(gv)      (GvGP(gv)->gp_form)
56 #define GvAV(gv)        (GvGP(gv)->gp_av)
57
58 #ifdef  MICROPORT       /* Microport 2.4 hack */
59 AV *GvAVn();
60 #else
61 #define GvAVn(gv)       (GvGP(gv)->gp_av ? \
62                          GvGP(gv)->gp_av : \
63                          GvGP(gv_AVadd(gv))->gp_av)
64 #endif
65 #define GvHV(gv)        ((GvGP(gv))->gp_hv)
66
67 #ifdef  MICROPORT       /* Microport 2.4 hack */
68 HV *GvHVn();
69 #else
70 #define GvHVn(gv)       (GvGP(gv)->gp_hv ? \
71                          GvGP(gv)->gp_hv : \
72                          GvGP(gv_HVadd(gv))->gp_hv)
73 #endif                  /* Microport 2.4 hack */
74
75 #define GvCV(gv)        (GvGP(gv)->gp_cv)
76
77 #define GvLASTEXPR(gv)  (GvGP(gv)->gp_lastexpr)
78
79 #define GvLINE(gv)      (GvGP(gv)->gp_line)
80
81 #define GvFLAGS(gv)     (GvGP(gv)->gp_flags)
82
83 #define GvEGV(gv)       (GvGP(gv)->gp_egv)
84
85 #define GvGP(gv)        (GvXPVGV(gv)->xgv_gp)
86 #define GvNAME(gv)      (GvXPVGV(gv)->xgv_name)
87 #define GvNAMELEN(gv)   (GvXPVGV(gv)->xgv_namelen)
88 #define GvENAME(gv)     GvNAME(GvEGV(gv))
89
90 #define GvSTASH(gv)     (GvXPVGV(gv)->xgv_stash)
91 #define GvESTASH(gv)    GvSTASH(GvEGV(gv))
92
93 struct io {
94     FILE *      ifp;            /* ifp and ofp are normally the same */
95     FILE *      ofp;            /* but sockets need separate streams */
96 #ifdef HAS_READDIR
97     DIR *       dirp;           /* for opendir, readdir, etc */
98 #endif
99     long        lines;          /* $. */
100     long        page;           /* $% */
101     long        page_len;       /* $= */
102     long        lines_left;     /* $- */
103     char *      top_name;       /* $^ */
104     GV *        top_gv;         /* $^ */
105     char *      fmt_name;       /* $~ */
106     GV *        fmt_gv;         /* $~ */
107     short       subprocess;     /* -| or |- */
108     char        type;
109     char        flags;
110 };
111
112 #define IOf_ARGV 1      /* this fp iterates over ARGV */
113 #define IOf_START 2     /* check for null ARGV and substitute '-' */
114 #define IOf_FLUSH 4     /* this fp wants a flush after write op */
115
116 #define Nullgv Null(GV*)
117
118 #define DM_UID   0x003
119 #define DM_RUID   0x001
120 #define DM_EUID   0x002
121 #define DM_GID   0x030
122 #define DM_RGID   0x010
123 #define DM_EGID   0x020
124 #define DM_DELAY 0x100
125