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 *);