perl 3.0 patch #44 patch #42, continued
[p5sagit/p5-mst-13.2.git] / stab.h
1 /* $Header: stab.h,v 3.0.1.4 90/10/16 10:33:08 lwall Locked $
2  *
3  *    Copyright (c) 1989, Larry Wall
4  *
5  *    You may distribute under the terms of the GNU General Public License
6  *    as specified in the README file that comes with the perl 3.0 kit.
7  *
8  * $Log:        stab.h,v $
9  * Revision 3.0.1.4  90/10/16  10:33:08  lwall
10  * patch29: *foo now prints as *package'foo
11  * patch29: package behavior is now more consistent
12  * 
13  * Revision 3.0.1.3  90/08/09  05:18:42  lwall
14  * patch19: Added support for linked-in C subroutines
15  * 
16  * Revision 3.0.1.2  90/03/12  17:00:43  lwall
17  * patch13: did some ndir straightening up for Xenix
18  * 
19  * Revision 3.0.1.1  89/12/21  20:19:53  lwall
20  * patch7: in stab.h, added some CRIPPLED_CC support for Microport
21  * 
22  * Revision 3.0  89/10/18  15:23:30  lwall
23  * 3.0 baseline
24  * 
25  */
26
27 struct stabptrs {
28     char        stbp_magic[4];
29     STR         *stbp_val;      /* scalar value */
30     struct stio *stbp_io;       /* filehandle value */
31     FCMD        *stbp_form;     /* format value */
32     ARRAY       *stbp_array;    /* array value */
33     HASH        *stbp_hash;     /* associative array value */
34     HASH        *stbp_stash;    /* symbol table for this stab */
35     SUBR        *stbp_sub;      /* subroutine value */
36     int         stbp_lastexpr;  /* used by nothing_in_common() */
37     line_t      stbp_line;      /* line first declared at (for -w) */
38     char        stbp_flags;
39 };
40
41 #if defined(CRIPPLED_CC) && (defined(iAPX286) || defined(M_I286) || defined(I80286))
42 #define MICROPORT
43 #endif
44
45 #define stab_magic(stab)        (((STBP*)(stab->str_ptr))->stbp_magic)
46 #define stab_val(stab)          (((STBP*)(stab->str_ptr))->stbp_val)
47 #define stab_io(stab)           (((STBP*)(stab->str_ptr))->stbp_io)
48 #define stab_form(stab)         (((STBP*)(stab->str_ptr))->stbp_form)
49 #define stab_xarray(stab)       (((STBP*)(stab->str_ptr))->stbp_array)
50 #ifdef  MICROPORT       /* Microport 2.4 hack */
51 ARRAY *stab_array();
52 #else
53 #define stab_array(stab)        (((STBP*)(stab->str_ptr))->stbp_array ? \
54                                  ((STBP*)(stab->str_ptr))->stbp_array : \
55                                  ((STBP*)(aadd(stab)->str_ptr))->stbp_array)
56 #endif
57 #define stab_xhash(stab)        (((STBP*)(stab->str_ptr))->stbp_hash)
58 #ifdef  MICROPORT       /* Microport 2.4 hack */
59 HASH *stab_hash();
60 #else
61 #define stab_hash(stab)         (((STBP*)(stab->str_ptr))->stbp_hash ? \
62                                  ((STBP*)(stab->str_ptr))->stbp_hash : \
63                                  ((STBP*)(hadd(stab)->str_ptr))->stbp_hash)
64 #endif                  /* Microport 2.4 hack */
65 #define stab_stash(stab)        (((STBP*)(stab->str_ptr))->stbp_stash)
66 #define stab_sub(stab)          (((STBP*)(stab->str_ptr))->stbp_sub)
67 #define stab_lastexpr(stab)     (((STBP*)(stab->str_ptr))->stbp_lastexpr)
68 #define stab_line(stab)         (((STBP*)(stab->str_ptr))->stbp_line)
69 #define stab_flags(stab)        (((STBP*)(stab->str_ptr))->stbp_flags)
70 #define stab_name(stab)         (stab->str_magic->str_ptr)
71
72 #define SF_VMAGIC 1             /* call routine to dereference STR val */
73 #define SF_MULTI 2              /* seen more than once */
74
75 struct stio {
76     FILE        *ifp;           /* ifp and ofp are normally the same */
77     FILE        *ofp;           /* but sockets need separate streams */
78 #ifdef READDIR
79     DIR         *dirp;          /* for opendir, readdir, etc */
80 #endif
81     long        lines;          /* $. */
82     long        page;           /* $% */
83     long        page_len;       /* $= */
84     long        lines_left;     /* $- */
85     char        *top_name;      /* $^ */
86     STAB        *top_stab;      /* $^ */
87     char        *fmt_name;      /* $~ */
88     STAB        *fmt_stab;      /* $~ */
89     short       subprocess;     /* -| or |- */
90     char        type;
91     char        flags;
92 };
93
94 #define IOF_ARGV 1      /* this fp iterates over ARGV */
95 #define IOF_START 2     /* check for null ARGV and substitute '-' */
96 #define IOF_FLUSH 4     /* this fp wants a flush after write op */
97
98 struct sub {
99     CMD         *cmd;
100     int         (*usersub)();
101     int         userindex;
102     STAB        *filestab;
103     long        depth;  /* >= 2 indicates recursive call */
104     ARRAY       *tosave;
105 };
106
107 #define Nullstab Null(STAB*)
108
109 #define STAB_STR(s) (tmpstab = (s), stab_flags(tmpstab) & SF_VMAGIC ? stab_str(stab_val(tmpstab)->str_magic) : stab_val(tmpstab))
110 #define STAB_GET(s) (tmpstab = (s), str_get(stab_flags(tmpstab) & SF_VMAGIC ? stab_str(tmpstab->str_magic) : stab_val(tmpstab)))
111 #define STAB_GNUM(s) (tmpstab = (s), str_gnum(stab_flags(tmpstab) & SF_VMAGIC ? stab_str(tmpstab->str_magic) : stab_val(tmpstab)))
112
113 EXT STAB *tmpstab;
114
115 EXT STAB *stab_index[128];
116
117 EXT unsigned short statusvalue;
118
119 EXT int delaymagic INIT(0);
120 #define DM_DELAY 1
121 #define DM_REUID 2
122 #define DM_REGID 4
123
124 STAB *aadd();
125 STAB *hadd();
126 STAB *fstab();