1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1982-2012 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                  David Korn <dgk@research.att.com>                   *
18da2e3ebdSchin *                                                                      *
19da2e3ebdSchin ***********************************************************************/
20da2e3ebdSchin #pragma prototyped
21da2e3ebdSchin #ifndef _SHNODES_H
22da2e3ebdSchin #define _SHNODES_H	1
23da2e3ebdSchin /*
24da2e3ebdSchin  *	UNIX shell
25da2e3ebdSchin  *	Written by David Korn
26da2e3ebdSchin  *
27da2e3ebdSchin  */
28da2e3ebdSchin 
29da2e3ebdSchin 
30da2e3ebdSchin #include	<ast.h>
31da2e3ebdSchin #include	"argnod.h"
32da2e3ebdSchin 
33da2e3ebdSchin /* command tree for tretyp */
34da2e3ebdSchin #define FINT		(02<<COMBITS)		/* non-interruptable */
35da2e3ebdSchin #define FAMP		(04<<COMBITS)		/* background */
36da2e3ebdSchin #define FPIN		(010<<COMBITS)		/* input is a pipe */
37da2e3ebdSchin #define FPOU		(040<<COMBITS)		/* output is a pipe */
38da2e3ebdSchin #define FPCL		(0100<<COMBITS)		/* close the pipe */
39da2e3ebdSchin #define FCOOP		(0200<<COMBITS)		/* cooperating process */
40da2e3ebdSchin #define FSHOWME		(0400<<COMBITS)		/* set for showme commands  */
41*b30d1939SAndy Fiddaman #define FALTPIPE	(02000<<COMBITS)	/* alternate pipes &| */
42da2e3ebdSchin #define FPOSIX		(02<<COMBITS)		/* posix semantics function */
43da2e3ebdSchin #define FLINENO		(04<<COMBITS)		/* for/case has line number */
44*b30d1939SAndy Fiddaman #define FOPTGET		(0200<<COMBITS)		/* function calls getopts */
45da2e3ebdSchin 
46da2e3ebdSchin #define TNEGATE		(01<<COMBITS)		/* ! inside [[...]] */
47da2e3ebdSchin #define TBINARY		(02<<COMBITS)		/* binary operator in [[...]] */
48da2e3ebdSchin #define TUNARY		(04<<COMBITS)		/* unary operator in [[...]] */
49da2e3ebdSchin #define TTEST		(010<<COMBITS)
50da2e3ebdSchin #define TPAREN		(TBINARY|TUNARY)
51da2e3ebdSchin #define TSHIFT		(COMBITS+4)
52da2e3ebdSchin #define TNSPACE		(TFUN|COMSCAN)
53da2e3ebdSchin 
54da2e3ebdSchin #define TCOM	0
55da2e3ebdSchin #define TPAR	1
56da2e3ebdSchin #define TFIL	2
57da2e3ebdSchin #define TLST	3
58da2e3ebdSchin #define TIF	4
59da2e3ebdSchin #define TWH	5
60da2e3ebdSchin #define TUN	(TWH|COMSCAN)
61da2e3ebdSchin #define TTST	6
62da2e3ebdSchin #define TSW	7
63da2e3ebdSchin #define TAND	8
64da2e3ebdSchin #define TORF	9
65da2e3ebdSchin #define TFORK	10
66da2e3ebdSchin #define TFOR	11
67da2e3ebdSchin #define TSELECT	(TFOR|COMSCAN)
68da2e3ebdSchin #define TARITH	12
69da2e3ebdSchin #define	TTIME	13
70da2e3ebdSchin #define TSETIO	14
71da2e3ebdSchin #define TFUN	15
72da2e3ebdSchin 
73da2e3ebdSchin /* this node is a proforma for those that follow */
74da2e3ebdSchin 
75da2e3ebdSchin struct trenod
76da2e3ebdSchin {
77da2e3ebdSchin 	int		tretyp;
78da2e3ebdSchin 	struct ionod	*treio;
79da2e3ebdSchin };
80da2e3ebdSchin 
81da2e3ebdSchin 
82da2e3ebdSchin struct forknod
83da2e3ebdSchin {
84da2e3ebdSchin 	int		forktyp;
85da2e3ebdSchin 	struct ionod	*forkio;
86da2e3ebdSchin 	Shnode_t	*forktre;
87da2e3ebdSchin 	int		forkline;
88da2e3ebdSchin };
89da2e3ebdSchin 
90da2e3ebdSchin 
91da2e3ebdSchin struct ifnod
92da2e3ebdSchin {
93da2e3ebdSchin 	int		iftyp;
94da2e3ebdSchin 	Shnode_t	*iftre;
95da2e3ebdSchin 	Shnode_t	*thtre;
96da2e3ebdSchin 	Shnode_t	*eltre;
97da2e3ebdSchin };
98da2e3ebdSchin 
99da2e3ebdSchin struct whnod
100da2e3ebdSchin {
101da2e3ebdSchin 	int		whtyp;
102da2e3ebdSchin 	Shnode_t	*whtre;
103da2e3ebdSchin 	Shnode_t	*dotre;
104da2e3ebdSchin 	struct arithnod	*whinc;
105da2e3ebdSchin };
106da2e3ebdSchin 
107da2e3ebdSchin struct fornod
108da2e3ebdSchin {
109da2e3ebdSchin 	int		fortyp;
110da2e3ebdSchin 	char	 	*fornam;
111da2e3ebdSchin 	Shnode_t	*fortre;
112da2e3ebdSchin 	struct comnod	*forlst;
113da2e3ebdSchin 	int		forline;
114da2e3ebdSchin };
115da2e3ebdSchin 
116da2e3ebdSchin struct swnod
117da2e3ebdSchin {
118da2e3ebdSchin 	int		swtyp;
119da2e3ebdSchin 	struct argnod	*swarg;
120da2e3ebdSchin 	struct regnod	*swlst;
121da2e3ebdSchin 	struct ionod	*swio;
122da2e3ebdSchin 	int		swline;
123da2e3ebdSchin };
124da2e3ebdSchin 
125da2e3ebdSchin struct regnod
126da2e3ebdSchin {
127da2e3ebdSchin 	struct argnod	*regptr;
128da2e3ebdSchin 	Shnode_t	*regcom;
129da2e3ebdSchin 	struct regnod	*regnxt;
130da2e3ebdSchin 	char		regflag;
131da2e3ebdSchin };
132da2e3ebdSchin 
133da2e3ebdSchin struct parnod
134da2e3ebdSchin {
135da2e3ebdSchin 	int		partyp;
136da2e3ebdSchin 	Shnode_t	*partre;
137da2e3ebdSchin };
138da2e3ebdSchin 
139da2e3ebdSchin struct lstnod
140da2e3ebdSchin {
141da2e3ebdSchin 	int		lsttyp;
142da2e3ebdSchin 	Shnode_t	*lstlef;
143da2e3ebdSchin 	Shnode_t	*lstrit;
144da2e3ebdSchin };
145da2e3ebdSchin 
146da2e3ebdSchin /* tst is same as lst, but with extra field for line number */
147da2e3ebdSchin struct tstnod
148da2e3ebdSchin {
149da2e3ebdSchin 	struct lstnod	tstlst;
150da2e3ebdSchin 	int		tstline;
151da2e3ebdSchin };
152da2e3ebdSchin 
153da2e3ebdSchin struct functnod
154da2e3ebdSchin {
155da2e3ebdSchin 	int		functtyp;
156da2e3ebdSchin 	char		*functnam;
157da2e3ebdSchin 	Shnode_t	*functtre;
158da2e3ebdSchin 	int		functline;
159da2e3ebdSchin 	off_t		functloc;
160da2e3ebdSchin 	struct slnod	*functstak;
161da2e3ebdSchin 	struct comnod	*functargs;
162da2e3ebdSchin };
163da2e3ebdSchin 
164da2e3ebdSchin struct arithnod
165da2e3ebdSchin {
166da2e3ebdSchin 	int		artyp;
167da2e3ebdSchin 	int		arline;
168da2e3ebdSchin 	struct argnod	*arexpr;
169da2e3ebdSchin 	void		*arcomp;
170da2e3ebdSchin };
171da2e3ebdSchin 
172da2e3ebdSchin 
173da2e3ebdSchin /* types of ionodes stored in iofile  */
1747c2fbfb3SApril Chin #define IOUFD		0x3f	/* file descriptor number mask */
1757c2fbfb3SApril Chin #define IOPUT		0x40	/* > redirection operator */
1767c2fbfb3SApril Chin #define IOAPP		0x80	/* >> redirection operator */
1777c2fbfb3SApril Chin #define IODOC		0x100	/* << redirection operator */
1787c2fbfb3SApril Chin #define IOMOV		0x200	/* <& or >& operators */
1797c2fbfb3SApril Chin #define IOCLOB		0x400	/* noclobber bit */
1807c2fbfb3SApril Chin #define IORDW		0x800	/* <> redirection operator */
1817c2fbfb3SApril Chin #define IORAW		0x1000	/* no expansion needed for filename */
1827c2fbfb3SApril Chin #define IOSTRG		0x2000	/* here-document stored as incore string */
1837c2fbfb3SApril Chin #define IOSTRIP 	0x4000	/* strip leading tabs for here-document */
1847c2fbfb3SApril Chin #define IOQUOTE		0x8000	/* here-document delimiter was quoted */
1857c2fbfb3SApril Chin #define IOVNM		0x10000	/* iovname field is non-zero */
1867c2fbfb3SApril Chin #define IOLSEEK		0x20000	/* seek operators <# or >#  */
1877c2fbfb3SApril Chin #define IOARITH		0x40000	/* arithmetic seek <# ((expr))  */
1887c2fbfb3SApril Chin #define IOREWRITE	0x80000	/* arithmetic seek <# ((expr))  */
1897c2fbfb3SApril Chin #define IOCOPY		IOCLOB	/* copy skipped lines onto standard output */
19034f9b3eeSRoland Mainz #define IOPROCSUB	IOARITH	/* process substitution redirection */
191da2e3ebdSchin 
192da2e3ebdSchin union Shnode_u
193da2e3ebdSchin {
194da2e3ebdSchin 	struct argnod	arg;
195da2e3ebdSchin 	struct ionod	io;
196da2e3ebdSchin 	struct whnod	wh;
197da2e3ebdSchin 	struct swnod	sw;
198da2e3ebdSchin 	struct ifnod	if_;
199da2e3ebdSchin 	struct dolnod	dol;
200da2e3ebdSchin 	struct comnod	com;
201da2e3ebdSchin 	struct trenod	tre;
202da2e3ebdSchin 	struct forknod	fork;
203da2e3ebdSchin 	struct fornod	for_;
204da2e3ebdSchin 	struct regnod	reg;
205da2e3ebdSchin 	struct parnod	par;
206da2e3ebdSchin 	struct lstnod	lst;
207da2e3ebdSchin 	struct tstnod	tst;
208da2e3ebdSchin 	struct functnod	funct;
209da2e3ebdSchin 	struct arithnod	ar;
210da2e3ebdSchin };
211da2e3ebdSchin 
2127c2fbfb3SApril Chin extern void			sh_freeup(Shell_t*);
213da2e3ebdSchin extern void			sh_funstaks(struct slnod*,int);
214*b30d1939SAndy Fiddaman extern Sfio_t 			*sh_subshell(Shell_t*,Shnode_t*, volatile int, int);
215da2e3ebdSchin #if defined(__EXPORT__) && defined(_BLD_DLL) && defined(_BLD_shell)
216da2e3ebdSchin    __EXPORT__
217da2e3ebdSchin #endif
218da2e3ebdSchin extern int			sh_tdump(Sfio_t*, const Shnode_t*);
2197c2fbfb3SApril Chin extern Shnode_t			*sh_trestore(Shell_t*, Sfio_t*);
220da2e3ebdSchin 
221da2e3ebdSchin #endif /* _SHNODES_H */
222