]> git.ipfire.org Git - thirdparty/bash.git/blame - command.h
Bash-4.1 patchlevel 11
[thirdparty/bash.git] / command.h
CommitLineData
726f6388
JA
1/* command.h -- The structures used internally to represent commands, and
2 the extern declarations of the functions used to create them. */
3
3185942a 4/* Copyright (C) 1993-2009 Free Software Foundation, Inc.
726f6388
JA
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
3185942a
JA
8 Bash is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
726f6388 12
3185942a
JA
13 Bash is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
726f6388 17
3185942a
JA
18 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
20*/
726f6388 21
ccc6cda3
JA
22#if !defined (_COMMAND_H_)
23#define _COMMAND_H_
726f6388
JA
24
25#include "stdc.h"
26
27/* Instructions describing what kind of thing to do for a redirection. */
28enum r_instruction {
29 r_output_direction, r_input_direction, r_inputa_direction,
7117c2d2
JA
30 r_appending_to, r_reading_until, r_reading_string,
31 r_duplicating_input, r_duplicating_output, r_deblank_reading_until,
32 r_close_this, r_err_and_out, r_input_output, r_output_force,
33 r_duplicating_input_word, r_duplicating_output_word,
3185942a
JA
34 r_move_input, r_move_output, r_move_input_word, r_move_output_word,
35 r_append_err_and_out
726f6388
JA
36};
37
0001803f
CR
38/* Redirection flags; values for rflags */
39#define REDIR_VARASSIGN 0x01
40
ccc6cda3
JA
41/* Redirection errors. */
42#define AMBIGUOUS_REDIRECT -1
43#define NOCLOBBER_REDIRECT -2
44#define RESTRICTED_REDIRECT -3 /* can only happen in restricted shells. */
d166f048 45#define HEREDOC_REDIRECT -4 /* here-doc temp file can't be created */
0001803f 46#define BADVAR_REDIRECT -5 /* something wrong with {varname}redir */
ccc6cda3 47
28ef6c31
JA
48#define CLOBBERING_REDIRECT(ri) \
49 (ri == r_output_direction || ri == r_err_and_out)
50
ccc6cda3 51#define OUTPUT_REDIRECT(ri) \
3185942a 52 (ri == r_output_direction || ri == r_input_output || ri == r_err_and_out || ri == r_append_err_and_out)
ccc6cda3
JA
53
54#define INPUT_REDIRECT(ri) \
55 (ri == r_input_direction || ri == r_inputa_direction || ri == r_input_output)
56
57#define WRITE_REDIRECT(ri) \
58 (ri == r_output_direction || \
59 ri == r_input_output || \
60 ri == r_err_and_out || \
61 ri == r_appending_to || \
3185942a 62 ri == r_append_err_and_out || \
ccc6cda3
JA
63 ri == r_output_force)
64
7117c2d2
JA
65/* redirection needs translation */
66#define TRANSLATE_REDIRECT(ri) \
67 (ri == r_duplicating_input_word || ri == r_duplicating_output_word || \
68 ri == r_move_input_word || ri == r_move_output_word)
69
726f6388
JA
70/* Command Types: */
71enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
cce855bc 72 cm_connection, cm_function_def, cm_until, cm_group,
3185942a 73 cm_arith, cm_cond, cm_arith_for, cm_subshell, cm_coproc };
726f6388 74
ccc6cda3 75/* Possible values for the `flags' field of a WORD_DESC. */
0628567a
JA
76#define W_HASDOLLAR 0x000001 /* Dollar sign present. */
77#define W_QUOTED 0x000002 /* Some form of quote character is present. */
78#define W_ASSIGNMENT 0x000004 /* This word is a variable assignment. */
79#define W_GLOBEXP 0x000008 /* This word is the result of a glob expansion. */
0001803f 80#define W_NOSPLIT 0x000010 /* Do not perform word splitting on this word because ifs is empty string. */
0628567a 81#define W_NOGLOB 0x000020 /* Do not perform globbing on this word. */
0001803f 82#define W_NOSPLIT2 0x000040 /* Don't split word except for $@ expansion (using spaces) because context does not allow it. */
0628567a
JA
83#define W_TILDEEXP 0x000080 /* Tilde expand this assignment word */
84#define W_DOLLARAT 0x000100 /* $@ and its special handling */
85#define W_DOLLARSTAR 0x000200 /* $* and its special handling */
86#define W_NOCOMSUB 0x000400 /* Don't perform command substitution on this word */
87#define W_ASSIGNRHS 0x000800 /* Word is rhs of an assignment statement */
88#define W_NOTILDE 0x001000 /* Don't perform tilde expansion on this word */
89#define W_ITILDE 0x002000 /* Internal flag for word expansion */
90#define W_NOEXPAND 0x004000 /* Don't expand at all -- do quote removal */
91#define W_COMPASSIGN 0x008000 /* Compound assignment */
92#define W_ASSNBLTIN 0x010000 /* word is a builtin command that takes assignments */
93#define W_ASSIGNARG 0x020000 /* word is assignment argument to command */
94#define W_HASQUOTEDNULL 0x040000 /* word contains a quoted null character */
95#define W_DQUOTE 0x080000 /* word should be treated as if double-quoted */
96#define W_NOPROCSUB 0x100000 /* don't perform process substitution */
3185942a
JA
97#define W_HASCTLESC 0x200000 /* word contains literal CTLESC characters */
98#define W_ASSIGNASSOC 0x400000 /* word looks like associative array assignment */
ccc6cda3
JA
99
100/* Possible values for subshell_environment */
101#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
102#define SUBSHELL_PAREN 0x02 /* subshell caused by ( ... ) */
103#define SUBSHELL_COMSUB 0x04 /* subshell caused by `command` or $(command) */
104#define SUBSHELL_FORK 0x08 /* subshell caused by executing a disk command */
28ef6c31 105#define SUBSHELL_PIPE 0x10 /* subshell from a pipeline element */
3185942a
JA
106#define SUBSHELL_PROCSUB 0x20 /* subshell caused by <(command) or >(command) */
107#define SUBSHELL_COPROC 0x40 /* subshell from a coproc pipeline */
ccc6cda3 108
726f6388
JA
109/* A structure which represents a word. */
110typedef struct word_desc {
111 char *word; /* Zero terminated string. */
ccc6cda3 112 int flags; /* Flags associated with this word. */
726f6388
JA
113} WORD_DESC;
114
115/* A linked list of words. */
116typedef struct word_list {
117 struct word_list *next;
118 WORD_DESC *word;
119} WORD_LIST;
120
121
122/* **************************************************************** */
123/* */
124/* Shell Command Structs */
125/* */
126/* **************************************************************** */
127
f73dda09
JA
128/* What a redirection descriptor looks like. If the redirection instruction
129 is ri_duplicating_input or ri_duplicating_output, use DEST, otherwise
130 use the file in FILENAME. Out-of-range descriptors are identified by a
131 negative DEST. */
726f6388
JA
132
133typedef union {
f73dda09 134 int dest; /* Place to redirect REDIRECTOR to, or ... */
726f6388
JA
135 WORD_DESC *filename; /* filename to redirect to. */
136} REDIRECTEE;
137
f73dda09
JA
138/* Structure describing a redirection. If REDIRECTOR is negative, the parser
139 (or translator in redir.c) encountered an out-of-range file descriptor. */
726f6388
JA
140typedef struct redirect {
141 struct redirect *next; /* Next element, or NULL. */
0001803f
CR
142 REDIRECTEE redirector; /* Descriptor or varname to be redirected. */
143 int rflags; /* Private flags for this redirection */
726f6388
JA
144 int flags; /* Flag value for `open'. */
145 enum r_instruction instruction; /* What to do with the information. */
146 REDIRECTEE redirectee; /* File descriptor or filename */
147 char *here_doc_eof; /* The word that appeared in <<foo. */
148} REDIRECT;
149
150/* An element used in parsing. A single word or a single redirection.
151 This is an ephemeral construct. */
152typedef struct element {
153 WORD_DESC *word;
154 REDIRECT *redirect;
155} ELEMENT;
156
157/* Possible values for command->flags. */
158#define CMD_WANT_SUBSHELL 0x01 /* User wants a subshell: ( command ) */
159#define CMD_FORCE_SUBSHELL 0x02 /* Shell needs to force a subshell. */
160#define CMD_INVERT_RETURN 0x04 /* Invert the exit value. */
161#define CMD_IGNORE_RETURN 0x08 /* Ignore the exit value. For set -e. */
162#define CMD_NO_FUNCTIONS 0x10 /* Ignore functions during command lookup. */
163#define CMD_INHIBIT_EXPANSION 0x20 /* Do not expand the command words. */
164#define CMD_NO_FORK 0x40 /* Don't fork; just call execve */
ccc6cda3
JA
165#define CMD_TIME_PIPELINE 0x80 /* Time a pipeline */
166#define CMD_TIME_POSIX 0x100 /* time -p; use POSIX.2 time output spec. */
d166f048
JA
167#define CMD_AMPERSAND 0x200 /* command & */
168#define CMD_STDIN_REDIR 0x400 /* async command needs implicit </dev/null */
f73dda09 169#define CMD_COMMAND_BUILTIN 0x0800 /* command executed by `command' builtin */
3185942a 170#define CMD_COPROC_SUBSHELL 0x1000
726f6388
JA
171
172/* What a command looks like. */
173typedef struct command {
174 enum command_type type; /* FOR CASE WHILE IF CONNECTION or SIMPLE. */
175 int flags; /* Flags controlling execution environment. */
176 int line; /* line number the command starts on */
177 REDIRECT *redirects; /* Special redirects for FOR CASE, etc. */
178 union {
179 struct for_com *For;
180 struct case_com *Case;
181 struct while_com *While;
182 struct if_com *If;
183 struct connection *Connection;
184 struct simple_com *Simple;
185 struct function_def *Function_def;
186 struct group_com *Group;
187#if defined (SELECT_COMMAND)
188 struct select_com *Select;
cce855bc
JA
189#endif
190#if defined (DPAREN_ARITHMETIC)
191 struct arith_com *Arith;
192#endif
193#if defined (COND_COMMAND)
194 struct cond_com *Cond;
726f6388 195#endif
bb70624e
JA
196#if defined (ARITH_FOR_COMMAND)
197 struct arith_for_com *ArithFor;
198#endif
199 struct subshell_com *Subshell;
3185942a 200 struct coproc_com *Coproc;
726f6388
JA
201 } value;
202} COMMAND;
203
204/* Structure used to represent the CONNECTION type. */
205typedef struct connection {
206 int ignore; /* Unused; simplifies make_command (). */
207 COMMAND *first; /* Pointer to the first command. */
208 COMMAND *second; /* Pointer to the second command. */
209 int connector; /* What separates this command from others. */
210} CONNECTION;
211
212/* Structures used to represent the CASE command. */
213
3185942a
JA
214/* Values for FLAGS word in a PATTERN_LIST */
215#define CASEPAT_FALLTHROUGH 0x01
216#define CASEPAT_TESTNEXT 0x02
217
726f6388
JA
218/* Pattern/action structure for CASE_COM. */
219typedef struct pattern_list {
220 struct pattern_list *next; /* Clause to try in case this one failed. */
221 WORD_LIST *patterns; /* Linked list of patterns to test. */
222 COMMAND *action; /* Thing to execute if a pattern matches. */
95732b49 223 int flags;
726f6388
JA
224} PATTERN_LIST;
225
226/* The CASE command. */
227typedef struct case_com {
228 int flags; /* See description of CMD flags. */
b80f6443 229 int line; /* line number the `case' keyword appears on */
726f6388
JA
230 WORD_DESC *word; /* The thing to test. */
231 PATTERN_LIST *clauses; /* The clauses to test against, or NULL. */
232} CASE_COM;
233
234/* FOR command. */
235typedef struct for_com {
236 int flags; /* See description of CMD flags. */
b80f6443 237 int line; /* line number the `for' keyword appears on */
726f6388
JA
238 WORD_DESC *name; /* The variable name to get mapped over. */
239 WORD_LIST *map_list; /* The things to map over. This is never NULL. */
240 COMMAND *action; /* The action to execute.
241 During execution, NAME is bound to successive
242 members of MAP_LIST. */
243} FOR_COM;
244
bb70624e
JA
245#if defined (ARITH_FOR_COMMAND)
246typedef struct arith_for_com {
247 int flags;
248 int line; /* generally used for error messages */
249 WORD_LIST *init;
250 WORD_LIST *test;
251 WORD_LIST *step;
252 COMMAND *action;
253} ARITH_FOR_COM;
254#endif
255
726f6388
JA
256#if defined (SELECT_COMMAND)
257/* KSH SELECT command. */
258typedef struct select_com {
259 int flags; /* See description of CMD flags. */
b80f6443 260 int line; /* line number the `select' keyword appears on */
726f6388
JA
261 WORD_DESC *name; /* The variable name to get mapped over. */
262 WORD_LIST *map_list; /* The things to map over. This is never NULL. */
263 COMMAND *action; /* The action to execute.
264 During execution, NAME is bound to the member of
265 MAP_LIST chosen by the user. */
266} SELECT_COM;
267#endif /* SELECT_COMMAND */
268
269/* IF command. */
270typedef struct if_com {
271 int flags; /* See description of CMD flags. */
272 COMMAND *test; /* Thing to test. */
273 COMMAND *true_case; /* What to do if the test returned non-zero. */
274 COMMAND *false_case; /* What to do if the test returned zero. */
275} IF_COM;
276
277/* WHILE command. */
278typedef struct while_com {
279 int flags; /* See description of CMD flags. */
280 COMMAND *test; /* Thing to test. */
281 COMMAND *action; /* Thing to do while test is non-zero. */
282} WHILE_COM;
283
cce855bc
JA
284#if defined (DPAREN_ARITHMETIC)
285/* The arithmetic evaluation command, ((...)). Just a set of flags and
286 a WORD_LIST, of which the first element is the only one used, for the
287 time being. */
288typedef struct arith_com {
289 int flags;
cce855bc 290 int line;
b80f6443 291 WORD_LIST *exp;
cce855bc
JA
292} ARITH_COM;
293#endif /* DPAREN_ARITHMETIC */
294
295/* The conditional command, [[...]]. This is a binary tree -- we slippped
296 a recursive-descent parser into the YACC grammar to parse it. */
297#define COND_AND 1
298#define COND_OR 2
299#define COND_UNARY 3
300#define COND_BINARY 4
301#define COND_TERM 5
302#define COND_EXPR 6
303
304typedef struct cond_com {
305 int flags;
306 int line;
307 int type;
308 WORD_DESC *op;
309 struct cond_com *left, *right;
310} COND_COM;
311
726f6388
JA
312/* The "simple" command. Just a collection of words and redirects. */
313typedef struct simple_com {
314 int flags; /* See description of CMD flags. */
b80f6443 315 int line; /* line number the command starts on */
726f6388
JA
316 WORD_LIST *words; /* The program name, the arguments,
317 variable assignments, etc. */
318 REDIRECT *redirects; /* Redirections to perform. */
726f6388
JA
319} SIMPLE_COM;
320
ccc6cda3 321/* The "function definition" command. */
726f6388 322typedef struct function_def {
cce855bc 323 int flags; /* See description of CMD flags. */
b80f6443 324 int line; /* Line number the function def starts on. */
726f6388
JA
325 WORD_DESC *name; /* The name of the function. */
326 COMMAND *command; /* The parsed execution tree. */
b80f6443 327 char *source_file; /* file in which function was defined, if any */
726f6388
JA
328} FUNCTION_DEF;
329
ccc6cda3
JA
330/* A command that is `grouped' allows pipes and redirections to affect all
331 commands in the group. */
726f6388
JA
332typedef struct group_com {
333 int ignore; /* See description of CMD flags. */
334 COMMAND *command;
335} GROUP_COM;
336
bb70624e
JA
337typedef struct subshell_com {
338 int flags;
339 COMMAND *command;
340} SUBSHELL_COM;
341
17345e5a
JA
342#define COPROC_RUNNING 0x01
343#define COPROC_DEAD 0x02
344
3185942a
JA
345typedef struct coproc {
346 char *c_name;
347 pid_t c_pid;
348 int c_rfd;
349 int c_wfd;
350 int c_rsave;
351 int c_wsave;
352 int c_flags;
353 int c_status;
354} Coproc;
355
356typedef struct coproc_com {
357 int flags;
358 char *name;
359 COMMAND *command;
360} COPROC_COM;
361
726f6388 362extern COMMAND *global_command;
3185942a 363extern Coproc sh_coproc;
726f6388 364
b72432fd
JA
365/* Possible command errors */
366#define CMDERR_DEFAULT 0
367#define CMDERR_BADTYPE 1
368#define CMDERR_BADCONN 2
369#define CMDERR_BADJUMP 3
370
371#define CMDERR_LAST 3
372
726f6388
JA
373/* Forward declarations of functions declared in copy_cmd.c. */
374
b80f6443
JA
375extern FUNCTION_DEF *copy_function_def_contents __P((FUNCTION_DEF *, FUNCTION_DEF *));
376extern FUNCTION_DEF *copy_function_def __P((FUNCTION_DEF *));
377
726f6388
JA
378extern WORD_DESC *copy_word __P((WORD_DESC *));
379extern WORD_LIST *copy_word_list __P((WORD_LIST *));
380extern REDIRECT *copy_redirect __P((REDIRECT *));
381extern REDIRECT *copy_redirects __P((REDIRECT *));
382extern COMMAND *copy_command __P((COMMAND *));
383
ccc6cda3 384#endif /* _COMMAND_H_ */