xref: /illumos-gate/usr/src/cmd/sh/mode.h (revision 711890bc9379ceea66272dc8d4981812224ea86e)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
26 /* All Rights Reserved */
27 
28 #pragma ident	"%Z%%M%	%I%	%E% SMI"
29 
30 #ifndef _MODE_H
31 #define	_MODE_H
32 
33 /*
34  *	UNIX shell
35  */
36 
37 #include <unistd.h>
38 
39 #ifdef pdp11
40 typedef char BOOL;
41 #else
42 typedef short BOOL;
43 #endif
44 
45 #define	BYTESPERWORD	(sizeof (char *))
46 #define	ALIGNSIZ	(sizeof (double))
47 #define	NIL	((char *)0)
48 
49 
50 /*
51  * the following nonsense is required
52  * because casts turn an Lvalue
53  * into an Rvalue so two cheats
54  * are necessary, one for each context.
55  */
56 #define	Rcheat(a)	((int)(a))
57 
58 
59 /* address puns for storage allocation */
60 typedef union
61 {
62 	struct forknod	*_forkptr;
63 	struct comnod	*_comptr;
64 	struct fndnod	*_fndptr;
65 	struct parnod	*_parptr;
66 	struct ifnod	*_ifptr;
67 	struct whnod	*_whptr;
68 	struct fornod	*_forptr;
69 	struct lstnod	*_lstptr;
70 	struct blk	*_blkptr;
71 	struct namnod	*_namptr;
72 	char	*_bytptr;
73 } address;
74 
75 
76 /* heap storage */
77 struct blk
78 {
79 	struct blk	*word;
80 	char		pad[ALIGNSIZ - sizeof (struct blk *)];
81 };
82 
83 /*
84  * largefile converson hack note.
85  * the shell uses the *fnxt and *fend pointers when
86  * parsing a script. However, it was also using the
87  * difference between them when doing lseeks. Because
88  * that doesn't work in the largefile world, I have
89  * added a parallel set of offset counters that need to
90  * be updated whenever the "buffer" offsets the shell
91  * uses get changed. Most of this code is in word.c.
92  * If you change it, have fun...
93  */
94 
95 #define	BUFFERSIZE	128
96 struct fileblk
97 {
98 	int	fdes;
99 	unsigned flin;
100 	BOOL	feof;
101 	unsigned char	fsiz;
102 	unsigned char	*fnxt;
103 	unsigned char	*fend;
104 	off_t		nxtoff;		/* file offset */
105 	off_t		endoff;		/* file offset */
106 	unsigned char	**feval;
107 	struct fileblk	*fstak;
108 	unsigned char	fbuf[BUFFERSIZE];
109 };
110 
111 struct tempblk
112 {
113 	int fdes;
114 	struct tempblk *fstak;
115 };
116 
117 
118 /* for files not used with file descriptors */
119 struct filehdr
120 {
121 	int	fdes;
122 	unsigned	flin;
123 	BOOL	feof;
124 	unsigned char	fsiz;
125 	unsigned char	*fnxt;
126 	unsigned char	*fend;
127 	off_t		nxtoff;		/* file offset */
128 	off_t		endoff;		/* file offset */
129 	unsigned char	**feval;
130 	struct fileblk	*fstak;
131 	unsigned char	_fbuf[1];
132 };
133 
134 struct sysnod
135 {
136 	char	*sysnam;
137 	int	sysval;
138 };
139 
140 /* this node is a proforma for those that follow */
141 struct trenod
142 {
143 	int	tretyp;
144 	struct ionod	*treio;
145 };
146 
147 /* dummy for access only */
148 struct argnod
149 {
150 	struct argnod	*argnxt;
151 	unsigned char	argval[1];
152 };
153 
154 struct dolnod
155 {
156 	struct dolnod	*dolnxt;
157 	int	doluse;
158 	unsigned char	**dolarg;
159 };
160 
161 struct forknod
162 {
163 	int	forktyp;
164 	struct ionod	*forkio;
165 	struct trenod	*forktre;
166 };
167 
168 struct comnod
169 {
170 	int	comtyp;
171 	struct ionod	*comio;
172 	struct argnod	*comarg;
173 	struct argnod	*comset;
174 };
175 
176 struct fndnod
177 {
178 	int 	fndtyp;
179 	unsigned char	*fndnam;
180 	struct trenod	*fndval;
181 };
182 
183 struct ifnod
184 {
185 	int	iftyp;
186 	struct trenod	*iftre;
187 	struct trenod	*thtre;
188 	struct trenod	*eltre;
189 };
190 
191 struct whnod
192 {
193 	int	whtyp;
194 	struct trenod	*whtre;
195 	struct trenod	*dotre;
196 };
197 
198 struct fornod
199 {
200 	int	fortyp;
201 	struct trenod	*fortre;
202 	unsigned char	*fornam;
203 	struct comnod	*forlst;
204 };
205 
206 struct swnod
207 {
208 	int	swtyp;
209 	unsigned char *swarg;
210 	struct regnod	*swlst;
211 };
212 
213 struct regnod
214 {
215 	struct argnod	*regptr;
216 	struct trenod	*regcom;
217 	struct regnod	*regnxt;
218 };
219 
220 struct parnod
221 {
222 	int	partyp;
223 	struct trenod	*partre;
224 };
225 
226 struct lstnod
227 {
228 	int	lsttyp;
229 	struct trenod	*lstlef;
230 	struct trenod	*lstrit;
231 };
232 
233 struct ionod
234 {
235 	int	iofile;
236 	char	*ioname;
237 	char	*iolink;
238 	struct ionod	*ionxt;
239 	struct ionod	*iolst;
240 };
241 
242 struct fdsave
243 {
244 	int org_fd;
245 	int dup_fd;
246 };
247 
248 
249 #define		fndptr(x)	((struct fndnod *)x)
250 #define		comptr(x)	((struct comnod *)x)
251 #define		forkptr(x)	((struct forknod *)x)
252 #define		parptr(x)	((struct parnod *)x)
253 #define		lstptr(x)	((struct lstnod *)x)
254 #define		forptr(x)	((struct fornod *)x)
255 #define		whptr(x)	((struct whnod *)x)
256 #define		ifptr(x)	((struct ifnod *)x)
257 #define		swptr(x)	((struct swnod *)x)
258 
259 #endif /* _MODE_H */
260