]> git.ipfire.org Git - thirdparty/bash.git/blame - command.h
Bash-5.1 patch 11: save and restore alias parsing when performing compound array...
[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
8868edaf 4/* Copyright (C) 1993-2020 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. */
8868edaf
CR
76#define W_HASDOLLAR (1 << 0) /* Dollar sign present. */
77#define W_QUOTED (1 << 1) /* Some form of quote character is present. */
78#define W_ASSIGNMENT (1 << 2) /* This word is a variable assignment. */
79#define W_SPLITSPACE (1 << 3) /* Split this word on " " regardless of IFS */
80#define W_NOSPLIT (1 << 4) /* Do not perform word splitting on this word because ifs is empty string. */
81#define W_NOGLOB (1 << 5) /* Do not perform globbing on this word. */
82#define W_NOSPLIT2 (1 << 6) /* Don't split word except for $@ expansion (using spaces) because context does not allow it. */
83#define W_TILDEEXP (1 << 7) /* Tilde expand this assignment word */
84#define W_DOLLARAT (1 << 8) /* $@ and its special handling -- UNUSED */
85#define W_DOLLARSTAR (1 << 9) /* $* and its special handling -- UNUSED */
86#define W_NOCOMSUB (1 << 10) /* Don't perform command substitution on this word */
87#define W_ASSIGNRHS (1 << 11) /* Word is rhs of an assignment statement */
88#define W_NOTILDE (1 << 12) /* Don't perform tilde expansion on this word */
89#define W_ITILDE (1 << 13) /* Internal flag for word expansion */
90#define W_EXPANDRHS (1 << 14) /* Expanding word in ${paramOPword} */
91#define W_COMPASSIGN (1 << 15) /* Compound assignment */
92#define W_ASSNBLTIN (1 << 16) /* word is a builtin command that takes assignments */
93#define W_ASSIGNARG (1 << 17) /* word is assignment argument to command */
94#define W_HASQUOTEDNULL (1 << 18) /* word contains a quoted null character */
95#define W_DQUOTE (1 << 19) /* word should be treated as if double-quoted */
96#define W_NOPROCSUB (1 << 20) /* don't perform process substitution */
97#define W_SAWQUOTEDNULL (1 << 21) /* word contained a quoted null that was removed */
98#define W_ASSIGNASSOC (1 << 22) /* word looks like associative array assignment */
99#define W_ASSIGNARRAY (1 << 23) /* word looks like a compound indexed array assignment */
100#define W_ARRAYIND (1 << 24) /* word is an array index being expanded */
101#define W_ASSNGLOBAL (1 << 25) /* word is a global assignment to declare (declare/typeset -g) */
102#define W_NOBRACE (1 << 26) /* Don't perform brace expansion */
103#define W_COMPLETE (1 << 27) /* word is being expanded for completion */
104#define W_CHKLOCAL (1 << 28) /* check for local vars on assignment */
105#define W_NOASSNTILDE (1 << 29) /* don't do tilde expansion like an assignment statement */
106#define W_FORCELOCAL (1 << 30) /* force assignments to be to local variables, non-fatal on assignment errors */
a0c0a00f
CR
107
108/* Flags for the `pflags' argument to param_expand() and various
109 parameter_brace_expand_xxx functions; also used for string_list_dollar_at */
110#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */
111#define PF_IGNUNBOUND 0x02 /* ignore unbound vars even if -u set */
112#define PF_NOSPLIT2 0x04 /* same as W_NOSPLIT2 */
113#define PF_ASSIGNRHS 0x08 /* same as W_ASSIGNRHS */
114#define PF_COMPLETE 0x10 /* same as W_COMPLETE, sets SX_COMPLETE */
8868edaf
CR
115#define PF_EXPANDRHS 0x20 /* same as W_EXPANDRHS */
116#define PF_ALLINDS 0x40 /* array, act as if [@] was supplied */
ccc6cda3
JA
117
118/* Possible values for subshell_environment */
119#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
120#define SUBSHELL_PAREN 0x02 /* subshell caused by ( ... ) */
121#define SUBSHELL_COMSUB 0x04 /* subshell caused by `command` or $(command) */
122#define SUBSHELL_FORK 0x08 /* subshell caused by executing a disk command */
28ef6c31 123#define SUBSHELL_PIPE 0x10 /* subshell from a pipeline element */
3185942a
JA
124#define SUBSHELL_PROCSUB 0x20 /* subshell caused by <(command) or >(command) */
125#define SUBSHELL_COPROC 0x40 /* subshell from a coproc pipeline */
495aee44 126#define SUBSHELL_RESETTRAP 0x80 /* subshell needs to reset trap strings on first call to trap */
ccc6cda3 127
726f6388
JA
128/* A structure which represents a word. */
129typedef struct word_desc {
130 char *word; /* Zero terminated string. */
ccc6cda3 131 int flags; /* Flags associated with this word. */
726f6388
JA
132} WORD_DESC;
133
134/* A linked list of words. */
135typedef struct word_list {
136 struct word_list *next;
137 WORD_DESC *word;
138} WORD_LIST;
139
140
141/* **************************************************************** */
142/* */
143/* Shell Command Structs */
144/* */
145/* **************************************************************** */
146
f73dda09
JA
147/* What a redirection descriptor looks like. If the redirection instruction
148 is ri_duplicating_input or ri_duplicating_output, use DEST, otherwise
149 use the file in FILENAME. Out-of-range descriptors are identified by a
150 negative DEST. */
726f6388
JA
151
152typedef union {
f73dda09 153 int dest; /* Place to redirect REDIRECTOR to, or ... */
726f6388
JA
154 WORD_DESC *filename; /* filename to redirect to. */
155} REDIRECTEE;
156
f73dda09
JA
157/* Structure describing a redirection. If REDIRECTOR is negative, the parser
158 (or translator in redir.c) encountered an out-of-range file descriptor. */
726f6388
JA
159typedef struct redirect {
160 struct redirect *next; /* Next element, or NULL. */
0001803f
CR
161 REDIRECTEE redirector; /* Descriptor or varname to be redirected. */
162 int rflags; /* Private flags for this redirection */
726f6388
JA
163 int flags; /* Flag value for `open'. */
164 enum r_instruction instruction; /* What to do with the information. */
165 REDIRECTEE redirectee; /* File descriptor or filename */
166 char *here_doc_eof; /* The word that appeared in <<foo. */
167} REDIRECT;
168
169/* An element used in parsing. A single word or a single redirection.
170 This is an ephemeral construct. */
171typedef struct element {
172 WORD_DESC *word;
173 REDIRECT *redirect;
174} ELEMENT;
175
176/* Possible values for command->flags. */
177#define CMD_WANT_SUBSHELL 0x01 /* User wants a subshell: ( command ) */
178#define CMD_FORCE_SUBSHELL 0x02 /* Shell needs to force a subshell. */
179#define CMD_INVERT_RETURN 0x04 /* Invert the exit value. */
180#define CMD_IGNORE_RETURN 0x08 /* Ignore the exit value. For set -e. */
181#define CMD_NO_FUNCTIONS 0x10 /* Ignore functions during command lookup. */
182#define CMD_INHIBIT_EXPANSION 0x20 /* Do not expand the command words. */
183#define CMD_NO_FORK 0x40 /* Don't fork; just call execve */
ccc6cda3
JA
184#define CMD_TIME_PIPELINE 0x80 /* Time a pipeline */
185#define CMD_TIME_POSIX 0x100 /* time -p; use POSIX.2 time output spec. */
d166f048
JA
186#define CMD_AMPERSAND 0x200 /* command & */
187#define CMD_STDIN_REDIR 0x400 /* async command needs implicit </dev/null */
f73dda09 188#define CMD_COMMAND_BUILTIN 0x0800 /* command executed by `command' builtin */
3185942a 189#define CMD_COPROC_SUBSHELL 0x1000
495aee44 190#define CMD_LASTPIPE 0x2000
a0c0a00f 191#define CMD_STDPATH 0x4000 /* use standard path for command lookup */
41f5420d 192#define CMD_TRY_OPTIMIZING 0x8000 /* try to optimize this simple command */
726f6388
JA
193
194/* What a command looks like. */
195typedef struct command {
196 enum command_type type; /* FOR CASE WHILE IF CONNECTION or SIMPLE. */
197 int flags; /* Flags controlling execution environment. */
198 int line; /* line number the command starts on */
199 REDIRECT *redirects; /* Special redirects for FOR CASE, etc. */
200 union {
201 struct for_com *For;
202 struct case_com *Case;
203 struct while_com *While;
204 struct if_com *If;
205 struct connection *Connection;
206 struct simple_com *Simple;
207 struct function_def *Function_def;
208 struct group_com *Group;
209#if defined (SELECT_COMMAND)
210 struct select_com *Select;
cce855bc
JA
211#endif
212#if defined (DPAREN_ARITHMETIC)
213 struct arith_com *Arith;
214#endif
215#if defined (COND_COMMAND)
216 struct cond_com *Cond;
726f6388 217#endif
bb70624e
JA
218#if defined (ARITH_FOR_COMMAND)
219 struct arith_for_com *ArithFor;
220#endif
221 struct subshell_com *Subshell;
3185942a 222 struct coproc_com *Coproc;
726f6388
JA
223 } value;
224} COMMAND;
225
226/* Structure used to represent the CONNECTION type. */
227typedef struct connection {
228 int ignore; /* Unused; simplifies make_command (). */
229 COMMAND *first; /* Pointer to the first command. */
230 COMMAND *second; /* Pointer to the second command. */
231 int connector; /* What separates this command from others. */
232} CONNECTION;
233
234/* Structures used to represent the CASE command. */
235
3185942a
JA
236/* Values for FLAGS word in a PATTERN_LIST */
237#define CASEPAT_FALLTHROUGH 0x01
238#define CASEPAT_TESTNEXT 0x02
239
726f6388
JA
240/* Pattern/action structure for CASE_COM. */
241typedef struct pattern_list {
242 struct pattern_list *next; /* Clause to try in case this one failed. */
243 WORD_LIST *patterns; /* Linked list of patterns to test. */
244 COMMAND *action; /* Thing to execute if a pattern matches. */
95732b49 245 int flags;
726f6388
JA
246} PATTERN_LIST;
247
248/* The CASE command. */
249typedef struct case_com {
250 int flags; /* See description of CMD flags. */
b80f6443 251 int line; /* line number the `case' keyword appears on */
726f6388
JA
252 WORD_DESC *word; /* The thing to test. */
253 PATTERN_LIST *clauses; /* The clauses to test against, or NULL. */
254} CASE_COM;
255
256/* FOR command. */
257typedef struct for_com {
258 int flags; /* See description of CMD flags. */
b80f6443 259 int line; /* line number the `for' keyword appears on */
726f6388
JA
260 WORD_DESC *name; /* The variable name to get mapped over. */
261 WORD_LIST *map_list; /* The things to map over. This is never NULL. */
262 COMMAND *action; /* The action to execute.
263 During execution, NAME is bound to successive
264 members of MAP_LIST. */
265} FOR_COM;
266
bb70624e
JA
267#if defined (ARITH_FOR_COMMAND)
268typedef struct arith_for_com {
269 int flags;
270 int line; /* generally used for error messages */
271 WORD_LIST *init;
272 WORD_LIST *test;
273 WORD_LIST *step;
274 COMMAND *action;
275} ARITH_FOR_COM;
276#endif
277
726f6388
JA
278#if defined (SELECT_COMMAND)
279/* KSH SELECT command. */
280typedef struct select_com {
281 int flags; /* See description of CMD flags. */
b80f6443 282 int line; /* line number the `select' keyword appears on */
726f6388
JA
283 WORD_DESC *name; /* The variable name to get mapped over. */
284 WORD_LIST *map_list; /* The things to map over. This is never NULL. */
285 COMMAND *action; /* The action to execute.
286 During execution, NAME is bound to the member of
287 MAP_LIST chosen by the user. */
288} SELECT_COM;
289#endif /* SELECT_COMMAND */
290
291/* IF command. */
292typedef struct if_com {
293 int flags; /* See description of CMD flags. */
294 COMMAND *test; /* Thing to test. */
295 COMMAND *true_case; /* What to do if the test returned non-zero. */
296 COMMAND *false_case; /* What to do if the test returned zero. */
297} IF_COM;
298
299/* WHILE command. */
300typedef struct while_com {
301 int flags; /* See description of CMD flags. */
302 COMMAND *test; /* Thing to test. */
303 COMMAND *action; /* Thing to do while test is non-zero. */
304} WHILE_COM;
305
cce855bc
JA
306#if defined (DPAREN_ARITHMETIC)
307/* The arithmetic evaluation command, ((...)). Just a set of flags and
308 a WORD_LIST, of which the first element is the only one used, for the
309 time being. */
310typedef struct arith_com {
311 int flags;
cce855bc 312 int line;
b80f6443 313 WORD_LIST *exp;
cce855bc
JA
314} ARITH_COM;
315#endif /* DPAREN_ARITHMETIC */
316
ac50fbac 317/* The conditional command, [[...]]. This is a binary tree -- we slipped
cce855bc
JA
318 a recursive-descent parser into the YACC grammar to parse it. */
319#define COND_AND 1
320#define COND_OR 2
321#define COND_UNARY 3
322#define COND_BINARY 4
323#define COND_TERM 5
324#define COND_EXPR 6
325
326typedef struct cond_com {
327 int flags;
328 int line;
329 int type;
330 WORD_DESC *op;
331 struct cond_com *left, *right;
332} COND_COM;
333
726f6388
JA
334/* The "simple" command. Just a collection of words and redirects. */
335typedef struct simple_com {
336 int flags; /* See description of CMD flags. */
b80f6443 337 int line; /* line number the command starts on */
726f6388
JA
338 WORD_LIST *words; /* The program name, the arguments,
339 variable assignments, etc. */
340 REDIRECT *redirects; /* Redirections to perform. */
726f6388
JA
341} SIMPLE_COM;
342
ccc6cda3 343/* The "function definition" command. */
726f6388 344typedef struct function_def {
cce855bc 345 int flags; /* See description of CMD flags. */
b80f6443 346 int line; /* Line number the function def starts on. */
726f6388
JA
347 WORD_DESC *name; /* The name of the function. */
348 COMMAND *command; /* The parsed execution tree. */
b80f6443 349 char *source_file; /* file in which function was defined, if any */
726f6388
JA
350} FUNCTION_DEF;
351
ccc6cda3
JA
352/* A command that is `grouped' allows pipes and redirections to affect all
353 commands in the group. */
726f6388
JA
354typedef struct group_com {
355 int ignore; /* See description of CMD flags. */
356 COMMAND *command;
357} GROUP_COM;
358
bb70624e
JA
359typedef struct subshell_com {
360 int flags;
d233b485 361 int line;
bb70624e
JA
362 COMMAND *command;
363} SUBSHELL_COM;
364
17345e5a
JA
365#define COPROC_RUNNING 0x01
366#define COPROC_DEAD 0x02
367
3185942a
JA
368typedef struct coproc {
369 char *c_name;
370 pid_t c_pid;
371 int c_rfd;
372 int c_wfd;
373 int c_rsave;
374 int c_wsave;
375 int c_flags;
376 int c_status;
ac50fbac 377 int c_lock;
3185942a
JA
378} Coproc;
379
380typedef struct coproc_com {
381 int flags;
382 char *name;
383 COMMAND *command;
384} COPROC_COM;
385
726f6388 386extern COMMAND *global_command;
3185942a 387extern Coproc sh_coproc;
726f6388 388
b72432fd
JA
389/* Possible command errors */
390#define CMDERR_DEFAULT 0
391#define CMDERR_BADTYPE 1
392#define CMDERR_BADCONN 2
393#define CMDERR_BADJUMP 3
394
395#define CMDERR_LAST 3
396
726f6388
JA
397/* Forward declarations of functions declared in copy_cmd.c. */
398
8868edaf
CR
399extern FUNCTION_DEF *copy_function_def_contents PARAMS((FUNCTION_DEF *, FUNCTION_DEF *));
400extern FUNCTION_DEF *copy_function_def PARAMS((FUNCTION_DEF *));
b80f6443 401
8868edaf
CR
402extern WORD_DESC *copy_word PARAMS((WORD_DESC *));
403extern WORD_LIST *copy_word_list PARAMS((WORD_LIST *));
404extern REDIRECT *copy_redirect PARAMS((REDIRECT *));
405extern REDIRECT *copy_redirects PARAMS((REDIRECT *));
406extern COMMAND *copy_command PARAMS((COMMAND *));
726f6388 407
ccc6cda3 408#endif /* _COMMAND_H_ */