Commit | Line | Data |
79072805 |
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 | |