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