loksh-noxz

[fork] a Linux port of OpenBSD's ksh
git clone https://noxz.tech/git/loksh-noxz.git
Log | Files | README

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