diff options
author | Chet Ramey <chet.ramey@case.edu> | 2011-11-21 20:51:19 -0500 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2011-11-21 20:51:19 -0500 |
commit | 0001803f0b9523c94fa2ede48eaecb047fef4524 (patch) | |
tree | f334332811e033ff966d94f6268f0629a94304b3 /y.tab.c | |
parent | 89a92869e56aba4e4cab2d639c00a86f0545c862 (diff) | |
download | android_external_bash-0001803f0b9523c94fa2ede48eaecb047fef4524.tar.gz android_external_bash-0001803f0b9523c94fa2ede48eaecb047fef4524.tar.bz2 android_external_bash-0001803f0b9523c94fa2ede48eaecb047fef4524.zip |
Bash-4.1 distribution source
Diffstat (limited to 'y.tab.c')
-rw-r--r-- | y.tab.c | 1934 |
1 files changed, 1134 insertions, 800 deletions
@@ -90,27 +90,28 @@ TIMEOPT = 279, WORD = 280, ASSIGNMENT_WORD = 281, - NUMBER = 282, - ARITH_CMD = 283, - ARITH_FOR_EXPRS = 284, - COND_CMD = 285, - AND_AND = 286, - OR_OR = 287, - GREATER_GREATER = 288, - LESS_LESS = 289, - LESS_AND = 290, - LESS_LESS_LESS = 291, - GREATER_AND = 292, - SEMI_SEMI = 293, - SEMI_AND = 294, - SEMI_SEMI_AND = 295, - LESS_LESS_MINUS = 296, - AND_GREATER = 297, - AND_GREATER_GREATER = 298, - LESS_GREATER = 299, - GREATER_BAR = 300, - BAR_AND = 301, - yacc_EOF = 302 + REDIR_WORD = 282, + NUMBER = 283, + ARITH_CMD = 284, + ARITH_FOR_EXPRS = 285, + COND_CMD = 286, + AND_AND = 287, + OR_OR = 288, + GREATER_GREATER = 289, + LESS_LESS = 290, + LESS_AND = 291, + LESS_LESS_LESS = 292, + GREATER_AND = 293, + SEMI_SEMI = 294, + SEMI_AND = 295, + SEMI_SEMI_AND = 296, + LESS_LESS_MINUS = 297, + AND_GREATER = 298, + AND_GREATER_GREATER = 299, + LESS_GREATER = 300, + GREATER_BAR = 301, + BAR_AND = 302, + yacc_EOF = 303 }; #endif /* Tokens. */ @@ -138,27 +139,28 @@ #define TIMEOPT 279 #define WORD 280 #define ASSIGNMENT_WORD 281 -#define NUMBER 282 -#define ARITH_CMD 283 -#define ARITH_FOR_EXPRS 284 -#define COND_CMD 285 -#define AND_AND 286 -#define OR_OR 287 -#define GREATER_GREATER 288 -#define LESS_LESS 289 -#define LESS_AND 290 -#define LESS_LESS_LESS 291 -#define GREATER_AND 292 -#define SEMI_SEMI 293 -#define SEMI_AND 294 -#define SEMI_SEMI_AND 295 -#define LESS_LESS_MINUS 296 -#define AND_GREATER 297 -#define AND_GREATER_GREATER 298 -#define LESS_GREATER 299 -#define GREATER_BAR 300 -#define BAR_AND 301 -#define yacc_EOF 302 +#define REDIR_WORD 282 +#define NUMBER 283 +#define ARITH_CMD 284 +#define ARITH_FOR_EXPRS 285 +#define COND_CMD 286 +#define AND_AND 287 +#define OR_OR 288 +#define GREATER_GREATER 289 +#define LESS_LESS 290 +#define LESS_AND 291 +#define LESS_LESS_LESS 292 +#define GREATER_AND 293 +#define SEMI_SEMI 294 +#define SEMI_AND 295 +#define SEMI_SEMI_AND 296 +#define LESS_LESS_MINUS 297 +#define AND_GREATER 298 +#define AND_GREATER_GREATER 299 +#define LESS_GREATER 300 +#define GREATER_BAR 301 +#define BAR_AND 302 +#define yacc_EOF 303 @@ -265,6 +267,7 @@ extern int current_command_number; extern int sourcelevel, parse_and_execute_level; extern int posixly_correct; extern int last_command_exit_value; +extern pid_t last_command_subst_pid; extern char *shell_name, *current_host_name; extern char *dist_version; extern int patch_level; @@ -393,10 +396,6 @@ int promptvars = 1; quotes. */ int extended_quote = 1; -/* The decoded prompt string. Used if READLINE is not defined or if - editing is turned off. Analogous to current_readline_prompt. */ -static char *current_decoded_prompt; - /* The number of lines read from input while creating the current command. */ int current_command_line_count; @@ -406,6 +405,9 @@ int shell_eof_token; /* The token currently being read. */ int current_token; +/* The current parser state. */ +int parser_state; + /* Variables to manage the task of reading here documents, because we need to defer the reading until after a complete command has been collected. */ static REDIRECT *redir_stack[10]; @@ -430,8 +432,9 @@ static int function_bstart; /* The line number in a script at which an arithmetic for command starts. */ static int arith_for_lineno; -/* The current parser state. */ -static int parser_state; +/* The decoded prompt string. Used if READLINE is not defined or if + editing is turned off. Analogous to current_readline_prompt. */ +static char *current_decoded_prompt; /* The last read token, or NULL. read_token () uses this for context checking. */ @@ -443,6 +446,8 @@ static int token_before_that; /* The token read prior to token_before_that. */ static int two_tokens_ago; +static int global_extglob; + /* The line number in a script where the word in a `case WORD', `select WORD' or `for WORD' begins. This is a nested command maximum, since the array index is decremented after a case, select, or for command is parsed. */ @@ -457,6 +462,7 @@ static int word_top = -1; static int token_to_read; static WORD_DESC *word_desc_to_read; +static REDIRECTEE source; static REDIRECTEE redir; @@ -480,7 +486,7 @@ static REDIRECTEE redir; #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE -#line 316 "/Users/chet/src/bash/src/parse.y" +#line 320 "/Users/chet/src/bash/src/parse.y" { WORD_DESC *word; /* the word that we read. */ int number; /* the number that we read. */ @@ -491,7 +497,7 @@ typedef union YYSTYPE PATTERN_LIST *pattern; } /* Line 187 of yacc.c. */ -#line 495 "y.tab.c" +#line 501 "y.tab.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -504,7 +510,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 508 "y.tab.c" +#line 514 "y.tab.c" #ifdef short # undef short @@ -717,22 +723,22 @@ union yyalloc #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 102 +#define YYFINAL 113 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 728 +#define YYLAST 760 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 59 +#define YYNTOKENS 60 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 38 /* YYNRULES -- Number of rules. */ -#define YYNRULES 153 +#define YYNRULES 167 /* YYNRULES -- Number of states. */ -#define YYNSTATES 319 +#define YYNSTATES 344 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 302 +#define YYMAXUTOK 303 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -741,18 +747,18 @@ union yyalloc static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 50, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 47, 2, - 57, 58, 2, 2, 2, 54, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, - 53, 2, 52, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 48, 2, + 58, 59, 2, 2, 2, 55, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, + 54, 2, 53, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 55, 51, 56, 2, 2, 2, 2, + 2, 2, 2, 56, 52, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -770,7 +776,7 @@ static const yytype_uint8 yytranslate[] = 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 50 + 45, 46, 47, 51 }; #if YYDEBUG @@ -779,110 +785,118 @@ static const yytype_uint8 yytranslate[] = static const yytype_uint16 yyprhs[] = { 0, 0, 3, 6, 8, 11, 13, 15, 18, 21, - 24, 28, 32, 35, 39, 42, 46, 49, 53, 56, - 60, 63, 67, 70, 74, 77, 81, 84, 88, 91, - 95, 98, 102, 105, 108, 112, 115, 118, 122, 124, - 126, 128, 130, 133, 135, 138, 140, 142, 145, 147, - 149, 151, 153, 159, 165, 167, 169, 171, 173, 175, - 177, 179, 186, 193, 201, 209, 220, 231, 241, 251, - 259, 267, 273, 279, 286, 293, 301, 309, 320, 331, - 338, 346, 353, 359, 366, 371, 373, 376, 380, 383, - 387, 391, 396, 399, 405, 413, 420, 424, 426, 430, - 435, 442, 448, 450, 453, 458, 463, 469, 475, 478, - 482, 485, 489, 492, 496, 498, 502, 505, 507, 510, - 514, 518, 522, 527, 532, 537, 542, 547, 549, 551, - 553, 555, 557, 559, 560, 563, 565, 568, 571, 576, - 581, 585, 589, 591, 593, 596, 599, 603, 607, 610, - 615, 620, 622, 624 + 24, 28, 32, 36, 40, 43, 47, 51, 54, 58, + 62, 65, 69, 73, 76, 80, 84, 87, 91, 95, + 98, 102, 106, 109, 113, 117, 120, 124, 128, 131, + 135, 139, 142, 146, 150, 153, 157, 161, 164, 168, + 172, 175, 178, 180, 182, 184, 186, 189, 191, 194, + 196, 198, 201, 203, 205, 207, 209, 215, 221, 223, + 225, 227, 229, 231, 233, 235, 242, 249, 257, 265, + 276, 287, 297, 307, 315, 323, 329, 335, 342, 349, + 357, 365, 376, 387, 394, 402, 409, 415, 422, 427, + 429, 432, 436, 439, 443, 447, 452, 455, 461, 469, + 476, 480, 482, 486, 491, 498, 504, 506, 509, 514, + 519, 525, 531, 534, 538, 541, 545, 548, 552, 554, + 558, 561, 563, 566, 570, 574, 578, 583, 588, 593, + 598, 603, 605, 607, 609, 611, 613, 615, 616, 619, + 621, 624, 627, 632, 637, 641, 645, 647, 649, 652, + 655, 659, 663, 666, 671, 676, 678, 680 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { - 60, 0, -1, 92, 89, -1, 49, -1, 1, 49, - -1, 50, -1, 25, -1, 61, 25, -1, 52, 25, - -1, 53, 25, -1, 27, 52, 25, -1, 27, 53, - 25, -1, 33, 25, -1, 27, 33, 25, -1, 34, - 25, -1, 27, 34, 25, -1, 36, 25, -1, 27, - 36, 25, -1, 35, 27, -1, 27, 35, 27, -1, - 37, 27, -1, 27, 37, 27, -1, 35, 25, -1, - 27, 35, 25, -1, 37, 25, -1, 27, 37, 25, - -1, 41, 25, -1, 27, 41, 25, -1, 37, 54, - -1, 27, 37, 54, -1, 35, 54, -1, 27, 35, - 54, -1, 42, 25, -1, 43, 25, -1, 27, 44, - 25, -1, 44, 25, -1, 45, 25, -1, 27, 45, - 25, -1, 25, -1, 26, -1, 62, -1, 62, -1, - 64, 62, -1, 63, -1, 65, 63, -1, 65, -1, - 67, -1, 67, 64, -1, 72, -1, 75, -1, 68, - -1, 71, -1, 12, 86, 14, 86, 15, -1, 13, - 86, 14, 86, 15, -1, 70, -1, 76, -1, 74, - -1, 77, -1, 78, -1, 79, -1, 69, -1, 10, - 25, 91, 14, 86, 15, -1, 10, 25, 91, 55, - 86, 56, -1, 10, 25, 48, 91, 14, 86, 15, - -1, 10, 25, 48, 91, 55, 86, 56, -1, 10, - 25, 91, 21, 61, 90, 91, 14, 86, 15, -1, - 10, 25, 91, 21, 61, 90, 91, 55, 86, 56, - -1, 10, 25, 91, 21, 90, 91, 14, 86, 15, - -1, 10, 25, 91, 21, 90, 91, 55, 86, 56, - -1, 10, 29, 90, 91, 14, 86, 15, -1, 10, - 29, 90, 91, 55, 86, 56, -1, 10, 29, 14, - 86, 15, -1, 10, 29, 55, 86, 56, -1, 11, - 25, 91, 14, 85, 15, -1, 11, 25, 91, 55, - 85, 56, -1, 11, 25, 48, 91, 14, 85, 15, - -1, 11, 25, 48, 91, 55, 85, 56, -1, 11, - 25, 91, 21, 61, 90, 91, 14, 85, 15, -1, - 11, 25, 91, 21, 61, 90, 91, 55, 85, 56, - -1, 8, 25, 91, 21, 91, 9, -1, 8, 25, - 91, 21, 83, 91, 9, -1, 8, 25, 91, 21, - 81, 9, -1, 25, 57, 58, 91, 73, -1, 16, - 25, 57, 58, 91, 73, -1, 16, 25, 91, 73, - -1, 67, -1, 67, 64, -1, 57, 86, 58, -1, - 17, 67, -1, 17, 67, 64, -1, 17, 25, 67, - -1, 17, 25, 67, 64, -1, 17, 65, -1, 3, - 86, 4, 86, 7, -1, 3, 86, 4, 86, 5, - 86, 7, -1, 3, 86, 4, 86, 80, 7, -1, - 55, 86, 56, -1, 28, -1, 18, 30, 19, -1, - 6, 86, 4, 86, -1, 6, 86, 4, 86, 5, - 86, -1, 6, 86, 4, 86, 80, -1, 82, -1, - 83, 82, -1, 91, 84, 58, 86, -1, 91, 84, - 58, 91, -1, 91, 57, 84, 58, 86, -1, 91, - 57, 84, 58, 91, -1, 82, 38, -1, 83, 82, - 38, -1, 82, 39, -1, 83, 82, 39, -1, 82, - 40, -1, 83, 82, 40, -1, 25, -1, 84, 51, - 25, -1, 91, 87, -1, 85, -1, 91, 88, -1, - 88, 49, 91, -1, 88, 47, 91, -1, 88, 48, - 91, -1, 88, 31, 91, 88, -1, 88, 32, 91, - 88, -1, 88, 47, 91, 88, -1, 88, 48, 91, - 88, -1, 88, 49, 91, 88, -1, 94, -1, 49, - -1, 50, -1, 49, -1, 48, -1, 50, -1, -1, - 91, 49, -1, 93, -1, 93, 47, -1, 93, 48, - -1, 93, 31, 91, 93, -1, 93, 32, 91, 93, - -1, 93, 47, 93, -1, 93, 48, 93, -1, 94, - -1, 95, -1, 22, 95, -1, 96, 95, -1, 96, - 22, 95, -1, 22, 96, 95, -1, 96, 90, -1, - 95, 51, 91, 95, -1, 95, 46, 91, 95, -1, - 66, -1, 23, -1, 23, 24, -1 + 61, 0, -1, 93, 90, -1, 50, -1, 1, 50, + -1, 51, -1, 25, -1, 62, 25, -1, 53, 25, + -1, 54, 25, -1, 28, 53, 25, -1, 28, 54, + 25, -1, 27, 53, 25, -1, 27, 54, 25, -1, + 34, 25, -1, 28, 34, 25, -1, 27, 34, 25, + -1, 46, 25, -1, 28, 46, 25, -1, 27, 46, + 25, -1, 45, 25, -1, 28, 45, 25, -1, 27, + 45, 25, -1, 35, 25, -1, 28, 35, 25, -1, + 27, 35, 25, -1, 42, 25, -1, 28, 42, 25, + -1, 27, 42, 25, -1, 37, 25, -1, 28, 37, + 25, -1, 27, 37, 25, -1, 36, 28, -1, 28, + 36, 28, -1, 27, 36, 28, -1, 38, 28, -1, + 28, 38, 28, -1, 27, 38, 28, -1, 36, 25, + -1, 28, 36, 25, -1, 27, 36, 25, -1, 38, + 25, -1, 28, 38, 25, -1, 27, 38, 25, -1, + 38, 55, -1, 28, 38, 55, -1, 27, 38, 55, + -1, 36, 55, -1, 28, 36, 55, -1, 27, 36, + 55, -1, 43, 25, -1, 44, 25, -1, 25, -1, + 26, -1, 63, -1, 63, -1, 65, 63, -1, 64, + -1, 66, 64, -1, 66, -1, 68, -1, 68, 65, + -1, 73, -1, 76, -1, 69, -1, 72, -1, 12, + 87, 14, 87, 15, -1, 13, 87, 14, 87, 15, + -1, 71, -1, 77, -1, 75, -1, 78, -1, 79, + -1, 80, -1, 70, -1, 10, 25, 92, 14, 87, + 15, -1, 10, 25, 92, 56, 87, 57, -1, 10, + 25, 49, 92, 14, 87, 15, -1, 10, 25, 49, + 92, 56, 87, 57, -1, 10, 25, 92, 21, 62, + 91, 92, 14, 87, 15, -1, 10, 25, 92, 21, + 62, 91, 92, 56, 87, 57, -1, 10, 25, 92, + 21, 91, 92, 14, 87, 15, -1, 10, 25, 92, + 21, 91, 92, 56, 87, 57, -1, 10, 30, 91, + 92, 14, 87, 15, -1, 10, 30, 91, 92, 56, + 87, 57, -1, 10, 30, 14, 87, 15, -1, 10, + 30, 56, 87, 57, -1, 11, 25, 92, 14, 86, + 15, -1, 11, 25, 92, 56, 86, 57, -1, 11, + 25, 49, 92, 14, 86, 15, -1, 11, 25, 49, + 92, 56, 86, 57, -1, 11, 25, 92, 21, 62, + 91, 92, 14, 86, 15, -1, 11, 25, 92, 21, + 62, 91, 92, 56, 86, 57, -1, 8, 25, 92, + 21, 92, 9, -1, 8, 25, 92, 21, 84, 92, + 9, -1, 8, 25, 92, 21, 82, 9, -1, 25, + 58, 59, 92, 74, -1, 16, 25, 58, 59, 92, + 74, -1, 16, 25, 92, 74, -1, 68, -1, 68, + 65, -1, 58, 87, 59, -1, 17, 68, -1, 17, + 68, 65, -1, 17, 25, 68, -1, 17, 25, 68, + 65, -1, 17, 66, -1, 3, 87, 4, 87, 7, + -1, 3, 87, 4, 87, 5, 87, 7, -1, 3, + 87, 4, 87, 81, 7, -1, 56, 87, 57, -1, + 29, -1, 18, 31, 19, -1, 6, 87, 4, 87, + -1, 6, 87, 4, 87, 5, 87, -1, 6, 87, + 4, 87, 81, -1, 83, -1, 84, 83, -1, 92, + 85, 59, 87, -1, 92, 85, 59, 92, -1, 92, + 58, 85, 59, 87, -1, 92, 58, 85, 59, 92, + -1, 83, 39, -1, 84, 83, 39, -1, 83, 40, + -1, 84, 83, 40, -1, 83, 41, -1, 84, 83, + 41, -1, 25, -1, 85, 52, 25, -1, 92, 88, + -1, 86, -1, 92, 89, -1, 89, 50, 92, -1, + 89, 48, 92, -1, 89, 49, 92, -1, 89, 32, + 92, 89, -1, 89, 33, 92, 89, -1, 89, 48, + 92, 89, -1, 89, 49, 92, 89, -1, 89, 50, + 92, 89, -1, 95, -1, 50, -1, 51, -1, 50, + -1, 49, -1, 51, -1, -1, 92, 50, -1, 94, + -1, 94, 48, -1, 94, 49, -1, 94, 32, 92, + 94, -1, 94, 33, 92, 94, -1, 94, 48, 94, + -1, 94, 49, 94, -1, 95, -1, 96, -1, 22, + 96, -1, 97, 96, -1, 97, 22, 96, -1, 22, + 97, 96, -1, 97, 91, -1, 96, 52, 92, 96, + -1, 96, 47, 92, 96, -1, 67, -1, 23, -1, + 23, 24, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 369, 369, 380, 389, 404, 414, 416, 420, 425, - 430, 435, 440, 445, 450, 456, 462, 467, 472, 477, - 482, 487, 492, 497, 502, 507, 512, 519, 526, 531, - 536, 541, 546, 551, 556, 561, 566, 571, 578, 580, - 582, 586, 590, 601, 603, 607, 609, 611, 627, 629, - 633, 635, 637, 639, 641, 643, 645, 647, 649, 651, - 653, 657, 662, 667, 672, 677, 682, 687, 692, 699, - 704, 709, 714, 721, 726, 731, 736, 741, 746, 753, - 758, 763, 770, 773, 776, 780, 782, 813, 820, 825, - 842, 847, 864, 871, 873, 875, 880, 884, 888, 892, - 894, 896, 900, 901, 905, 907, 909, 911, 915, 917, - 919, 921, 923, 925, 929, 931, 940, 948, 949, 955, - 956, 963, 967, 969, 971, 978, 980, 982, 986, 987, - 990, 992, 994, 998, 999, 1008, 1021, 1037, 1052, 1054, - 1056, 1063, 1066, 1070, 1072, 1078, 1084, 1090, 1096, 1116, - 1118, 1140, 1144, 1146 + 0, 373, 373, 384, 393, 408, 418, 420, 424, 430, + 436, 442, 448, 454, 460, 466, 472, 478, 484, 490, + 496, 502, 508, 514, 521, 528, 535, 542, 549, 556, + 562, 568, 574, 580, 586, 592, 598, 604, 610, 616, + 622, 628, 634, 640, 646, 652, 658, 664, 670, 676, + 682, 688, 696, 698, 700, 704, 708, 719, 721, 725, + 727, 729, 745, 747, 751, 753, 755, 757, 759, 761, + 763, 765, 767, 769, 771, 775, 780, 785, 790, 795, + 800, 805, 810, 817, 822, 827, 832, 839, 844, 849, + 854, 859, 864, 871, 876, 881, 888, 891, 894, 898, + 900, 931, 938, 943, 960, 965, 982, 989, 991, 993, + 998, 1002, 1006, 1010, 1012, 1014, 1018, 1019, 1023, 1025, + 1027, 1029, 1033, 1035, 1037, 1039, 1041, 1043, 1047, 1049, + 1058, 1066, 1067, 1073, 1074, 1081, 1085, 1087, 1089, 1096, + 1098, 1100, 1104, 1105, 1108, 1110, 1112, 1116, 1117, 1126, + 1139, 1155, 1170, 1172, 1174, 1181, 1184, 1188, 1190, 1196, + 1202, 1208, 1214, 1234, 1236, 1259, 1263, 1265 }; #endif @@ -894,8 +908,8 @@ static const char *const yytname[] = "$end", "error", "$undefined", "IF", "THEN", "ELSE", "ELIF", "FI", "CASE", "ESAC", "FOR", "SELECT", "WHILE", "UNTIL", "DO", "DONE", "FUNCTION", "COPROC", "COND_START", "COND_END", "COND_ERROR", "IN", - "BANG", "TIME", "TIMEOPT", "WORD", "ASSIGNMENT_WORD", "NUMBER", - "ARITH_CMD", "ARITH_FOR_EXPRS", "COND_CMD", "AND_AND", "OR_OR", + "BANG", "TIME", "TIMEOPT", "WORD", "ASSIGNMENT_WORD", "REDIR_WORD", + "NUMBER", "ARITH_CMD", "ARITH_FOR_EXPRS", "COND_CMD", "AND_AND", "OR_OR", "GREATER_GREATER", "LESS_LESS", "LESS_AND", "LESS_LESS_LESS", "GREATER_AND", "SEMI_SEMI", "SEMI_AND", "SEMI_SEMI_AND", "LESS_LESS_MINUS", "AND_GREATER", "AND_GREATER_GREATER", "LESS_GREATER", @@ -922,51 +936,53 @@ static const yytype_uint16 yytoknum[] = 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 38, 59, 10, - 302, 124, 62, 60, 45, 123, 125, 40, 41 + 295, 296, 297, 298, 299, 300, 301, 302, 38, 59, + 10, 303, 124, 62, 60, 45, 123, 125, 40, 41 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 59, 60, 60, 60, 60, 61, 61, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, - 63, 64, 64, 65, 65, 66, 66, 66, 66, 66, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 68, 68, 68, 68, 68, 68, 68, 68, 69, - 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, - 71, 71, 72, 72, 72, 73, 73, 74, 75, 75, - 75, 75, 75, 76, 76, 76, 77, 78, 79, 80, - 80, 80, 81, 81, 82, 82, 82, 82, 83, 83, - 83, 83, 83, 83, 84, 84, 85, 86, 86, 87, - 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, - 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, - 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, - 95, 95, 96, 96 + 0, 60, 61, 61, 61, 61, 62, 62, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 64, 64, 64, 65, 65, 66, 66, 67, + 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, + 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, + 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, + 74, 75, 76, 76, 76, 76, 76, 77, 77, 77, + 78, 79, 80, 81, 81, 81, 82, 82, 83, 83, + 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, + 86, 87, 87, 88, 88, 88, 89, 89, 89, 89, + 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, + 93, 93, 94, 94, 94, 94, 94, 95, 95, 95, + 95, 95, 95, 96, 96, 96, 97, 97 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 1, 2, 1, 1, 2, 2, 2, - 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 2, 3, 2, 2, 3, 2, 2, 3, 1, 1, - 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, - 1, 1, 5, 5, 1, 1, 1, 1, 1, 1, - 1, 6, 6, 7, 7, 10, 10, 9, 9, 7, - 7, 5, 5, 6, 6, 7, 7, 10, 10, 6, - 7, 6, 5, 6, 4, 1, 2, 3, 2, 3, - 3, 4, 2, 5, 7, 6, 3, 1, 3, 4, - 6, 5, 1, 2, 4, 4, 5, 5, 2, 3, - 2, 3, 2, 3, 1, 3, 2, 1, 2, 3, - 3, 3, 4, 4, 4, 4, 4, 1, 1, 1, - 1, 1, 1, 0, 2, 1, 2, 2, 4, 4, - 3, 3, 1, 1, 2, 2, 3, 3, 2, 4, - 4, 1, 1, 2 + 3, 3, 3, 3, 2, 3, 3, 2, 3, 3, + 2, 3, 3, 2, 3, 3, 2, 3, 3, 2, + 3, 3, 2, 3, 3, 2, 3, 3, 2, 3, + 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, + 2, 2, 1, 1, 1, 1, 2, 1, 2, 1, + 1, 2, 1, 1, 1, 1, 5, 5, 1, 1, + 1, 1, 1, 1, 1, 6, 6, 7, 7, 10, + 10, 9, 9, 7, 7, 5, 5, 6, 6, 7, + 7, 10, 10, 6, 7, 6, 5, 6, 4, 1, + 2, 3, 2, 3, 3, 4, 2, 5, 7, 6, + 3, 1, 3, 4, 6, 5, 1, 2, 4, 4, + 5, 5, 2, 3, 2, 3, 2, 3, 1, 3, + 2, 1, 2, 3, 3, 3, 4, 4, 4, 4, + 4, 1, 1, 1, 1, 1, 1, 0, 2, 1, + 2, 2, 4, 4, 3, 3, 1, 1, 2, 2, + 3, 3, 2, 4, 4, 1, 1, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -974,95 +990,101 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 0, 133, 0, 0, 0, 133, 133, 0, 0, - 0, 0, 152, 38, 39, 0, 97, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3, 5, 0, - 0, 133, 133, 0, 40, 43, 45, 151, 46, 50, - 60, 54, 51, 48, 56, 49, 55, 57, 58, 59, - 0, 135, 142, 143, 0, 4, 117, 0, 0, 133, - 133, 0, 133, 0, 0, 133, 38, 92, 88, 0, - 144, 0, 153, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 14, 22, 18, 30, 16, - 24, 20, 28, 26, 32, 33, 35, 36, 8, 9, - 0, 0, 1, 38, 44, 41, 47, 128, 129, 2, - 133, 133, 136, 137, 133, 133, 0, 131, 130, 132, - 148, 145, 133, 134, 116, 118, 127, 0, 133, 0, - 133, 133, 133, 133, 0, 133, 133, 0, 0, 90, - 89, 98, 147, 133, 13, 15, 23, 19, 31, 17, - 25, 21, 29, 27, 34, 37, 10, 11, 96, 87, - 42, 0, 0, 140, 141, 0, 0, 146, 0, 133, - 133, 133, 133, 133, 133, 0, 133, 0, 133, 0, - 0, 0, 0, 133, 0, 133, 0, 0, 133, 85, - 84, 91, 0, 138, 139, 0, 0, 150, 149, 133, - 133, 93, 0, 0, 0, 120, 121, 119, 0, 102, - 133, 0, 133, 133, 0, 6, 0, 133, 0, 71, - 72, 133, 133, 133, 133, 0, 0, 0, 0, 52, - 53, 0, 86, 82, 0, 0, 95, 122, 123, 124, - 125, 126, 81, 108, 110, 112, 103, 0, 79, 114, - 0, 0, 0, 0, 61, 7, 133, 0, 62, 0, - 0, 0, 0, 73, 0, 133, 74, 83, 94, 133, - 133, 133, 133, 109, 111, 113, 80, 0, 0, 133, - 63, 64, 0, 133, 133, 69, 70, 75, 76, 0, - 99, 0, 0, 0, 133, 115, 104, 105, 133, 133, - 0, 0, 133, 133, 133, 101, 106, 107, 0, 0, - 67, 68, 0, 0, 100, 65, 66, 77, 78 + 0, 0, 147, 0, 0, 0, 147, 147, 0, 0, + 0, 0, 166, 52, 53, 0, 0, 111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, + 0, 0, 147, 147, 0, 54, 57, 59, 165, 60, + 64, 74, 68, 65, 62, 70, 63, 69, 71, 72, + 73, 0, 149, 156, 157, 0, 4, 131, 0, 0, + 147, 147, 0, 147, 0, 0, 147, 52, 106, 102, + 0, 158, 0, 167, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 23, 38, 32, 47, + 29, 41, 35, 44, 26, 50, 51, 20, 17, 8, + 9, 0, 0, 1, 52, 58, 55, 61, 142, 143, + 2, 147, 147, 150, 151, 147, 147, 0, 145, 144, + 146, 162, 159, 147, 148, 130, 132, 141, 0, 147, + 0, 147, 147, 147, 147, 0, 147, 147, 0, 0, + 104, 103, 112, 161, 147, 16, 25, 40, 34, 49, + 31, 43, 37, 46, 28, 22, 19, 12, 13, 15, + 24, 39, 33, 48, 30, 42, 36, 45, 27, 21, + 18, 10, 11, 110, 101, 56, 0, 0, 154, 155, + 0, 0, 160, 0, 147, 147, 147, 147, 147, 147, + 0, 147, 0, 147, 0, 0, 0, 0, 147, 0, + 147, 0, 0, 147, 99, 98, 105, 0, 152, 153, + 0, 0, 164, 163, 147, 147, 107, 0, 0, 0, + 134, 135, 133, 0, 116, 147, 0, 147, 147, 0, + 6, 0, 147, 0, 85, 86, 147, 147, 147, 147, + 0, 0, 0, 0, 66, 67, 0, 100, 96, 0, + 0, 109, 136, 137, 138, 139, 140, 95, 122, 124, + 126, 117, 0, 93, 128, 0, 0, 0, 0, 75, + 7, 147, 0, 76, 0, 0, 0, 0, 87, 0, + 147, 88, 97, 108, 147, 147, 147, 147, 123, 125, + 127, 94, 0, 0, 147, 77, 78, 0, 147, 147, + 83, 84, 89, 90, 0, 113, 0, 0, 0, 147, + 129, 118, 119, 147, 147, 0, 0, 147, 147, 147, + 115, 120, 121, 0, 0, 81, 82, 0, 0, 114, + 79, 80, 91, 92 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 33, 216, 34, 35, 106, 36, 37, 38, 39, - 40, 41, 42, 43, 190, 44, 45, 46, 47, 48, - 49, 202, 208, 209, 210, 251, 56, 57, 124, 125, - 109, 120, 58, 50, 163, 126, 53, 54 + -1, 34, 241, 35, 36, 117, 37, 38, 39, 40, + 41, 42, 43, 44, 215, 45, 46, 47, 48, 49, + 50, 227, 233, 234, 235, 276, 57, 58, 135, 136, + 120, 131, 59, 51, 188, 137, 54, 55 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -188 +#define YYPACT_NINF -212 static const yytype_int16 yypact[] = { - 293, -26, -188, 7, 41, 43, -188, -188, 46, 629, - -17, 485, 11, 23, -188, 675, -188, 65, 68, 96, - 77, 119, 92, 124, 127, 140, 143, -188, -188, 149, - 154, -188, -188, 98, -188, -188, 662, -188, 208, -188, - -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, - 24, 12, -188, -36, 341, -188, -188, 177, 389, -188, - 142, 8, 147, 169, 185, 148, 200, 662, 208, 181, - -36, 581, -188, 146, 184, 189, 130, 192, 135, 197, - 198, 202, 207, 209, -188, -188, -188, -188, -188, -188, - -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, - 180, 167, -188, -188, -188, -188, 208, -188, -188, -188, - -188, -188, 437, 437, -188, -188, 581, -188, -188, -188, - -188, -36, -188, -188, -188, 227, -188, -12, -188, 20, - -188, -188, -188, -188, 122, -188, -188, 179, 37, 208, - 208, -188, -36, -188, -188, -188, -188, -188, -188, -188, - -188, -188, -188, -188, -188, -188, -188, -188, -188, -188, - -188, 389, 389, 53, 53, 533, 533, -36, 224, -188, - -188, -188, -188, -188, -188, 40, -188, 171, -188, 233, - 190, 48, 73, -188, 247, -188, 239, 267, -188, 208, - -188, 208, 37, -188, -188, 437, 437, -36, -36, -188, - -188, -188, 276, 389, 389, 389, 389, 389, 275, 226, - -188, 42, -188, -188, 270, -188, 231, -188, 230, -188, - -188, -188, -188, -188, -188, 272, 389, 231, 234, -188, - -188, 37, 208, -188, 282, 287, -188, -188, -188, 76, - 76, 76, -188, -188, -188, -188, 229, 63, -188, -188, - 274, -27, 280, 241, -188, -188, -188, 99, -188, 285, - 246, 292, 252, -188, 227, -188, -188, -188, -188, -188, - -188, -188, -188, -188, -188, -188, -188, -22, 288, -188, - -188, -188, 131, -188, -188, -188, -188, -188, -188, 133, - 129, 389, 389, 389, -188, -188, -188, 389, -188, -188, - 297, 258, -188, -188, -188, -188, -188, 389, 302, 266, - -188, -188, 308, 268, -188, -188, -188, -188, -188 + 318, -40, -212, 11, 10, 32, -212, -212, 34, 661, + 39, 514, 52, 21, -212, 255, 706, -212, 65, 79, + 47, 98, 55, 133, 134, 139, 151, 152, -212, -212, + 156, 157, -212, -212, 142, -212, -212, 232, -212, 693, + -212, -212, -212, -212, -212, -212, -212, -212, -212, -212, + -212, 49, 213, -212, -28, 367, -212, -212, 150, 416, + -212, 135, -3, 137, 184, 194, 158, 31, 232, 693, + 191, -28, 612, -212, 166, 199, 202, 69, 209, 128, + 210, 214, 218, 219, 225, 227, 247, 165, 248, 181, + 256, 257, 258, 259, 262, -212, -212, -212, -212, -212, + -212, -212, -212, -212, -212, -212, -212, -212, -212, -212, + -212, 237, 236, -212, -212, -212, -212, 693, -212, -212, + -212, -212, -212, 465, 465, -212, -212, 612, -212, -212, + -212, -212, -28, -212, -212, -212, 205, -212, -13, -212, + 116, -212, -212, -212, -212, 117, -212, -212, 240, 53, + 693, 693, -212, -28, -212, -212, -212, -212, -212, -212, + -212, -212, -212, -212, -212, -212, -212, -212, -212, -212, + -212, -212, -212, -212, -212, -212, -212, -212, -212, -212, + -212, -212, -212, -212, -212, -212, 416, 416, 75, 75, + 563, 563, -28, 15, -212, -212, -212, -212, -212, -212, + 72, -212, 120, -212, 281, 249, 105, 118, -212, 279, + -212, 290, 292, -212, 693, -212, 693, 53, -212, -212, + 465, 465, -28, -28, -212, -212, -212, 303, 416, 416, + 416, 416, 416, 302, 174, -212, 0, -212, -212, 297, + -212, 179, -212, 263, -212, -212, -212, -212, -212, -212, + 299, 416, 179, 265, -212, -212, 53, 693, -212, 308, + 312, -212, -212, -212, 80, 80, 80, -212, -212, -212, + -212, 224, 43, -212, -212, 300, 33, 309, 270, -212, + -212, -212, 129, -212, 317, 276, 322, 282, -212, 205, + -212, -212, -212, -212, -212, -212, -212, -212, -212, -212, + -212, -212, 46, 313, -212, -212, -212, 149, -212, -212, + -212, -212, -212, -212, 161, 115, 416, 416, 416, -212, + -212, -212, 416, -212, -212, 327, 291, -212, -212, -212, + -212, -212, 416, 334, 293, -212, -212, 336, 301, -212, + -212, -212, -212, -212 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -188, -188, 141, -30, -25, -62, 322, -188, -5, -188, - -188, -188, -188, -188, -185, -188, -188, -188, -188, -188, - -188, 49, -188, 123, -188, 82, -171, -6, -188, -187, - -188, -58, -32, -188, 5, 2, 10, 329 + -212, -212, 148, -36, 1, -62, 350, -212, -5, -212, + -212, -212, -212, -212, -211, -212, -212, -212, -212, -212, + -212, 50, -212, 131, -212, 92, -194, -6, -212, -200, + -212, -45, -48, -212, 5, 2, 12, 362 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -1072,156 +1094,164 @@ static const yytype_int16 yypgoto[] = #define YYTABLE_NINF -1 static const yytype_uint16 yytable[] = { - 63, 64, 52, 132, 68, 51, 140, 233, 105, 174, - 114, 104, 225, 69, 228, 115, 237, 238, 239, 240, - 241, 70, 130, 55, 278, 100, 101, 127, 129, 278, - 134, 279, 59, 138, 176, 72, 294, 123, 105, 264, - 2, 177, 104, 110, 111, 3, 267, 4, 5, 6, - 7, 248, 261, 262, 212, 10, 117, 118, 119, 112, - 113, 139, 221, 131, 121, 16, 60, 249, 62, 123, - 61, 65, 276, 107, 108, 178, 160, 191, 161, 162, - 73, 142, 165, 166, 110, 111, 123, 223, 249, 123, - 84, 123, 31, 85, 32, 213, 175, 123, 102, 250, - 181, 182, 89, 222, 239, 240, 241, 169, 170, 105, - 160, 192, 123, 283, 52, 52, 168, 93, 164, 217, - 250, 86, 123, 87, 179, 180, 167, 232, 224, 186, - 187, 312, 313, 189, 304, 200, 183, 203, 204, 205, - 206, 207, 211, 184, 90, 298, 91, 302, 123, 94, - 88, 226, 95, 226, 284, 146, 231, 147, 256, 105, - 150, 160, 151, 52, 52, 96, 193, 194, 97, 265, - 214, 123, 218, 92, 98, 197, 198, 185, 247, 99, - 123, 122, 123, 135, 148, 257, 299, 189, 303, 152, - 128, 226, 226, 234, 235, 133, 215, 52, 52, 136, - 141, 164, 160, 2, 143, 137, 252, 253, 3, 144, - 4, 5, 6, 7, 145, 259, 260, 149, 10, 117, - 118, 119, 153, 154, 282, 159, 189, 155, 16, 199, - 200, 201, 156, 289, 157, 15, 158, 188, 291, 292, - 293, 17, 18, 19, 20, 21, 220, 297, 219, 22, - 23, 24, 25, 26, 229, 31, 255, 32, 169, 170, - 29, 30, 307, 290, 243, 244, 245, 273, 274, 275, - 226, 226, 215, 296, 171, 172, 173, 300, 301, 117, - 118, 119, 230, 236, 242, 254, 258, 263, 306, 268, - 266, 269, 308, 309, 1, 280, 2, 281, 314, 249, - 285, 3, 286, 4, 5, 6, 7, 287, 288, 8, - 9, 10, 310, 295, 311, 11, 12, 315, 13, 14, - 15, 16, 316, 317, 318, 227, 17, 18, 19, 20, - 21, 67, 277, 246, 22, 23, 24, 25, 26, 305, - 71, 0, 27, 28, 2, 29, 30, 0, 31, 3, - 32, 4, 5, 6, 7, 0, 0, 8, 9, 10, - 0, 0, 0, 116, 0, 0, 13, 14, 15, 16, - 0, 0, 0, 0, 17, 18, 19, 20, 21, 0, - 0, 0, 22, 23, 24, 25, 26, 0, 0, 117, - 118, 119, 2, 29, 30, 0, 31, 3, 32, 4, - 5, 6, 7, 0, 0, 8, 9, 10, 0, 0, - 0, 11, 12, 0, 13, 14, 15, 16, 0, 0, - 0, 0, 17, 18, 19, 20, 21, 0, 0, 0, - 22, 23, 24, 25, 26, 0, 0, 0, 123, 0, - 2, 29, 30, 0, 31, 3, 32, 4, 5, 6, - 7, 0, 0, 8, 9, 10, 0, 0, 0, 11, - 12, 0, 13, 14, 15, 16, 0, 0, 0, 0, - 17, 18, 19, 20, 21, 0, 0, 0, 22, 23, - 24, 25, 26, 0, 0, 0, 0, 0, 2, 29, - 30, 0, 31, 3, 32, 4, 5, 6, 7, 0, - 0, 8, 9, 10, 0, 0, 0, 0, 12, 0, - 13, 14, 15, 16, 0, 0, 0, 0, 17, 18, - 19, 20, 21, 0, 0, 0, 22, 23, 24, 25, - 26, 0, 0, 0, 0, 0, 2, 29, 30, 0, - 31, 3, 32, 4, 5, 6, 7, 0, 0, 8, + 64, 65, 53, 116, 69, 52, 258, 151, 199, 273, + 56, 141, 138, 140, 250, 145, 253, 143, 149, 125, + 224, 225, 226, 71, 126, 274, 111, 112, 262, 263, + 264, 265, 266, 116, 2, 61, 60, 134, 115, 3, + 62, 4, 5, 6, 7, 292, 128, 129, 130, 10, + 134, 289, 301, 142, 286, 287, 2, 63, 275, 66, + 17, 3, 150, 4, 5, 6, 7, 132, 274, 115, + 70, 10, 97, 186, 187, 98, 73, 190, 191, 74, + 101, 185, 17, 102, 153, 303, 237, 32, 216, 33, + 95, 200, 304, 134, 157, 206, 207, 158, 303, 118, + 119, 275, 99, 134, 96, 319, 217, 121, 122, 32, + 103, 33, 194, 195, 116, 185, 264, 265, 266, 246, + 329, 225, 134, 100, 159, 53, 53, 193, 238, 189, + 201, 208, 248, 337, 338, 204, 205, 202, 209, 192, + 211, 212, 113, 308, 214, 240, 228, 229, 230, 231, + 232, 236, 257, 161, 133, 134, 162, 242, 104, 105, + 251, 247, 251, 323, 106, 256, 134, 134, 134, 128, + 129, 130, 203, 210, 249, 327, 107, 108, 116, 134, + 185, 109, 110, 163, 139, 309, 144, 272, 53, 53, + 171, 218, 219, 172, 282, 239, 281, 243, 146, 134, + 251, 251, 222, 223, 280, 324, 175, 290, 147, 176, + 152, 134, 214, 268, 269, 270, 148, 328, 259, 260, + 173, 185, 53, 53, 155, 154, 189, 156, 128, 129, + 130, 277, 278, 307, 160, 164, 177, 194, 195, 165, + 284, 285, 314, 166, 167, 121, 122, 316, 317, 318, + 168, 214, 169, 196, 197, 198, 322, 114, 14, 15, + 16, 123, 124, 298, 299, 300, 18, 19, 20, 21, + 22, 332, 170, 174, 23, 24, 25, 26, 27, 251, + 251, 178, 179, 180, 181, 30, 31, 182, 315, 75, + 76, 77, 78, 79, 183, 184, 244, 80, 321, 213, + 81, 82, 325, 326, 240, 254, 245, 255, 83, 84, + 261, 267, 279, 331, 288, 293, 294, 333, 334, 1, + 283, 2, 291, 339, 305, 274, 3, 306, 4, 5, + 6, 7, 310, 311, 8, 9, 10, 312, 320, 313, + 11, 12, 335, 13, 14, 15, 16, 17, 336, 340, + 341, 342, 18, 19, 20, 21, 22, 252, 343, 68, + 23, 24, 25, 26, 27, 330, 271, 302, 28, 29, + 2, 30, 31, 72, 32, 3, 33, 4, 5, 6, + 7, 0, 0, 8, 9, 10, 0, 0, 0, 127, + 0, 0, 13, 14, 15, 16, 17, 0, 0, 0, + 0, 18, 19, 20, 21, 22, 0, 0, 0, 23, + 24, 25, 26, 27, 0, 0, 128, 129, 130, 2, + 30, 31, 0, 32, 3, 33, 4, 5, 6, 7, + 0, 0, 8, 9, 10, 0, 0, 0, 11, 12, + 0, 13, 14, 15, 16, 17, 0, 0, 0, 0, + 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, + 25, 26, 27, 0, 0, 0, 134, 0, 2, 30, + 31, 0, 32, 3, 33, 4, 5, 6, 7, 0, + 0, 8, 9, 10, 0, 0, 0, 11, 12, 0, + 13, 14, 15, 16, 17, 0, 0, 0, 0, 18, + 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, + 26, 27, 0, 0, 0, 0, 0, 2, 30, 31, + 0, 32, 3, 33, 4, 5, 6, 7, 0, 0, + 8, 9, 10, 0, 0, 0, 0, 12, 0, 13, + 14, 15, 16, 17, 0, 0, 0, 0, 18, 19, + 20, 21, 22, 0, 0, 0, 23, 24, 25, 26, + 27, 0, 0, 0, 0, 0, 2, 30, 31, 0, + 32, 3, 33, 4, 5, 6, 7, 0, 0, 8, 9, 10, 0, 0, 0, 0, 0, 0, 13, 14, - 15, 16, 0, 0, 0, 0, 17, 18, 19, 20, - 21, 0, 0, 0, 22, 23, 24, 25, 26, 0, - 0, 0, 123, 0, 2, 29, 30, 0, 31, 3, - 32, 4, 5, 6, 7, 0, 0, 8, 9, 10, - 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, - 0, 0, 0, 0, 17, 18, 19, 20, 21, 0, - 0, 0, 22, 23, 24, 25, 26, 0, 0, 0, - 0, 0, 2, 29, 30, 0, 31, 3, 32, 4, - 5, 6, 7, 0, 0, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 66, 14, 15, 16, 0, 0, - 0, 0, 17, 18, 19, 20, 21, 0, 0, 0, - 22, 23, 24, 25, 26, 0, 0, 0, 0, 0, - 0, 29, 30, 0, 31, 0, 32, 103, 14, 15, - 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, - 0, 0, 0, 22, 23, 24, 25, 26, 74, 75, - 76, 77, 78, 0, 29, 30, 79, 0, 0, 80, - 81, 0, 0, 0, 0, 0, 0, 82, 83 + 15, 16, 17, 0, 0, 0, 0, 18, 19, 20, + 21, 22, 0, 0, 0, 23, 24, 25, 26, 27, + 0, 0, 0, 134, 0, 2, 30, 31, 0, 32, + 3, 33, 4, 5, 6, 7, 0, 0, 8, 9, + 10, 0, 0, 0, 0, 0, 0, 13, 14, 15, + 16, 17, 0, 0, 0, 0, 18, 19, 20, 21, + 22, 0, 0, 0, 23, 24, 25, 26, 27, 0, + 0, 0, 0, 0, 2, 30, 31, 0, 32, 3, + 33, 4, 5, 6, 7, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 67, 14, 15, 16, + 17, 0, 0, 0, 0, 18, 19, 20, 21, 22, + 0, 0, 0, 23, 24, 25, 26, 27, 0, 0, + 0, 0, 0, 0, 30, 31, 0, 32, 0, 33, + 15, 16, 0, 0, 0, 0, 0, 18, 19, 20, + 21, 22, 0, 0, 0, 23, 24, 25, 26, 27, + 85, 86, 87, 88, 89, 0, 30, 31, 90, 0, + 0, 91, 92, 0, 0, 0, 0, 0, 0, 93, + 94 }; static const yytype_int16 yycheck[] = { - 6, 7, 0, 61, 9, 0, 68, 192, 38, 21, - 46, 36, 183, 30, 185, 51, 203, 204, 205, 206, - 207, 11, 14, 49, 51, 31, 32, 59, 60, 51, - 62, 58, 25, 65, 14, 24, 58, 49, 68, 226, - 3, 21, 67, 31, 32, 8, 231, 10, 11, 12, - 13, 9, 223, 224, 14, 18, 48, 49, 50, 47, - 48, 66, 14, 55, 54, 28, 25, 25, 25, 49, - 29, 25, 9, 49, 50, 55, 106, 139, 110, 111, - 57, 71, 114, 115, 31, 32, 49, 14, 25, 49, - 25, 49, 55, 25, 57, 55, 128, 49, 0, 57, - 132, 133, 25, 55, 291, 292, 293, 31, 32, 139, - 140, 143, 49, 14, 112, 113, 122, 25, 113, 177, - 57, 25, 49, 27, 130, 131, 116, 189, 55, 135, - 136, 302, 303, 138, 5, 6, 14, 169, 170, 171, - 172, 173, 174, 21, 25, 14, 27, 14, 49, 25, - 54, 183, 25, 185, 55, 25, 188, 27, 216, 189, - 25, 191, 27, 161, 162, 25, 161, 162, 25, 227, - 176, 49, 178, 54, 25, 165, 166, 55, 210, 25, - 49, 4, 49, 14, 54, 217, 55, 192, 55, 54, - 48, 223, 224, 199, 200, 48, 25, 195, 196, 14, - 19, 196, 232, 3, 58, 57, 212, 213, 8, 25, - 10, 11, 12, 13, 25, 221, 222, 25, 18, 48, - 49, 50, 25, 25, 256, 58, 231, 25, 28, 5, - 6, 7, 25, 265, 25, 27, 56, 58, 270, 271, - 272, 33, 34, 35, 36, 37, 56, 279, 15, 41, - 42, 43, 44, 45, 15, 55, 25, 57, 31, 32, - 52, 53, 294, 269, 38, 39, 40, 38, 39, 40, - 302, 303, 25, 279, 47, 48, 49, 283, 284, 48, - 49, 50, 15, 7, 9, 15, 56, 15, 294, 7, - 56, 4, 298, 299, 1, 15, 3, 56, 304, 25, - 15, 8, 56, 10, 11, 12, 13, 15, 56, 16, - 17, 18, 15, 25, 56, 22, 23, 15, 25, 26, - 27, 28, 56, 15, 56, 184, 33, 34, 35, 36, - 37, 9, 250, 210, 41, 42, 43, 44, 45, 290, - 11, -1, 49, 50, 3, 52, 53, -1, 55, 8, - 57, 10, 11, 12, 13, -1, -1, 16, 17, 18, - -1, -1, -1, 22, -1, -1, 25, 26, 27, 28, - -1, -1, -1, -1, 33, 34, 35, 36, 37, -1, - -1, -1, 41, 42, 43, 44, 45, -1, -1, 48, - 49, 50, 3, 52, 53, -1, 55, 8, 57, 10, - 11, 12, 13, -1, -1, 16, 17, 18, -1, -1, - -1, 22, 23, -1, 25, 26, 27, 28, -1, -1, - -1, -1, 33, 34, 35, 36, 37, -1, -1, -1, - 41, 42, 43, 44, 45, -1, -1, -1, 49, -1, - 3, 52, 53, -1, 55, 8, 57, 10, 11, 12, + 6, 7, 0, 39, 9, 0, 217, 69, 21, 9, + 50, 14, 60, 61, 208, 63, 210, 62, 66, 47, + 5, 6, 7, 11, 52, 25, 32, 33, 228, 229, + 230, 231, 232, 69, 3, 25, 25, 50, 37, 8, + 30, 10, 11, 12, 13, 256, 49, 50, 51, 18, + 50, 251, 9, 56, 248, 249, 3, 25, 58, 25, + 29, 8, 67, 10, 11, 12, 13, 55, 25, 68, + 31, 18, 25, 121, 122, 28, 24, 125, 126, 58, + 25, 117, 29, 28, 72, 52, 14, 56, 150, 58, + 25, 139, 59, 50, 25, 143, 144, 28, 52, 50, + 51, 58, 55, 50, 25, 59, 154, 32, 33, 56, + 55, 58, 32, 33, 150, 151, 316, 317, 318, 14, + 5, 6, 50, 25, 55, 123, 124, 133, 56, 124, + 14, 14, 14, 327, 328, 141, 142, 21, 21, 127, + 146, 147, 0, 14, 149, 25, 194, 195, 196, 197, + 198, 199, 214, 25, 4, 50, 28, 202, 25, 25, + 208, 56, 210, 14, 25, 213, 50, 50, 50, 49, + 50, 51, 56, 56, 56, 14, 25, 25, 214, 50, + 216, 25, 25, 55, 49, 56, 49, 235, 186, 187, + 25, 186, 187, 28, 242, 201, 241, 203, 14, 50, + 248, 249, 190, 191, 25, 56, 25, 252, 14, 28, + 19, 50, 217, 39, 40, 41, 58, 56, 224, 225, + 55, 257, 220, 221, 25, 59, 221, 25, 49, 50, + 51, 237, 238, 281, 25, 25, 55, 32, 33, 25, + 246, 247, 290, 25, 25, 32, 33, 295, 296, 297, + 25, 256, 25, 48, 49, 50, 304, 25, 26, 27, + 28, 48, 49, 39, 40, 41, 34, 35, 36, 37, + 38, 319, 25, 25, 42, 43, 44, 45, 46, 327, + 328, 25, 25, 25, 25, 53, 54, 25, 294, 34, + 35, 36, 37, 38, 57, 59, 15, 42, 304, 59, + 45, 46, 308, 309, 25, 15, 57, 15, 53, 54, + 7, 9, 15, 319, 15, 7, 4, 323, 324, 1, + 57, 3, 57, 329, 15, 25, 8, 57, 10, 11, + 12, 13, 15, 57, 16, 17, 18, 15, 25, 57, + 22, 23, 15, 25, 26, 27, 28, 29, 57, 15, + 57, 15, 34, 35, 36, 37, 38, 209, 57, 9, + 42, 43, 44, 45, 46, 315, 235, 275, 50, 51, + 3, 53, 54, 11, 56, 8, 58, 10, 11, 12, 13, -1, -1, 16, 17, 18, -1, -1, -1, 22, - 23, -1, 25, 26, 27, 28, -1, -1, -1, -1, - 33, 34, 35, 36, 37, -1, -1, -1, 41, 42, - 43, 44, 45, -1, -1, -1, -1, -1, 3, 52, - 53, -1, 55, 8, 57, 10, 11, 12, 13, -1, - -1, 16, 17, 18, -1, -1, -1, -1, 23, -1, - 25, 26, 27, 28, -1, -1, -1, -1, 33, 34, - 35, 36, 37, -1, -1, -1, 41, 42, 43, 44, - 45, -1, -1, -1, -1, -1, 3, 52, 53, -1, - 55, 8, 57, 10, 11, 12, 13, -1, -1, 16, + -1, -1, 25, 26, 27, 28, 29, -1, -1, -1, + -1, 34, 35, 36, 37, 38, -1, -1, -1, 42, + 43, 44, 45, 46, -1, -1, 49, 50, 51, 3, + 53, 54, -1, 56, 8, 58, 10, 11, 12, 13, + -1, -1, 16, 17, 18, -1, -1, -1, 22, 23, + -1, 25, 26, 27, 28, 29, -1, -1, -1, -1, + 34, 35, 36, 37, 38, -1, -1, -1, 42, 43, + 44, 45, 46, -1, -1, -1, 50, -1, 3, 53, + 54, -1, 56, 8, 58, 10, 11, 12, 13, -1, + -1, 16, 17, 18, -1, -1, -1, 22, 23, -1, + 25, 26, 27, 28, 29, -1, -1, -1, -1, 34, + 35, 36, 37, 38, -1, -1, -1, 42, 43, 44, + 45, 46, -1, -1, -1, -1, -1, 3, 53, 54, + -1, 56, 8, 58, 10, 11, 12, 13, -1, -1, + 16, 17, 18, -1, -1, -1, -1, 23, -1, 25, + 26, 27, 28, 29, -1, -1, -1, -1, 34, 35, + 36, 37, 38, -1, -1, -1, 42, 43, 44, 45, + 46, -1, -1, -1, -1, -1, 3, 53, 54, -1, + 56, 8, 58, 10, 11, 12, 13, -1, -1, 16, 17, 18, -1, -1, -1, -1, -1, -1, 25, 26, - 27, 28, -1, -1, -1, -1, 33, 34, 35, 36, - 37, -1, -1, -1, 41, 42, 43, 44, 45, -1, - -1, -1, 49, -1, 3, 52, 53, -1, 55, 8, - 57, 10, 11, 12, 13, -1, -1, 16, 17, 18, + 27, 28, 29, -1, -1, -1, -1, 34, 35, 36, + 37, 38, -1, -1, -1, 42, 43, 44, 45, 46, + -1, -1, -1, 50, -1, 3, 53, 54, -1, 56, + 8, 58, 10, 11, 12, 13, -1, -1, 16, 17, + 18, -1, -1, -1, -1, -1, -1, 25, 26, 27, + 28, 29, -1, -1, -1, -1, 34, 35, 36, 37, + 38, -1, -1, -1, 42, 43, 44, 45, 46, -1, + -1, -1, -1, -1, 3, 53, 54, -1, 56, 8, + 58, 10, 11, 12, 13, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, 25, 26, 27, 28, - -1, -1, -1, -1, 33, 34, 35, 36, 37, -1, - -1, -1, 41, 42, 43, 44, 45, -1, -1, -1, - -1, -1, 3, 52, 53, -1, 55, 8, 57, 10, - 11, 12, 13, -1, -1, -1, -1, 18, -1, -1, - -1, -1, -1, -1, 25, 26, 27, 28, -1, -1, - -1, -1, 33, 34, 35, 36, 37, -1, -1, -1, - 41, 42, 43, 44, 45, -1, -1, -1, -1, -1, - -1, 52, 53, -1, 55, -1, 57, 25, 26, 27, - -1, -1, -1, -1, -1, 33, 34, 35, 36, 37, - -1, -1, -1, 41, 42, 43, 44, 45, 33, 34, - 35, 36, 37, -1, 52, 53, 41, -1, -1, 44, - 45, -1, -1, -1, -1, -1, -1, 52, 53 + 29, -1, -1, -1, -1, 34, 35, 36, 37, 38, + -1, -1, -1, 42, 43, 44, 45, 46, -1, -1, + -1, -1, -1, -1, 53, 54, -1, 56, -1, 58, + 27, 28, -1, -1, -1, -1, -1, 34, 35, 36, + 37, 38, -1, -1, -1, 42, 43, 44, 45, 46, + 34, 35, 36, 37, 38, -1, 53, 54, 42, -1, + -1, 45, 46, -1, -1, -1, -1, -1, -1, 53, + 54 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1229,37 +1259,40 @@ static const yytype_int16 yycheck[] = static const yytype_uint8 yystos[] = { 0, 1, 3, 8, 10, 11, 12, 13, 16, 17, - 18, 22, 23, 25, 26, 27, 28, 33, 34, 35, - 36, 37, 41, 42, 43, 44, 45, 49, 50, 52, - 53, 55, 57, 60, 62, 63, 65, 66, 67, 68, - 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, - 92, 93, 94, 95, 96, 49, 85, 86, 91, 25, - 25, 29, 25, 86, 86, 25, 25, 65, 67, 30, - 95, 96, 24, 57, 33, 34, 35, 36, 37, 41, - 44, 45, 52, 53, 25, 25, 25, 27, 54, 25, - 25, 27, 54, 25, 25, 25, 25, 25, 25, 25, - 86, 86, 0, 25, 63, 62, 64, 49, 50, 89, - 31, 32, 47, 48, 46, 51, 22, 48, 49, 50, - 90, 95, 4, 49, 87, 88, 94, 91, 48, 91, - 14, 55, 90, 48, 91, 14, 14, 57, 91, 67, - 64, 19, 95, 58, 25, 25, 25, 27, 54, 25, - 25, 27, 54, 25, 25, 25, 25, 25, 56, 58, - 62, 91, 91, 93, 93, 91, 91, 95, 86, 31, - 32, 47, 48, 49, 21, 91, 14, 21, 55, 86, - 86, 91, 91, 14, 21, 55, 86, 86, 58, 67, - 73, 64, 91, 93, 93, 47, 48, 95, 95, 5, - 6, 7, 80, 91, 91, 91, 91, 91, 81, 82, - 83, 91, 14, 55, 86, 25, 61, 90, 86, 15, - 56, 14, 55, 14, 55, 85, 91, 61, 85, 15, - 15, 91, 64, 73, 86, 86, 7, 88, 88, 88, - 88, 88, 9, 38, 39, 40, 82, 91, 9, 25, - 57, 84, 86, 86, 15, 25, 90, 91, 56, 86, - 86, 85, 85, 15, 88, 90, 56, 73, 7, 4, - 47, 48, 49, 38, 39, 40, 9, 84, 51, 58, - 15, 56, 91, 14, 55, 15, 56, 15, 56, 91, - 86, 91, 91, 91, 58, 25, 86, 91, 14, 55, - 86, 86, 14, 55, 5, 80, 86, 91, 86, 86, - 15, 56, 85, 85, 86, 15, 56, 15, 56 + 18, 22, 23, 25, 26, 27, 28, 29, 34, 35, + 36, 37, 38, 42, 43, 44, 45, 46, 50, 51, + 53, 54, 56, 58, 61, 63, 64, 66, 67, 68, + 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, + 80, 93, 94, 95, 96, 97, 50, 86, 87, 92, + 25, 25, 30, 25, 87, 87, 25, 25, 66, 68, + 31, 96, 97, 24, 58, 34, 35, 36, 37, 38, + 42, 45, 46, 53, 54, 34, 35, 36, 37, 38, + 42, 45, 46, 53, 54, 25, 25, 25, 28, 55, + 25, 25, 28, 55, 25, 25, 25, 25, 25, 25, + 25, 87, 87, 0, 25, 64, 63, 65, 50, 51, + 90, 32, 33, 48, 49, 47, 52, 22, 49, 50, + 51, 91, 96, 4, 50, 88, 89, 95, 92, 49, + 92, 14, 56, 91, 49, 92, 14, 14, 58, 92, + 68, 65, 19, 96, 59, 25, 25, 25, 28, 55, + 25, 25, 28, 55, 25, 25, 25, 25, 25, 25, + 25, 25, 28, 55, 25, 25, 28, 55, 25, 25, + 25, 25, 25, 57, 59, 63, 92, 92, 94, 94, + 92, 92, 96, 87, 32, 33, 48, 49, 50, 21, + 92, 14, 21, 56, 87, 87, 92, 92, 14, 21, + 56, 87, 87, 59, 68, 74, 65, 92, 94, 94, + 48, 49, 96, 96, 5, 6, 7, 81, 92, 92, + 92, 92, 92, 82, 83, 84, 92, 14, 56, 87, + 25, 62, 91, 87, 15, 57, 14, 56, 14, 56, + 86, 92, 62, 86, 15, 15, 92, 65, 74, 87, + 87, 7, 89, 89, 89, 89, 89, 9, 39, 40, + 41, 83, 92, 9, 25, 58, 85, 87, 87, 15, + 25, 91, 92, 57, 87, 87, 86, 86, 15, 89, + 91, 57, 74, 7, 4, 48, 49, 50, 39, 40, + 41, 9, 85, 52, 59, 15, 57, 92, 14, 56, + 15, 57, 15, 57, 92, 87, 92, 92, 92, 59, + 25, 87, 92, 14, 56, 87, 87, 14, 56, 5, + 81, 87, 92, 87, 87, 15, 57, 86, 86, 87, + 15, 57, 15, 57 }; #define yyerrok (yyerrstatus = 0) @@ -2074,7 +2107,7 @@ yyreduce: switch (yyn) { case 2: -#line 370 "/Users/chet/src/bash/src/parse.y" +#line 374 "/Users/chet/src/bash/src/parse.y" { /* Case of regular command. Discard the error safety net,and return the command just parsed. */ @@ -2088,7 +2121,7 @@ yyreduce: break; case 3: -#line 381 "/Users/chet/src/bash/src/parse.y" +#line 385 "/Users/chet/src/bash/src/parse.y" { /* Case of regular command, but not a very interesting one. Return a NULL command. */ @@ -2100,7 +2133,7 @@ yyreduce: break; case 4: -#line 390 "/Users/chet/src/bash/src/parse.y" +#line 394 "/Users/chet/src/bash/src/parse.y" { /* Error during parsing. Return NULL command. */ global_command = (COMMAND *)NULL; @@ -2118,7 +2151,7 @@ yyreduce: break; case 5: -#line 405 "/Users/chet/src/bash/src/parse.y" +#line 409 "/Users/chet/src/bash/src/parse.y" { /* Case of EOF seen by itself. Do ignoreeof or not. */ @@ -2129,285 +2162,441 @@ yyreduce: break; case 6: -#line 415 "/Users/chet/src/bash/src/parse.y" +#line 419 "/Users/chet/src/bash/src/parse.y" { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); } break; case 7: -#line 417 "/Users/chet/src/bash/src/parse.y" +#line 421 "/Users/chet/src/bash/src/parse.y" { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); } break; case 8: -#line 421 "/Users/chet/src/bash/src/parse.y" +#line 425 "/Users/chet/src/bash/src/parse.y" { + source.dest = 1; redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (1, r_output_direction, redir); + (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0); } break; case 9: -#line 426 "/Users/chet/src/bash/src/parse.y" +#line 431 "/Users/chet/src/bash/src/parse.y" { + source.dest = 0; redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (0, r_input_direction, redir); + (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0); } break; case 10: -#line 431 "/Users/chet/src/bash/src/parse.y" +#line 437 "/Users/chet/src/bash/src/parse.y" { + source.dest = (yyvsp[(1) - (3)].number); redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_output_direction, redir); + (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0); } break; case 11: -#line 436 "/Users/chet/src/bash/src/parse.y" +#line 443 "/Users/chet/src/bash/src/parse.y" { + source.dest = (yyvsp[(1) - (3)].number); redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_input_direction, redir); + (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0); } break; case 12: -#line 441 "/Users/chet/src/bash/src/parse.y" +#line 449 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (1, r_appending_to, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_output_direction, redir, REDIR_VARASSIGN); } break; case 13: -#line 446 "/Users/chet/src/bash/src/parse.y" +#line 455 "/Users/chet/src/bash/src/parse.y" { + source.filename = (yyvsp[(1) - (3)].word); redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_appending_to, redir); + (yyval.redirect) = make_redirection (source, r_input_direction, redir, REDIR_VARASSIGN); } break; case 14: -#line 451 "/Users/chet/src/bash/src/parse.y" +#line 461 "/Users/chet/src/bash/src/parse.y" { + source.dest = 1; redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (0, r_reading_until, redir); - redir_stack[need_here_doc++] = (yyval.redirect); + (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0); } break; case 15: -#line 457 "/Users/chet/src/bash/src/parse.y" +#line 467 "/Users/chet/src/bash/src/parse.y" { + source.dest = (yyvsp[(1) - (3)].number); redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_reading_until, redir); - redir_stack[need_here_doc++] = (yyval.redirect); + (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0); } break; case 16: -#line 463 "/Users/chet/src/bash/src/parse.y" +#line 473 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (0, r_reading_string, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_appending_to, redir, REDIR_VARASSIGN); } break; case 17: -#line 468 "/Users/chet/src/bash/src/parse.y" +#line 479 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_reading_string, redir); + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_output_force, redir, 0); } break; case 18: -#line 473 "/Users/chet/src/bash/src/parse.y" +#line 485 "/Users/chet/src/bash/src/parse.y" { - redir.dest = (yyvsp[(2) - (2)].number); - (yyval.redirect) = make_redirection (0, r_duplicating_input, redir); + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_output_force, redir, 0); } break; case 19: -#line 478 "/Users/chet/src/bash/src/parse.y" +#line 491 "/Users/chet/src/bash/src/parse.y" { - redir.dest = (yyvsp[(3) - (3)].number); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_duplicating_input, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_output_force, redir, REDIR_VARASSIGN); } break; case 20: -#line 483 "/Users/chet/src/bash/src/parse.y" +#line 497 "/Users/chet/src/bash/src/parse.y" { - redir.dest = (yyvsp[(2) - (2)].number); - (yyval.redirect) = make_redirection (1, r_duplicating_output, redir); + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_input_output, redir, 0); } break; case 21: -#line 488 "/Users/chet/src/bash/src/parse.y" +#line 503 "/Users/chet/src/bash/src/parse.y" { - redir.dest = (yyvsp[(3) - (3)].number); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_duplicating_output, redir); + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_input_output, redir, 0); } break; case 22: -#line 493 "/Users/chet/src/bash/src/parse.y" +#line 509 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (0, r_duplicating_input_word, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_input_output, redir, REDIR_VARASSIGN); } break; case 23: -#line 498 "/Users/chet/src/bash/src/parse.y" +#line 515 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_duplicating_input_word, redir); + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0); + redir_stack[need_here_doc++] = (yyval.redirect); } break; case 24: -#line 503 "/Users/chet/src/bash/src/parse.y" +#line 522 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (1, r_duplicating_output_word, redir); + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0); + redir_stack[need_here_doc++] = (yyval.redirect); } break; case 25: -#line 508 "/Users/chet/src/bash/src/parse.y" +#line 529 "/Users/chet/src/bash/src/parse.y" { + source.filename = (yyvsp[(1) - (3)].word); redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_duplicating_output_word, redir); + (yyval.redirect) = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN); + redir_stack[need_here_doc++] = (yyval.redirect); } break; case 26: -#line 513 "/Users/chet/src/bash/src/parse.y" +#line 536 "/Users/chet/src/bash/src/parse.y" { + source.dest = 0; redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection - (0, r_deblank_reading_until, redir); + (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0); redir_stack[need_here_doc++] = (yyval.redirect); } break; case 27: -#line 520 "/Users/chet/src/bash/src/parse.y" +#line 543 "/Users/chet/src/bash/src/parse.y" { + source.dest = (yyvsp[(1) - (3)].number); redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection - ((yyvsp[(1) - (3)].number), r_deblank_reading_until, redir); + (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0); redir_stack[need_here_doc++] = (yyval.redirect); } break; case 28: -#line 527 "/Users/chet/src/bash/src/parse.y" +#line 550 "/Users/chet/src/bash/src/parse.y" { - redir.dest = 0; - (yyval.redirect) = make_redirection (1, r_close_this, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN); + redir_stack[need_here_doc++] = (yyval.redirect); } break; case 29: -#line 532 "/Users/chet/src/bash/src/parse.y" +#line 557 "/Users/chet/src/bash/src/parse.y" { - redir.dest = 0; - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_close_this, redir); + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0); } break; case 30: -#line 537 "/Users/chet/src/bash/src/parse.y" +#line 563 "/Users/chet/src/bash/src/parse.y" { - redir.dest = 0; - (yyval.redirect) = make_redirection (0, r_close_this, redir); + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0); } break; case 31: -#line 542 "/Users/chet/src/bash/src/parse.y" +#line 569 "/Users/chet/src/bash/src/parse.y" { - redir.dest = 0; - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_close_this, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_reading_string, redir, REDIR_VARASSIGN); } break; case 32: -#line 547 "/Users/chet/src/bash/src/parse.y" +#line 575 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (1, r_err_and_out, redir); + source.dest = 0; + redir.dest = (yyvsp[(2) - (2)].number); + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0); } break; case 33: -#line 552 "/Users/chet/src/bash/src/parse.y" +#line 581 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (1, r_append_err_and_out, redir); + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = (yyvsp[(3) - (3)].number); + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0); } break; case 34: -#line 557 "/Users/chet/src/bash/src/parse.y" +#line 587 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_input_output, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = (yyvsp[(3) - (3)].number); + (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, REDIR_VARASSIGN); } break; case 35: -#line 562 "/Users/chet/src/bash/src/parse.y" +#line 593 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (0, r_input_output, redir); + source.dest = 1; + redir.dest = (yyvsp[(2) - (2)].number); + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0); } break; case 36: -#line 567 "/Users/chet/src/bash/src/parse.y" +#line 599 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(2) - (2)].word); - (yyval.redirect) = make_redirection (1, r_output_force, redir); + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = (yyvsp[(3) - (3)].number); + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0); } break; case 37: -#line 572 "/Users/chet/src/bash/src/parse.y" +#line 605 "/Users/chet/src/bash/src/parse.y" { - redir.filename = (yyvsp[(3) - (3)].word); - (yyval.redirect) = make_redirection ((yyvsp[(1) - (3)].number), r_output_force, redir); + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = (yyvsp[(3) - (3)].number); + (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, REDIR_VARASSIGN); } break; case 38: -#line 579 "/Users/chet/src/bash/src/parse.y" - { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } +#line 611 "/Users/chet/src/bash/src/parse.y" + { + source.dest = 0; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0); + } break; case 39: -#line 581 "/Users/chet/src/bash/src/parse.y" - { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } +#line 617 "/Users/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0); + } break; case 40: -#line 583 "/Users/chet/src/bash/src/parse.y" - { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; } +#line 623 "/Users/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, REDIR_VARASSIGN); + } break; case 41: -#line 587 "/Users/chet/src/bash/src/parse.y" +#line 629 "/Users/chet/src/bash/src/parse.y" { - (yyval.redirect) = (yyvsp[(1) - (1)].redirect); + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0); } break; case 42: -#line 591 "/Users/chet/src/bash/src/parse.y" +#line 635 "/Users/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0); + } + break; + + case 43: +#line 641 "/Users/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.filename = (yyvsp[(3) - (3)].word); + (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, REDIR_VARASSIGN); + } + break; + + case 44: +#line 647 "/Users/chet/src/bash/src/parse.y" + { + source.dest = 1; + redir.dest = 0; + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } + break; + + case 45: +#line 653 "/Users/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = 0; + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } + break; + + case 46: +#line 659 "/Users/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = 0; + (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN); + } + break; + + case 47: +#line 665 "/Users/chet/src/bash/src/parse.y" + { + source.dest = 0; + redir.dest = 0; + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } + break; + + case 48: +#line 671 "/Users/chet/src/bash/src/parse.y" + { + source.dest = (yyvsp[(1) - (3)].number); + redir.dest = 0; + (yyval.redirect) = make_redirection (source, r_close_this, redir, 0); + } + break; + + case 49: +#line 677 "/Users/chet/src/bash/src/parse.y" + { + source.filename = (yyvsp[(1) - (3)].word); + redir.dest = 0; + (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN); + } + break; + + case 50: +#line 683 "/Users/chet/src/bash/src/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_err_and_out, redir, 0); + } + break; + + case 51: +#line 689 "/Users/chet/src/bash/src/parse.y" + { + source.dest = 1; + redir.filename = (yyvsp[(2) - (2)].word); + (yyval.redirect) = make_redirection (source, r_append_err_and_out, redir, 0); + } + break; + + case 52: +#line 697 "/Users/chet/src/bash/src/parse.y" + { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } + break; + + case 53: +#line 699 "/Users/chet/src/bash/src/parse.y" + { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; } + break; + + case 54: +#line 701 "/Users/chet/src/bash/src/parse.y" + { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; } + break; + + case 55: +#line 705 "/Users/chet/src/bash/src/parse.y" + { + (yyval.redirect) = (yyvsp[(1) - (1)].redirect); + } + break; + + case 56: +#line 709 "/Users/chet/src/bash/src/parse.y" { register REDIRECT *t; @@ -2418,28 +2607,28 @@ yyreduce: } break; - case 43: -#line 602 "/Users/chet/src/bash/src/parse.y" + case 57: +#line 720 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); } break; - case 44: -#line 604 "/Users/chet/src/bash/src/parse.y" + case 58: +#line 722 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); } break; - case 45: -#line 608 "/Users/chet/src/bash/src/parse.y" + case 59: +#line 726 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); } break; - case 46: -#line 610 "/Users/chet/src/bash/src/parse.y" + case 60: +#line 728 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 47: -#line 612 "/Users/chet/src/bash/src/parse.y" + case 61: +#line 730 "/Users/chet/src/bash/src/parse.y" { COMMAND *tc; @@ -2457,261 +2646,261 @@ yyreduce: } break; - case 48: -#line 628 "/Users/chet/src/bash/src/parse.y" + case 62: +#line 746 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 49: -#line 630 "/Users/chet/src/bash/src/parse.y" + case 63: +#line 748 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 50: -#line 634 "/Users/chet/src/bash/src/parse.y" + case 64: +#line 752 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 51: -#line 636 "/Users/chet/src/bash/src/parse.y" + case 65: +#line 754 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 52: -#line 638 "/Users/chet/src/bash/src/parse.y" + case 66: +#line 756 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); } break; - case 53: -#line 640 "/Users/chet/src/bash/src/parse.y" + case 67: +#line 758 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); } break; - case 54: -#line 642 "/Users/chet/src/bash/src/parse.y" + case 68: +#line 760 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 55: -#line 644 "/Users/chet/src/bash/src/parse.y" + case 69: +#line 762 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 56: -#line 646 "/Users/chet/src/bash/src/parse.y" + case 70: +#line 764 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 57: -#line 648 "/Users/chet/src/bash/src/parse.y" + case 71: +#line 766 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 58: -#line 650 "/Users/chet/src/bash/src/parse.y" + case 72: +#line 768 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 59: -#line 652 "/Users/chet/src/bash/src/parse.y" + case 73: +#line 770 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 60: -#line 654 "/Users/chet/src/bash/src/parse.y" + case 74: +#line 772 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 61: -#line 658 "/Users/chet/src/bash/src/parse.y" + case 75: +#line 776 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 62: -#line 663 "/Users/chet/src/bash/src/parse.y" + case 76: +#line 781 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 63: -#line 668 "/Users/chet/src/bash/src/parse.y" + case 77: +#line 786 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 64: -#line 673 "/Users/chet/src/bash/src/parse.y" + case 78: +#line 791 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 65: -#line 678 "/Users/chet/src/bash/src/parse.y" + case 79: +#line 796 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 66: -#line 683 "/Users/chet/src/bash/src/parse.y" + case 80: +#line 801 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 67: -#line 688 "/Users/chet/src/bash/src/parse.y" + case 81: +#line 806 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 68: -#line 693 "/Users/chet/src/bash/src/parse.y" + case 82: +#line 811 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 69: -#line 700 "/Users/chet/src/bash/src/parse.y" + case 83: +#line 818 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno); if (word_top > 0) word_top--; } break; - case 70: -#line 705 "/Users/chet/src/bash/src/parse.y" + case 84: +#line 823 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno); if (word_top > 0) word_top--; } break; - case 71: -#line 710 "/Users/chet/src/bash/src/parse.y" + case 85: +#line 828 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno); if (word_top > 0) word_top--; } break; - case 72: -#line 715 "/Users/chet/src/bash/src/parse.y" + case 86: +#line 833 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno); if (word_top > 0) word_top--; } break; - case 73: -#line 722 "/Users/chet/src/bash/src/parse.y" + case 87: +#line 840 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 74: -#line 727 "/Users/chet/src/bash/src/parse.y" + case 88: +#line 845 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 75: -#line 732 "/Users/chet/src/bash/src/parse.y" + case 89: +#line 850 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 76: -#line 737 "/Users/chet/src/bash/src/parse.y" + case 90: +#line 855 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 77: -#line 742 "/Users/chet/src/bash/src/parse.y" + case 91: +#line 860 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 78: -#line 747 "/Users/chet/src/bash/src/parse.y" + case 92: +#line 865 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 79: -#line 754 "/Users/chet/src/bash/src/parse.y" + case 93: +#line 872 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 80: -#line 759 "/Users/chet/src/bash/src/parse.y" + case 94: +#line 877 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 81: -#line 764 "/Users/chet/src/bash/src/parse.y" + case 95: +#line 882 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]); if (word_top > 0) word_top--; } break; - case 82: -#line 771 "/Users/chet/src/bash/src/parse.y" + case 96: +#line 889 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); } break; - case 83: -#line 774 "/Users/chet/src/bash/src/parse.y" + case 97: +#line 892 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); } break; - case 84: -#line 777 "/Users/chet/src/bash/src/parse.y" + case 98: +#line 895 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); } break; - case 85: -#line 781 "/Users/chet/src/bash/src/parse.y" + case 99: +#line 899 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 86: -#line 783 "/Users/chet/src/bash/src/parse.y" + case 100: +#line 901 "/Users/chet/src/bash/src/parse.y" { COMMAND *tc; @@ -2742,24 +2931,24 @@ yyreduce: } break; - case 87: -#line 814 "/Users/chet/src/bash/src/parse.y" + case 101: +#line 932 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command)); (yyval.command)->flags |= CMD_WANT_SUBSHELL; } break; - case 88: -#line 821 "/Users/chet/src/bash/src/parse.y" + case 102: +#line 939 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command)); (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; } break; - case 89: -#line 826 "/Users/chet/src/bash/src/parse.y" + case 103: +#line 944 "/Users/chet/src/bash/src/parse.y" { COMMAND *tc; @@ -2778,16 +2967,16 @@ yyreduce: } break; - case 90: -#line 843 "/Users/chet/src/bash/src/parse.y" + case 104: +#line 961 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command)); (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; } break; - case 91: -#line 848 "/Users/chet/src/bash/src/parse.y" + case 105: +#line 966 "/Users/chet/src/bash/src/parse.y" { COMMAND *tc; @@ -2806,126 +2995,126 @@ yyreduce: } break; - case 92: -#line 865 "/Users/chet/src/bash/src/parse.y" + case 106: +#line 983 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command))); (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL; } break; - case 93: -#line 872 "/Users/chet/src/bash/src/parse.y" + case 107: +#line 990 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); } break; - case 94: -#line 874 "/Users/chet/src/bash/src/parse.y" + case 108: +#line 992 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); } break; - case 95: -#line 876 "/Users/chet/src/bash/src/parse.y" + case 109: +#line 994 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); } break; - case 96: -#line 881 "/Users/chet/src/bash/src/parse.y" + case 110: +#line 999 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); } break; - case 97: -#line 885 "/Users/chet/src/bash/src/parse.y" + case 111: +#line 1003 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); } break; - case 98: -#line 889 "/Users/chet/src/bash/src/parse.y" + case 112: +#line 1007 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(2) - (3)].command); } break; - case 99: -#line 893 "/Users/chet/src/bash/src/parse.y" + case 113: +#line 1011 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); } break; - case 100: -#line 895 "/Users/chet/src/bash/src/parse.y" + case 114: +#line 1013 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); } break; - case 101: -#line 897 "/Users/chet/src/bash/src/parse.y" + case 115: +#line 1015 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); } break; - case 103: -#line 902 "/Users/chet/src/bash/src/parse.y" + case 117: +#line 1020 "/Users/chet/src/bash/src/parse.y" { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); } break; - case 104: -#line 906 "/Users/chet/src/bash/src/parse.y" + case 118: +#line 1024 "/Users/chet/src/bash/src/parse.y" { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); } break; - case 105: -#line 908 "/Users/chet/src/bash/src/parse.y" + case 119: +#line 1026 "/Users/chet/src/bash/src/parse.y" { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); } break; - case 106: -#line 910 "/Users/chet/src/bash/src/parse.y" + case 120: +#line 1028 "/Users/chet/src/bash/src/parse.y" { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); } break; - case 107: -#line 912 "/Users/chet/src/bash/src/parse.y" + case 121: +#line 1030 "/Users/chet/src/bash/src/parse.y" { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); } break; - case 108: -#line 916 "/Users/chet/src/bash/src/parse.y" + case 122: +#line 1034 "/Users/chet/src/bash/src/parse.y" { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } break; - case 109: -#line 918 "/Users/chet/src/bash/src/parse.y" + case 123: +#line 1036 "/Users/chet/src/bash/src/parse.y" { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } break; - case 110: -#line 920 "/Users/chet/src/bash/src/parse.y" + case 124: +#line 1038 "/Users/chet/src/bash/src/parse.y" { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } break; - case 111: -#line 922 "/Users/chet/src/bash/src/parse.y" + case 125: +#line 1040 "/Users/chet/src/bash/src/parse.y" { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } break; - case 112: -#line 924 "/Users/chet/src/bash/src/parse.y" + case 126: +#line 1042 "/Users/chet/src/bash/src/parse.y" { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); } break; - case 113: -#line 926 "/Users/chet/src/bash/src/parse.y" + case 127: +#line 1044 "/Users/chet/src/bash/src/parse.y" { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); } break; - case 114: -#line 930 "/Users/chet/src/bash/src/parse.y" + case 128: +#line 1048 "/Users/chet/src/bash/src/parse.y" { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); } break; - case 115: -#line 932 "/Users/chet/src/bash/src/parse.y" + case 129: +#line 1050 "/Users/chet/src/bash/src/parse.y" { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); } break; - case 116: -#line 941 "/Users/chet/src/bash/src/parse.y" + case 130: +#line 1059 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(2) - (2)].command); if (need_here_doc) @@ -2933,15 +3122,15 @@ yyreduce: } break; - case 118: -#line 950 "/Users/chet/src/bash/src/parse.y" + case 132: +#line 1068 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(2) - (2)].command); } break; - case 120: -#line 957 "/Users/chet/src/bash/src/parse.y" + case 134: +#line 1075 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(1) - (3)].command)->type == cm_connection) (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&'); @@ -2950,18 +3139,18 @@ yyreduce: } break; - case 122: -#line 968 "/Users/chet/src/bash/src/parse.y" + case 136: +#line 1086 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); } break; - case 123: -#line 970 "/Users/chet/src/bash/src/parse.y" + case 137: +#line 1088 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); } break; - case 124: -#line 972 "/Users/chet/src/bash/src/parse.y" + case 138: +#line 1090 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(1) - (4)].command)->type == cm_connection) (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&'); @@ -2970,38 +3159,38 @@ yyreduce: } break; - case 125: -#line 979 "/Users/chet/src/bash/src/parse.y" + case 139: +#line 1097 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); } break; - case 126: -#line 981 "/Users/chet/src/bash/src/parse.y" + case 140: +#line 1099 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); } break; - case 127: -#line 983 "/Users/chet/src/bash/src/parse.y" + case 141: +#line 1101 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 130: -#line 991 "/Users/chet/src/bash/src/parse.y" + case 144: +#line 1109 "/Users/chet/src/bash/src/parse.y" { (yyval.number) = '\n'; } break; - case 131: -#line 993 "/Users/chet/src/bash/src/parse.y" + case 145: +#line 1111 "/Users/chet/src/bash/src/parse.y" { (yyval.number) = ';'; } break; - case 132: -#line 995 "/Users/chet/src/bash/src/parse.y" + case 146: +#line 1113 "/Users/chet/src/bash/src/parse.y" { (yyval.number) = yacc_EOF; } break; - case 135: -#line 1009 "/Users/chet/src/bash/src/parse.y" + case 149: +#line 1127 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); if (need_here_doc) @@ -3016,8 +3205,8 @@ yyreduce: } break; - case 136: -#line 1022 "/Users/chet/src/bash/src/parse.y" + case 150: +#line 1140 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(1) - (2)].command)->type == cm_connection) (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&'); @@ -3035,8 +3224,8 @@ yyreduce: } break; - case 137: -#line 1038 "/Users/chet/src/bash/src/parse.y" + case 151: +#line 1156 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (2)].command); if (need_here_doc) @@ -3051,18 +3240,18 @@ yyreduce: } break; - case 138: -#line 1053 "/Users/chet/src/bash/src/parse.y" + case 152: +#line 1171 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); } break; - case 139: -#line 1055 "/Users/chet/src/bash/src/parse.y" + case 153: +#line 1173 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); } break; - case 140: -#line 1057 "/Users/chet/src/bash/src/parse.y" + case 154: +#line 1175 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(1) - (3)].command)->type == cm_connection) (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&'); @@ -3071,23 +3260,23 @@ yyreduce: } break; - case 141: -#line 1064 "/Users/chet/src/bash/src/parse.y" + case 155: +#line 1182 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); } break; - case 142: -#line 1067 "/Users/chet/src/bash/src/parse.y" + case 156: +#line 1185 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 143: -#line 1071 "/Users/chet/src/bash/src/parse.y" + case 157: +#line 1189 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 144: -#line 1073 "/Users/chet/src/bash/src/parse.y" + case 158: +#line 1191 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(2) - (2)].command)) (yyvsp[(2) - (2)].command)->flags |= CMD_INVERT_RETURN; @@ -3095,8 +3284,8 @@ yyreduce: } break; - case 145: -#line 1079 "/Users/chet/src/bash/src/parse.y" + case 159: +#line 1197 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(2) - (2)].command)) (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number); @@ -3104,8 +3293,8 @@ yyreduce: } break; - case 146: -#line 1085 "/Users/chet/src/bash/src/parse.y" + case 160: +#line 1203 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(3) - (3)].command)) (yyvsp[(3) - (3)].command)->flags |= (yyvsp[(1) - (3)].number)|CMD_INVERT_RETURN; @@ -3113,8 +3302,8 @@ yyreduce: } break; - case 147: -#line 1091 "/Users/chet/src/bash/src/parse.y" + case 161: +#line 1209 "/Users/chet/src/bash/src/parse.y" { if ((yyvsp[(3) - (3)].command)) (yyvsp[(3) - (3)].command)->flags |= (yyvsp[(2) - (3)].number)|CMD_INVERT_RETURN; @@ -3122,8 +3311,8 @@ yyreduce: } break; - case 148: -#line 1097 "/Users/chet/src/bash/src/parse.y" + case 162: +#line 1215 "/Users/chet/src/bash/src/parse.y" { ELEMENT x; @@ -3142,22 +3331,23 @@ yyreduce: } break; - case 149: -#line 1117 "/Users/chet/src/bash/src/parse.y" + case 163: +#line 1235 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); } break; - case 150: -#line 1119 "/Users/chet/src/bash/src/parse.y" + case 164: +#line 1237 "/Users/chet/src/bash/src/parse.y" { /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */ COMMAND *tc; - REDIRECTEE rd; + REDIRECTEE rd, sd; REDIRECT *r; - tc = (yyvsp[(1) - (4)].command); + tc = (yyvsp[(1) - (4)].command)->type == cm_simple ? (COMMAND *)(yyvsp[(1) - (4)].command)->value.Simple : (yyvsp[(1) - (4)].command); + sd.dest = 2; rd.dest = 1; - r = make_redirection (2, r_duplicating_output, rd); + r = make_redirection (sd, r_duplicating_output, rd, 0); if (tc->redirects) { register REDIRECT *t; @@ -3172,24 +3362,24 @@ yyreduce: } break; - case 151: -#line 1141 "/Users/chet/src/bash/src/parse.y" + case 165: +#line 1260 "/Users/chet/src/bash/src/parse.y" { (yyval.command) = (yyvsp[(1) - (1)].command); } break; - case 152: -#line 1145 "/Users/chet/src/bash/src/parse.y" + case 166: +#line 1264 "/Users/chet/src/bash/src/parse.y" { (yyval.number) = CMD_TIME_PIPELINE; } break; - case 153: -#line 1147 "/Users/chet/src/bash/src/parse.y" + case 167: +#line 1266 "/Users/chet/src/bash/src/parse.y" { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; } break; /* Line 1267 of yacc.c. */ -#line 3193 "y.tab.c" +#line 3383 "y.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -3403,7 +3593,7 @@ yyreturn: } -#line 1149 "/Users/chet/src/bash/src/parse.y" +#line 1268 "/Users/chet/src/bash/src/parse.y" /* Initial size to allocate for tokens, and the @@ -3873,10 +4063,11 @@ save_token_state () { int *ret; - ret = (int *)xmalloc (3 * sizeof (int)); + ret = (int *)xmalloc (4 * sizeof (int)); ret[0] = last_read_token; ret[1] = token_before_that; ret[2] = two_tokens_ago; + ret[3] = current_token; return ret; } @@ -3889,6 +4080,7 @@ restore_token_state (ts) last_read_token = ts[0]; token_before_that = ts[1]; two_tokens_ago = ts[2]; + current_token = ts[3]; } /* @@ -4042,7 +4234,7 @@ read_a_line (remove_quoted_newline) { static char *line_buffer = (char *)NULL; static int buffer_size = 0; - int indx = 0, c, peekc, pass_next; + int indx, c, peekc, pass_next; #if defined (READLINE) if (no_line_editing && SHOULD_PROMPT ()) @@ -4051,7 +4243,7 @@ read_a_line (remove_quoted_newline) #endif print_prompt (); - pass_next = 0; + pass_next = indx = 0; while (1) { /* Allow immediate exit if interrupted during input. */ @@ -4135,7 +4327,7 @@ read_secondary_line (remove_quoted_newline) prompt_again (); ret = read_a_line (remove_quoted_newline); #if defined (HISTORY) - if (remember_on_history && (parser_state & PST_HEREDOC)) + if (ret && remember_on_history && (parser_state & PST_HEREDOC)) { /* To make adding the the here-document body right, we need to rely on history_delimiting_chars() returning \n for the first line of @@ -4491,6 +4683,7 @@ shell_getc (remove_quoted_newline) because we have fully consumed the result of the last alias expansion. Do it transparently; just return the next character of the string popped to. */ +pop_alias: if (!uc && (pushed_string_list != (STRING_SAVER *)NULL)) { pop_string (); @@ -4505,6 +4698,17 @@ shell_getc (remove_quoted_newline) if (SHOULD_PROMPT ()) prompt_again (); line_number++; + /* XXX - what do we do here if we're expanding an alias whose definition + ends with a newline? Recall that we inhibit the appending of a + space in mk_alexpansion() if newline is the last character. */ +#if 0 /* XXX - bash-4.2 (jonathan@claggett.org) */ + if (expanding_alias () && shell_input_line[shell_input_line_index+1] == '\0') + { + uc = 0; + goto pop_alias; + } +#endif + goto restart_read; } @@ -4652,7 +4856,7 @@ gather_here_documents () static int open_brace_count; #define command_token_position(token) \ - (((token) == ASSIGNMENT_WORD) || \ + (((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \ ((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token))) #define assignment_acceptable(token) \ @@ -4715,7 +4919,11 @@ mk_alexpansion (s) l = strlen (s); r = xmalloc (l + 2); strcpy (r, s); +#if 0 /* XXX - bash-4.2 */ + if (r[l -1] != ' ' && r[l -1] != '\n') +#else if (r[l -1] != ' ') +#endif r[l++] = ' '; r[l] = '\0'; return r; @@ -4909,6 +5117,12 @@ reset_parser () dstack.delimiter_depth = 0; /* No delimiters found so far. */ open_brace_count = 0; +#if defined (EXTENDED_GLOB) + /* Reset to global value of extended glob */ + if (parser_state & PST_EXTPAT) + extended_glob = global_extglob; +#endif + parser_state = 0; #if defined (ALIAS) || defined (DPAREN_ARITHMETIC) @@ -4926,6 +5140,7 @@ reset_parser () FREE (word_desc_to_read); word_desc_to_read = (WORD_DESC *)NULL; + current_token = '\n'; /* XXX */ last_read_token = '\n'; token_to_read = '\n'; } @@ -5173,6 +5388,7 @@ tokword: #define P_DQUOTE 0x04 #define P_COMMAND 0x08 /* parsing a command, so look for comments */ #define P_BACKQUOTE 0x10 /* parsing a backquoted command substitution */ +#define P_ARRAYSUB 0x20 /* parsing a [...] array subscript for assignment */ /* Lexical state while parsing a grouping construct or $(...). */ #define LEX_WASDOL 0x001 @@ -5185,6 +5401,7 @@ tokword: #define LEX_INHEREDOC 0x080 #define LEX_HEREDELIM 0x100 /* reading here-doc delimiter */ #define LEX_STRIPDOC 0x200 /* <<- strip tabs from here doc delim */ +#define LEX_INWORD 0x400 #define COMSUB_META(ch) ((ch) == ';' || (ch) == '&' || (ch) == '|') @@ -5220,7 +5437,7 @@ parse_matched_pair (qc, open, close, lenp, flags) char *ret, *nestret, *ttrans; int retind, retsize, rflags; -/* itrace("parse_matched_pair: open = %c close = %c flags = %d", open, close, flags); */ +/*itrace("parse_matched_pair[%d]: open = %c close = %c flags = %d", line_number, open, close, flags);*/ count = 1; tflags = 0; @@ -5387,6 +5604,8 @@ parse_matched_pair (qc, open, close, lenp, flags) APPEND_NESTRET (); FREE (nestret); } + else if ((flags & P_ARRAYSUB) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ + goto parse_dollar_word; } /* Parse an old-style command substitution within double quotes as a single word. */ @@ -5403,6 +5622,7 @@ parse_matched_pair (qc, open, close, lenp, flags) else if MBTEST(open != '`' && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */ /* check for $(), $[], or ${} inside quoted string. */ { +parse_dollar_word: if (open == ch) /* undo previous increment */ count--; if (ch == '(') /* ) */ @@ -5426,6 +5646,7 @@ parse_matched_pair (qc, open, close, lenp, flags) ret[retind] = '\0'; if (lenp) *lenp = retind; +/*itrace("parse_matched_pair[%d]: returning %s", line_number, ret);*/ return ret; } @@ -5437,7 +5658,7 @@ parse_comsub (qc, open, close, lenp, flags) int open, close; int *lenp, flags; { - int count, ch, peekc, tflags, lex_rwlen, lex_firstind; + int count, ch, peekc, tflags, lex_rwlen, lex_wlen, lex_firstind; int nestlen, ttranslen, start_lineno; char *ret, *nestret, *ttrans, *heredelim; int retind, retsize, rflags, hdlen; @@ -5458,7 +5679,7 @@ parse_comsub (qc, open, close, lenp, flags) retind = 0; start_lineno = line_number; - lex_rwlen = 0; + lex_rwlen = lex_wlen = 0; heredelim = 0; lex_firstind = -1; @@ -5501,6 +5722,8 @@ eof_error: { tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC); /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/ + free (heredelim); + heredelim = 0; lex_firstind = -1; } else @@ -5512,6 +5735,25 @@ eof_error: if (ch == '\n' && SHOULD_PROMPT ()) prompt_again (); + /* XXX -- possibly allow here doc to be delimited by ending right + paren. */ + if ((tflags & LEX_INHEREDOC) && ch == close && count == 1) + { + int tind; +/*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/ + tind = lex_firstind; + while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t') + tind++; + if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen)) + { + tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC); +/*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/ + free (heredelim); + heredelim = 0; + lex_firstind = -1; + } + } + /* Don't bother counting parens or doing anything else if in a comment */ if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC)) { @@ -5520,11 +5762,54 @@ eof_error: ret[retind++] = ch; if ((tflags & LEX_INCOMMENT) && ch == '\n') +{ +/*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/ tflags &= ~LEX_INCOMMENT; +} continue; } + if (tflags & LEX_PASSNEXT) /* last char was backslash */ + { +/*itrace("parse_comsub:%d: lex_passnext -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/ + tflags &= ~LEX_PASSNEXT; + if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */ + { + if (retind > 0) + retind--; /* swallow previously-added backslash */ + continue; + } + + RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); + if MBTEST(ch == CTLESC || ch == CTLNUL) + ret[retind++] = CTLESC; + ret[retind++] = ch; + continue; + } + + /* If this is a shell break character, we are not in a word. If not, + we either start or continue a word. */ + if MBTEST(shellbreak (ch)) + { + tflags &= ~LEX_INWORD; +/*itrace("parse_comsub:%d: lex_inword -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/ + } + else + { + if (tflags & LEX_INWORD) + { + lex_wlen++; +/*itrace("parse_comsub:%d: lex_inword == 1 ch = `%c' lex_wlen = %d (%d)", line_number, ch, lex_wlen, __LINE__);*/ + } + else + { +/*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/ + tflags |= LEX_INWORD; + lex_wlen = 0; + } + } + /* Skip whitespace */ if MBTEST(shellblank (ch) && lex_rwlen == 0) { @@ -5545,13 +5830,24 @@ eof_error: { if (lex_firstind == -1 && shellbreak (ch) == 0) lex_firstind = retind; +#if 0 + else if (heredelim && (tflags & LEX_PASSNEXT) == 0 && ch == '\n') + { + tflags |= LEX_INHEREDOC; + tflags &= ~LEX_HEREDELIM; + lex_firstind = retind + 1; + } +#endif else if (lex_firstind >= 0 && (tflags & LEX_PASSNEXT) == 0 && shellbreak (ch)) { - nestret = substring (ret, lex_firstind, retind); - heredelim = string_quote_removal (nestret, 0); - free (nestret); - hdlen = STRLEN(heredelim); + if (heredelim == 0) + { + nestret = substring (ret, lex_firstind, retind); + heredelim = string_quote_removal (nestret, 0); + free (nestret); + hdlen = STRLEN(heredelim); /*itrace("parse_comsub:%d: found here doc delimiter `%s' (%d)", line_number, heredelim, hdlen);*/ + } if (ch == '\n') { tflags |= LEX_INHEREDOC; @@ -5564,7 +5860,7 @@ eof_error: } /* Meta-characters that can introduce a reserved word. Not perfect yet. */ - if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && shellmeta(ch)) + if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && (shellmeta(ch) || ch == '\n')) { /* Add this character. */ RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); @@ -5574,7 +5870,7 @@ eof_error: { RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); ret[retind++] = peekc; -/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch); */ +/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/ tflags |= LEX_RESWDOK; lex_rwlen = 0; continue; @@ -5582,8 +5878,8 @@ eof_error: else if (ch == '\n' || COMSUB_META(ch)) { shell_ungetc (peekc); - tflags |= LEX_RESWDOK; /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/ + tflags |= LEX_RESWDOK; lex_rwlen = 0; continue; } @@ -5613,22 +5909,35 @@ eof_error: if (STREQN (ret + retind - 4, "case", 4)) { tflags |= LEX_INCASE; -/*itrace("parse_comsub:%d: found `case', lex_incase -> 1", line_number);*/ +/*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/ } else if (STREQN (ret + retind - 4, "esac", 4)) { tflags &= ~LEX_INCASE; -/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0", line_number);*/ +/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/ } tflags &= ~LEX_RESWDOK; } - else if (shellbreak (ch) == 0) + else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0))) + ; /* don't modify LEX_RESWDOK if we're starting a comment */ + else if MBTEST((tflags & LEX_INCASE) && ch != '\n') + /* If we can read a reserved word and we're in case, we're at the + point where we can read a new pattern list or an esac. We + handle the esac case above. If we read a newline, we want to + leave LEX_RESWDOK alone. If we read anything else, we want to + turn off LEX_RESWDOK, since we're going to read a pattern list. */ { - tflags &= ~LEX_RESWDOK; + tflags &= ~LEX_RESWDOK; +/*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/ +} + else if MBTEST(shellbreak (ch) == 0) +{ + tflags &= ~LEX_RESWDOK; /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/ } } + /* Might be the start of a here-doc delimiter */ if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<') { /* Add this character. */ @@ -5652,36 +5961,23 @@ eof_error: } else shell_ungetc (peekc); - tflags |= LEX_HEREDELIM; - lex_firstind = -1; + if (peekc != '<') + { + tflags |= LEX_HEREDELIM; + lex_firstind = -1; + } continue; } else - ch = peekc; /* fall through and continue XXX - this skips comments if peekc == '#' */ + ch = peekc; /* fall through and continue XXX */ } - /* Not exactly right yet, should handle shell metacharacters, too. If - any changes are made to this test, make analogous changes to subst.c: - extract_delimited_string(). */ - else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1]))) + else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0))) +{ +/*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/ tflags |= LEX_INCOMMENT; +} - if (tflags & LEX_PASSNEXT) /* last char was backslash */ - { - tflags &= ~LEX_PASSNEXT; - if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */ - { - if (retind > 0) - retind--; /* swallow previously-added backslash */ - continue; - } - - RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); - if MBTEST(ch == CTLESC || ch == CTLNUL) - ret[retind++] = CTLESC; - ret[retind++] = ch; - continue; - } - else if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */ + if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */ { RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64); ret[retind++] = CTLESC; @@ -5698,7 +5994,10 @@ eof_error: /*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/ } else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */ +{ count++; +/*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/ +} /* Add this character. */ RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64); @@ -6114,7 +6413,13 @@ cond_term () /* binop */ tok = read_token (READ); if (tok == WORD && test_binop (yylval.word->word)) - op = yylval.word; + { + op = yylval.word; + if (op->word[0] == '=' && (op->word[1] == '\0' || (op->word[1] == '=' && op->word[2] == '\0'))) + parser_state |= PST_EXTPAT; + else if (op->word[0] == '!' && op->word[1] == '=' && op->word[2] == '\0') + parser_state |= PST_EXTPAT; + } #if defined (COND_REGEXP) else if (tok == WORD && STREQ (yylval.word->word, "=~")) { @@ -6150,8 +6455,13 @@ cond_term () } /* rhs */ + if (parser_state & PST_EXTPAT) + extended_glob = 1; tok = read_token (READ); - parser_state &= ~PST_REGEXP; + if (parser_state & PST_EXTPAT) + extended_glob = global_extglob; + parser_state &= ~(PST_REGEXP|PST_EXTPAT); + if (tok == WORD) { tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL); @@ -6196,6 +6506,7 @@ parse_cond_command () { COND_COM *cexp; + global_extglob = extended_glob; cexp = cond_expr (); return (make_cond_command (cexp)); } @@ -6506,7 +6817,7 @@ read_token_word (character) ((token_index > 0 && assignment_acceptable (last_read_token) && token_is_ident (token, token_index)) || (token_index == 0 && (parser_state&PST_COMPASSIGN)))) { - ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0); + ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARRAYSUB); if (ttok == &matched_pair_error) return -1; /* Bail immediately. */ RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2, @@ -6668,6 +6979,19 @@ got_token: yylval.word = the_word; + if (token[0] == '{' && token[token_index-1] == '}' && + (character == '<' || character == '>')) + { + /* can use token; already copied to the_word */ + token[token_index-1] = '\0'; + if (legal_identifier (token+1)) + { + strcpy (the_word->word, token+1); +/*itrace("read_token_word: returning REDIR_WORD for %s", the_word->word);*/ + return (REDIR_WORD); + } + } + result = ((the_word->flags & (W_ASSIGNMENT|W_NOSPLIT)) == (W_ASSIGNMENT|W_NOSPLIT)) ? ASSIGNMENT_WORD : WORD; @@ -6707,6 +7031,7 @@ reserved_word_acceptable (toksym) case '}': /* XXX */ case AND_AND: case BANG: + case BAR_AND: case DO: case DONE: case ELIF: @@ -6857,7 +7182,7 @@ prompt_again () { char *temp_prompt; - if (interactive == 0 || expanding_alias()) /* XXX */ + if (interactive == 0 || expanding_alias ()) /* XXX */ return; ps1_prompt = get_string_value ("PS1"); @@ -6953,7 +7278,7 @@ decode_prompt_string (string) WORD_LIST *list; char *result, *t; struct dstack save_dstack; - int last_exit_value; + int last_exit_value, last_comsub_pid; #if defined (PROMPT_STRING_DECODE) int result_size, result_index; int c, n, i; @@ -7140,6 +7465,13 @@ decode_prompt_string (string) } t_string[tlen] = '\0'; +#if defined (MACOSX) + /* Convert from "fs" format to "input" format */ + temp = fnx_fromfs (t_string, strlen (t_string)); + if (temp != t_string) + strcpy (t_string, temp); +#endif + #define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0) #define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0) /* Abbreviate \W as ~ if $PWD == $HOME */ @@ -7294,11 +7626,13 @@ not_escape: if (promptvars || posixly_correct) { last_exit_value = last_command_exit_value; + last_comsub_pid = last_command_subst_pid; list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0); free (result); result = string_list (list); dispose_words (list); last_command_exit_value = last_exit_value; + last_command_subst_pid = last_comsub_pid; } else { @@ -7441,7 +7775,7 @@ report_syntax_error (message) parser_error (line_number, "%s", message); if (interactive && EOF_Reached) EOF_Reached = 0; - last_command_exit_value = EX_USAGE; + last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE; return; } @@ -7456,7 +7790,7 @@ report_syntax_error (message) if (interactive == 0) print_offending_line (); - last_command_exit_value = EX_USAGE; + last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE; return; } @@ -7487,7 +7821,7 @@ report_syntax_error (message) EOF_Reached = 0; } - last_command_exit_value = EX_USAGE; + last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE; } /* ??? Needed function. ??? We have to be able to discard the constructs |