xref: /plan9/sys/src/ape/cmd/pdksh/tree.h (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier /*
2*7dd7cddfSDavid du Colombier  * command trees for compile/execute
3*7dd7cddfSDavid du Colombier  */
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier /* $Id: tree.h,v 1.3 1994/05/31 13:34:34 michael Exp $ */
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier #define	NOBLOCK	((struct op *)NULL)
8*7dd7cddfSDavid du Colombier #define	NOWORD	((char *)NULL)
9*7dd7cddfSDavid du Colombier #define	NOWORDS	((char **)NULL)
10*7dd7cddfSDavid du Colombier 
11*7dd7cddfSDavid du Colombier /*
12*7dd7cddfSDavid du Colombier  * Description of a command or an operation on commands.
13*7dd7cddfSDavid du Colombier  */
14*7dd7cddfSDavid du Colombier struct op {
15*7dd7cddfSDavid du Colombier 	short	type;			/* operation type, see below */
16*7dd7cddfSDavid du Colombier 	union { /* WARNING: newtp(), tcopy() use evalflags = 0 to clear union */
17*7dd7cddfSDavid du Colombier 		short	evalflags;	/* TCOM: arg expansion eval() flags */
18*7dd7cddfSDavid du Colombier 		short	ksh_func;	/* TFUNC: function x (vs x()) */
19*7dd7cddfSDavid du Colombier 	} u;
20*7dd7cddfSDavid du Colombier 	char  **args;			/* arguments to a command */
21*7dd7cddfSDavid du Colombier 	char  **vars;			/* variable assignments */
22*7dd7cddfSDavid du Colombier 	struct ioword	**ioact;	/* IO actions (eg, < > >>) */
23*7dd7cddfSDavid du Colombier 	struct op *left, *right; 	/* descendents */
24*7dd7cddfSDavid du Colombier 	char   *str;			/* word for case; identifier for for,
25*7dd7cddfSDavid du Colombier 					 * select, and functions;
26*7dd7cddfSDavid du Colombier 					 * path to execute for TEXEC;
27*7dd7cddfSDavid du Colombier 					 * time hook for TCOM.
28*7dd7cddfSDavid du Colombier 					 */
29*7dd7cddfSDavid du Colombier 	int	lineno;			/* TCOM/TFUNC: LINENO for this */
30*7dd7cddfSDavid du Colombier };
31*7dd7cddfSDavid du Colombier 
32*7dd7cddfSDavid du Colombier /* Tree.type values */
33*7dd7cddfSDavid du Colombier #define	TEOF		0
34*7dd7cddfSDavid du Colombier #define	TCOM		1	/* command */
35*7dd7cddfSDavid du Colombier #define	TPAREN		2	/* (c-list) */
36*7dd7cddfSDavid du Colombier #define	TPIPE		3	/* a | b */
37*7dd7cddfSDavid du Colombier #define	TLIST		4	/* a ; b */
38*7dd7cddfSDavid du Colombier #define	TOR		5	/* || */
39*7dd7cddfSDavid du Colombier #define	TAND		6	/* && */
40*7dd7cddfSDavid du Colombier #define TBANG		7	/* ! */
41*7dd7cddfSDavid du Colombier #define TDBRACKET	8	/* [[ .. ]] */
42*7dd7cddfSDavid du Colombier #define	TFOR		9
43*7dd7cddfSDavid du Colombier #define TSELECT		10
44*7dd7cddfSDavid du Colombier #define	TCASE		11
45*7dd7cddfSDavid du Colombier #define	TIF		12
46*7dd7cddfSDavid du Colombier #define	TWHILE		13
47*7dd7cddfSDavid du Colombier #define	TUNTIL		14
48*7dd7cddfSDavid du Colombier #define	TELIF		15
49*7dd7cddfSDavid du Colombier #define	TPAT		16	/* pattern in case */
50*7dd7cddfSDavid du Colombier #define	TBRACE		17	/* {c-list} */
51*7dd7cddfSDavid du Colombier #define	TASYNC		18	/* c & */
52*7dd7cddfSDavid du Colombier #define	TFUNCT		19	/* function name { command; } */
53*7dd7cddfSDavid du Colombier #define	TTIME		20	/* time pipeline */
54*7dd7cddfSDavid du Colombier #define	TEXEC		21	/* fork/exec eval'd TCOM */
55*7dd7cddfSDavid du Colombier #define TCOPROC		22	/* coprocess |& */
56*7dd7cddfSDavid du Colombier 
57*7dd7cddfSDavid du Colombier /*
58*7dd7cddfSDavid du Colombier  * prefix codes for words in command tree
59*7dd7cddfSDavid du Colombier  */
60*7dd7cddfSDavid du Colombier #define	EOS	0		/* end of string */
61*7dd7cddfSDavid du Colombier #define	CHAR	1		/* unquoted character */
62*7dd7cddfSDavid du Colombier #define	QCHAR	2		/* quoted character */
63*7dd7cddfSDavid du Colombier #define	COMSUB	3		/* $() substitution (0 terminated) */
64*7dd7cddfSDavid du Colombier #define EXPRSUB	4		/* $(()) substitution (0 terminated) */
65*7dd7cddfSDavid du Colombier #define	OQUOTE	5		/* opening " or ' */
66*7dd7cddfSDavid du Colombier #define	CQUOTE	6		/* closing " or ' */
67*7dd7cddfSDavid du Colombier #define	OSUBST	7		/* opening ${ subst (followed by { or X) */
68*7dd7cddfSDavid du Colombier #define	CSUBST	8		/* closing } of above (followed by } or X) */
69*7dd7cddfSDavid du Colombier #define OPAT	9		/* open pattern: *(, @(, etc. */
70*7dd7cddfSDavid du Colombier #define SPAT	10		/* separate pattern: | */
71*7dd7cddfSDavid du Colombier #define CPAT	11		/* close pattern: ) */
72*7dd7cddfSDavid du Colombier 
73*7dd7cddfSDavid du Colombier /*
74*7dd7cddfSDavid du Colombier  * IO redirection
75*7dd7cddfSDavid du Colombier  */
76*7dd7cddfSDavid du Colombier struct ioword {
77*7dd7cddfSDavid du Colombier 	int	unit;	/* unit affected */
78*7dd7cddfSDavid du Colombier 	int	flag;	/* action (below) */
79*7dd7cddfSDavid du Colombier 	char	*name;	/* file name (unused if heredoc) */
80*7dd7cddfSDavid du Colombier 	char	*delim;	/* delimiter for <<,<<- */
81*7dd7cddfSDavid du Colombier 	char	*heredoc;/* content of heredoc */
82*7dd7cddfSDavid du Colombier };
83*7dd7cddfSDavid du Colombier 
84*7dd7cddfSDavid du Colombier /* ioword.flag - type of redirection */
85*7dd7cddfSDavid du Colombier #define	IOTYPE	0xF		/* type: bits 0:3 */
86*7dd7cddfSDavid du Colombier #define	IOREAD	0x1		/* < */
87*7dd7cddfSDavid du Colombier #define	IOWRITE	0x2		/* > */
88*7dd7cddfSDavid du Colombier #define	IORDWR	0x3		/* <>: todo */
89*7dd7cddfSDavid du Colombier #define	IOHERE	0x4		/* << (here file) */
90*7dd7cddfSDavid du Colombier #define	IOCAT	0x5		/* >> */
91*7dd7cddfSDavid du Colombier #define	IODUP	0x6		/* <&/>& */
92*7dd7cddfSDavid du Colombier #define	IOEVAL	BIT(4)		/* expand in << */
93*7dd7cddfSDavid du Colombier #define	IOSKIP	BIT(5)		/* <<-, skip ^\t* */
94*7dd7cddfSDavid du Colombier #define	IOCLOB	BIT(6)		/* >|, override -o noclobber */
95*7dd7cddfSDavid du Colombier #define IORDUP	BIT(7)		/* x<&y (as opposed to x>&y) */
96*7dd7cddfSDavid du Colombier #define IONAMEXP BIT(8)		/* name has been expanded */
97*7dd7cddfSDavid du Colombier 
98*7dd7cddfSDavid du Colombier /* execute/exchild flags */
99*7dd7cddfSDavid du Colombier #define	XEXEC	BIT(0)		/* execute without forking */
100*7dd7cddfSDavid du Colombier #define	XFORK	BIT(1)		/* fork before executing */
101*7dd7cddfSDavid du Colombier #define	XBGND	BIT(2)		/* command & */
102*7dd7cddfSDavid du Colombier #define	XPIPEI	BIT(3)		/* input is pipe */
103*7dd7cddfSDavid du Colombier #define	XPIPEO	BIT(4)		/* output is pipe */
104*7dd7cddfSDavid du Colombier #define	XPIPE	(XPIPEI|XPIPEO)	/* member of pipe */
105*7dd7cddfSDavid du Colombier #define	XXCOM	BIT(5)		/* `...` command */
106*7dd7cddfSDavid du Colombier #define	XPCLOSE	BIT(6)		/* exchild: close close_fd in parent */
107*7dd7cddfSDavid du Colombier #define	XCCLOSE	BIT(7)		/* exchild: close close_fd in child */
108*7dd7cddfSDavid du Colombier #define XERROK	BIT(8)		/* non-zero exit ok (for set -e) */
109*7dd7cddfSDavid du Colombier #define XCOPROC BIT(9)		/* starting a co-process */
110*7dd7cddfSDavid du Colombier #define XTIME	BIT(10)		/* timeing TCOM command */
111*7dd7cddfSDavid du Colombier #define XINTACT BIT(11)		/* OS2: proc started from interactive session */
112*7dd7cddfSDavid du Colombier 
113*7dd7cddfSDavid du Colombier /*
114*7dd7cddfSDavid du Colombier  * flags to control expansion of words (assumed by t->evalflags to fit
115*7dd7cddfSDavid du Colombier  * in a short)
116*7dd7cddfSDavid du Colombier  */
117*7dd7cddfSDavid du Colombier #define	DOBLANK	BIT(0)		/* perform blank interpretation */
118*7dd7cddfSDavid du Colombier #define	DOGLOB	BIT(1)		/* expand [?* */
119*7dd7cddfSDavid du Colombier #define	DOPAT	BIT(2)		/* quote *?[ */
120*7dd7cddfSDavid du Colombier #define	DOTILDE	BIT(3)		/* normal ~ expansion (first char) */
121*7dd7cddfSDavid du Colombier #define DONTRUNCOMMAND BIT(4)	/* do not run $(command) things */
122*7dd7cddfSDavid du Colombier #define DOASNTILDE BIT(5)	/* assignment ~ expansion (after =, :) */
123*7dd7cddfSDavid du Colombier #define DOBRACE_ BIT(6)		/* used by expand(): do brace expansion */
124*7dd7cddfSDavid du Colombier #define DOMAGIC_ BIT(7)		/* used by expand(): string contains MAGIC */
125*7dd7cddfSDavid du Colombier #define DOTEMP_	BIT(8)		/* ditto : in word part of ${..[%#=?]..} */
126*7dd7cddfSDavid du Colombier #define DOVACHECK BIT(9)	/* var assign check (for typeset, set, etc) */
127*7dd7cddfSDavid du Colombier #define DOMARKDIRS BIT(10)	/* force markdirs behaviour */
128*7dd7cddfSDavid du Colombier 
129*7dd7cddfSDavid du Colombier /*
130*7dd7cddfSDavid du Colombier  * The arguments of [[ .. ]] expressions are kept in t->args[] and flags
131*7dd7cddfSDavid du Colombier  * indicating how the arguments have been munged are kept in t->vars[].
132*7dd7cddfSDavid du Colombier  * The contents of t->vars[] are stuffed strings (so they can be treated
133*7dd7cddfSDavid du Colombier  * like all other t->vars[]) in which the second character is the one that
134*7dd7cddfSDavid du Colombier  * is examined.  The DB_* defines are the values for these second characters.
135*7dd7cddfSDavid du Colombier  */
136*7dd7cddfSDavid du Colombier #define DB_NORM	1		/* normal argument */
137*7dd7cddfSDavid du Colombier #define DB_OR	2		/* || -> -o conversion */
138*7dd7cddfSDavid du Colombier #define DB_AND	3		/* && -> -a conversion */
139*7dd7cddfSDavid du Colombier #define DB_BE	4		/* an inserted -BE */
140*7dd7cddfSDavid du Colombier #define DB_PAT	5		/* a pattern argument */
141