No specific user configuration
[platform/upstream/bash.git] / y.tab.c
1 /* A Bison parser, made by GNU Bison 2.3.  */
2
3 /* Skeleton implementation for Bison's Yacc-like parsers in C
4
5    Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6    Free Software Foundation, Inc.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor,
21    Boston, MA 02110-1301, USA.  */
22
23 /* As a special exception, you may create a larger work that contains
24    part or all of the Bison parser skeleton and distribute that work
25    under terms of your choice, so long as that work isn't itself a
26    parser generator using the skeleton or a modified version thereof
27    as a parser skeleton.  Alternatively, if you modify or redistribute
28    the parser skeleton itself, you may (at your option) remove this
29    special exception, which will cause the skeleton and the resulting
30    Bison output files to be licensed under the GNU General Public
31    License without this special exception.
32
33    This special exception was added by the Free Software Foundation in
34    version 2.2 of Bison.  */
35
36 /* C LALR(1) parser skeleton written by Richard Stallman, by
37    simplifying the original so-called "semantic" parser.  */
38
39 /* All symbols defined below should begin with yy or YY, to avoid
40    infringing on user name space.  This should be done even for local
41    variables, as they might otherwise be expanded by user macros.
42    There are some unavoidable exceptions within include files to
43    define necessary library symbols; they are noted "INFRINGES ON
44    USER NAME SPACE" below.  */
45
46 /* Identify Bison output.  */
47 #define YYBISON 1
48
49 /* Bison version.  */
50 #define YYBISON_VERSION "2.3"
51
52 /* Skeleton name.  */
53 #define YYSKELETON_NAME "yacc.c"
54
55 /* Pure parsers.  */
56 #define YYPURE 0
57
58 /* Using locations.  */
59 #define YYLSP_NEEDED 0
60
61
62
63 /* Tokens.  */
64 #ifndef YYTOKENTYPE
65 # define YYTOKENTYPE
66    /* Put the tokens into the symbol table, so that GDB and other debuggers
67       know about them.  */
68    enum yytokentype {
69      IF = 258,
70      THEN = 259,
71      ELSE = 260,
72      ELIF = 261,
73      FI = 262,
74      CASE = 263,
75      ESAC = 264,
76      FOR = 265,
77      SELECT = 266,
78      WHILE = 267,
79      UNTIL = 268,
80      DO = 269,
81      DONE = 270,
82      FUNCTION = 271,
83      COPROC = 272,
84      COND_START = 273,
85      COND_END = 274,
86      COND_ERROR = 275,
87      IN = 276,
88      BANG = 277,
89      TIME = 278,
90      TIMEOPT = 279,
91      TIMEIGN = 280,
92      WORD = 281,
93      ASSIGNMENT_WORD = 282,
94      REDIR_WORD = 283,
95      NUMBER = 284,
96      ARITH_CMD = 285,
97      ARITH_FOR_EXPRS = 286,
98      COND_CMD = 287,
99      AND_AND = 288,
100      OR_OR = 289,
101      GREATER_GREATER = 290,
102      LESS_LESS = 291,
103      LESS_AND = 292,
104      LESS_LESS_LESS = 293,
105      GREATER_AND = 294,
106      SEMI_SEMI = 295,
107      SEMI_AND = 296,
108      SEMI_SEMI_AND = 297,
109      LESS_LESS_MINUS = 298,
110      AND_GREATER = 299,
111      AND_GREATER_GREATER = 300,
112      LESS_GREATER = 301,
113      GREATER_BAR = 302,
114      BAR_AND = 303,
115      yacc_EOF = 304
116    };
117 #endif
118 /* Tokens.  */
119 #define IF 258
120 #define THEN 259
121 #define ELSE 260
122 #define ELIF 261
123 #define FI 262
124 #define CASE 263
125 #define ESAC 264
126 #define FOR 265
127 #define SELECT 266
128 #define WHILE 267
129 #define UNTIL 268
130 #define DO 269
131 #define DONE 270
132 #define FUNCTION 271
133 #define COPROC 272
134 #define COND_START 273
135 #define COND_END 274
136 #define COND_ERROR 275
137 #define IN 276
138 #define BANG 277
139 #define TIME 278
140 #define TIMEOPT 279
141 #define TIMEIGN 280
142 #define WORD 281
143 #define ASSIGNMENT_WORD 282
144 #define REDIR_WORD 283
145 #define NUMBER 284
146 #define ARITH_CMD 285
147 #define ARITH_FOR_EXPRS 286
148 #define COND_CMD 287
149 #define AND_AND 288
150 #define OR_OR 289
151 #define GREATER_GREATER 290
152 #define LESS_LESS 291
153 #define LESS_AND 292
154 #define LESS_LESS_LESS 293
155 #define GREATER_AND 294
156 #define SEMI_SEMI 295
157 #define SEMI_AND 296
158 #define SEMI_SEMI_AND 297
159 #define LESS_LESS_MINUS 298
160 #define AND_GREATER 299
161 #define AND_GREATER_GREATER 300
162 #define LESS_GREATER 301
163 #define GREATER_BAR 302
164 #define BAR_AND 303
165 #define yacc_EOF 304
166
167
168
169
170 /* Copy the first part of user declarations.  */
171 #line 21 "/usr/src/local/bash/bash-4.3-patched/parse.y"
172
173 #include "config.h"
174
175 #include "bashtypes.h"
176 #include "bashansi.h"
177
178 #include "filecntl.h"
179
180 #if defined (HAVE_UNISTD_H)
181 #  include <unistd.h>
182 #endif
183
184 #if defined (HAVE_LOCALE_H)
185 #  include <locale.h>
186 #endif
187
188 #include <stdio.h>
189 #include "chartypes.h"
190 #include <signal.h>
191
192 #include "memalloc.h"
193
194 #include "bashintl.h"
195
196 #define NEED_STRFTIME_DECL      /* used in externs.h */
197
198 #include "shell.h"
199 #include "typemax.h"            /* SIZE_MAX if needed */
200 #include "trap.h"
201 #include "flags.h"
202 #include "parser.h"
203 #include "mailcheck.h"
204 #include "test.h"
205 #include "builtins.h"
206 #include "builtins/common.h"
207 #include "builtins/builtext.h"
208
209 #include "shmbutil.h"
210
211 #if defined (READLINE)
212 #  include "bashline.h"
213 #  include <readline/readline.h>
214 #endif /* READLINE */
215
216 #if defined (HISTORY)
217 #  include "bashhist.h"
218 #  include <readline/history.h>
219 #endif /* HISTORY */
220
221 #if defined (JOB_CONTROL)
222 #  include "jobs.h"
223 #endif /* JOB_CONTROL */
224
225 #if defined (ALIAS)
226 #  include "alias.h"
227 #else
228 typedef void *alias_t;
229 #endif /* ALIAS */
230
231 #if defined (PROMPT_STRING_DECODE)
232 #  ifndef _MINIX
233 #    include <sys/param.h>
234 #  endif
235 #  include <time.h>
236 #  if defined (TM_IN_SYS_TIME)
237 #    include <sys/types.h>
238 #    include <sys/time.h>
239 #  endif /* TM_IN_SYS_TIME */
240 #  include "maxpath.h"
241 #endif /* PROMPT_STRING_DECODE */
242
243 #define RE_READ_TOKEN   -99
244 #define NO_EXPANSION    -100
245
246 #ifdef DEBUG
247 #  define YYDEBUG 1
248 #else
249 #  define YYDEBUG 0
250 #endif
251
252 #if defined (HANDLE_MULTIBYTE)
253 #  define last_shell_getc_is_singlebyte \
254         ((shell_input_line_index > 1) \
255                 ? shell_input_line_property[shell_input_line_index - 1] \
256                 : 1)
257 #  define MBTEST(x)     ((x) && last_shell_getc_is_singlebyte)
258 #else
259 #  define last_shell_getc_is_singlebyte 1
260 #  define MBTEST(x)     ((x))
261 #endif
262
263 #if defined (EXTENDED_GLOB)
264 extern int extended_glob;
265 #endif
266
267 extern int eof_encountered;
268 extern int no_line_editing, running_under_emacs;
269 extern int current_command_number;
270 extern int sourcelevel, parse_and_execute_level;
271 extern int posixly_correct;
272 extern int last_command_exit_value;
273 extern pid_t last_command_subst_pid;
274 extern char *shell_name, *current_host_name;
275 extern char *dist_version;
276 extern int patch_level;
277 extern int dump_translatable_strings, dump_po_strings;
278 extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
279 #if defined (BUFFERED_INPUT)
280 extern int bash_input_fd_changed;
281 #endif
282
283 extern int errno;
284 /* **************************************************************** */
285 /*                                                                  */
286 /*                  "Forward" declarations                          */
287 /*                                                                  */
288 /* **************************************************************** */
289
290 #ifdef DEBUG
291 static void debug_parser __P((int));
292 #endif
293
294 static int yy_getc __P((void));
295 static int yy_ungetc __P((int));
296
297 #if defined (READLINE)
298 static int yy_readline_get __P((void));
299 static int yy_readline_unget __P((int));
300 #endif
301
302 static int yy_string_get __P((void));
303 static int yy_string_unget __P((int));
304 static void rewind_input_string __P((void));
305 static int yy_stream_get __P((void));
306 static int yy_stream_unget __P((int));
307
308 static int shell_getc __P((int));
309 static void shell_ungetc __P((int));
310 static void discard_until __P((int));
311
312 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
313 static void push_string __P((char *, int, alias_t *));
314 static void pop_string __P((void));
315 static void free_string_list __P((void));
316 #endif
317
318 static char *read_a_line __P((int));
319
320 static int reserved_word_acceptable __P((int));
321 static int yylex __P((void));
322
323 static void push_heredoc __P((REDIRECT *));
324 static char *mk_alexpansion __P((char *));
325 static int alias_expand_token __P((char *));
326 static int time_command_acceptable __P((void));
327 static int special_case_tokens __P((char *));
328 static int read_token __P((int));
329 static char *parse_matched_pair __P((int, int, int, int *, int));
330 static char *parse_comsub __P((int, int, int, int *, int));
331 #if defined (ARRAY_VARS)
332 static char *parse_compound_assignment __P((int *));
333 #endif
334 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
335 static int parse_dparen __P((int));
336 static int parse_arith_cmd __P((char **, int));
337 #endif
338 #if defined (COND_COMMAND)
339 static void cond_error __P((void));
340 static COND_COM *cond_expr __P((void));
341 static COND_COM *cond_or __P((void));
342 static COND_COM *cond_and __P((void));
343 static COND_COM *cond_term __P((void));
344 static int cond_skip_newlines __P((void));
345 static COMMAND *parse_cond_command __P((void));
346 #endif
347 #if defined (ARRAY_VARS)
348 static int token_is_assignment __P((char *, int));
349 static int token_is_ident __P((char *, int));
350 #endif
351 static int read_token_word __P((int));
352 static void discard_parser_constructs __P((int));
353
354 static char *error_token_from_token __P((int));
355 static char *error_token_from_text __P((void));
356 static void print_offending_line __P((void));
357 static void report_syntax_error __P((char *));
358
359 static void handle_eof_input_unit __P((void));
360 static void prompt_again __P((void));
361 #if 0
362 static void reset_readline_prompt __P((void));
363 #endif
364 static void print_prompt __P((void));
365
366 #if defined (HANDLE_MULTIBYTE)
367 static void set_line_mbstate __P((void));
368 static char *shell_input_line_property = NULL;
369 #else
370 #  define set_line_mbstate()
371 #endif
372
373 extern int yyerror __P((const char *));
374
375 #ifdef DEBUG
376 extern int yydebug;
377 #endif
378
379 /* Default prompt strings */
380 char *primary_prompt = PPROMPT;
381 char *secondary_prompt = SPROMPT;
382
383 /* PROMPT_STRING_POINTER points to one of these, never to an actual string. */
384 char *ps1_prompt, *ps2_prompt;
385
386 /* Handle on the current prompt string.  Indirectly points through
387    ps1_ or ps2_prompt. */
388 char **prompt_string_pointer = (char **)NULL;
389 char *current_prompt_string;
390
391 /* Non-zero means we expand aliases in commands. */
392 int expand_aliases = 0;
393
394 /* If non-zero, the decoded prompt string undergoes parameter and
395    variable substitution, command substitution, arithmetic substitution,
396    string expansion, process substitution, and quote removal in
397    decode_prompt_string. */
398 int promptvars = 1;
399
400 /* If non-zero, $'...' and $"..." are expanded when they appear within
401    a ${...} expansion, even when the expansion appears within double
402    quotes. */
403 int extended_quote = 1;
404
405 /* The number of lines read from input while creating the current command. */
406 int current_command_line_count;
407
408 /* The number of lines in a command saved while we run parse_and_execute */
409 int saved_command_line_count;
410
411 /* The token that currently denotes the end of parse. */
412 int shell_eof_token;
413
414 /* The token currently being read. */
415 int current_token;
416
417 /* The current parser state. */
418 int parser_state;
419
420 /* Variables to manage the task of reading here documents, because we need to
421    defer the reading until after a complete command has been collected. */
422 #define HEREDOC_MAX 16
423
424 static REDIRECT *redir_stack[HEREDOC_MAX];
425 int need_here_doc;
426
427 /* Where shell input comes from.  History expansion is performed on each
428    line when the shell is interactive. */
429 static char *shell_input_line = (char *)NULL;
430 static size_t shell_input_line_index;
431 static size_t shell_input_line_size;    /* Amount allocated for shell_input_line. */
432 static size_t shell_input_line_len;     /* strlen (shell_input_line) */
433
434 /* Either zero or EOF. */
435 static int shell_input_line_terminator;
436
437 /* The line number in a script on which a function definition starts. */
438 static int function_dstart;
439
440 /* The line number in a script on which a function body starts. */
441 static int function_bstart;
442
443 /* The line number in a script at which an arithmetic for command starts. */
444 static int arith_for_lineno;
445
446 /* The decoded prompt string.  Used if READLINE is not defined or if
447    editing is turned off.  Analogous to current_readline_prompt. */
448 static char *current_decoded_prompt;
449
450 /* The last read token, or NULL.  read_token () uses this for context
451    checking. */
452 static int last_read_token;
453
454 /* The token read prior to last_read_token. */
455 static int token_before_that;
456
457 /* The token read prior to token_before_that. */
458 static int two_tokens_ago;
459
460 static int global_extglob;
461
462 /* The line number in a script where the word in a `case WORD', `select WORD'
463    or `for WORD' begins.  This is a nested command maximum, since the array
464    index is decremented after a case, select, or for command is parsed. */
465 #define MAX_CASE_NEST   128
466 static int word_lineno[MAX_CASE_NEST+1];
467 static int word_top = -1;
468
469 /* If non-zero, it is the token that we want read_token to return
470    regardless of what text is (or isn't) present to be read.  This
471    is reset by read_token.  If token_to_read == WORD or
472    ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */
473 static int token_to_read;
474 static WORD_DESC *word_desc_to_read;
475
476 static REDIRECTEE source;
477 static REDIRECTEE redir;
478
479
480 /* Enabling traces.  */
481 #ifndef YYDEBUG
482 # define YYDEBUG 0
483 #endif
484
485 /* Enabling verbose error messages.  */
486 #ifdef YYERROR_VERBOSE
487 # undef YYERROR_VERBOSE
488 # define YYERROR_VERBOSE 1
489 #else
490 # define YYERROR_VERBOSE 0
491 #endif
492
493 /* Enabling the token table.  */
494 #ifndef YYTOKEN_TABLE
495 # define YYTOKEN_TABLE 0
496 #endif
497
498 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
499 typedef union YYSTYPE
500 #line 329 "/usr/src/local/bash/bash-4.3-patched/parse.y"
501 {
502   WORD_DESC *word;              /* the word that we read. */
503   int number;                   /* the number that we read. */
504   WORD_LIST *word_list;
505   COMMAND *command;
506   REDIRECT *redirect;
507   ELEMENT element;
508   PATTERN_LIST *pattern;
509 }
510 /* Line 193 of yacc.c.  */
511 #line 512 "y.tab.c"
512         YYSTYPE;
513 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
514 # define YYSTYPE_IS_DECLARED 1
515 # define YYSTYPE_IS_TRIVIAL 1
516 #endif
517
518
519
520 /* Copy the second part of user declarations.  */
521
522
523 /* Line 216 of yacc.c.  */
524 #line 525 "y.tab.c"
525
526 #ifdef short
527 # undef short
528 #endif
529
530 #ifdef YYTYPE_UINT8
531 typedef YYTYPE_UINT8 yytype_uint8;
532 #else
533 typedef unsigned char yytype_uint8;
534 #endif
535
536 #ifdef YYTYPE_INT8
537 typedef YYTYPE_INT8 yytype_int8;
538 #elif (defined __STDC__ || defined __C99__FUNC__ \
539      || defined __cplusplus || defined _MSC_VER)
540 typedef signed char yytype_int8;
541 #else
542 typedef short int yytype_int8;
543 #endif
544
545 #ifdef YYTYPE_UINT16
546 typedef YYTYPE_UINT16 yytype_uint16;
547 #else
548 typedef unsigned short int yytype_uint16;
549 #endif
550
551 #ifdef YYTYPE_INT16
552 typedef YYTYPE_INT16 yytype_int16;
553 #else
554 typedef short int yytype_int16;
555 #endif
556
557 #ifndef YYSIZE_T
558 # ifdef __SIZE_TYPE__
559 #  define YYSIZE_T __SIZE_TYPE__
560 # elif defined size_t
561 #  define YYSIZE_T size_t
562 # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
563      || defined __cplusplus || defined _MSC_VER)
564 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
565 #  define YYSIZE_T size_t
566 # else
567 #  define YYSIZE_T unsigned int
568 # endif
569 #endif
570
571 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
572
573 #ifndef YY_
574 # if defined YYENABLE_NLS && YYENABLE_NLS
575 #  if ENABLE_NLS
576 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
577 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
578 #  endif
579 # endif
580 # ifndef YY_
581 #  define YY_(msgid) msgid
582 # endif
583 #endif
584
585 /* Suppress unused-variable warnings by "using" E.  */
586 #if ! defined lint || defined __GNUC__
587 # define YYUSE(e) ((void) (e))
588 #else
589 # define YYUSE(e) /* empty */
590 #endif
591
592 /* Identity function, used to suppress warnings about constant conditions.  */
593 #ifndef lint
594 # define YYID(n) (n)
595 #else
596 #if (defined __STDC__ || defined __C99__FUNC__ \
597      || defined __cplusplus || defined _MSC_VER)
598 static int
599 YYID (int i)
600 #else
601 static int
602 YYID (i)
603     int i;
604 #endif
605 {
606   return i;
607 }
608 #endif
609
610 #if ! defined yyoverflow || YYERROR_VERBOSE
611
612 /* The parser invokes alloca or malloc; define the necessary symbols.  */
613
614 # ifdef YYSTACK_USE_ALLOCA
615 #  if YYSTACK_USE_ALLOCA
616 #   ifdef __GNUC__
617 #    define YYSTACK_ALLOC __builtin_alloca
618 #   elif defined __BUILTIN_VA_ARG_INCR
619 #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
620 #   elif defined _AIX
621 #    define YYSTACK_ALLOC __alloca
622 #   elif defined _MSC_VER
623 #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
624 #    define alloca _alloca
625 #   else
626 #    define YYSTACK_ALLOC alloca
627 #    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
628      || defined __cplusplus || defined _MSC_VER)
629 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
630 #     ifndef _STDLIB_H
631 #      define _STDLIB_H 1
632 #     endif
633 #    endif
634 #   endif
635 #  endif
636 # endif
637
638 # ifdef YYSTACK_ALLOC
639    /* Pacify GCC's `empty if-body' warning.  */
640 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
641 #  ifndef YYSTACK_ALLOC_MAXIMUM
642     /* The OS might guarantee only one guard page at the bottom of the stack,
643        and a page size can be as small as 4096 bytes.  So we cannot safely
644        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
645        to allow for a few compiler-allocated temporary stack slots.  */
646 #   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
647 #  endif
648 # else
649 #  define YYSTACK_ALLOC YYMALLOC
650 #  define YYSTACK_FREE YYFREE
651 #  ifndef YYSTACK_ALLOC_MAXIMUM
652 #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
653 #  endif
654 #  if (defined __cplusplus && ! defined _STDLIB_H \
655        && ! ((defined YYMALLOC || defined malloc) \
656              && (defined YYFREE || defined free)))
657 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
658 #   ifndef _STDLIB_H
659 #    define _STDLIB_H 1
660 #   endif
661 #  endif
662 #  ifndef YYMALLOC
663 #   define YYMALLOC malloc
664 #   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
665      || defined __cplusplus || defined _MSC_VER)
666 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
667 #   endif
668 #  endif
669 #  ifndef YYFREE
670 #   define YYFREE free
671 #   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
672      || defined __cplusplus || defined _MSC_VER)
673 void free (void *); /* INFRINGES ON USER NAME SPACE */
674 #   endif
675 #  endif
676 # endif
677 #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
678
679
680 #if (! defined yyoverflow \
681      && (! defined __cplusplus \
682          || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
683
684 /* A type that is properly aligned for any stack member.  */
685 union yyalloc
686 {
687   yytype_int16 yyss;
688   YYSTYPE yyvs;
689   };
690
691 /* The size of the maximum gap between one aligned stack and the next.  */
692 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
693
694 /* The size of an array large to enough to hold all stacks, each with
695    N elements.  */
696 # define YYSTACK_BYTES(N) \
697      ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
698       + YYSTACK_GAP_MAXIMUM)
699
700 /* Copy COUNT objects from FROM to TO.  The source and destination do
701    not overlap.  */
702 # ifndef YYCOPY
703 #  if defined __GNUC__ && 1 < __GNUC__
704 #   define YYCOPY(To, From, Count) \
705       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
706 #  else
707 #   define YYCOPY(To, From, Count)              \
708       do                                        \
709         {                                       \
710           YYSIZE_T yyi;                         \
711           for (yyi = 0; yyi < (Count); yyi++)   \
712             (To)[yyi] = (From)[yyi];            \
713         }                                       \
714       while (YYID (0))
715 #  endif
716 # endif
717
718 /* Relocate STACK from its old location to the new one.  The
719    local variables YYSIZE and YYSTACKSIZE give the old and new number of
720    elements in the stack, and YYPTR gives the new location of the
721    stack.  Advance YYPTR to a properly aligned location for the next
722    stack.  */
723 # define YYSTACK_RELOCATE(Stack)                                        \
724     do                                                                  \
725       {                                                                 \
726         YYSIZE_T yynewbytes;                                            \
727         YYCOPY (&yyptr->Stack, Stack, yysize);                          \
728         Stack = &yyptr->Stack;                                          \
729         yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
730         yyptr += yynewbytes / sizeof (*yyptr);                          \
731       }                                                                 \
732     while (YYID (0))
733
734 #endif
735
736 /* YYFINAL -- State number of the termination state.  */
737 #define YYFINAL  116
738 /* YYLAST -- Last index in YYTABLE.  */
739 #define YYLAST   659
740
741 /* YYNTOKENS -- Number of terminals.  */
742 #define YYNTOKENS  61
743 /* YYNNTS -- Number of nonterminals.  */
744 #define YYNNTS  38
745 /* YYNRULES -- Number of rules.  */
746 #define YYNRULES  167
747 /* YYNRULES -- Number of states.  */
748 #define YYNSTATES  342
749
750 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
751 #define YYUNDEFTOK  2
752 #define YYMAXUTOK   304
753
754 #define YYTRANSLATE(YYX)                                                \
755   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
756
757 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
758 static const yytype_uint8 yytranslate[] =
759 {
760        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
761       51,     2,     2,     2,     2,     2,     2,     2,     2,     2,
762        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
763        2,     2,     2,     2,     2,     2,     2,     2,    49,     2,
764       59,    60,     2,     2,     2,    56,     2,     2,     2,     2,
765        2,     2,     2,     2,     2,     2,     2,     2,     2,    50,
766       55,     2,    54,     2,     2,     2,     2,     2,     2,     2,
767        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
768        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
769        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
770        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
771        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
772        2,     2,     2,    57,    53,    58,     2,     2,     2,     2,
773        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
774        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
775        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
776        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
777        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
778        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
779        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
780        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
781        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
782        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
783        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
784        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
785        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
786        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
787       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
788       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
789       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
790       45,    46,    47,    48,    52
791 };
792
793 #if YYDEBUG
794 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
795    YYRHS.  */
796 static const yytype_uint16 yyprhs[] =
797 {
798        0,     0,     3,     6,     8,    11,    13,    15,    18,    21,
799       24,    28,    32,    36,    40,    43,    47,    51,    54,    58,
800       62,    65,    69,    73,    76,    80,    84,    87,    91,    95,
801       98,   102,   106,   109,   113,   117,   120,   124,   128,   131,
802      135,   139,   142,   146,   150,   153,   157,   161,   164,   168,
803      172,   175,   178,   180,   182,   184,   186,   189,   191,   194,
804      196,   198,   201,   203,   205,   207,   209,   215,   221,   223,
805      225,   227,   229,   231,   233,   235,   242,   249,   257,   265,
806      276,   287,   297,   307,   315,   323,   329,   335,   342,   349,
807      357,   365,   376,   387,   394,   402,   409,   415,   422,   427,
808      429,   432,   436,   439,   443,   447,   452,   455,   461,   469,
809      476,   480,   482,   486,   491,   498,   504,   506,   509,   514,
810      519,   525,   531,   534,   538,   541,   545,   548,   552,   554,
811      558,   561,   563,   566,   570,   574,   578,   583,   588,   593,
812      598,   603,   605,   607,   609,   611,   613,   615,   616,   619,
813      621,   624,   627,   632,   637,   641,   645,   647,   649,   652,
814      655,   658,   661,   666,   671,   673,   675,   678
815 };
816
817 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
818 static const yytype_int8 yyrhs[] =
819 {
820       62,     0,    -1,    94,    91,    -1,    51,    -1,     1,    51,
821       -1,    52,    -1,    26,    -1,    63,    26,    -1,    54,    26,
822       -1,    55,    26,    -1,    29,    54,    26,    -1,    29,    55,
823       26,    -1,    28,    54,    26,    -1,    28,    55,    26,    -1,
824       35,    26,    -1,    29,    35,    26,    -1,    28,    35,    26,
825       -1,    47,    26,    -1,    29,    47,    26,    -1,    28,    47,
826       26,    -1,    46,    26,    -1,    29,    46,    26,    -1,    28,
827       46,    26,    -1,    36,    26,    -1,    29,    36,    26,    -1,
828       28,    36,    26,    -1,    43,    26,    -1,    29,    43,    26,
829       -1,    28,    43,    26,    -1,    38,    26,    -1,    29,    38,
830       26,    -1,    28,    38,    26,    -1,    37,    29,    -1,    29,
831       37,    29,    -1,    28,    37,    29,    -1,    39,    29,    -1,
832       29,    39,    29,    -1,    28,    39,    29,    -1,    37,    26,
833       -1,    29,    37,    26,    -1,    28,    37,    26,    -1,    39,
834       26,    -1,    29,    39,    26,    -1,    28,    39,    26,    -1,
835       39,    56,    -1,    29,    39,    56,    -1,    28,    39,    56,
836       -1,    37,    56,    -1,    29,    37,    56,    -1,    28,    37,
837       56,    -1,    44,    26,    -1,    45,    26,    -1,    26,    -1,
838       27,    -1,    64,    -1,    64,    -1,    66,    64,    -1,    65,
839       -1,    67,    65,    -1,    67,    -1,    69,    -1,    69,    66,
840       -1,    74,    -1,    77,    -1,    70,    -1,    73,    -1,    12,
841       88,    14,    88,    15,    -1,    13,    88,    14,    88,    15,
842       -1,    72,    -1,    78,    -1,    76,    -1,    79,    -1,    80,
843       -1,    81,    -1,    71,    -1,    10,    26,    93,    14,    88,
844       15,    -1,    10,    26,    93,    57,    88,    58,    -1,    10,
845       26,    50,    93,    14,    88,    15,    -1,    10,    26,    50,
846       93,    57,    88,    58,    -1,    10,    26,    93,    21,    63,
847       92,    93,    14,    88,    15,    -1,    10,    26,    93,    21,
848       63,    92,    93,    57,    88,    58,    -1,    10,    26,    93,
849       21,    92,    93,    14,    88,    15,    -1,    10,    26,    93,
850       21,    92,    93,    57,    88,    58,    -1,    10,    31,    92,
851       93,    14,    88,    15,    -1,    10,    31,    92,    93,    57,
852       88,    58,    -1,    10,    31,    14,    88,    15,    -1,    10,
853       31,    57,    88,    58,    -1,    11,    26,    93,    14,    87,
854       15,    -1,    11,    26,    93,    57,    87,    58,    -1,    11,
855       26,    50,    93,    14,    87,    15,    -1,    11,    26,    50,
856       93,    57,    87,    58,    -1,    11,    26,    93,    21,    63,
857       92,    93,    14,    87,    15,    -1,    11,    26,    93,    21,
858       63,    92,    93,    57,    87,    58,    -1,     8,    26,    93,
859       21,    93,     9,    -1,     8,    26,    93,    21,    85,    93,
860        9,    -1,     8,    26,    93,    21,    83,     9,    -1,    26,
861       59,    60,    93,    75,    -1,    16,    26,    59,    60,    93,
862       75,    -1,    16,    26,    93,    75,    -1,    69,    -1,    69,
863       66,    -1,    59,    88,    60,    -1,    17,    69,    -1,    17,
864       69,    66,    -1,    17,    26,    69,    -1,    17,    26,    69,
865       66,    -1,    17,    67,    -1,     3,    88,     4,    88,     7,
866       -1,     3,    88,     4,    88,     5,    88,     7,    -1,     3,
867       88,     4,    88,    82,     7,    -1,    57,    88,    58,    -1,
868       30,    -1,    18,    32,    19,    -1,     6,    88,     4,    88,
869       -1,     6,    88,     4,    88,     5,    88,    -1,     6,    88,
870        4,    88,    82,    -1,    84,    -1,    85,    84,    -1,    93,
871       86,    60,    88,    -1,    93,    86,    60,    93,    -1,    93,
872       59,    86,    60,    88,    -1,    93,    59,    86,    60,    93,
873       -1,    84,    40,    -1,    85,    84,    40,    -1,    84,    41,
874       -1,    85,    84,    41,    -1,    84,    42,    -1,    85,    84,
875       42,    -1,    26,    -1,    86,    53,    26,    -1,    93,    89,
876       -1,    87,    -1,    93,    90,    -1,    90,    51,    93,    -1,
877       90,    49,    93,    -1,    90,    50,    93,    -1,    90,    33,
878       93,    90,    -1,    90,    34,    93,    90,    -1,    90,    49,
879       93,    90,    -1,    90,    50,    93,    90,    -1,    90,    51,
880       93,    90,    -1,    96,    -1,    51,    -1,    52,    -1,    51,
881       -1,    50,    -1,    52,    -1,    -1,    93,    51,    -1,    95,
882       -1,    95,    49,    -1,    95,    50,    -1,    95,    33,    93,
883       95,    -1,    95,    34,    93,    95,    -1,    95,    49,    95,
884       -1,    95,    50,    95,    -1,    96,    -1,    97,    -1,    22,
885       96,    -1,    98,    96,    -1,    98,    92,    -1,    22,    92,
886       -1,    97,    53,    93,    97,    -1,    97,    48,    93,    97,
887       -1,    68,    -1,    23,    -1,    23,    24,    -1,    23,    24,
888       25,    -1
889 };
890
891 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
892 static const yytype_uint16 yyrline[] =
893 {
894        0,   382,   382,   393,   402,   417,   427,   429,   433,   439,
895      445,   451,   457,   463,   469,   475,   481,   487,   493,   499,
896      505,   511,   517,   523,   530,   537,   544,   551,   558,   565,
897      571,   577,   583,   589,   595,   601,   607,   613,   619,   625,
898      631,   637,   643,   649,   655,   661,   667,   673,   679,   685,
899      691,   697,   705,   707,   709,   713,   717,   728,   730,   734,
900      736,   738,   754,   756,   760,   762,   764,   766,   768,   770,
901      772,   774,   776,   778,   780,   784,   789,   794,   799,   804,
902      809,   814,   819,   826,   831,   836,   841,   848,   853,   858,
903      863,   868,   873,   880,   885,   890,   897,   900,   903,   907,
904      909,   940,   947,   952,   969,   974,   991,   998,  1000,  1002,
905     1007,  1011,  1015,  1019,  1021,  1023,  1027,  1028,  1032,  1034,
906     1036,  1038,  1042,  1044,  1046,  1048,  1050,  1052,  1056,  1058,
907     1067,  1075,  1076,  1082,  1083,  1090,  1094,  1096,  1098,  1105,
908     1107,  1109,  1113,  1114,  1117,  1119,  1121,  1125,  1126,  1135,
909     1148,  1164,  1179,  1181,  1183,  1190,  1193,  1197,  1199,  1205,
910     1211,  1228,  1248,  1250,  1273,  1277,  1279,  1281
911 };
912 #endif
913
914 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
915 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
916    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
917 static const char *const yytname[] =
918 {
919   "$end", "error", "$undefined", "IF", "THEN", "ELSE", "ELIF", "FI",
920   "CASE", "ESAC", "FOR", "SELECT", "WHILE", "UNTIL", "DO", "DONE",
921   "FUNCTION", "COPROC", "COND_START", "COND_END", "COND_ERROR", "IN",
922   "BANG", "TIME", "TIMEOPT", "TIMEIGN", "WORD", "ASSIGNMENT_WORD",
923   "REDIR_WORD", "NUMBER", "ARITH_CMD", "ARITH_FOR_EXPRS", "COND_CMD",
924   "AND_AND", "OR_OR", "GREATER_GREATER", "LESS_LESS", "LESS_AND",
925   "LESS_LESS_LESS", "GREATER_AND", "SEMI_SEMI", "SEMI_AND",
926   "SEMI_SEMI_AND", "LESS_LESS_MINUS", "AND_GREATER", "AND_GREATER_GREATER",
927   "LESS_GREATER", "GREATER_BAR", "BAR_AND", "'&'", "';'", "'\\n'",
928   "yacc_EOF", "'|'", "'>'", "'<'", "'-'", "'{'", "'}'", "'('", "')'",
929   "$accept", "inputunit", "word_list", "redirection",
930   "simple_command_element", "redirection_list", "simple_command",
931   "command", "shell_command", "for_command", "arith_for_command",
932   "select_command", "case_command", "function_def", "function_body",
933   "subshell", "coproc", "if_command", "group_command", "arith_command",
934   "cond_command", "elif_clause", "case_clause", "pattern_list",
935   "case_clause_sequence", "pattern", "list", "compound_list", "list0",
936   "list1", "simple_list_terminator", "list_terminator", "newline_list",
937   "simple_list", "simple_list1", "pipeline_command", "pipeline",
938   "timespec", 0
939 };
940 #endif
941
942 # ifdef YYPRINT
943 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
944    token YYLEX-NUM.  */
945 static const yytype_uint16 yytoknum[] =
946 {
947        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
948      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
949      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
950      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
951      295,   296,   297,   298,   299,   300,   301,   302,   303,    38,
952       59,    10,   304,   124,    62,    60,    45,   123,   125,    40,
953       41
954 };
955 # endif
956
957 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
958 static const yytype_uint8 yyr1[] =
959 {
960        0,    61,    62,    62,    62,    62,    63,    63,    64,    64,
961       64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
962       64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
963       64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
964       64,    64,    64,    64,    64,    64,    64,    64,    64,    64,
965       64,    64,    65,    65,    65,    66,    66,    67,    67,    68,
966       68,    68,    68,    68,    69,    69,    69,    69,    69,    69,
967       69,    69,    69,    69,    69,    70,    70,    70,    70,    70,
968       70,    70,    70,    71,    71,    71,    71,    72,    72,    72,
969       72,    72,    72,    73,    73,    73,    74,    74,    74,    75,
970       75,    76,    77,    77,    77,    77,    77,    78,    78,    78,
971       79,    80,    81,    82,    82,    82,    83,    83,    84,    84,
972       84,    84,    85,    85,    85,    85,    85,    85,    86,    86,
973       87,    88,    88,    89,    89,    89,    90,    90,    90,    90,
974       90,    90,    91,    91,    92,    92,    92,    93,    93,    94,
975       94,    94,    95,    95,    95,    95,    95,    96,    96,    96,
976       96,    96,    97,    97,    97,    98,    98,    98
977 };
978
979 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
980 static const yytype_uint8 yyr2[] =
981 {
982        0,     2,     2,     1,     2,     1,     1,     2,     2,     2,
983        3,     3,     3,     3,     2,     3,     3,     2,     3,     3,
984        2,     3,     3,     2,     3,     3,     2,     3,     3,     2,
985        3,     3,     2,     3,     3,     2,     3,     3,     2,     3,
986        3,     2,     3,     3,     2,     3,     3,     2,     3,     3,
987        2,     2,     1,     1,     1,     1,     2,     1,     2,     1,
988        1,     2,     1,     1,     1,     1,     5,     5,     1,     1,
989        1,     1,     1,     1,     1,     6,     6,     7,     7,    10,
990       10,     9,     9,     7,     7,     5,     5,     6,     6,     7,
991        7,    10,    10,     6,     7,     6,     5,     6,     4,     1,
992        2,     3,     2,     3,     3,     4,     2,     5,     7,     6,
993        3,     1,     3,     4,     6,     5,     1,     2,     4,     4,
994        5,     5,     2,     3,     2,     3,     2,     3,     1,     3,
995        2,     1,     2,     3,     3,     3,     4,     4,     4,     4,
996        4,     1,     1,     1,     1,     1,     1,     0,     2,     1,
997        2,     2,     4,     4,     3,     3,     1,     1,     2,     2,
998        2,     2,     4,     4,     1,     1,     2,     3
999 };
1000
1001 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
1002    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
1003    means the default is an error.  */
1004 static const yytype_uint8 yydefact[] =
1005 {
1006        0,     0,   147,     0,     0,     0,   147,   147,     0,     0,
1007        0,     0,   165,    52,    53,     0,     0,   111,     0,     0,
1008        0,     0,     0,     0,     0,     0,     0,     0,     3,     5,
1009        0,     0,   147,   147,     0,    54,    57,    59,   164,    60,
1010       64,    74,    68,    65,    62,    70,    63,    69,    71,    72,
1011       73,     0,   149,   156,   157,     0,     4,   131,     0,     0,
1012      147,   147,     0,   147,     0,     0,   147,    52,   106,   102,
1013        0,   145,   144,   146,   161,   158,   166,     0,     0,     0,
1014        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
1015        0,     0,     0,     0,     0,     0,     0,     0,    14,    23,
1016       38,    32,    47,    29,    41,    35,    44,    26,    50,    51,
1017       20,    17,     8,     9,     0,     0,     1,    52,    58,    55,
1018       61,   142,   143,     2,   147,   147,   150,   151,   147,   147,
1019      160,   159,   147,   148,   130,   132,   141,     0,   147,     0,
1020      147,   147,   147,   147,     0,   147,   147,     0,     0,   104,
1021      103,   112,   167,   147,    16,    25,    40,    34,    49,    31,
1022       43,    37,    46,    28,    22,    19,    12,    13,    15,    24,
1023       39,    33,    48,    30,    42,    36,    45,    27,    21,    18,
1024       10,    11,   110,   101,    56,     0,     0,   154,   155,     0,
1025        0,     0,   147,   147,   147,   147,   147,   147,     0,   147,
1026        0,   147,     0,     0,     0,     0,   147,     0,   147,     0,
1027        0,   147,    99,    98,   105,     0,   152,   153,     0,     0,
1028      163,   162,   147,   147,   107,     0,     0,     0,   134,   135,
1029      133,     0,   116,   147,     0,   147,   147,     0,     6,     0,
1030      147,     0,    85,    86,   147,   147,   147,   147,     0,     0,
1031        0,     0,    66,    67,     0,   100,    96,     0,     0,   109,
1032      136,   137,   138,   139,   140,    95,   122,   124,   126,   117,
1033        0,    93,   128,     0,     0,     0,     0,    75,     7,   147,
1034        0,    76,     0,     0,     0,     0,    87,     0,   147,    88,
1035       97,   108,   147,   147,   147,   147,   123,   125,   127,    94,
1036        0,     0,   147,    77,    78,     0,   147,   147,    83,    84,
1037       89,    90,     0,   113,     0,     0,     0,   147,   129,   118,
1038      119,   147,   147,     0,     0,   147,   147,   147,   115,   120,
1039      121,     0,     0,    81,    82,     0,     0,   114,    79,    80,
1040       91,    92
1041 };
1042
1043 /* YYDEFGOTO[NTERM-NUM].  */
1044 static const yytype_int16 yydefgoto[] =
1045 {
1046       -1,    34,   239,    35,    36,   120,    37,    38,    39,    40,
1047       41,    42,    43,    44,   213,    45,    46,    47,    48,    49,
1048       50,   225,   231,   232,   233,   274,    57,    58,   134,   135,
1049      123,    74,    59,    51,   187,   136,    54,    55
1050 };
1051
1052 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
1053    STATE-NUM.  */
1054 #define YYPACT_NINF -208
1055 static const yytype_int16 yypact[] =
1056 {
1057      296,   -35,  -208,    -2,    38,    10,  -208,  -208,    24,   546,
1058       31,   346,    51,    47,  -208,   591,   604,  -208,    56,    71,
1059      -18,   112,   130,   115,   128,   136,   143,   154,  -208,  -208,
1060      157,   170,  -208,  -208,   111,  -208,  -208,   229,  -208,   578,
1061     -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
1062     -208,   -12,    -3,  -208,    48,   346,  -208,  -208,   208,   396,
1063     -208,    73,    15,   163,   190,   201,   160,   107,   229,   578,
1064      204,  -208,  -208,  -208,  -208,  -208,   195,   165,   202,   215,
1065      152,   216,   153,   222,   227,   236,   237,   244,   245,   253,
1066      158,   254,   171,   255,   256,   259,   261,   262,  -208,  -208,
1067     -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
1068     -208,  -208,  -208,  -208,   231,   230,  -208,  -208,  -208,  -208,
1069      578,  -208,  -208,  -208,  -208,  -208,   446,   446,  -208,  -208,
1070     -208,  -208,  -208,  -208,  -208,   210,  -208,     4,  -208,    65,
1071     -208,  -208,  -208,  -208,    70,  -208,  -208,   232,    41,   578,
1072      578,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
1073     -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
1074     -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
1075     -208,  -208,  -208,  -208,  -208,   396,   396,    23,    23,   496,
1076      496,    97,  -208,  -208,  -208,  -208,  -208,  -208,    85,  -208,
1077      185,  -208,   276,   235,   100,   110,  -208,   268,  -208,   280,
1078      283,  -208,   578,  -208,   578,    41,  -208,  -208,   446,   446,
1079       48,    48,  -208,  -208,  -208,   295,   396,   396,   396,   396,
1080      396,   294,   161,  -208,    19,  -208,  -208,   290,  -208,   200,
1081     -208,   252,  -208,  -208,  -208,  -208,  -208,  -208,   302,   396,
1082      200,   269,  -208,  -208,    41,   578,  -208,   313,   324,  -208,
1083     -208,  -208,    55,    55,    55,  -208,  -208,  -208,  -208,   192,
1084       34,  -208,  -208,   303,   -19,   315,   278,  -208,  -208,  -208,
1085      114,  -208,   322,   286,   323,   287,  -208,   210,  -208,  -208,
1086     -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
1087        8,   320,  -208,  -208,  -208,   117,  -208,  -208,  -208,  -208,
1088     -208,  -208,   119,   167,   396,   396,   396,  -208,  -208,  -208,
1089      396,  -208,  -208,   337,   307,  -208,  -208,  -208,  -208,  -208,
1090      396,   345,   308,  -208,  -208,   352,   312,  -208,  -208,  -208,
1091     -208,  -208
1092 };
1093
1094 /* YYPGOTO[NTERM-NUM].  */
1095 static const yytype_int16 yypgoto[] =
1096 {
1097     -208,  -208,   164,   -37,   -31,   -62,   368,  -208,    -5,  -208,
1098     -208,  -208,  -208,  -208,  -206,  -208,  -208,  -208,  -208,  -208,
1099     -208,    66,  -208,   145,  -208,    88,  -173,    -6,  -208,  -207,
1100     -208,   -45,   -48,  -208,     5,     3,    17,  -208
1101 };
1102
1103 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
1104    positive, shift that token.  If negative, reduce the rule which
1105    number is the opposite.  If zero, do what YYDEFACT says.
1106    If YYTABLE_NINF, syntax error.  */
1107 #define YYTABLE_NINF -1
1108 static const yytype_uint16 yytable[] =
1109 {
1110       64,    65,   119,    53,    69,    52,   118,   150,   100,   256,
1111      130,   101,   137,   139,    75,   144,    56,   142,   148,   260,
1112      261,   262,   263,   264,    60,   197,   114,   115,   271,   140,
1113      124,   125,   119,   248,   301,   251,    63,   118,   102,   121,
1114      122,   302,   287,   299,     2,   272,   126,   127,   290,     3,
1115       66,     4,     5,     6,     7,   133,   124,   125,   131,    10,
1116      272,   301,   149,    70,    61,    71,    72,    73,   317,    62,
1117      133,    17,   141,   284,   285,    76,   185,   186,   273,   199,
1118      189,   190,    98,   184,   206,   133,   200,   214,   192,   193,
1119      198,   207,   133,   273,   204,   205,   128,    99,    32,   235,
1120       33,   129,   222,   223,   224,   215,    77,   262,   263,   264,
1121        2,   116,   119,   184,   244,     3,   133,     4,     5,     6,
1122        7,   133,   201,   138,   246,    10,   191,   208,   306,    53,
1123       53,   321,   188,   325,   202,   203,   133,    17,   103,   209,
1124      210,   107,   236,   212,   226,   227,   228,   229,   230,   234,
1125      255,   133,   335,   336,   108,   240,   104,   245,   249,   105,
1126      249,   133,   109,   254,    32,   133,    33,   247,   133,   110,
1127      133,   307,   327,   223,   322,   119,   326,   184,   156,   160,
1128      111,   157,   161,   112,   170,   270,   106,   171,    53,    53,
1129      216,   217,   280,   237,   279,   241,   113,   174,   249,   249,
1130      175,   266,   267,   268,   145,   288,   220,   221,   158,   162,
1131      212,   238,   132,   143,   172,   146,   257,   258,   184,   147,
1132      152,    53,    53,   151,   188,   153,   278,   176,   154,   275,
1133      276,   305,   296,   297,   298,    71,    72,    73,   282,   283,
1134      312,   155,   159,   192,   193,   314,   315,   316,   163,   212,
1135       71,    72,    73,   164,   320,   117,    14,    15,    16,   194,
1136      195,   196,   165,   166,    18,    19,    20,    21,    22,   330,
1137      167,   168,    23,    24,    25,    26,    27,   249,   249,   169,
1138      173,   177,   178,    30,    31,   179,   313,   180,   181,   182,
1139      183,   242,   211,   243,   238,   252,   319,     1,   253,     2,
1140      323,   324,   259,   265,     3,   277,     4,     5,     6,     7,
1141      281,   329,     8,     9,    10,   331,   332,   286,    11,    12,
1142      291,   337,    13,    14,    15,    16,    17,   289,   292,   272,
1143      303,    18,    19,    20,    21,    22,   304,   308,   310,    23,
1144       24,    25,    26,    27,   309,   311,   318,    28,    29,     2,
1145       30,    31,   333,    32,     3,    33,     4,     5,     6,     7,
1146      338,   300,     8,     9,    10,   334,   339,   340,    11,    12,
1147      341,   250,    13,    14,    15,    16,    17,    68,   269,   328,
1148        0,    18,    19,    20,    21,    22,     0,     0,     0,    23,
1149       24,    25,    26,    27,     0,     0,    71,    72,    73,     2,
1150       30,    31,     0,    32,     3,    33,     4,     5,     6,     7,
1151        0,     0,     8,     9,    10,     0,     0,     0,    11,    12,
1152        0,     0,    13,    14,    15,    16,    17,     0,     0,     0,
1153        0,    18,    19,    20,    21,    22,     0,     0,     0,    23,
1154       24,    25,    26,    27,     0,     0,     0,   133,     0,     2,
1155       30,    31,     0,    32,     3,    33,     4,     5,     6,     7,
1156        0,     0,     8,     9,    10,     0,     0,     0,    11,    12,
1157        0,     0,    13,    14,    15,    16,    17,     0,     0,     0,
1158        0,    18,    19,    20,    21,    22,     0,     0,     0,    23,
1159       24,    25,    26,    27,     0,     0,     0,     0,     0,     2,
1160       30,    31,     0,    32,     3,    33,     4,     5,     6,     7,
1161        0,     0,     8,     9,    10,     0,     0,     0,     0,     0,
1162        0,     0,    13,    14,    15,    16,    17,     0,     0,     0,
1163        0,    18,    19,    20,    21,    22,     0,     0,     0,    23,
1164       24,    25,    26,    27,     0,     0,     0,   133,     0,     2,
1165       30,    31,     0,    32,     3,    33,     4,     5,     6,     7,
1166        0,     0,     0,     0,    10,     0,     0,     0,     0,     0,
1167        0,     0,    67,    14,    15,    16,    17,     0,     0,     0,
1168        0,    18,    19,    20,    21,    22,     0,     0,     0,    23,
1169       24,    25,    26,    27,     0,     0,     0,     0,     0,     0,
1170       30,    31,     0,    32,     0,    33,    15,    16,     0,     0,
1171        0,     0,     0,    18,    19,    20,    21,    22,     0,     0,
1172        0,    23,    24,    25,    26,    27,    78,    79,    80,    81,
1173       82,     0,    30,    31,    83,     0,     0,    84,    85,    88,
1174       89,    90,    91,    92,     0,    86,    87,    93,     0,     0,
1175       94,    95,     0,     0,     0,     0,     0,     0,    96,    97
1176 };
1177
1178 static const yytype_int16 yycheck[] =
1179 {
1180        6,     7,    39,     0,     9,     0,    37,    69,    26,   215,
1181       55,    29,    60,    61,    11,    63,    51,    62,    66,   226,
1182      227,   228,   229,   230,    26,    21,    32,    33,     9,    14,
1183       33,    34,    69,   206,    53,   208,    26,    68,    56,    51,
1184       52,    60,   249,     9,     3,    26,    49,    50,   254,     8,
1185       26,    10,    11,    12,    13,    51,    33,    34,    55,    18,
1186       26,    53,    67,    32,    26,    50,    51,    52,    60,    31,
1187       51,    30,    57,   246,   247,    24,   124,   125,    59,    14,
1188      128,   129,    26,   120,    14,    51,    21,   149,    33,    34,
1189      138,    21,    51,    59,   142,   143,    48,    26,    57,    14,
1190       59,    53,     5,     6,     7,   153,    59,   314,   315,   316,
1191        3,     0,   149,   150,    14,     8,    51,    10,    11,    12,
1192       13,    51,    57,    50,    14,    18,   132,    57,    14,   126,
1193      127,    14,   127,    14,   140,   141,    51,    30,    26,   145,
1194      146,    26,    57,   148,   192,   193,   194,   195,   196,   197,
1195      212,    51,   325,   326,    26,   200,    26,    57,   206,    29,
1196      208,    51,    26,   211,    57,    51,    59,    57,    51,    26,
1197       51,    57,     5,     6,    57,   212,    57,   214,    26,    26,
1198       26,    29,    29,    26,    26,   233,    56,    29,   185,   186,
1199      185,   186,   240,   199,   239,   201,    26,    26,   246,   247,
1200       29,    40,    41,    42,    14,   250,   189,   190,    56,    56,
1201      215,    26,     4,    50,    56,    14,   222,   223,   255,    59,
1202       25,   218,   219,    19,   219,    60,    26,    56,    26,   235,
1203      236,   279,    40,    41,    42,    50,    51,    52,   244,   245,
1204      288,    26,    26,    33,    34,   293,   294,   295,    26,   254,
1205       50,    51,    52,    26,   302,    26,    27,    28,    29,    49,
1206       50,    51,    26,    26,    35,    36,    37,    38,    39,   317,
1207       26,    26,    43,    44,    45,    46,    47,   325,   326,    26,
1208       26,    26,    26,    54,    55,    26,   292,    26,    26,    58,
1209       60,    15,    60,    58,    26,    15,   302,     1,    15,     3,
1210      306,   307,     7,     9,     8,    15,    10,    11,    12,    13,
1211       58,   317,    16,    17,    18,   321,   322,    15,    22,    23,
1212        7,   327,    26,    27,    28,    29,    30,    58,     4,    26,
1213       15,    35,    36,    37,    38,    39,    58,    15,    15,    43,
1214       44,    45,    46,    47,    58,    58,    26,    51,    52,     3,
1215       54,    55,    15,    57,     8,    59,    10,    11,    12,    13,
1216       15,   273,    16,    17,    18,    58,    58,    15,    22,    23,
1217       58,   207,    26,    27,    28,    29,    30,     9,   233,   313,
1218       -1,    35,    36,    37,    38,    39,    -1,    -1,    -1,    43,
1219       44,    45,    46,    47,    -1,    -1,    50,    51,    52,     3,
1220       54,    55,    -1,    57,     8,    59,    10,    11,    12,    13,
1221       -1,    -1,    16,    17,    18,    -1,    -1,    -1,    22,    23,
1222       -1,    -1,    26,    27,    28,    29,    30,    -1,    -1,    -1,
1223       -1,    35,    36,    37,    38,    39,    -1,    -1,    -1,    43,
1224       44,    45,    46,    47,    -1,    -1,    -1,    51,    -1,     3,
1225       54,    55,    -1,    57,     8,    59,    10,    11,    12,    13,
1226       -1,    -1,    16,    17,    18,    -1,    -1,    -1,    22,    23,
1227       -1,    -1,    26,    27,    28,    29,    30,    -1,    -1,    -1,
1228       -1,    35,    36,    37,    38,    39,    -1,    -1,    -1,    43,
1229       44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,     3,
1230       54,    55,    -1,    57,     8,    59,    10,    11,    12,    13,
1231       -1,    -1,    16,    17,    18,    -1,    -1,    -1,    -1,    -1,
1232       -1,    -1,    26,    27,    28,    29,    30,    -1,    -1,    -1,
1233       -1,    35,    36,    37,    38,    39,    -1,    -1,    -1,    43,
1234       44,    45,    46,    47,    -1,    -1,    -1,    51,    -1,     3,
1235       54,    55,    -1,    57,     8,    59,    10,    11,    12,    13,
1236       -1,    -1,    -1,    -1,    18,    -1,    -1,    -1,    -1,    -1,
1237       -1,    -1,    26,    27,    28,    29,    30,    -1,    -1,    -1,
1238       -1,    35,    36,    37,    38,    39,    -1,    -1,    -1,    43,
1239       44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,    -1,
1240       54,    55,    -1,    57,    -1,    59,    28,    29,    -1,    -1,
1241       -1,    -1,    -1,    35,    36,    37,    38,    39,    -1,    -1,
1242       -1,    43,    44,    45,    46,    47,    35,    36,    37,    38,
1243       39,    -1,    54,    55,    43,    -1,    -1,    46,    47,    35,
1244       36,    37,    38,    39,    -1,    54,    55,    43,    -1,    -1,
1245       46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    54,    55
1246 };
1247
1248 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
1249    symbol of state STATE-NUM.  */
1250 static const yytype_uint8 yystos[] =
1251 {
1252        0,     1,     3,     8,    10,    11,    12,    13,    16,    17,
1253       18,    22,    23,    26,    27,    28,    29,    30,    35,    36,
1254       37,    38,    39,    43,    44,    45,    46,    47,    51,    52,
1255       54,    55,    57,    59,    62,    64,    65,    67,    68,    69,
1256       70,    71,    72,    73,    74,    76,    77,    78,    79,    80,
1257       81,    94,    95,    96,    97,    98,    51,    87,    88,    93,
1258       26,    26,    31,    26,    88,    88,    26,    26,    67,    69,
1259       32,    50,    51,    52,    92,    96,    24,    59,    35,    36,
1260       37,    38,    39,    43,    46,    47,    54,    55,    35,    36,
1261       37,    38,    39,    43,    46,    47,    54,    55,    26,    26,
1262       26,    29,    56,    26,    26,    29,    56,    26,    26,    26,
1263       26,    26,    26,    26,    88,    88,     0,    26,    65,    64,
1264       66,    51,    52,    91,    33,    34,    49,    50,    48,    53,
1265       92,    96,     4,    51,    89,    90,    96,    93,    50,    93,
1266       14,    57,    92,    50,    93,    14,    14,    59,    93,    69,
1267       66,    19,    25,    60,    26,    26,    26,    29,    56,    26,
1268       26,    29,    56,    26,    26,    26,    26,    26,    26,    26,
1269       26,    29,    56,    26,    26,    29,    56,    26,    26,    26,
1270       26,    26,    58,    60,    64,    93,    93,    95,    95,    93,
1271       93,    88,    33,    34,    49,    50,    51,    21,    93,    14,
1272       21,    57,    88,    88,    93,    93,    14,    21,    57,    88,
1273       88,    60,    69,    75,    66,    93,    95,    95,    49,    50,
1274       97,    97,     5,     6,     7,    82,    93,    93,    93,    93,
1275       93,    83,    84,    85,    93,    14,    57,    88,    26,    63,
1276       92,    88,    15,    58,    14,    57,    14,    57,    87,    93,
1277       63,    87,    15,    15,    93,    66,    75,    88,    88,     7,
1278       90,    90,    90,    90,    90,     9,    40,    41,    42,    84,
1279       93,     9,    26,    59,    86,    88,    88,    15,    26,    92,
1280       93,    58,    88,    88,    87,    87,    15,    90,    92,    58,
1281       75,     7,     4,    49,    50,    51,    40,    41,    42,     9,
1282       86,    53,    60,    15,    58,    93,    14,    57,    15,    58,
1283       15,    58,    93,    88,    93,    93,    93,    60,    26,    88,
1284       93,    14,    57,    88,    88,    14,    57,     5,    82,    88,
1285       93,    88,    88,    15,    58,    87,    87,    88,    15,    58,
1286       15,    58
1287 };
1288
1289 #define yyerrok         (yyerrstatus = 0)
1290 #define yyclearin       (yychar = YYEMPTY)
1291 #define YYEMPTY         (-2)
1292 #define YYEOF           0
1293
1294 #define YYACCEPT        goto yyacceptlab
1295 #define YYABORT         goto yyabortlab
1296 #define YYERROR         goto yyerrorlab
1297
1298
1299 /* Like YYERROR except do call yyerror.  This remains here temporarily
1300    to ease the transition to the new meaning of YYERROR, for GCC.
1301    Once GCC version 2 has supplanted version 1, this can go.  */
1302
1303 #define YYFAIL          goto yyerrlab
1304
1305 #define YYRECOVERING()  (!!yyerrstatus)
1306
1307 #define YYBACKUP(Token, Value)                                  \
1308 do                                                              \
1309   if (yychar == YYEMPTY && yylen == 1)                          \
1310     {                                                           \
1311       yychar = (Token);                                         \
1312       yylval = (Value);                                         \
1313       yytoken = YYTRANSLATE (yychar);                           \
1314       YYPOPSTACK (1);                                           \
1315       goto yybackup;                                            \
1316     }                                                           \
1317   else                                                          \
1318     {                                                           \
1319       yyerror (YY_("syntax error: cannot back up")); \
1320       YYERROR;                                                  \
1321     }                                                           \
1322 while (YYID (0))
1323
1324
1325 #define YYTERROR        1
1326 #define YYERRCODE       256
1327
1328
1329 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
1330    If N is 0, then set CURRENT to the empty location which ends
1331    the previous symbol: RHS[0] (always defined).  */
1332
1333 #define YYRHSLOC(Rhs, K) ((Rhs)[K])
1334 #ifndef YYLLOC_DEFAULT
1335 # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
1336     do                                                                  \
1337       if (YYID (N))                                                    \
1338         {                                                               \
1339           (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
1340           (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
1341           (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
1342           (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
1343         }                                                               \
1344       else                                                              \
1345         {                                                               \
1346           (Current).first_line   = (Current).last_line   =              \
1347             YYRHSLOC (Rhs, 0).last_line;                                \
1348           (Current).first_column = (Current).last_column =              \
1349             YYRHSLOC (Rhs, 0).last_column;                              \
1350         }                                                               \
1351     while (YYID (0))
1352 #endif
1353
1354
1355 /* YY_LOCATION_PRINT -- Print the location on the stream.
1356    This macro was not mandated originally: define only if we know
1357    we won't break user code: when these are the locations we know.  */
1358
1359 #ifndef YY_LOCATION_PRINT
1360 # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
1361 #  define YY_LOCATION_PRINT(File, Loc)                  \
1362      fprintf (File, "%d.%d-%d.%d",                      \
1363               (Loc).first_line, (Loc).first_column,     \
1364               (Loc).last_line,  (Loc).last_column)
1365 # else
1366 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1367 # endif
1368 #endif
1369
1370
1371 /* YYLEX -- calling `yylex' with the right arguments.  */
1372
1373 #ifdef YYLEX_PARAM
1374 # define YYLEX yylex (YYLEX_PARAM)
1375 #else
1376 # define YYLEX yylex ()
1377 #endif
1378
1379 /* Enable debugging if requested.  */
1380 #if YYDEBUG
1381
1382 # ifndef YYFPRINTF
1383 #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
1384 #  define YYFPRINTF fprintf
1385 # endif
1386
1387 # define YYDPRINTF(Args)                        \
1388 do {                                            \
1389   if (yydebug)                                  \
1390     YYFPRINTF Args;                             \
1391 } while (YYID (0))
1392
1393 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
1394 do {                                                                      \
1395   if (yydebug)                                                            \
1396     {                                                                     \
1397       YYFPRINTF (stderr, "%s ", Title);                                   \
1398       yy_symbol_print (stderr,                                            \
1399                   Type, Value); \
1400       YYFPRINTF (stderr, "\n");                                           \
1401     }                                                                     \
1402 } while (YYID (0))
1403
1404
1405 /*--------------------------------.
1406 | Print this symbol on YYOUTPUT.  |
1407 `--------------------------------*/
1408
1409 /*ARGSUSED*/
1410 #if (defined __STDC__ || defined __C99__FUNC__ \
1411      || defined __cplusplus || defined _MSC_VER)
1412 static void
1413 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1414 #else
1415 static void
1416 yy_symbol_value_print (yyoutput, yytype, yyvaluep)
1417     FILE *yyoutput;
1418     int yytype;
1419     YYSTYPE const * const yyvaluep;
1420 #endif
1421 {
1422   if (!yyvaluep)
1423     return;
1424 # ifdef YYPRINT
1425   if (yytype < YYNTOKENS)
1426     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
1427 # else
1428   YYUSE (yyoutput);
1429 # endif
1430   switch (yytype)
1431     {
1432       default:
1433         break;
1434     }
1435 }
1436
1437
1438 /*--------------------------------.
1439 | Print this symbol on YYOUTPUT.  |
1440 `--------------------------------*/
1441
1442 #if (defined __STDC__ || defined __C99__FUNC__ \
1443      || defined __cplusplus || defined _MSC_VER)
1444 static void
1445 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1446 #else
1447 static void
1448 yy_symbol_print (yyoutput, yytype, yyvaluep)
1449     FILE *yyoutput;
1450     int yytype;
1451     YYSTYPE const * const yyvaluep;
1452 #endif
1453 {
1454   if (yytype < YYNTOKENS)
1455     YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
1456   else
1457     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
1458
1459   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
1460   YYFPRINTF (yyoutput, ")");
1461 }
1462
1463 /*------------------------------------------------------------------.
1464 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
1465 | TOP (included).                                                   |
1466 `------------------------------------------------------------------*/
1467
1468 #if (defined __STDC__ || defined __C99__FUNC__ \
1469      || defined __cplusplus || defined _MSC_VER)
1470 static void
1471 yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
1472 #else
1473 static void
1474 yy_stack_print (bottom, top)
1475     yytype_int16 *bottom;
1476     yytype_int16 *top;
1477 #endif
1478 {
1479   YYFPRINTF (stderr, "Stack now");
1480   for (; bottom <= top; ++bottom)
1481     YYFPRINTF (stderr, " %d", *bottom);
1482   YYFPRINTF (stderr, "\n");
1483 }
1484
1485 # define YY_STACK_PRINT(Bottom, Top)                            \
1486 do {                                                            \
1487   if (yydebug)                                                  \
1488     yy_stack_print ((Bottom), (Top));                           \
1489 } while (YYID (0))
1490
1491
1492 /*------------------------------------------------.
1493 | Report that the YYRULE is going to be reduced.  |
1494 `------------------------------------------------*/
1495
1496 #if (defined __STDC__ || defined __C99__FUNC__ \
1497      || defined __cplusplus || defined _MSC_VER)
1498 static void
1499 yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
1500 #else
1501 static void
1502 yy_reduce_print (yyvsp, yyrule)
1503     YYSTYPE *yyvsp;
1504     int yyrule;
1505 #endif
1506 {
1507   int yynrhs = yyr2[yyrule];
1508   int yyi;
1509   unsigned long int yylno = yyrline[yyrule];
1510   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
1511              yyrule - 1, yylno);
1512   /* The symbols being reduced.  */
1513   for (yyi = 0; yyi < yynrhs; yyi++)
1514     {
1515       fprintf (stderr, "   $%d = ", yyi + 1);
1516       yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
1517                        &(yyvsp[(yyi + 1) - (yynrhs)])
1518                                        );
1519       fprintf (stderr, "\n");
1520     }
1521 }
1522
1523 # define YY_REDUCE_PRINT(Rule)          \
1524 do {                                    \
1525   if (yydebug)                          \
1526     yy_reduce_print (yyvsp, Rule); \
1527 } while (YYID (0))
1528
1529 /* Nonzero means print parse trace.  It is left uninitialized so that
1530    multiple parsers can coexist.  */
1531 int yydebug;
1532 #else /* !YYDEBUG */
1533 # define YYDPRINTF(Args)
1534 # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1535 # define YY_STACK_PRINT(Bottom, Top)
1536 # define YY_REDUCE_PRINT(Rule)
1537 #endif /* !YYDEBUG */
1538
1539
1540 /* YYINITDEPTH -- initial size of the parser's stacks.  */
1541 #ifndef YYINITDEPTH
1542 # define YYINITDEPTH 200
1543 #endif
1544
1545 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1546    if the built-in stack extension method is used).
1547
1548    Do not make this value too large; the results are undefined if
1549    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1550    evaluated with infinite-precision integer arithmetic.  */
1551
1552 #ifndef YYMAXDEPTH
1553 # define YYMAXDEPTH 10000
1554 #endif
1555
1556 \f
1557
1558 #if YYERROR_VERBOSE
1559
1560 # ifndef yystrlen
1561 #  if defined __GLIBC__ && defined _STRING_H
1562 #   define yystrlen strlen
1563 #  else
1564 /* Return the length of YYSTR.  */
1565 #if (defined __STDC__ || defined __C99__FUNC__ \
1566      || defined __cplusplus || defined _MSC_VER)
1567 static YYSIZE_T
1568 yystrlen (const char *yystr)
1569 #else
1570 static YYSIZE_T
1571 yystrlen (yystr)
1572     const char *yystr;
1573 #endif
1574 {
1575   YYSIZE_T yylen;
1576   for (yylen = 0; yystr[yylen]; yylen++)
1577     continue;
1578   return yylen;
1579 }
1580 #  endif
1581 # endif
1582
1583 # ifndef yystpcpy
1584 #  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
1585 #   define yystpcpy stpcpy
1586 #  else
1587 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
1588    YYDEST.  */
1589 #if (defined __STDC__ || defined __C99__FUNC__ \
1590      || defined __cplusplus || defined _MSC_VER)
1591 static char *
1592 yystpcpy (char *yydest, const char *yysrc)
1593 #else
1594 static char *
1595 yystpcpy (yydest, yysrc)
1596     char *yydest;
1597     const char *yysrc;
1598 #endif
1599 {
1600   char *yyd = yydest;
1601   const char *yys = yysrc;
1602
1603   while ((*yyd++ = *yys++) != '\0')
1604     continue;
1605
1606   return yyd - 1;
1607 }
1608 #  endif
1609 # endif
1610
1611 # ifndef yytnamerr
1612 /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1613    quotes and backslashes, so that it's suitable for yyerror.  The
1614    heuristic is that double-quoting is unnecessary unless the string
1615    contains an apostrophe, a comma, or backslash (other than
1616    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
1617    null, do not copy; instead, return the length of what the result
1618    would have been.  */
1619 static YYSIZE_T
1620 yytnamerr (char *yyres, const char *yystr)
1621 {
1622   if (*yystr == '"')
1623     {
1624       YYSIZE_T yyn = 0;
1625       char const *yyp = yystr;
1626
1627       for (;;)
1628         switch (*++yyp)
1629           {
1630           case '\'':
1631           case ',':
1632             goto do_not_strip_quotes;
1633
1634           case '\\':
1635             if (*++yyp != '\\')
1636               goto do_not_strip_quotes;
1637             /* Fall through.  */
1638           default:
1639             if (yyres)
1640               yyres[yyn] = *yyp;
1641             yyn++;
1642             break;
1643
1644           case '"':
1645             if (yyres)
1646               yyres[yyn] = '\0';
1647             return yyn;
1648           }
1649     do_not_strip_quotes: ;
1650     }
1651
1652   if (! yyres)
1653     return yystrlen (yystr);
1654
1655   return yystpcpy (yyres, yystr) - yyres;
1656 }
1657 # endif
1658
1659 /* Copy into YYRESULT an error message about the unexpected token
1660    YYCHAR while in state YYSTATE.  Return the number of bytes copied,
1661    including the terminating null byte.  If YYRESULT is null, do not
1662    copy anything; just return the number of bytes that would be
1663    copied.  As a special case, return 0 if an ordinary "syntax error"
1664    message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
1665    size calculation.  */
1666 static YYSIZE_T
1667 yysyntax_error (char *yyresult, int yystate, int yychar)
1668 {
1669   int yyn = yypact[yystate];
1670
1671   if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
1672     return 0;
1673   else
1674     {
1675       int yytype = YYTRANSLATE (yychar);
1676       YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
1677       YYSIZE_T yysize = yysize0;
1678       YYSIZE_T yysize1;
1679       int yysize_overflow = 0;
1680       enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1681       char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1682       int yyx;
1683
1684 # if 0
1685       /* This is so xgettext sees the translatable formats that are
1686          constructed on the fly.  */
1687       YY_("syntax error, unexpected %s");
1688       YY_("syntax error, unexpected %s, expecting %s");
1689       YY_("syntax error, unexpected %s, expecting %s or %s");
1690       YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1691       YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1692 # endif
1693       char *yyfmt;
1694       char const *yyf;
1695       static char const yyunexpected[] = "syntax error, unexpected %s";
1696       static char const yyexpecting[] = ", expecting %s";
1697       static char const yyor[] = " or %s";
1698       char yyformat[sizeof yyunexpected
1699                     + sizeof yyexpecting - 1
1700                     + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
1701                        * (sizeof yyor - 1))];
1702       char const *yyprefix = yyexpecting;
1703
1704       /* Start YYX at -YYN if negative to avoid negative indexes in
1705          YYCHECK.  */
1706       int yyxbegin = yyn < 0 ? -yyn : 0;
1707
1708       /* Stay within bounds of both yycheck and yytname.  */
1709       int yychecklim = YYLAST - yyn + 1;
1710       int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1711       int yycount = 1;
1712
1713       yyarg[0] = yytname[yytype];
1714       yyfmt = yystpcpy (yyformat, yyunexpected);
1715
1716       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1717         if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1718           {
1719             if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1720               {
1721                 yycount = 1;
1722                 yysize = yysize0;
1723                 yyformat[sizeof yyunexpected - 1] = '\0';
1724                 break;
1725               }
1726             yyarg[yycount++] = yytname[yyx];
1727             yysize1 = yysize + yytnamerr (0, yytname[yyx]);
1728             yysize_overflow |= (yysize1 < yysize);
1729             yysize = yysize1;
1730             yyfmt = yystpcpy (yyfmt, yyprefix);
1731             yyprefix = yyor;
1732           }
1733
1734       yyf = YY_(yyformat);
1735       yysize1 = yysize + yystrlen (yyf);
1736       yysize_overflow |= (yysize1 < yysize);
1737       yysize = yysize1;
1738
1739       if (yysize_overflow)
1740         return YYSIZE_MAXIMUM;
1741
1742       if (yyresult)
1743         {
1744           /* Avoid sprintf, as that infringes on the user's name space.
1745              Don't have undefined behavior even if the translation
1746              produced a string with the wrong number of "%s"s.  */
1747           char *yyp = yyresult;
1748           int yyi = 0;
1749           while ((*yyp = *yyf) != '\0')
1750             {
1751               if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1752                 {
1753                   yyp += yytnamerr (yyp, yyarg[yyi++]);
1754                   yyf += 2;
1755                 }
1756               else
1757                 {
1758                   yyp++;
1759                   yyf++;
1760                 }
1761             }
1762         }
1763       return yysize;
1764     }
1765 }
1766 #endif /* YYERROR_VERBOSE */
1767 \f
1768
1769 /*-----------------------------------------------.
1770 | Release the memory associated to this symbol.  |
1771 `-----------------------------------------------*/
1772
1773 /*ARGSUSED*/
1774 #if (defined __STDC__ || defined __C99__FUNC__ \
1775      || defined __cplusplus || defined _MSC_VER)
1776 static void
1777 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
1778 #else
1779 static void
1780 yydestruct (yymsg, yytype, yyvaluep)
1781     const char *yymsg;
1782     int yytype;
1783     YYSTYPE *yyvaluep;
1784 #endif
1785 {
1786   YYUSE (yyvaluep);
1787
1788   if (!yymsg)
1789     yymsg = "Deleting";
1790   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1791
1792   switch (yytype)
1793     {
1794
1795       default:
1796         break;
1797     }
1798 }
1799 \f
1800
1801 /* Prevent warnings from -Wmissing-prototypes.  */
1802
1803 #ifdef YYPARSE_PARAM
1804 #if defined __STDC__ || defined __cplusplus
1805 int yyparse (void *YYPARSE_PARAM);
1806 #else
1807 int yyparse ();
1808 #endif
1809 #else /* ! YYPARSE_PARAM */
1810 #if defined __STDC__ || defined __cplusplus
1811 int yyparse (void);
1812 #else
1813 int yyparse ();
1814 #endif
1815 #endif /* ! YYPARSE_PARAM */
1816
1817
1818
1819 /* The look-ahead symbol.  */
1820 int yychar;
1821
1822 /* The semantic value of the look-ahead symbol.  */
1823 YYSTYPE yylval;
1824
1825 /* Number of syntax errors so far.  */
1826 int yynerrs;
1827
1828
1829
1830 /*----------.
1831 | yyparse.  |
1832 `----------*/
1833
1834 #ifdef YYPARSE_PARAM
1835 #if (defined __STDC__ || defined __C99__FUNC__ \
1836      || defined __cplusplus || defined _MSC_VER)
1837 int
1838 yyparse (void *YYPARSE_PARAM)
1839 #else
1840 int
1841 yyparse (YYPARSE_PARAM)
1842     void *YYPARSE_PARAM;
1843 #endif
1844 #else /* ! YYPARSE_PARAM */
1845 #if (defined __STDC__ || defined __C99__FUNC__ \
1846      || defined __cplusplus || defined _MSC_VER)
1847 int
1848 yyparse (void)
1849 #else
1850 int
1851 yyparse ()
1852
1853 #endif
1854 #endif
1855 {
1856   
1857   int yystate;
1858   int yyn;
1859   int yyresult;
1860   /* Number of tokens to shift before error messages enabled.  */
1861   int yyerrstatus;
1862   /* Look-ahead token as an internal (translated) token number.  */
1863   int yytoken = 0;
1864 #if YYERROR_VERBOSE
1865   /* Buffer for error messages, and its allocated size.  */
1866   char yymsgbuf[128];
1867   char *yymsg = yymsgbuf;
1868   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1869 #endif
1870
1871   /* Three stacks and their tools:
1872      `yyss': related to states,
1873      `yyvs': related to semantic values,
1874      `yyls': related to locations.
1875
1876      Refer to the stacks thru separate pointers, to allow yyoverflow
1877      to reallocate them elsewhere.  */
1878
1879   /* The state stack.  */
1880   yytype_int16 yyssa[YYINITDEPTH];
1881   yytype_int16 *yyss = yyssa;
1882   yytype_int16 *yyssp;
1883
1884   /* The semantic value stack.  */
1885   YYSTYPE yyvsa[YYINITDEPTH];
1886   YYSTYPE *yyvs = yyvsa;
1887   YYSTYPE *yyvsp;
1888
1889
1890
1891 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
1892
1893   YYSIZE_T yystacksize = YYINITDEPTH;
1894
1895   /* The variables used to return semantic value and location from the
1896      action routines.  */
1897   YYSTYPE yyval;
1898
1899
1900   /* The number of symbols on the RHS of the reduced rule.
1901      Keep to zero when no symbol should be popped.  */
1902   int yylen = 0;
1903
1904   YYDPRINTF ((stderr, "Starting parse\n"));
1905
1906   yystate = 0;
1907   yyerrstatus = 0;
1908   yynerrs = 0;
1909   yychar = YYEMPTY;             /* Cause a token to be read.  */
1910
1911   /* Initialize stack pointers.
1912      Waste one element of value and location stack
1913      so that they stay on the same level as the state stack.
1914      The wasted elements are never initialized.  */
1915
1916   yyssp = yyss;
1917   yyvsp = yyvs;
1918
1919   goto yysetstate;
1920
1921 /*------------------------------------------------------------.
1922 | yynewstate -- Push a new state, which is found in yystate.  |
1923 `------------------------------------------------------------*/
1924  yynewstate:
1925   /* In all cases, when you get here, the value and location stacks
1926      have just been pushed.  So pushing a state here evens the stacks.  */
1927   yyssp++;
1928
1929  yysetstate:
1930   *yyssp = yystate;
1931
1932   if (yyss + yystacksize - 1 <= yyssp)
1933     {
1934       /* Get the current used size of the three stacks, in elements.  */
1935       YYSIZE_T yysize = yyssp - yyss + 1;
1936
1937 #ifdef yyoverflow
1938       {
1939         /* Give user a chance to reallocate the stack.  Use copies of
1940            these so that the &'s don't force the real ones into
1941            memory.  */
1942         YYSTYPE *yyvs1 = yyvs;
1943         yytype_int16 *yyss1 = yyss;
1944
1945
1946         /* Each stack pointer address is followed by the size of the
1947            data in use in that stack, in bytes.  This used to be a
1948            conditional around just the two extra args, but that might
1949            be undefined if yyoverflow is a macro.  */
1950         yyoverflow (YY_("memory exhausted"),
1951                     &yyss1, yysize * sizeof (*yyssp),
1952                     &yyvs1, yysize * sizeof (*yyvsp),
1953
1954                     &yystacksize);
1955
1956         yyss = yyss1;
1957         yyvs = yyvs1;
1958       }
1959 #else /* no yyoverflow */
1960 # ifndef YYSTACK_RELOCATE
1961       goto yyexhaustedlab;
1962 # else
1963       /* Extend the stack our own way.  */
1964       if (YYMAXDEPTH <= yystacksize)
1965         goto yyexhaustedlab;
1966       yystacksize *= 2;
1967       if (YYMAXDEPTH < yystacksize)
1968         yystacksize = YYMAXDEPTH;
1969
1970       {
1971         yytype_int16 *yyss1 = yyss;
1972         union yyalloc *yyptr =
1973           (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1974         if (! yyptr)
1975           goto yyexhaustedlab;
1976         YYSTACK_RELOCATE (yyss);
1977         YYSTACK_RELOCATE (yyvs);
1978
1979 #  undef YYSTACK_RELOCATE
1980         if (yyss1 != yyssa)
1981           YYSTACK_FREE (yyss1);
1982       }
1983 # endif
1984 #endif /* no yyoverflow */
1985
1986       yyssp = yyss + yysize - 1;
1987       yyvsp = yyvs + yysize - 1;
1988
1989
1990       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1991                   (unsigned long int) yystacksize));
1992
1993       if (yyss + yystacksize - 1 <= yyssp)
1994         YYABORT;
1995     }
1996
1997   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1998
1999   goto yybackup;
2000
2001 /*-----------.
2002 | yybackup.  |
2003 `-----------*/
2004 yybackup:
2005
2006   /* Do appropriate processing given the current state.  Read a
2007      look-ahead token if we need one and don't already have one.  */
2008
2009   /* First try to decide what to do without reference to look-ahead token.  */
2010   yyn = yypact[yystate];
2011   if (yyn == YYPACT_NINF)
2012     goto yydefault;
2013
2014   /* Not known => get a look-ahead token if don't already have one.  */
2015
2016   /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
2017   if (yychar == YYEMPTY)
2018     {
2019       YYDPRINTF ((stderr, "Reading a token: "));
2020       yychar = YYLEX;
2021     }
2022
2023   if (yychar <= YYEOF)
2024     {
2025       yychar = yytoken = YYEOF;
2026       YYDPRINTF ((stderr, "Now at end of input.\n"));
2027     }
2028   else
2029     {
2030       yytoken = YYTRANSLATE (yychar);
2031       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
2032     }
2033
2034   /* If the proper action on seeing token YYTOKEN is to reduce or to
2035      detect an error, take that action.  */
2036   yyn += yytoken;
2037   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
2038     goto yydefault;
2039   yyn = yytable[yyn];
2040   if (yyn <= 0)
2041     {
2042       if (yyn == 0 || yyn == YYTABLE_NINF)
2043         goto yyerrlab;
2044       yyn = -yyn;
2045       goto yyreduce;
2046     }
2047
2048   if (yyn == YYFINAL)
2049     YYACCEPT;
2050
2051   /* Count tokens shifted since error; after three, turn off error
2052      status.  */
2053   if (yyerrstatus)
2054     yyerrstatus--;
2055
2056   /* Shift the look-ahead token.  */
2057   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
2058
2059   /* Discard the shifted token unless it is eof.  */
2060   if (yychar != YYEOF)
2061     yychar = YYEMPTY;
2062
2063   yystate = yyn;
2064   *++yyvsp = yylval;
2065
2066   goto yynewstate;
2067
2068
2069 /*-----------------------------------------------------------.
2070 | yydefault -- do the default action for the current state.  |
2071 `-----------------------------------------------------------*/
2072 yydefault:
2073   yyn = yydefact[yystate];
2074   if (yyn == 0)
2075     goto yyerrlab;
2076   goto yyreduce;
2077
2078
2079 /*-----------------------------.
2080 | yyreduce -- Do a reduction.  |
2081 `-----------------------------*/
2082 yyreduce:
2083   /* yyn is the number of a rule to reduce with.  */
2084   yylen = yyr2[yyn];
2085
2086   /* If YYLEN is nonzero, implement the default value of the action:
2087      `$$ = $1'.
2088
2089      Otherwise, the following line sets YYVAL to garbage.
2090      This behavior is undocumented and Bison
2091      users should not rely upon it.  Assigning to YYVAL
2092      unconditionally makes the parser a bit smaller, and it avoids a
2093      GCC warning that YYVAL may be used uninitialized.  */
2094   yyval = yyvsp[1-yylen];
2095
2096
2097   YY_REDUCE_PRINT (yyn);
2098   switch (yyn)
2099     {
2100         case 2:
2101 #line 383 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2102     {
2103                           /* Case of regular command.  Discard the error
2104                              safety net,and return the command just parsed. */
2105                           global_command = (yyvsp[(1) - (2)].command);
2106                           eof_encountered = 0;
2107                           /* discard_parser_constructs (0); */
2108                           if (parser_state & PST_CMDSUBST)
2109                             parser_state |= PST_EOFTOKEN;
2110                           YYACCEPT;
2111                         }
2112     break;
2113
2114   case 3:
2115 #line 394 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2116     {
2117                           /* Case of regular command, but not a very
2118                              interesting one.  Return a NULL command. */
2119                           global_command = (COMMAND *)NULL;
2120                           if (parser_state & PST_CMDSUBST)
2121                             parser_state |= PST_EOFTOKEN;
2122                           YYACCEPT;
2123                         }
2124     break;
2125
2126   case 4:
2127 #line 403 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2128     {
2129                           /* Error during parsing.  Return NULL command. */
2130                           global_command = (COMMAND *)NULL;
2131                           eof_encountered = 0;
2132                           /* discard_parser_constructs (1); */
2133                           if (interactive && parse_and_execute_level == 0)
2134                             {
2135                               YYACCEPT;
2136                             }
2137                           else
2138                             {
2139                               YYABORT;
2140                             }
2141                         }
2142     break;
2143
2144   case 5:
2145 #line 418 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2146     {
2147                           /* Case of EOF seen by itself.  Do ignoreeof or
2148                              not. */
2149                           global_command = (COMMAND *)NULL;
2150                           handle_eof_input_unit ();
2151                           YYACCEPT;
2152                         }
2153     break;
2154
2155   case 6:
2156 #line 428 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2157     { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
2158     break;
2159
2160   case 7:
2161 #line 430 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2162     { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); }
2163     break;
2164
2165   case 8:
2166 #line 434 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2167     {
2168                           source.dest = 1;
2169                           redir.filename = (yyvsp[(2) - (2)].word);
2170                           (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0);
2171                         }
2172     break;
2173
2174   case 9:
2175 #line 440 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2176     {
2177                           source.dest = 0;
2178                           redir.filename = (yyvsp[(2) - (2)].word);
2179                           (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0);
2180                         }
2181     break;
2182
2183   case 10:
2184 #line 446 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2185     {
2186                           source.dest = (yyvsp[(1) - (3)].number);
2187                           redir.filename = (yyvsp[(3) - (3)].word);
2188                           (yyval.redirect) = make_redirection (source, r_output_direction, redir, 0);
2189                         }
2190     break;
2191
2192   case 11:
2193 #line 452 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2194     {
2195                           source.dest = (yyvsp[(1) - (3)].number);
2196                           redir.filename = (yyvsp[(3) - (3)].word);
2197                           (yyval.redirect) = make_redirection (source, r_input_direction, redir, 0);
2198                         }
2199     break;
2200
2201   case 12:
2202 #line 458 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2203     {
2204                           source.filename = (yyvsp[(1) - (3)].word);
2205                           redir.filename = (yyvsp[(3) - (3)].word);
2206                           (yyval.redirect) = make_redirection (source, r_output_direction, redir, REDIR_VARASSIGN);
2207                         }
2208     break;
2209
2210   case 13:
2211 #line 464 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2212     {
2213                           source.filename = (yyvsp[(1) - (3)].word);
2214                           redir.filename = (yyvsp[(3) - (3)].word);
2215                           (yyval.redirect) = make_redirection (source, r_input_direction, redir, REDIR_VARASSIGN);
2216                         }
2217     break;
2218
2219   case 14:
2220 #line 470 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2221     {
2222                           source.dest = 1;
2223                           redir.filename = (yyvsp[(2) - (2)].word);
2224                           (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0);
2225                         }
2226     break;
2227
2228   case 15:
2229 #line 476 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2230     {
2231                           source.dest = (yyvsp[(1) - (3)].number);
2232                           redir.filename = (yyvsp[(3) - (3)].word);
2233                           (yyval.redirect) = make_redirection (source, r_appending_to, redir, 0);
2234                         }
2235     break;
2236
2237   case 16:
2238 #line 482 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2239     {
2240                           source.filename = (yyvsp[(1) - (3)].word);
2241                           redir.filename = (yyvsp[(3) - (3)].word);
2242                           (yyval.redirect) = make_redirection (source, r_appending_to, redir, REDIR_VARASSIGN);
2243                         }
2244     break;
2245
2246   case 17:
2247 #line 488 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2248     {
2249                           source.dest = 1;
2250                           redir.filename = (yyvsp[(2) - (2)].word);
2251                           (yyval.redirect) = make_redirection (source, r_output_force, redir, 0);
2252                         }
2253     break;
2254
2255   case 18:
2256 #line 494 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2257     {
2258                           source.dest = (yyvsp[(1) - (3)].number);
2259                           redir.filename = (yyvsp[(3) - (3)].word);
2260                           (yyval.redirect) = make_redirection (source, r_output_force, redir, 0);
2261                         }
2262     break;
2263
2264   case 19:
2265 #line 500 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2266     {
2267                           source.filename = (yyvsp[(1) - (3)].word);
2268                           redir.filename = (yyvsp[(3) - (3)].word);
2269                           (yyval.redirect) = make_redirection (source, r_output_force, redir, REDIR_VARASSIGN);
2270                         }
2271     break;
2272
2273   case 20:
2274 #line 506 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2275     {
2276                           source.dest = 0;
2277                           redir.filename = (yyvsp[(2) - (2)].word);
2278                           (yyval.redirect) = make_redirection (source, r_input_output, redir, 0);
2279                         }
2280     break;
2281
2282   case 21:
2283 #line 512 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2284     {
2285                           source.dest = (yyvsp[(1) - (3)].number);
2286                           redir.filename = (yyvsp[(3) - (3)].word);
2287                           (yyval.redirect) = make_redirection (source, r_input_output, redir, 0);
2288                         }
2289     break;
2290
2291   case 22:
2292 #line 518 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2293     {
2294                           source.filename = (yyvsp[(1) - (3)].word);
2295                           redir.filename = (yyvsp[(3) - (3)].word);
2296                           (yyval.redirect) = make_redirection (source, r_input_output, redir, REDIR_VARASSIGN);
2297                         }
2298     break;
2299
2300   case 23:
2301 #line 524 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2302     {
2303                           source.dest = 0;
2304                           redir.filename = (yyvsp[(2) - (2)].word);
2305                           (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
2306                           push_heredoc ((yyval.redirect));
2307                         }
2308     break;
2309
2310   case 24:
2311 #line 531 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2312     {
2313                           source.dest = (yyvsp[(1) - (3)].number);
2314                           redir.filename = (yyvsp[(3) - (3)].word);
2315                           (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
2316                           push_heredoc ((yyval.redirect));
2317                         }
2318     break;
2319
2320   case 25:
2321 #line 538 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2322     {
2323                           source.filename = (yyvsp[(1) - (3)].word);
2324                           redir.filename = (yyvsp[(3) - (3)].word);
2325                           (yyval.redirect) = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
2326                           push_heredoc ((yyval.redirect));
2327                         }
2328     break;
2329
2330   case 26:
2331 #line 545 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2332     {
2333                           source.dest = 0;
2334                           redir.filename = (yyvsp[(2) - (2)].word);
2335                           (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
2336                           push_heredoc ((yyval.redirect));
2337                         }
2338     break;
2339
2340   case 27:
2341 #line 552 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2342     {
2343                           source.dest = (yyvsp[(1) - (3)].number);
2344                           redir.filename = (yyvsp[(3) - (3)].word);
2345                           (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
2346                           push_heredoc ((yyval.redirect));
2347                         }
2348     break;
2349
2350   case 28:
2351 #line 559 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2352     {
2353                           source.filename = (yyvsp[(1) - (3)].word);
2354                           redir.filename = (yyvsp[(3) - (3)].word);
2355                           (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
2356                           push_heredoc ((yyval.redirect));
2357                         }
2358     break;
2359
2360   case 29:
2361 #line 566 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2362     {
2363                           source.dest = 0;
2364                           redir.filename = (yyvsp[(2) - (2)].word);
2365                           (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0);
2366                         }
2367     break;
2368
2369   case 30:
2370 #line 572 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2371     {
2372                           source.dest = (yyvsp[(1) - (3)].number);
2373                           redir.filename = (yyvsp[(3) - (3)].word);
2374                           (yyval.redirect) = make_redirection (source, r_reading_string, redir, 0);
2375                         }
2376     break;
2377
2378   case 31:
2379 #line 578 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2380     {
2381                           source.filename = (yyvsp[(1) - (3)].word);
2382                           redir.filename = (yyvsp[(3) - (3)].word);
2383                           (yyval.redirect) = make_redirection (source, r_reading_string, redir, REDIR_VARASSIGN);
2384                         }
2385     break;
2386
2387   case 32:
2388 #line 584 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2389     {
2390                           source.dest = 0;
2391                           redir.dest = (yyvsp[(2) - (2)].number);
2392                           (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0);
2393                         }
2394     break;
2395
2396   case 33:
2397 #line 590 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2398     {
2399                           source.dest = (yyvsp[(1) - (3)].number);
2400                           redir.dest = (yyvsp[(3) - (3)].number);
2401                           (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, 0);
2402                         }
2403     break;
2404
2405   case 34:
2406 #line 596 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2407     {
2408                           source.filename = (yyvsp[(1) - (3)].word);
2409                           redir.dest = (yyvsp[(3) - (3)].number);
2410                           (yyval.redirect) = make_redirection (source, r_duplicating_input, redir, REDIR_VARASSIGN);
2411                         }
2412     break;
2413
2414   case 35:
2415 #line 602 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2416     {
2417                           source.dest = 1;
2418                           redir.dest = (yyvsp[(2) - (2)].number);
2419                           (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0);
2420                         }
2421     break;
2422
2423   case 36:
2424 #line 608 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2425     {
2426                           source.dest = (yyvsp[(1) - (3)].number);
2427                           redir.dest = (yyvsp[(3) - (3)].number);
2428                           (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, 0);
2429                         }
2430     break;
2431
2432   case 37:
2433 #line 614 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2434     {
2435                           source.filename = (yyvsp[(1) - (3)].word);
2436                           redir.dest = (yyvsp[(3) - (3)].number);
2437                           (yyval.redirect) = make_redirection (source, r_duplicating_output, redir, REDIR_VARASSIGN);
2438                         }
2439     break;
2440
2441   case 38:
2442 #line 620 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2443     {
2444                           source.dest = 0;
2445                           redir.filename = (yyvsp[(2) - (2)].word);
2446                           (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0);
2447                         }
2448     break;
2449
2450   case 39:
2451 #line 626 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2452     {
2453                           source.dest = (yyvsp[(1) - (3)].number);
2454                           redir.filename = (yyvsp[(3) - (3)].word);
2455                           (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, 0);
2456                         }
2457     break;
2458
2459   case 40:
2460 #line 632 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2461     {
2462                           source.filename = (yyvsp[(1) - (3)].word);
2463                           redir.filename = (yyvsp[(3) - (3)].word);
2464                           (yyval.redirect) = make_redirection (source, r_duplicating_input_word, redir, REDIR_VARASSIGN);
2465                         }
2466     break;
2467
2468   case 41:
2469 #line 638 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2470     {
2471                           source.dest = 1;
2472                           redir.filename = (yyvsp[(2) - (2)].word);
2473                           (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0);
2474                         }
2475     break;
2476
2477   case 42:
2478 #line 644 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2479     {
2480                           source.dest = (yyvsp[(1) - (3)].number);
2481                           redir.filename = (yyvsp[(3) - (3)].word);
2482                           (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, 0);
2483                         }
2484     break;
2485
2486   case 43:
2487 #line 650 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2488     {
2489                           source.filename = (yyvsp[(1) - (3)].word);
2490                           redir.filename = (yyvsp[(3) - (3)].word);
2491                           (yyval.redirect) = make_redirection (source, r_duplicating_output_word, redir, REDIR_VARASSIGN);
2492                         }
2493     break;
2494
2495   case 44:
2496 #line 656 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2497     {
2498                           source.dest = 1;
2499                           redir.dest = 0;
2500                           (yyval.redirect) = make_redirection (source, r_close_this, redir, 0);
2501                         }
2502     break;
2503
2504   case 45:
2505 #line 662 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2506     {
2507                           source.dest = (yyvsp[(1) - (3)].number);
2508                           redir.dest = 0;
2509                           (yyval.redirect) = make_redirection (source, r_close_this, redir, 0);
2510                         }
2511     break;
2512
2513   case 46:
2514 #line 668 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2515     {
2516                           source.filename = (yyvsp[(1) - (3)].word);
2517                           redir.dest = 0;
2518                           (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN);
2519                         }
2520     break;
2521
2522   case 47:
2523 #line 674 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2524     {
2525                           source.dest = 0;
2526                           redir.dest = 0;
2527                           (yyval.redirect) = make_redirection (source, r_close_this, redir, 0);
2528                         }
2529     break;
2530
2531   case 48:
2532 #line 680 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2533     {
2534                           source.dest = (yyvsp[(1) - (3)].number);
2535                           redir.dest = 0;
2536                           (yyval.redirect) = make_redirection (source, r_close_this, redir, 0);
2537                         }
2538     break;
2539
2540   case 49:
2541 #line 686 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2542     {
2543                           source.filename = (yyvsp[(1) - (3)].word);
2544                           redir.dest = 0;
2545                           (yyval.redirect) = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN);
2546                         }
2547     break;
2548
2549   case 50:
2550 #line 692 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2551     {
2552                           source.dest = 1;
2553                           redir.filename = (yyvsp[(2) - (2)].word);
2554                           (yyval.redirect) = make_redirection (source, r_err_and_out, redir, 0);
2555                         }
2556     break;
2557
2558   case 51:
2559 #line 698 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2560     {
2561                           source.dest = 1;
2562                           redir.filename = (yyvsp[(2) - (2)].word);
2563                           (yyval.redirect) = make_redirection (source, r_append_err_and_out, redir, 0);
2564                         }
2565     break;
2566
2567   case 52:
2568 #line 706 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2569     { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
2570     break;
2571
2572   case 53:
2573 #line 708 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2574     { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
2575     break;
2576
2577   case 54:
2578 #line 710 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2579     { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; }
2580     break;
2581
2582   case 55:
2583 #line 714 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2584     {
2585                           (yyval.redirect) = (yyvsp[(1) - (1)].redirect);
2586                         }
2587     break;
2588
2589   case 56:
2590 #line 718 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2591     {
2592                           register REDIRECT *t;
2593
2594                           for (t = (yyvsp[(1) - (2)].redirect); t->next; t = t->next)
2595                             ;
2596                           t->next = (yyvsp[(2) - (2)].redirect);
2597                           (yyval.redirect) = (yyvsp[(1) - (2)].redirect);
2598                         }
2599     break;
2600
2601   case 57:
2602 #line 729 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2603     { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); }
2604     break;
2605
2606   case 58:
2607 #line 731 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2608     { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); }
2609     break;
2610
2611   case 59:
2612 #line 735 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2613     { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); }
2614     break;
2615
2616   case 60:
2617 #line 737 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2618     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2619     break;
2620
2621   case 61:
2622 #line 739 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2623     {
2624                           COMMAND *tc;
2625
2626                           tc = (yyvsp[(1) - (2)].command);
2627                           if (tc->redirects)
2628                             {
2629                               register REDIRECT *t;
2630                               for (t = tc->redirects; t->next; t = t->next)
2631                                 ;
2632                               t->next = (yyvsp[(2) - (2)].redirect);
2633                             }
2634                           else
2635                             tc->redirects = (yyvsp[(2) - (2)].redirect);
2636                           (yyval.command) = (yyvsp[(1) - (2)].command);
2637                         }
2638     break;
2639
2640   case 62:
2641 #line 755 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2642     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2643     break;
2644
2645   case 63:
2646 #line 757 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2647     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2648     break;
2649
2650   case 64:
2651 #line 761 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2652     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2653     break;
2654
2655   case 65:
2656 #line 763 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2657     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2658     break;
2659
2660   case 66:
2661 #line 765 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2662     { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
2663     break;
2664
2665   case 67:
2666 #line 767 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2667     { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
2668     break;
2669
2670   case 68:
2671 #line 769 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2672     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2673     break;
2674
2675   case 69:
2676 #line 771 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2677     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2678     break;
2679
2680   case 70:
2681 #line 773 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2682     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2683     break;
2684
2685   case 71:
2686 #line 775 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2687     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2688     break;
2689
2690   case 72:
2691 #line 777 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2692     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2693     break;
2694
2695   case 73:
2696 #line 779 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2697     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2698     break;
2699
2700   case 74:
2701 #line 781 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2702     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2703     break;
2704
2705   case 75:
2706 #line 785 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2707     {
2708                           (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
2709                           if (word_top > 0) word_top--;
2710                         }
2711     break;
2712
2713   case 76:
2714 #line 790 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2715     {
2716                           (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
2717                           if (word_top > 0) word_top--;
2718                         }
2719     break;
2720
2721   case 77:
2722 #line 795 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2723     {
2724                           (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
2725                           if (word_top > 0) word_top--;
2726                         }
2727     break;
2728
2729   case 78:
2730 #line 800 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2731     {
2732                           (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
2733                           if (word_top > 0) word_top--;
2734                         }
2735     break;
2736
2737   case 79:
2738 #line 805 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2739     {
2740                           (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]);
2741                           if (word_top > 0) word_top--;
2742                         }
2743     break;
2744
2745   case 80:
2746 #line 810 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2747     {
2748                           (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]);
2749                           if (word_top > 0) word_top--;
2750                         }
2751     break;
2752
2753   case 81:
2754 #line 815 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2755     {
2756                           (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
2757                           if (word_top > 0) word_top--;
2758                         }
2759     break;
2760
2761   case 82:
2762 #line 820 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2763     {
2764                           (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
2765                           if (word_top > 0) word_top--;
2766                         }
2767     break;
2768
2769   case 83:
2770 #line 827 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2771     {
2772                                   (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
2773                                   if (word_top > 0) word_top--;
2774                                 }
2775     break;
2776
2777   case 84:
2778 #line 832 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2779     {
2780                                   (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
2781                                   if (word_top > 0) word_top--;
2782                                 }
2783     break;
2784
2785   case 85:
2786 #line 837 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2787     {
2788                                   (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
2789                                   if (word_top > 0) word_top--;
2790                                 }
2791     break;
2792
2793   case 86:
2794 #line 842 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2795     {
2796                                   (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
2797                                   if (word_top > 0) word_top--;
2798                                 }
2799     break;
2800
2801   case 87:
2802 #line 849 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2803     {
2804                           (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
2805                           if (word_top > 0) word_top--;
2806                         }
2807     break;
2808
2809   case 88:
2810 #line 854 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2811     {
2812                           (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
2813                           if (word_top > 0) word_top--;
2814                         }
2815     break;
2816
2817   case 89:
2818 #line 859 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2819     {
2820                           (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
2821                           if (word_top > 0) word_top--;
2822                         }
2823     break;
2824
2825   case 90:
2826 #line 864 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2827     {
2828                           (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
2829                           if (word_top > 0) word_top--;
2830                         }
2831     break;
2832
2833   case 91:
2834 #line 869 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2835     {
2836                           (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]);
2837                           if (word_top > 0) word_top--;
2838                         }
2839     break;
2840
2841   case 92:
2842 #line 874 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2843     {
2844                           (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]);
2845                           if (word_top > 0) word_top--;
2846                         }
2847     break;
2848
2849   case 93:
2850 #line 881 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2851     {
2852                           (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]);
2853                           if (word_top > 0) word_top--;
2854                         }
2855     break;
2856
2857   case 94:
2858 #line 886 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2859     {
2860                           (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]);
2861                           if (word_top > 0) word_top--;
2862                         }
2863     break;
2864
2865   case 95:
2866 #line 891 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2867     {
2868                           (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]);
2869                           if (word_top > 0) word_top--;
2870                         }
2871     break;
2872
2873   case 96:
2874 #line 898 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2875     { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); }
2876     break;
2877
2878   case 97:
2879 #line 901 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2880     { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); }
2881     break;
2882
2883   case 98:
2884 #line 904 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2885     { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); }
2886     break;
2887
2888   case 99:
2889 #line 908 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2890     { (yyval.command) = (yyvsp[(1) - (1)].command); }
2891     break;
2892
2893   case 100:
2894 #line 910 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2895     {
2896                           COMMAND *tc;
2897
2898                           tc = (yyvsp[(1) - (2)].command);
2899                           /* According to Posix.2 3.9.5, redirections
2900                              specified after the body of a function should
2901                              be attached to the function and performed when
2902                              the function is executed, not as part of the
2903                              function definition command. */
2904                           /* XXX - I don't think it matters, but we might
2905                              want to change this in the future to avoid
2906                              problems differentiating between a function
2907                              definition with a redirection and a function
2908                              definition containing a single command with a
2909                              redirection.  The two are semantically equivalent,
2910                              though -- the only difference is in how the
2911                              command printing code displays the redirections. */
2912                           if (tc->redirects)
2913                             {
2914                               register REDIRECT *t;
2915                               for (t = tc->redirects; t->next; t = t->next)
2916                                 ;
2917                               t->next = (yyvsp[(2) - (2)].redirect);
2918                             }
2919                           else
2920                             tc->redirects = (yyvsp[(2) - (2)].redirect);
2921                           (yyval.command) = (yyvsp[(1) - (2)].command);
2922                         }
2923     break;
2924
2925   case 101:
2926 #line 941 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2927     {
2928                           (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command));
2929                           (yyval.command)->flags |= CMD_WANT_SUBSHELL;
2930                         }
2931     break;
2932
2933   case 102:
2934 #line 948 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2935     {
2936                           (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command));
2937                           (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
2938                         }
2939     break;
2940
2941   case 103:
2942 #line 953 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2943     {
2944                           COMMAND *tc;
2945
2946                           tc = (yyvsp[(2) - (3)].command);
2947                           if (tc->redirects)
2948                             {
2949                               register REDIRECT *t;
2950                               for (t = tc->redirects; t->next; t = t->next)
2951                                 ;
2952                               t->next = (yyvsp[(3) - (3)].redirect);
2953                             }
2954                           else
2955                             tc->redirects = (yyvsp[(3) - (3)].redirect);
2956                           (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (3)].command));
2957                           (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
2958                         }
2959     break;
2960
2961   case 104:
2962 #line 970 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2963     {
2964                           (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command));
2965                           (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
2966                         }
2967     break;
2968
2969   case 105:
2970 #line 975 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2971     {
2972                           COMMAND *tc;
2973
2974                           tc = (yyvsp[(3) - (4)].command);
2975                           if (tc->redirects)
2976                             {
2977                               register REDIRECT *t;
2978                               for (t = tc->redirects; t->next; t = t->next)
2979                                 ;
2980                               t->next = (yyvsp[(4) - (4)].redirect);
2981                             }
2982                           else
2983                             tc->redirects = (yyvsp[(4) - (4)].redirect);
2984                           (yyval.command) = make_coproc_command ((yyvsp[(2) - (4)].word)->word, (yyvsp[(3) - (4)].command));
2985                           (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
2986                         }
2987     break;
2988
2989   case 106:
2990 #line 992 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2991     {
2992                           (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command)));
2993                           (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
2994                         }
2995     break;
2996
2997   case 107:
2998 #line 999 "/usr/src/local/bash/bash-4.3-patched/parse.y"
2999     { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); }
3000     break;
3001
3002   case 108:
3003 #line 1001 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3004     { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); }
3005     break;
3006
3007   case 109:
3008 #line 1003 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3009     { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); }
3010     break;
3011
3012   case 110:
3013 #line 1008 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3014     { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); }
3015     break;
3016
3017   case 111:
3018 #line 1012 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3019     { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); }
3020     break;
3021
3022   case 112:
3023 #line 1016 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3024     { (yyval.command) = (yyvsp[(2) - (3)].command); }
3025     break;
3026
3027   case 113:
3028 #line 1020 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3029     { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); }
3030     break;
3031
3032   case 114:
3033 #line 1022 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3034     { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); }
3035     break;
3036
3037   case 115:
3038 #line 1024 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3039     { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); }
3040     break;
3041
3042   case 117:
3043 #line 1029 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3044     { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); }
3045     break;
3046
3047   case 118:
3048 #line 1033 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3049     { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); }
3050     break;
3051
3052   case 119:
3053 #line 1035 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3054     { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); }
3055     break;
3056
3057   case 120:
3058 #line 1037 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3059     { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); }
3060     break;
3061
3062   case 121:
3063 #line 1039 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3064     { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); }
3065     break;
3066
3067   case 122:
3068 #line 1043 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3069     { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
3070     break;
3071
3072   case 123:
3073 #line 1045 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3074     { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
3075     break;
3076
3077   case 124:
3078 #line 1047 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3079     { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
3080     break;
3081
3082   case 125:
3083 #line 1049 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3084     { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
3085     break;
3086
3087   case 126:
3088 #line 1051 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3089     { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
3090     break;
3091
3092   case 127:
3093 #line 1053 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3094     { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
3095     break;
3096
3097   case 128:
3098 #line 1057 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3099     { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
3100     break;
3101
3102   case 129:
3103 #line 1059 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3104     { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); }
3105     break;
3106
3107   case 130:
3108 #line 1068 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3109     {
3110                           (yyval.command) = (yyvsp[(2) - (2)].command);
3111                           if (need_here_doc)
3112                             gather_here_documents ();
3113                          }
3114     break;
3115
3116   case 132:
3117 #line 1077 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3118     {
3119                           (yyval.command) = (yyvsp[(2) - (2)].command);
3120                         }
3121     break;
3122
3123   case 134:
3124 #line 1084 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3125     {
3126                           if ((yyvsp[(1) - (3)].command)->type == cm_connection)
3127                             (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
3128                           else
3129                             (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
3130                         }
3131     break;
3132
3133   case 136:
3134 #line 1095 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3135     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
3136     break;
3137
3138   case 137:
3139 #line 1097 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3140     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
3141     break;
3142
3143   case 138:
3144 #line 1099 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3145     {
3146                           if ((yyvsp[(1) - (4)].command)->type == cm_connection)
3147                             (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
3148                           else
3149                             (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
3150                         }
3151     break;
3152
3153   case 139:
3154 #line 1106 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3155     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
3156     break;
3157
3158   case 140:
3159 #line 1108 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3160     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
3161     break;
3162
3163   case 141:
3164 #line 1110 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3165     { (yyval.command) = (yyvsp[(1) - (1)].command); }
3166     break;
3167
3168   case 144:
3169 #line 1118 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3170     { (yyval.number) = '\n'; }
3171     break;
3172
3173   case 145:
3174 #line 1120 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3175     { (yyval.number) = ';'; }
3176     break;
3177
3178   case 146:
3179 #line 1122 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3180     { (yyval.number) = yacc_EOF; }
3181     break;
3182
3183   case 149:
3184 #line 1136 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3185     {
3186                           (yyval.command) = (yyvsp[(1) - (1)].command);
3187                           if (need_here_doc)
3188                             gather_here_documents ();
3189                           if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token)
3190                             {
3191                               global_command = (yyvsp[(1) - (1)].command);
3192                               eof_encountered = 0;
3193                               rewind_input_string ();
3194                               YYACCEPT;
3195                             }
3196                         }
3197     break;
3198
3199   case 150:
3200 #line 1149 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3201     {
3202                           if ((yyvsp[(1) - (2)].command)->type == cm_connection)
3203                             (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
3204                           else
3205                             (yyval.command) = command_connect ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
3206                           if (need_here_doc)
3207                             gather_here_documents ();
3208                           if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token)
3209                             {
3210                               global_command = (yyvsp[(1) - (2)].command);
3211                               eof_encountered = 0;
3212                               rewind_input_string ();
3213                               YYACCEPT;
3214                             }
3215                         }
3216     break;
3217
3218   case 151:
3219 #line 1165 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3220     {
3221                           (yyval.command) = (yyvsp[(1) - (2)].command);
3222                           if (need_here_doc)
3223                             gather_here_documents ();
3224                           if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token)
3225                             {
3226                               global_command = (yyvsp[(1) - (2)].command);
3227                               eof_encountered = 0;
3228                               rewind_input_string ();
3229                               YYACCEPT;
3230                             }
3231                         }
3232     break;
3233
3234   case 152:
3235 #line 1180 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3236     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
3237     break;
3238
3239   case 153:
3240 #line 1182 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3241     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
3242     break;
3243
3244   case 154:
3245 #line 1184 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3246     {
3247                           if ((yyvsp[(1) - (3)].command)->type == cm_connection)
3248                             (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
3249                           else
3250                             (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
3251                         }
3252     break;
3253
3254   case 155:
3255 #line 1191 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3256     { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); }
3257     break;
3258
3259   case 156:
3260 #line 1194 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3261     { (yyval.command) = (yyvsp[(1) - (1)].command); }
3262     break;
3263
3264   case 157:
3265 #line 1198 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3266     { (yyval.command) = (yyvsp[(1) - (1)].command); }
3267     break;
3268
3269   case 158:
3270 #line 1200 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3271     {
3272                           if ((yyvsp[(2) - (2)].command))
3273                             (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN;     /* toggle */
3274                           (yyval.command) = (yyvsp[(2) - (2)].command);
3275                         }
3276     break;
3277
3278   case 159:
3279 #line 1206 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3280     {
3281                           if ((yyvsp[(2) - (2)].command))
3282                             (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number);
3283                           (yyval.command) = (yyvsp[(2) - (2)].command);
3284                         }
3285     break;
3286
3287   case 160:
3288 #line 1212 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3289     {
3290                           ELEMENT x;
3291
3292                           /* Boy, this is unclean.  `time' by itself can
3293                              time a null command.  We cheat and push a
3294                              newline back if the list_terminator was a newline
3295                              to avoid the double-newline problem (one to
3296                              terminate this, one to terminate the command) */
3297                           x.word = 0;
3298                           x.redirect = 0;
3299                           (yyval.command) = make_simple_command (x, (COMMAND *)NULL);
3300                           (yyval.command)->flags |= (yyvsp[(1) - (2)].number);
3301                           /* XXX - let's cheat and push a newline back */
3302                           if ((yyvsp[(2) - (2)].number) == '\n')
3303                             token_to_read = '\n';
3304                         }
3305     break;
3306
3307   case 161:
3308 #line 1229 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3309     {
3310                           ELEMENT x;
3311
3312                           /* This is just as unclean.  Posix says that `!'
3313                              by itself should be equivalent to `false'.
3314                              We cheat and push a
3315                              newline back if the list_terminator was a newline
3316                              to avoid the double-newline problem (one to
3317                              terminate this, one to terminate the command) */
3318                           x.word = 0;
3319                           x.redirect = 0;
3320                           (yyval.command) = make_simple_command (x, (COMMAND *)NULL);
3321                           (yyval.command)->flags |= CMD_INVERT_RETURN;
3322                           /* XXX - let's cheat and push a newline back */
3323                           if ((yyvsp[(2) - (2)].number) == '\n')
3324                             token_to_read = '\n';
3325                         }
3326     break;
3327
3328   case 162:
3329 #line 1249 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3330     { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); }
3331     break;
3332
3333   case 163:
3334 #line 1251 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3335     {
3336                           /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
3337                           COMMAND *tc;
3338                           REDIRECTEE rd, sd;
3339                           REDIRECT *r;
3340
3341                           tc = (yyvsp[(1) - (4)].command)->type == cm_simple ? (COMMAND *)(yyvsp[(1) - (4)].command)->value.Simple : (yyvsp[(1) - (4)].command);
3342                           sd.dest = 2;
3343                           rd.dest = 1;
3344                           r = make_redirection (sd, r_duplicating_output, rd, 0);
3345                           if (tc->redirects)
3346                             {
3347                               register REDIRECT *t;
3348                               for (t = tc->redirects; t->next; t = t->next)
3349                                 ;
3350                               t->next = r;
3351                             }
3352                           else
3353                             tc->redirects = r;
3354
3355                           (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|');
3356                         }
3357     break;
3358
3359   case 164:
3360 #line 1274 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3361     { (yyval.command) = (yyvsp[(1) - (1)].command); }
3362     break;
3363
3364   case 165:
3365 #line 1278 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3366     { (yyval.number) = CMD_TIME_PIPELINE; }
3367     break;
3368
3369   case 166:
3370 #line 1280 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3371     { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
3372     break;
3373
3374   case 167:
3375 #line 1282 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3376     { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
3377     break;
3378
3379
3380 /* Line 1267 of yacc.c.  */
3381 #line 3382 "y.tab.c"
3382       default: break;
3383     }
3384   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
3385
3386   YYPOPSTACK (yylen);
3387   yylen = 0;
3388   YY_STACK_PRINT (yyss, yyssp);
3389
3390   *++yyvsp = yyval;
3391
3392
3393   /* Now `shift' the result of the reduction.  Determine what state
3394      that goes to, based on the state we popped back to and the rule
3395      number reduced by.  */
3396
3397   yyn = yyr1[yyn];
3398
3399   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
3400   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
3401     yystate = yytable[yystate];
3402   else
3403     yystate = yydefgoto[yyn - YYNTOKENS];
3404
3405   goto yynewstate;
3406
3407
3408 /*------------------------------------.
3409 | yyerrlab -- here on detecting error |
3410 `------------------------------------*/
3411 yyerrlab:
3412   /* If not already recovering from an error, report this error.  */
3413   if (!yyerrstatus)
3414     {
3415       ++yynerrs;
3416 #if ! YYERROR_VERBOSE
3417       yyerror (YY_("syntax error"));
3418 #else
3419       {
3420         YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
3421         if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
3422           {
3423             YYSIZE_T yyalloc = 2 * yysize;
3424             if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
3425               yyalloc = YYSTACK_ALLOC_MAXIMUM;
3426             if (yymsg != yymsgbuf)
3427               YYSTACK_FREE (yymsg);
3428             yymsg = (char *) YYSTACK_ALLOC (yyalloc);
3429             if (yymsg)
3430               yymsg_alloc = yyalloc;
3431             else
3432               {
3433                 yymsg = yymsgbuf;
3434                 yymsg_alloc = sizeof yymsgbuf;
3435               }
3436           }
3437
3438         if (0 < yysize && yysize <= yymsg_alloc)
3439           {
3440             (void) yysyntax_error (yymsg, yystate, yychar);
3441             yyerror (yymsg);
3442           }
3443         else
3444           {
3445             yyerror (YY_("syntax error"));
3446             if (yysize != 0)
3447               goto yyexhaustedlab;
3448           }
3449       }
3450 #endif
3451     }
3452
3453
3454
3455   if (yyerrstatus == 3)
3456     {
3457       /* If just tried and failed to reuse look-ahead token after an
3458          error, discard it.  */
3459
3460       if (yychar <= YYEOF)
3461         {
3462           /* Return failure if at end of input.  */
3463           if (yychar == YYEOF)
3464             YYABORT;
3465         }
3466       else
3467         {
3468           yydestruct ("Error: discarding",
3469                       yytoken, &yylval);
3470           yychar = YYEMPTY;
3471         }
3472     }
3473
3474   /* Else will try to reuse look-ahead token after shifting the error
3475      token.  */
3476   goto yyerrlab1;
3477
3478
3479 /*---------------------------------------------------.
3480 | yyerrorlab -- error raised explicitly by YYERROR.  |
3481 `---------------------------------------------------*/
3482 yyerrorlab:
3483
3484   /* Pacify compilers like GCC when the user code never invokes
3485      YYERROR and the label yyerrorlab therefore never appears in user
3486      code.  */
3487   if (/*CONSTCOND*/ 0)
3488      goto yyerrorlab;
3489
3490   /* Do not reclaim the symbols of the rule which action triggered
3491      this YYERROR.  */
3492   YYPOPSTACK (yylen);
3493   yylen = 0;
3494   YY_STACK_PRINT (yyss, yyssp);
3495   yystate = *yyssp;
3496   goto yyerrlab1;
3497
3498
3499 /*-------------------------------------------------------------.
3500 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
3501 `-------------------------------------------------------------*/
3502 yyerrlab1:
3503   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
3504
3505   for (;;)
3506     {
3507       yyn = yypact[yystate];
3508       if (yyn != YYPACT_NINF)
3509         {
3510           yyn += YYTERROR;
3511           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
3512             {
3513               yyn = yytable[yyn];
3514               if (0 < yyn)
3515                 break;
3516             }
3517         }
3518
3519       /* Pop the current state because it cannot handle the error token.  */
3520       if (yyssp == yyss)
3521         YYABORT;
3522
3523
3524       yydestruct ("Error: popping",
3525                   yystos[yystate], yyvsp);
3526       YYPOPSTACK (1);
3527       yystate = *yyssp;
3528       YY_STACK_PRINT (yyss, yyssp);
3529     }
3530
3531   if (yyn == YYFINAL)
3532     YYACCEPT;
3533
3534   *++yyvsp = yylval;
3535
3536
3537   /* Shift the error token.  */
3538   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
3539
3540   yystate = yyn;
3541   goto yynewstate;
3542
3543
3544 /*-------------------------------------.
3545 | yyacceptlab -- YYACCEPT comes here.  |
3546 `-------------------------------------*/
3547 yyacceptlab:
3548   yyresult = 0;
3549   goto yyreturn;
3550
3551 /*-----------------------------------.
3552 | yyabortlab -- YYABORT comes here.  |
3553 `-----------------------------------*/
3554 yyabortlab:
3555   yyresult = 1;
3556   goto yyreturn;
3557
3558 #ifndef yyoverflow
3559 /*-------------------------------------------------.
3560 | yyexhaustedlab -- memory exhaustion comes here.  |
3561 `-------------------------------------------------*/
3562 yyexhaustedlab:
3563   yyerror (YY_("memory exhausted"));
3564   yyresult = 2;
3565   /* Fall through.  */
3566 #endif
3567
3568 yyreturn:
3569   if (yychar != YYEOF && yychar != YYEMPTY)
3570      yydestruct ("Cleanup: discarding lookahead",
3571                  yytoken, &yylval);
3572   /* Do not reclaim the symbols of the rule which action triggered
3573      this YYABORT or YYACCEPT.  */
3574   YYPOPSTACK (yylen);
3575   YY_STACK_PRINT (yyss, yyssp);
3576   while (yyssp != yyss)
3577     {
3578       yydestruct ("Cleanup: popping",
3579                   yystos[*yyssp], yyvsp);
3580       YYPOPSTACK (1);
3581     }
3582 #ifndef yyoverflow
3583   if (yyss != yyssa)
3584     YYSTACK_FREE (yyss);
3585 #endif
3586 #if YYERROR_VERBOSE
3587   if (yymsg != yymsgbuf)
3588     YYSTACK_FREE (yymsg);
3589 #endif
3590   /* Make sure YYID is used.  */
3591   return YYID (yyresult);
3592 }
3593
3594
3595 #line 1284 "/usr/src/local/bash/bash-4.3-patched/parse.y"
3596
3597
3598 /* Initial size to allocate for tokens, and the
3599    amount to grow them by. */
3600 #define TOKEN_DEFAULT_INITIAL_SIZE 496
3601 #define TOKEN_DEFAULT_GROW_SIZE 512
3602
3603 /* Should we call prompt_again? */
3604 #define SHOULD_PROMPT() \
3605   (interactive && (bash_input.type == st_stdin || bash_input.type == st_stream))
3606
3607 #if defined (ALIAS)
3608 #  define expanding_alias() (pushed_string_list && pushed_string_list->expander)
3609 #else
3610 #  define expanding_alias() 0
3611 #endif
3612
3613 /* Global var is non-zero when end of file has been reached. */
3614 int EOF_Reached = 0;
3615
3616 #ifdef DEBUG
3617 static void
3618 debug_parser (i)
3619      int i;
3620 {
3621 #if YYDEBUG != 0
3622   yydebug = i;
3623 #endif
3624 }
3625 #endif
3626
3627 /* yy_getc () returns the next available character from input or EOF.
3628    yy_ungetc (c) makes `c' the next character to read.
3629    init_yy_io (get, unget, type, location) makes the function GET the
3630    installed function for getting the next character, makes UNGET the
3631    installed function for un-getting a character, sets the type of stream
3632    (either string or file) from TYPE, and makes LOCATION point to where
3633    the input is coming from. */
3634
3635 /* Unconditionally returns end-of-file. */
3636 int
3637 return_EOF ()
3638 {
3639   return (EOF);
3640 }
3641
3642 /* Variable containing the current get and unget functions.
3643    See ./input.h for a clearer description. */
3644 BASH_INPUT bash_input;
3645
3646 /* Set all of the fields in BASH_INPUT to NULL.  Free bash_input.name if it
3647    is non-null, avoiding a memory leak. */
3648 void
3649 initialize_bash_input ()
3650 {
3651   bash_input.type = st_none;
3652   FREE (bash_input.name);
3653   bash_input.name = (char *)NULL;
3654   bash_input.location.file = (FILE *)NULL;
3655   bash_input.location.string = (char *)NULL;
3656   bash_input.getter = (sh_cget_func_t *)NULL;
3657   bash_input.ungetter = (sh_cunget_func_t *)NULL;
3658 }
3659
3660 /* Set the contents of the current bash input stream from
3661    GET, UNGET, TYPE, NAME, and LOCATION. */
3662 void
3663 init_yy_io (get, unget, type, name, location)
3664      sh_cget_func_t *get;
3665      sh_cunget_func_t *unget;
3666      enum stream_type type;
3667      const char *name;
3668      INPUT_STREAM location;
3669 {
3670   bash_input.type = type;
3671   FREE (bash_input.name);
3672   bash_input.name = name ? savestring (name) : (char *)NULL;
3673
3674   /* XXX */
3675 #if defined (CRAY)
3676   memcpy((char *)&bash_input.location.string, (char *)&location.string, sizeof(location));
3677 #else
3678   bash_input.location = location;
3679 #endif
3680   bash_input.getter = get;
3681   bash_input.ungetter = unget;
3682 }
3683
3684 char *
3685 yy_input_name ()
3686 {
3687   return (bash_input.name ? bash_input.name : "stdin");
3688 }
3689
3690 /* Call this to get the next character of input. */
3691 static int
3692 yy_getc ()
3693 {
3694   return (*(bash_input.getter)) ();
3695 }
3696
3697 /* Call this to unget C.  That is, to make C the next character
3698    to be read. */
3699 static int
3700 yy_ungetc (c)
3701      int c;
3702 {
3703   return (*(bash_input.ungetter)) (c);
3704 }
3705
3706 #if defined (BUFFERED_INPUT)
3707 #ifdef INCLUDE_UNUSED
3708 int
3709 input_file_descriptor ()
3710 {
3711   switch (bash_input.type)
3712     {
3713     case st_stream:
3714       return (fileno (bash_input.location.file));
3715     case st_bstream:
3716       return (bash_input.location.buffered_fd);
3717     case st_stdin:
3718     default:
3719       return (fileno (stdin));
3720     }
3721 }
3722 #endif
3723 #endif /* BUFFERED_INPUT */
3724
3725 /* **************************************************************** */
3726 /*                                                                  */
3727 /*                Let input be read from readline ().               */
3728 /*                                                                  */
3729 /* **************************************************************** */
3730
3731 #if defined (READLINE)
3732 char *current_readline_prompt = (char *)NULL;
3733 char *current_readline_line = (char *)NULL;
3734 int current_readline_line_index = 0;
3735
3736 static int
3737 yy_readline_get ()
3738 {
3739   SigHandler *old_sigint;
3740   int line_len;
3741   unsigned char c;
3742
3743   if (!current_readline_line)
3744     {
3745       if (!bash_readline_initialized)
3746         initialize_readline ();
3747
3748 #if defined (JOB_CONTROL)
3749       if (job_control)
3750         give_terminal_to (shell_pgrp, 0);
3751 #endif /* JOB_CONTROL */
3752
3753       old_sigint = (SigHandler *)IMPOSSIBLE_TRAP_HANDLER;
3754       if (signal_is_ignored (SIGINT) == 0)
3755         {
3756           /* interrupt_immediately++; */
3757           old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
3758         }
3759
3760       current_readline_line = readline (current_readline_prompt ?
3761                                           current_readline_prompt : "");
3762
3763       CHECK_TERMSIG;
3764       if (signal_is_ignored (SIGINT) == 0)
3765         {
3766           /* interrupt_immediately--; */
3767           if (old_sigint != IMPOSSIBLE_TRAP_HANDLER)
3768             set_signal_handler (SIGINT, old_sigint);
3769         }
3770
3771 #if 0
3772       /* Reset the prompt to the decoded value of prompt_string_pointer. */
3773       reset_readline_prompt ();
3774 #endif
3775
3776       if (current_readline_line == 0)
3777         return (EOF);
3778
3779       current_readline_line_index = 0;
3780       line_len = strlen (current_readline_line);
3781
3782       current_readline_line = (char *)xrealloc (current_readline_line, 2 + line_len);
3783       current_readline_line[line_len++] = '\n';
3784       current_readline_line[line_len] = '\0';
3785     }
3786
3787   if (current_readline_line[current_readline_line_index] == 0)
3788     {
3789       free (current_readline_line);
3790       current_readline_line = (char *)NULL;
3791       return (yy_readline_get ());
3792     }
3793   else
3794     {
3795       c = current_readline_line[current_readline_line_index++];
3796       return (c);
3797     }
3798 }
3799
3800 static int
3801 yy_readline_unget (c)
3802      int c;
3803 {
3804   if (current_readline_line_index && current_readline_line)
3805     current_readline_line[--current_readline_line_index] = c;
3806   return (c);
3807 }
3808
3809 void
3810 with_input_from_stdin ()
3811 {
3812   INPUT_STREAM location;
3813
3814   if (bash_input.type != st_stdin && stream_on_stack (st_stdin) == 0)
3815     {
3816       location.string = current_readline_line;
3817       init_yy_io (yy_readline_get, yy_readline_unget,
3818                   st_stdin, "readline stdin", location);
3819     }
3820 }
3821
3822 #else  /* !READLINE */
3823
3824 void
3825 with_input_from_stdin ()
3826 {
3827   with_input_from_stream (stdin, "stdin");
3828 }
3829 #endif  /* !READLINE */
3830
3831 /* **************************************************************** */
3832 /*                                                                  */
3833 /*   Let input come from STRING.  STRING is zero terminated.        */
3834 /*                                                                  */
3835 /* **************************************************************** */
3836
3837 static int
3838 yy_string_get ()
3839 {
3840   register char *string;
3841   register unsigned char c;
3842
3843   string = bash_input.location.string;
3844
3845   /* If the string doesn't exist, or is empty, EOF found. */
3846   if (string && *string)
3847     {
3848       c = *string++;
3849       bash_input.location.string = string;
3850       return (c);
3851     }
3852   else
3853     return (EOF);
3854 }
3855
3856 static int
3857 yy_string_unget (c)
3858      int c;
3859 {
3860   *(--bash_input.location.string) = c;
3861   return (c);
3862 }
3863
3864 void
3865 with_input_from_string (string, name)
3866      char *string;
3867      const char *name;
3868 {
3869   INPUT_STREAM location;
3870
3871   location.string = string;
3872   init_yy_io (yy_string_get, yy_string_unget, st_string, name, location);
3873 }
3874
3875 /* Count the number of characters we've consumed from bash_input.location.string
3876    and read into shell_input_line, but have not returned from shell_getc.
3877    That is the true input location.  Rewind bash_input.location.string by
3878    that number of characters, so it points to the last character actually
3879    consumed by the parser. */
3880 static void
3881 rewind_input_string ()
3882 {
3883   int xchars;
3884
3885   /* number of unconsumed characters in the input -- XXX need to take newlines
3886      into account, e.g., $(...\n) */
3887   xchars = shell_input_line_len - shell_input_line_index;
3888   if (bash_input.location.string[-1] == '\n')
3889     xchars++;
3890
3891   /* XXX - how to reflect bash_input.location.string back to string passed to
3892      parse_and_execute or xparse_dolparen?  xparse_dolparen needs to know how
3893      far into the string we parsed.  parse_and_execute knows where bash_input.
3894      location.string is, and how far from orig_string that is -- that's the
3895      number of characters the command consumed. */
3896
3897   /* bash_input.location.string - xchars should be where we parsed to */
3898   /* need to do more validation on xchars value for sanity -- test cases. */
3899   bash_input.location.string -= xchars;
3900 }
3901
3902 /* **************************************************************** */
3903 /*                                                                  */
3904 /*                   Let input come from STREAM.                    */
3905 /*                                                                  */
3906 /* **************************************************************** */
3907
3908 /* These two functions used to test the value of the HAVE_RESTARTABLE_SYSCALLS
3909    define, and just use getc/ungetc if it was defined, but since bash
3910    installs its signal handlers without the SA_RESTART flag, some signals
3911    (like SIGCHLD, SIGWINCH, etc.) received during a read(2) will not cause
3912    the read to be restarted.  We need to restart it ourselves. */
3913
3914 static int
3915 yy_stream_get ()
3916 {
3917   int result;
3918
3919   result = EOF;
3920   if (bash_input.location.file)
3921     {
3922 #if 0
3923       if (interactive)
3924         interrupt_immediately++;
3925 #endif
3926
3927       /* XXX - don't need terminate_immediately; getc_with_restart checks
3928          for terminating signals itself if read returns < 0 */
3929       result = getc_with_restart (bash_input.location.file);
3930
3931 #if 0
3932       if (interactive)
3933         interrupt_immediately--;
3934 #endif
3935     }
3936   return (result);
3937 }
3938
3939 static int
3940 yy_stream_unget (c)
3941      int c;
3942 {
3943   return (ungetc_with_restart (c, bash_input.location.file));
3944 }
3945
3946 void
3947 with_input_from_stream (stream, name)
3948      FILE *stream;
3949      const char *name;
3950 {
3951   INPUT_STREAM location;
3952
3953   location.file = stream;
3954   init_yy_io (yy_stream_get, yy_stream_unget, st_stream, name, location);
3955 }
3956
3957 typedef struct stream_saver {
3958   struct stream_saver *next;
3959   BASH_INPUT bash_input;
3960   int line;
3961 #if defined (BUFFERED_INPUT)
3962   BUFFERED_STREAM *bstream;
3963 #endif /* BUFFERED_INPUT */
3964 } STREAM_SAVER;
3965
3966 /* The globally known line number. */
3967 int line_number = 0;
3968
3969 /* The line number offset set by assigning to LINENO.  Not currently used. */
3970 int line_number_base = 0;
3971
3972 #if defined (COND_COMMAND)
3973 static int cond_lineno;
3974 static int cond_token;
3975 #endif
3976
3977 STREAM_SAVER *stream_list = (STREAM_SAVER *)NULL;
3978
3979 void
3980 push_stream (reset_lineno)
3981      int reset_lineno;
3982 {
3983   STREAM_SAVER *saver = (STREAM_SAVER *)xmalloc (sizeof (STREAM_SAVER));
3984
3985   xbcopy ((char *)&bash_input, (char *)&(saver->bash_input), sizeof (BASH_INPUT));
3986
3987 #if defined (BUFFERED_INPUT)
3988   saver->bstream = (BUFFERED_STREAM *)NULL;
3989   /* If we have a buffered stream, clear out buffers[fd]. */
3990   if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
3991     saver->bstream = set_buffered_stream (bash_input.location.buffered_fd,
3992                                           (BUFFERED_STREAM *)NULL);
3993 #endif /* BUFFERED_INPUT */
3994
3995   saver->line = line_number;
3996   bash_input.name = (char *)NULL;
3997   saver->next = stream_list;
3998   stream_list = saver;
3999   EOF_Reached = 0;
4000   if (reset_lineno)
4001     line_number = 0;
4002 }
4003
4004 void
4005 pop_stream ()
4006 {
4007   if (!stream_list)
4008     EOF_Reached = 1;
4009   else
4010     {
4011       STREAM_SAVER *saver = stream_list;
4012
4013       EOF_Reached = 0;
4014       stream_list = stream_list->next;
4015
4016       init_yy_io (saver->bash_input.getter,
4017                   saver->bash_input.ungetter,
4018                   saver->bash_input.type,
4019                   saver->bash_input.name,
4020                   saver->bash_input.location);
4021
4022 #if defined (BUFFERED_INPUT)
4023       /* If we have a buffered stream, restore buffers[fd]. */
4024       /* If the input file descriptor was changed while this was on the
4025          save stack, update the buffered fd to the new file descriptor and
4026          re-establish the buffer <-> bash_input fd correspondence. */
4027       if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
4028         {
4029           if (bash_input_fd_changed)
4030             {
4031               bash_input_fd_changed = 0;
4032               if (default_buffered_input >= 0)
4033                 {
4034                   bash_input.location.buffered_fd = default_buffered_input;
4035                   saver->bstream->b_fd = default_buffered_input;
4036                   SET_CLOSE_ON_EXEC (default_buffered_input);
4037                 }
4038             }
4039           /* XXX could free buffered stream returned as result here. */
4040           set_buffered_stream (bash_input.location.buffered_fd, saver->bstream);
4041         }
4042 #endif /* BUFFERED_INPUT */
4043
4044       line_number = saver->line;
4045
4046       FREE (saver->bash_input.name);
4047       free (saver);
4048     }
4049 }
4050
4051 /* Return 1 if a stream of type TYPE is saved on the stack. */
4052 int
4053 stream_on_stack (type)
4054      enum stream_type type;
4055 {
4056   register STREAM_SAVER *s;
4057
4058   for (s = stream_list; s; s = s->next)
4059     if (s->bash_input.type == type)
4060       return 1;
4061   return 0;
4062 }
4063
4064 /* Save the current token state and return it in a malloced array. */
4065 int *
4066 save_token_state ()
4067 {
4068   int *ret;
4069
4070   ret = (int *)xmalloc (4 * sizeof (int));
4071   ret[0] = last_read_token;
4072   ret[1] = token_before_that;
4073   ret[2] = two_tokens_ago;
4074   ret[3] = current_token;
4075   return ret;
4076 }
4077
4078 void
4079 restore_token_state (ts)
4080      int *ts;
4081 {
4082   if (ts == 0)
4083     return;
4084   last_read_token = ts[0];
4085   token_before_that = ts[1];
4086   two_tokens_ago = ts[2];
4087   current_token = ts[3];
4088 }
4089
4090 /*
4091  * This is used to inhibit alias expansion and reserved word recognition
4092  * inside case statement pattern lists.  A `case statement pattern list' is:
4093  *
4094  *      everything between the `in' in a `case word in' and the next ')'
4095  *      or `esac'
4096  *      everything between a `;;' and the next `)' or `esac'
4097  */
4098
4099 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4100
4101 #define END_OF_ALIAS 0
4102
4103 /*
4104  * Pseudo-global variables used in implementing token-wise alias expansion.
4105  */
4106
4107 /*
4108  * Pushing and popping strings.  This works together with shell_getc to
4109  * implement alias expansion on a per-token basis.
4110  */
4111
4112 #define PSH_ALIAS       0x01
4113 #define PSH_DPAREN      0x02
4114 #define PSH_SOURCE      0x04
4115
4116 typedef struct string_saver {
4117   struct string_saver *next;
4118   int expand_alias;  /* Value to set expand_alias to when string is popped. */
4119   char *saved_line;
4120 #if defined (ALIAS)
4121   alias_t *expander;   /* alias that caused this line to be pushed. */
4122 #endif
4123   size_t saved_line_size, saved_line_index;
4124   int saved_line_terminator;
4125   int flags;
4126 } STRING_SAVER;
4127
4128 STRING_SAVER *pushed_string_list = (STRING_SAVER *)NULL;
4129
4130 /*
4131  * Push the current shell_input_line onto a stack of such lines and make S
4132  * the current input.  Used when expanding aliases.  EXPAND is used to set
4133  * the value of expand_next_token when the string is popped, so that the
4134  * word after the alias in the original line is handled correctly when the
4135  * alias expands to multiple words.  TOKEN is the token that was expanded
4136  * into S; it is saved and used to prevent infinite recursive expansion.
4137  */
4138 static void
4139 push_string (s, expand, ap)
4140      char *s;
4141      int expand;
4142      alias_t *ap;
4143 {
4144   STRING_SAVER *temp = (STRING_SAVER *)xmalloc (sizeof (STRING_SAVER));
4145
4146   temp->expand_alias = expand;
4147   temp->saved_line = shell_input_line;
4148   temp->saved_line_size = shell_input_line_size;
4149   temp->saved_line_index = shell_input_line_index;
4150   temp->saved_line_terminator = shell_input_line_terminator;
4151   temp->flags = 0;
4152 #if defined (ALIAS)
4153   temp->expander = ap;
4154   if (ap)
4155     temp->flags = PSH_ALIAS;
4156 #endif
4157   temp->next = pushed_string_list;
4158   pushed_string_list = temp;
4159
4160 #if defined (ALIAS)
4161   if (ap)
4162     ap->flags |= AL_BEINGEXPANDED;
4163 #endif
4164
4165   shell_input_line = s;
4166   shell_input_line_size = STRLEN (s);
4167   shell_input_line_index = 0;
4168   shell_input_line_terminator = '\0';
4169 #if 0
4170   parser_state &= ~PST_ALEXPNEXT;       /* XXX */
4171 #endif
4172
4173   set_line_mbstate ();
4174 }
4175
4176 /*
4177  * Make the top of the pushed_string stack be the current shell input.
4178  * Only called when there is something on the stack.  Called from shell_getc
4179  * when it thinks it has consumed the string generated by an alias expansion
4180  * and needs to return to the original input line.
4181  */
4182 static void
4183 pop_string ()
4184 {
4185   STRING_SAVER *t;
4186
4187   FREE (shell_input_line);
4188   shell_input_line = pushed_string_list->saved_line;
4189   shell_input_line_index = pushed_string_list->saved_line_index;
4190   shell_input_line_size = pushed_string_list->saved_line_size;
4191   shell_input_line_terminator = pushed_string_list->saved_line_terminator;
4192
4193   if (pushed_string_list->expand_alias)
4194     parser_state |= PST_ALEXPNEXT;
4195   else
4196     parser_state &= ~PST_ALEXPNEXT;
4197
4198   t = pushed_string_list;
4199   pushed_string_list = pushed_string_list->next;
4200
4201 #if defined (ALIAS)
4202   if (t->expander)
4203     t->expander->flags &= ~AL_BEINGEXPANDED;
4204 #endif
4205
4206   free ((char *)t);
4207
4208   set_line_mbstate ();
4209 }
4210
4211 static void
4212 free_string_list ()
4213 {
4214   register STRING_SAVER *t, *t1;
4215
4216   for (t = pushed_string_list; t; )
4217     {
4218       t1 = t->next;
4219       FREE (t->saved_line);
4220 #if defined (ALIAS)
4221       if (t->expander)
4222         t->expander->flags &= ~AL_BEINGEXPANDED;
4223 #endif
4224       free ((char *)t);
4225       t = t1;
4226     }
4227   pushed_string_list = (STRING_SAVER *)NULL;
4228 }
4229
4230 #endif /* ALIAS || DPAREN_ARITHMETIC */
4231
4232 void
4233 free_pushed_string_input ()
4234 {
4235 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4236   free_string_list ();
4237 #endif
4238 }
4239
4240 int
4241 parser_expanding_alias ()
4242 {
4243   return (expanding_alias ());
4244 }
4245
4246 void
4247 parser_save_alias ()
4248 {
4249 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4250   push_string ((char *)NULL, 0, (alias_t *)NULL);
4251   pushed_string_list->flags = PSH_SOURCE;       /* XXX - for now */
4252 #else
4253   ;
4254 #endif
4255 }
4256
4257 void
4258 parser_restore_alias ()
4259 {
4260 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4261   if (pushed_string_list)
4262     pop_string ();
4263 #else
4264   ;
4265 #endif
4266 }
4267
4268 /* Return a line of text, taken from wherever yylex () reads input.
4269    If there is no more input, then we return NULL.  If REMOVE_QUOTED_NEWLINE
4270    is non-zero, we remove unquoted \<newline> pairs.  This is used by
4271    read_secondary_line to read here documents. */
4272 static char *
4273 read_a_line (remove_quoted_newline)
4274      int remove_quoted_newline;
4275 {
4276   static char *line_buffer = (char *)NULL;
4277   static int buffer_size = 0;
4278   int indx, c, peekc, pass_next;
4279
4280 #if defined (READLINE)
4281   if (no_line_editing && SHOULD_PROMPT ())
4282 #else
4283   if (SHOULD_PROMPT ())
4284 #endif
4285     print_prompt ();
4286
4287   pass_next = indx = 0;
4288   while (1)
4289     {
4290       /* Allow immediate exit if interrupted during input. */
4291       QUIT;
4292
4293       c = yy_getc ();
4294
4295       /* Ignore null bytes in input. */
4296       if (c == 0)
4297         {
4298 #if 0
4299           internal_warning ("read_a_line: ignored null byte in input");
4300 #endif
4301           continue;
4302         }
4303
4304       /* If there is no more input, then we return NULL. */
4305       if (c == EOF)
4306         {
4307           if (interactive && bash_input.type == st_stream)
4308             clearerr (stdin);
4309           if (indx == 0)
4310             return ((char *)NULL);
4311           c = '\n';
4312         }
4313
4314       /* `+2' in case the final character in the buffer is a newline. */
4315       RESIZE_MALLOCED_BUFFER (line_buffer, indx, 2, buffer_size, 128);
4316
4317       /* IF REMOVE_QUOTED_NEWLINES is non-zero, we are reading a
4318          here document with an unquoted delimiter.  In this case,
4319          the line will be expanded as if it were in double quotes.
4320          We allow a backslash to escape the next character, but we
4321          need to treat the backslash specially only if a backslash
4322          quoting a backslash-newline pair appears in the line. */
4323       if (pass_next)
4324         {
4325           line_buffer[indx++] = c;
4326           pass_next = 0;
4327         }
4328       else if (c == '\\' && remove_quoted_newline)
4329         {
4330           QUIT;
4331           peekc = yy_getc ();
4332           if (peekc == '\n')
4333             {
4334               line_number++;
4335               continue; /* Make the unquoted \<newline> pair disappear. */
4336             }
4337           else
4338             {
4339               yy_ungetc (peekc);
4340               pass_next = 1;
4341               line_buffer[indx++] = c;          /* Preserve the backslash. */
4342             }
4343         }
4344       else
4345         line_buffer[indx++] = c;
4346
4347       if (c == '\n')
4348         {
4349           line_buffer[indx] = '\0';
4350           return (line_buffer);
4351         }
4352     }
4353 }
4354
4355 /* Return a line as in read_a_line (), but insure that the prompt is
4356    the secondary prompt.  This is used to read the lines of a here
4357    document.  REMOVE_QUOTED_NEWLINE is non-zero if we should remove
4358    newlines quoted with backslashes while reading the line.  It is
4359    non-zero unless the delimiter of the here document was quoted. */
4360 char *
4361 read_secondary_line (remove_quoted_newline)
4362      int remove_quoted_newline;
4363 {
4364   char *ret;
4365   int n, c;
4366
4367   prompt_string_pointer = &ps2_prompt;
4368   if (SHOULD_PROMPT())
4369     prompt_again ();
4370   ret = read_a_line (remove_quoted_newline);
4371 #if defined (HISTORY)
4372   if (ret && remember_on_history && (parser_state & PST_HEREDOC))
4373     {
4374       /* To make adding the the here-document body right, we need to rely
4375          on history_delimiting_chars() returning \n for the first line of
4376          the here-document body and the null string for the second and
4377          subsequent lines, so we avoid double newlines.
4378          current_command_line_count == 2 for the first line of the body. */
4379
4380       current_command_line_count++;
4381       maybe_add_history (ret);
4382     }
4383 #endif /* HISTORY */
4384   return ret;
4385 }
4386
4387 /* **************************************************************** */
4388 /*                                                                  */
4389 /*                              YYLEX ()                            */
4390 /*                                                                  */
4391 /* **************************************************************** */
4392
4393 /* Reserved words.  These are only recognized as the first word of a
4394    command. */
4395 STRING_INT_ALIST word_token_alist[] = {
4396   { "if", IF },
4397   { "then", THEN },
4398   { "else", ELSE },
4399   { "elif", ELIF },
4400   { "fi", FI },
4401   { "case", CASE },
4402   { "esac", ESAC },
4403   { "for", FOR },
4404 #if defined (SELECT_COMMAND)
4405   { "select", SELECT },
4406 #endif
4407   { "while", WHILE },
4408   { "until", UNTIL },
4409   { "do", DO },
4410   { "done", DONE },
4411   { "in", IN },
4412   { "function", FUNCTION },
4413 #if defined (COMMAND_TIMING)
4414   { "time", TIME },
4415 #endif
4416   { "{", '{' },
4417   { "}", '}' },
4418   { "!", BANG },
4419 #if defined (COND_COMMAND)
4420   { "[[", COND_START },
4421   { "]]", COND_END },
4422 #endif
4423 #if defined (COPROCESS_SUPPORT)
4424   { "coproc", COPROC },
4425 #endif
4426   { (char *)NULL, 0}
4427 };
4428
4429 /* other tokens that can be returned by read_token() */
4430 STRING_INT_ALIST other_token_alist[] = {
4431   /* Multiple-character tokens with special values */
4432   { "--", TIMEIGN },
4433   { "-p", TIMEOPT },
4434   { "&&", AND_AND },
4435   { "||", OR_OR },
4436   { ">>", GREATER_GREATER },
4437   { "<<", LESS_LESS },
4438   { "<&", LESS_AND },
4439   { ">&", GREATER_AND },
4440   { ";;", SEMI_SEMI },
4441   { ";&", SEMI_AND },
4442   { ";;&", SEMI_SEMI_AND },
4443   { "<<-", LESS_LESS_MINUS },
4444   { "<<<", LESS_LESS_LESS },
4445   { "&>", AND_GREATER },
4446   { "&>>", AND_GREATER_GREATER },
4447   { "<>", LESS_GREATER },
4448   { ">|", GREATER_BAR },
4449   { "|&", BAR_AND },
4450   { "EOF", yacc_EOF },
4451   /* Tokens whose value is the character itself */
4452   { ">", '>' },
4453   { "<", '<' },
4454   { "-", '-' },
4455   { "{", '{' },
4456   { "}", '}' },
4457   { ";", ';' },
4458   { "(", '(' },
4459   { ")", ')' },
4460   { "|", '|' },
4461   { "&", '&' },
4462   { "newline", '\n' },
4463   { (char *)NULL, 0}
4464 };
4465
4466 /* others not listed here:
4467         WORD                    look at yylval.word
4468         ASSIGNMENT_WORD         look at yylval.word
4469         NUMBER                  look at yylval.number
4470         ARITH_CMD               look at yylval.word_list
4471         ARITH_FOR_EXPRS         look at yylval.word_list
4472         COND_CMD                look at yylval.command
4473 */
4474
4475 /* These are used by read_token_word, but appear up here so that shell_getc
4476    can use them to decide when to add otherwise blank lines to the history. */
4477
4478 /* The primary delimiter stack. */
4479 struct dstack dstack = {  (char *)NULL, 0, 0 };
4480
4481 /* A temporary delimiter stack to be used when decoding prompt strings.
4482    This is needed because command substitutions in prompt strings (e.g., PS2)
4483    can screw up the parser's quoting state. */
4484 static struct dstack temp_dstack = { (char *)NULL, 0, 0 };
4485
4486 /* Macro for accessing the top delimiter on the stack.  Returns the
4487    delimiter or zero if none. */
4488 #define current_delimiter(ds) \
4489   (ds.delimiter_depth ? ds.delimiters[ds.delimiter_depth - 1] : 0)
4490
4491 #define push_delimiter(ds, character) \
4492   do \
4493     { \
4494       if (ds.delimiter_depth + 2 > ds.delimiter_space) \
4495         ds.delimiters = (char *)xrealloc \
4496           (ds.delimiters, (ds.delimiter_space += 10) * sizeof (char)); \
4497       ds.delimiters[ds.delimiter_depth] = character; \
4498       ds.delimiter_depth++; \
4499     } \
4500   while (0)
4501
4502 #define pop_delimiter(ds)       ds.delimiter_depth--
4503
4504 /* Return the next shell input character.  This always reads characters
4505    from shell_input_line; when that line is exhausted, it is time to
4506    read the next line.  This is called by read_token when the shell is
4507    processing normal command input. */
4508
4509 /* This implements one-character lookahead/lookbehind across physical input
4510    lines, to avoid something being lost because it's pushed back with
4511    shell_ungetc when we're at the start of a line. */
4512 static int eol_ungetc_lookahead = 0;
4513
4514 static int
4515 shell_getc (remove_quoted_newline)
4516      int remove_quoted_newline;
4517 {
4518   register int i;
4519   int c, truncating;
4520   unsigned char uc;
4521
4522   QUIT;
4523
4524   if (sigwinch_received)
4525     {
4526       sigwinch_received = 0;
4527       get_new_window_size (0, (int *)0, (int *)0);
4528     }
4529       
4530   if (eol_ungetc_lookahead)
4531     {
4532       c = eol_ungetc_lookahead;
4533       eol_ungetc_lookahead = 0;
4534       return (c);
4535     }
4536
4537 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4538   /* If shell_input_line[shell_input_line_index] == 0, but there is
4539      something on the pushed list of strings, then we don't want to go
4540      off and get another line.  We let the code down below handle it. */
4541
4542   if (!shell_input_line || ((!shell_input_line[shell_input_line_index]) &&
4543                             (pushed_string_list == (STRING_SAVER *)NULL)))
4544 #else /* !ALIAS && !DPAREN_ARITHMETIC */
4545   if (!shell_input_line || !shell_input_line[shell_input_line_index])
4546 #endif /* !ALIAS && !DPAREN_ARITHMETIC */
4547     {
4548       line_number++;
4549
4550       /* Let's not let one really really long line blow up memory allocation */
4551       if (shell_input_line && shell_input_line_size >= 32768)
4552         {
4553           free (shell_input_line);
4554           shell_input_line = 0;
4555           shell_input_line_size = 0;
4556         }
4557
4558     restart_read:
4559
4560       /* Allow immediate exit if interrupted during input. */
4561       QUIT;
4562
4563       i = truncating = 0;
4564       shell_input_line_terminator = 0;
4565
4566       /* If the shell is interatctive, but not currently printing a prompt
4567          (interactive_shell && interactive == 0), we don't want to print
4568          notifies or cleanup the jobs -- we want to defer it until we do
4569          print the next prompt. */
4570       if (interactive_shell == 0 || SHOULD_PROMPT())
4571         {
4572 #if defined (JOB_CONTROL)
4573       /* This can cause a problem when reading a command as the result
4574          of a trap, when the trap is called from flush_child.  This call
4575          had better not cause jobs to disappear from the job table in
4576          that case, or we will have big trouble. */
4577           notify_and_cleanup ();
4578 #else /* !JOB_CONTROL */
4579           cleanup_dead_jobs ();
4580 #endif /* !JOB_CONTROL */
4581         }
4582
4583 #if defined (READLINE)
4584       if (no_line_editing && SHOULD_PROMPT())
4585 #else
4586       if (SHOULD_PROMPT())
4587 #endif
4588         print_prompt ();
4589
4590       if (bash_input.type == st_stream)
4591         clearerr (stdin);
4592
4593       while (1)
4594         {
4595           c = yy_getc ();
4596
4597           /* Allow immediate exit if interrupted during input. */
4598           QUIT;
4599
4600           if (c == '\0')
4601             {
4602 #if 0
4603               internal_warning ("shell_getc: ignored null byte in input");
4604 #endif
4605               continue;
4606             }
4607
4608           /* Theoretical overflow */
4609           /* If we can't put 256 bytes more into the buffer, allocate
4610              everything we can and fill it as full as we can. */
4611           /* XXX - we ignore rest of line using `truncating' flag */
4612           if (shell_input_line_size > (SIZE_MAX - 256))
4613             {
4614               size_t n;
4615
4616               n = SIZE_MAX - i; /* how much more can we put into the buffer? */
4617               if (n <= 2)       /* we have to save 1 for the newline added below */
4618                 {
4619                   if (truncating == 0)
4620                     internal_warning("shell_getc: shell_input_line_size (%zu) exceeds SIZE_MAX (%llu): line truncated", shell_input_line_size, SIZE_MAX);
4621                   shell_input_line[i] = '\0';
4622                   truncating = 1;
4623                 }
4624               if (shell_input_line_size < SIZE_MAX)
4625                 {
4626                   shell_input_line_size = SIZE_MAX;
4627                   shell_input_line = xrealloc (shell_input_line, shell_input_line_size);
4628                 }
4629             }
4630           else
4631             RESIZE_MALLOCED_BUFFER (shell_input_line, i, 2, shell_input_line_size, 256);
4632
4633           if (c == EOF)
4634             {
4635               if (bash_input.type == st_stream)
4636                 clearerr (stdin);
4637
4638               if (i == 0)
4639                 shell_input_line_terminator = EOF;
4640
4641               shell_input_line[i] = '\0';
4642               break;
4643             }
4644
4645           if (truncating == 0 || c == '\n')
4646             shell_input_line[i++] = c;
4647
4648           if (c == '\n')
4649             {
4650               shell_input_line[--i] = '\0';
4651               current_command_line_count++;
4652               break;
4653             }
4654         }
4655
4656       shell_input_line_index = 0;
4657       shell_input_line_len = i;         /* == strlen (shell_input_line) */
4658
4659       set_line_mbstate ();
4660
4661 #if defined (HISTORY)
4662       if (remember_on_history && shell_input_line && shell_input_line[0])
4663         {
4664           char *expansions;
4665 #  if defined (BANG_HISTORY)
4666           int old_hist;
4667
4668           /* If the current delimiter is a single quote, we should not be
4669              performing history expansion, even if we're on a different
4670              line from the original single quote. */
4671           old_hist = history_expansion_inhibited;
4672           if (current_delimiter (dstack) == '\'')
4673             history_expansion_inhibited = 1;
4674 #  endif
4675           expansions = pre_process_line (shell_input_line, 1, 1);
4676 #  if defined (BANG_HISTORY)
4677           history_expansion_inhibited = old_hist;
4678 #  endif
4679           if (expansions != shell_input_line)
4680             {
4681               free (shell_input_line);
4682               shell_input_line = expansions;
4683               shell_input_line_len = shell_input_line ?
4684                                         strlen (shell_input_line) : 0;
4685               if (shell_input_line_len == 0)
4686                 current_command_line_count--;
4687
4688               /* We have to force the xrealloc below because we don't know
4689                  the true allocated size of shell_input_line anymore. */
4690               shell_input_line_size = shell_input_line_len;
4691
4692               set_line_mbstate ();
4693             }
4694         }
4695       /* Try to do something intelligent with blank lines encountered while
4696          entering multi-line commands.  XXX - this is grotesque */
4697       else if (remember_on_history && shell_input_line &&
4698                shell_input_line[0] == '\0' &&
4699                current_command_line_count > 1)
4700         {
4701           if (current_delimiter (dstack))
4702             /* We know shell_input_line[0] == 0 and we're reading some sort of
4703                quoted string.  This means we've got a line consisting of only
4704                a newline in a quoted string.  We want to make sure this line
4705                gets added to the history. */
4706             maybe_add_history (shell_input_line);
4707           else
4708             {
4709               char *hdcs;
4710               hdcs = history_delimiting_chars (shell_input_line);
4711               if (hdcs && hdcs[0] == ';')
4712                 maybe_add_history (shell_input_line);
4713             }
4714         }
4715
4716 #endif /* HISTORY */
4717
4718       if (shell_input_line)
4719         {
4720           /* Lines that signify the end of the shell's input should not be
4721              echoed.  We should not echo lines while parsing command
4722              substitutions with recursive calls into the parsing engine; those
4723              should only be echoed once when we read the word.  That is the
4724              reason for the test against shell_eof_token, which is set to a
4725              right paren when parsing the contents of command substitutions. */
4726           if (echo_input_at_read && (shell_input_line[0] ||
4727                                        shell_input_line_terminator != EOF) &&
4728                                      shell_eof_token == 0)
4729             fprintf (stderr, "%s\n", shell_input_line);
4730         }
4731       else
4732         {
4733           shell_input_line_size = 0;
4734           prompt_string_pointer = &current_prompt_string;
4735           if (SHOULD_PROMPT ())
4736             prompt_again ();
4737           goto restart_read;
4738         }
4739
4740       /* Add the newline to the end of this string, iff the string does
4741          not already end in an EOF character.  */
4742       if (shell_input_line_terminator != EOF)
4743         {
4744           if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
4745             shell_input_line = (char *)xrealloc (shell_input_line,
4746                                         1 + (shell_input_line_size += 2));
4747
4748           shell_input_line[shell_input_line_len] = '\n';
4749           shell_input_line[shell_input_line_len + 1] = '\0';
4750
4751           set_line_mbstate ();
4752         }
4753     }
4754
4755 next_alias_char:
4756   uc = shell_input_line[shell_input_line_index];
4757
4758   if (uc)
4759     shell_input_line_index++;
4760
4761 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4762   /* If UC is NULL, we have reached the end of the current input string.  If
4763      pushed_string_list is non-empty, it's time to pop to the previous string
4764      because we have fully consumed the result of the last alias expansion.
4765      Do it transparently; just return the next character of the string popped
4766      to. */
4767   /* If pushed_string_list != 0 but pushed_string_list->expander == 0 (not
4768      currently tested) and the flags value is not PSH_SOURCE, we are not
4769      parsing an alias, we have just saved one (push_string, when called by
4770      the parse_dparen code) In this case, just go on as well.  The PSH_SOURCE
4771      case is handled below. */
4772 pop_alias:
4773   if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE)
4774     {
4775       pop_string ();
4776       uc = shell_input_line[shell_input_line_index];
4777       if (uc)
4778         shell_input_line_index++;
4779     }
4780 #endif /* ALIAS || DPAREN_ARITHMETIC */
4781
4782   if MBTEST(uc == '\\' && remove_quoted_newline && shell_input_line[shell_input_line_index] == '\n')
4783     {
4784         if (SHOULD_PROMPT ())
4785           prompt_again ();
4786         line_number++;
4787         /* What do we do here if we're expanding an alias whose definition
4788            includes an escaped newline?  If that's the last character in the
4789            alias expansion, we just pop the pushed string list (recall that
4790            we inhibit the appending of a space in mk_alexpansion() if newline
4791            is the last character).  If it's not the last character, we need
4792            to consume the quoted newline and move to the next character in
4793            the expansion. */
4794 #if defined (ALIAS)
4795         if (expanding_alias () && shell_input_line[shell_input_line_index+1] == '\0')
4796           {
4797             uc = 0;
4798             goto pop_alias;
4799           }
4800         else if (expanding_alias () && shell_input_line[shell_input_line_index+1] != '\0')
4801           {
4802             shell_input_line_index++;   /* skip newline */
4803             goto next_alias_char;       /* and get next character */
4804           }
4805         else
4806 #endif 
4807           goto restart_read;
4808     }
4809
4810   if (uc == 0 && shell_input_line_terminator == EOF)
4811     return ((shell_input_line_index != 0) ? '\n' : EOF);
4812
4813 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
4814   /* We already know that we are not parsing an alias expansion because of the
4815      check for expanding_alias() above.  This knows how parse_and_execute
4816      handles switching to st_string input while an alias is being expanded,
4817      hence the check for pushed_string_list without pushed_string_list->expander
4818      and the check for PSH_SOURCE as pushed_string_list->flags.
4819      parse_and_execute and parse_string both change the input type to st_string
4820      and place the string to be parsed and executed into location.string, so
4821      we should not stop reading that until the pointer is '\0'.
4822      The check for shell_input_line_terminator may be superfluous.
4823
4824      This solves the problem of `.' inside a multi-line alias with embedded
4825      newlines executing things out of order. */
4826   if (uc == 0 && bash_input.type == st_string && *bash_input.location.string &&
4827       pushed_string_list && pushed_string_list->flags == PSH_SOURCE &&
4828       shell_input_line_terminator == 0)
4829     {
4830       shell_input_line_index = 0;
4831       goto restart_read;
4832     }
4833 #endif
4834
4835   return (uc);
4836 }
4837
4838 /* Put C back into the input for the shell.  This might need changes for
4839    HANDLE_MULTIBYTE around EOLs.  Since we (currently) never push back a
4840    character different than we read, shell_input_line_property doesn't need
4841    to change when manipulating shell_input_line.  The define for
4842    last_shell_getc_is_singlebyte should take care of it, though. */
4843 static void
4844 shell_ungetc (c)
4845      int c;
4846 {
4847   if (shell_input_line && shell_input_line_index)
4848     shell_input_line[--shell_input_line_index] = c;
4849   else
4850     eol_ungetc_lookahead = c;
4851 }
4852
4853 char *
4854 parser_remaining_input ()
4855 {
4856   if (shell_input_line == 0)
4857     return 0;
4858   if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
4859     return '\0';        /* XXX */
4860   return (shell_input_line + shell_input_line_index);
4861 }
4862
4863 #ifdef INCLUDE_UNUSED
4864 /* Back the input pointer up by one, effectively `ungetting' a character. */
4865 static void
4866 shell_ungetchar ()
4867 {
4868   if (shell_input_line && shell_input_line_index)
4869     shell_input_line_index--;
4870 }
4871 #endif
4872
4873 /* Discard input until CHARACTER is seen, then push that character back
4874    onto the input stream. */
4875 static void
4876 discard_until (character)
4877      int character;
4878 {
4879   int c;
4880
4881   while ((c = shell_getc (0)) != EOF && c != character)
4882     ;
4883
4884   if (c != EOF)
4885     shell_ungetc (c);
4886 }
4887
4888 void
4889 execute_variable_command (command, vname)
4890      char *command, *vname;
4891 {
4892   char *last_lastarg;
4893   sh_parser_state_t ps;
4894
4895   save_parser_state (&ps);
4896   last_lastarg = get_string_value ("_");
4897   if (last_lastarg)
4898     last_lastarg = savestring (last_lastarg);
4899
4900   parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST);
4901
4902   restore_parser_state (&ps);
4903   bind_variable ("_", last_lastarg, 0);
4904   FREE (last_lastarg);
4905
4906   if (token_to_read == '\n')    /* reset_parser was called */
4907     token_to_read = 0;
4908 }
4909
4910 /* Place to remember the token.  We try to keep the buffer
4911    at a reasonable size, but it can grow. */
4912 static char *token = (char *)NULL;
4913
4914 /* Current size of the token buffer. */
4915 static int token_buffer_size;
4916
4917 /* Command to read_token () explaining what we want it to do. */
4918 #define READ 0
4919 #define RESET 1
4920 #define prompt_is_ps1 \
4921       (!prompt_string_pointer || prompt_string_pointer == &ps1_prompt)
4922
4923 /* Function for yyparse to call.  yylex keeps track of
4924    the last two tokens read, and calls read_token.  */
4925 static int
4926 yylex ()
4927 {
4928   if (interactive && (current_token == 0 || current_token == '\n'))
4929     {
4930       /* Before we print a prompt, we might have to check mailboxes.
4931          We do this only if it is time to do so. Notice that only here
4932          is the mail alarm reset; nothing takes place in check_mail ()
4933          except the checking of mail.  Please don't change this. */
4934       if (prompt_is_ps1 && parse_and_execute_level == 0 && time_to_check_mail ())
4935         {
4936           check_mail ();
4937           reset_mail_timer ();
4938         }
4939
4940       /* Avoid printing a prompt if we're not going to read anything, e.g.
4941          after resetting the parser with read_token (RESET). */
4942       if (token_to_read == 0 && SHOULD_PROMPT ())
4943         prompt_again ();
4944     }
4945
4946   two_tokens_ago = token_before_that;
4947   token_before_that = last_read_token;
4948   last_read_token = current_token;
4949   current_token = read_token (READ);
4950
4951   if ((parser_state & PST_EOFTOKEN) && current_token == shell_eof_token)
4952     {
4953       current_token = yacc_EOF;
4954       if (bash_input.type == st_string)
4955         rewind_input_string ();
4956     }
4957   parser_state &= ~PST_EOFTOKEN;
4958
4959   return (current_token);
4960 }
4961
4962 /* When non-zero, we have read the required tokens
4963    which allow ESAC to be the next one read. */
4964 static int esacs_needed_count;
4965
4966 static void
4967 push_heredoc (r)
4968      REDIRECT *r;
4969 {
4970   if (need_here_doc >= HEREDOC_MAX)
4971     {
4972       last_command_exit_value = EX_BADUSAGE;
4973       need_here_doc = 0;
4974       report_syntax_error (_("maximum here-document count exceeded"));
4975       reset_parser ();
4976       exit_shell (last_command_exit_value);
4977     }
4978   redir_stack[need_here_doc++] = r;
4979 }
4980
4981 void
4982 gather_here_documents ()
4983 {
4984   int r;
4985
4986   r = 0;
4987   while (need_here_doc > 0)
4988     {
4989       parser_state |= PST_HEREDOC;
4990       make_here_document (redir_stack[r++], line_number);
4991       parser_state &= ~PST_HEREDOC;
4992       need_here_doc--;
4993     }
4994 }
4995
4996 /* When non-zero, an open-brace used to create a group is awaiting a close
4997    brace partner. */
4998 static int open_brace_count;
4999
5000 #define command_token_position(token) \
5001   (((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
5002    ((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
5003
5004 #define assignment_acceptable(token) \
5005   (command_token_position(token) && ((parser_state & PST_CASEPAT) == 0))
5006
5007 /* Check to see if TOKEN is a reserved word and return the token
5008    value if it is. */
5009 #define CHECK_FOR_RESERVED_WORD(tok) \
5010   do { \
5011     if (!dollar_present && !quoted && \
5012         reserved_word_acceptable (last_read_token)) \
5013       { \
5014         int i; \
5015         for (i = 0; word_token_alist[i].word != (char *)NULL; i++) \
5016           if (STREQ (tok, word_token_alist[i].word)) \
5017             { \
5018               if ((parser_state & PST_CASEPAT) && (word_token_alist[i].token != ESAC)) \
5019                 break; \
5020               if (word_token_alist[i].token == TIME && time_command_acceptable () == 0) \
5021                 break; \
5022               if (word_token_alist[i].token == ESAC) \
5023                 parser_state &= ~(PST_CASEPAT|PST_CASESTMT); \
5024               else if (word_token_alist[i].token == CASE) \
5025                 parser_state |= PST_CASESTMT; \
5026               else if (word_token_alist[i].token == COND_END) \
5027                 parser_state &= ~(PST_CONDCMD|PST_CONDEXPR); \
5028               else if (word_token_alist[i].token == COND_START) \
5029                 parser_state |= PST_CONDCMD; \
5030               else if (word_token_alist[i].token == '{') \
5031                 open_brace_count++; \
5032               else if (word_token_alist[i].token == '}' && open_brace_count) \
5033                 open_brace_count--; \
5034               return (word_token_alist[i].token); \
5035             } \
5036       } \
5037   } while (0)
5038
5039 #if defined (ALIAS)
5040
5041     /* OK, we have a token.  Let's try to alias expand it, if (and only if)
5042        it's eligible.
5043
5044        It is eligible for expansion if EXPAND_ALIASES is set, and
5045        the token is unquoted and the last token read was a command
5046        separator (or expand_next_token is set), and we are currently
5047        processing an alias (pushed_string_list is non-empty) and this
5048        token is not the same as the current or any previously
5049        processed alias.
5050
5051        Special cases that disqualify:
5052          In a pattern list in a case statement (parser_state & PST_CASEPAT). */
5053
5054 static char *
5055 mk_alexpansion (s)
5056      char *s;
5057 {
5058   int l;
5059   char *r;
5060
5061   l = strlen (s);
5062   r = xmalloc (l + 2);
5063   strcpy (r, s);
5064   /* If the last character in the alias is a newline, don't add a trailing
5065      space to the expansion.  Works with shell_getc above. */
5066   if (r[l - 1] != ' ' && r[l - 1] != '\n')
5067     r[l++] = ' ';
5068   r[l] = '\0';
5069   return r;
5070 }
5071
5072 static int
5073 alias_expand_token (tokstr)
5074      char *tokstr;
5075 {
5076   char *expanded;
5077   alias_t *ap;
5078
5079   if (((parser_state & PST_ALEXPNEXT) || command_token_position (last_read_token)) &&
5080         (parser_state & PST_CASEPAT) == 0)
5081     {
5082       ap = find_alias (tokstr);
5083
5084       /* Currently expanding this token. */
5085       if (ap && (ap->flags & AL_BEINGEXPANDED))
5086         return (NO_EXPANSION);
5087
5088       /* mk_alexpansion puts an extra space on the end of the alias expansion,
5089          so the lookahead by the parser works right.  If this gets changed,
5090          make sure the code in shell_getc that deals with reaching the end of
5091          an expanded alias is changed with it. */
5092       expanded = ap ? mk_alexpansion (ap->value) : (char *)NULL;
5093
5094       if (expanded)
5095         {
5096           push_string (expanded, ap->flags & AL_EXPANDNEXT, ap);
5097           return (RE_READ_TOKEN);
5098         }
5099       else
5100         /* This is an eligible token that does not have an expansion. */
5101         return (NO_EXPANSION);
5102     }
5103   return (NO_EXPANSION);
5104 }
5105 #endif /* ALIAS */
5106
5107 static int
5108 time_command_acceptable ()
5109 {
5110 #if defined (COMMAND_TIMING)
5111   int i;
5112
5113   if (posixly_correct && shell_compatibility_level > 41)
5114     {
5115       /* Quick check of the rest of the line to find the next token.  If it
5116          begins with a `-', Posix says to not return `time' as the token.
5117          This was interp 267. */
5118       i = shell_input_line_index;
5119       while (i < shell_input_line_len && (shell_input_line[i] == ' ' || shell_input_line[i] == '\t'))
5120         i++;
5121       if (shell_input_line[i] == '-')
5122         return 0;
5123     }
5124
5125   switch (last_read_token)
5126     {
5127     case 0:
5128     case ';':
5129     case '\n':
5130     case AND_AND:
5131     case OR_OR:
5132     case '&':
5133     case DO:
5134     case THEN:
5135     case ELSE:
5136     case '{':           /* } */
5137     case '(':           /* ) */
5138     case BANG:          /* ! time pipeline */
5139     case TIME:          /* time time pipeline */
5140     case TIMEOPT:       /* time -p time pipeline */
5141     case TIMEIGN:       /* time -p -- ... */
5142       return 1;
5143     default:
5144       return 0;
5145     }
5146 #else
5147   return 0;
5148 #endif /* COMMAND_TIMING */
5149 }
5150
5151 /* Handle special cases of token recognition:
5152         IN is recognized if the last token was WORD and the token
5153         before that was FOR or CASE or SELECT.
5154
5155         DO is recognized if the last token was WORD and the token
5156         before that was FOR or SELECT.
5157
5158         ESAC is recognized if the last token caused `esacs_needed_count'
5159         to be set
5160
5161         `{' is recognized if the last token as WORD and the token
5162         before that was FUNCTION, or if we just parsed an arithmetic
5163         `for' command.
5164
5165         `}' is recognized if there is an unclosed `{' present.
5166
5167         `-p' is returned as TIMEOPT if the last read token was TIME.
5168         `--' is returned as TIMEIGN if the last read token was TIMEOPT.
5169
5170         ']]' is returned as COND_END if the parser is currently parsing
5171         a conditional expression ((parser_state & PST_CONDEXPR) != 0)
5172
5173         `time' is returned as TIME if and only if it is immediately
5174         preceded by one of `;', `\n', `||', `&&', or `&'.
5175 */
5176
5177 static int
5178 special_case_tokens (tokstr)
5179      char *tokstr;
5180 {
5181   if ((last_read_token == WORD) &&
5182 #if defined (SELECT_COMMAND)
5183       ((token_before_that == FOR) || (token_before_that == CASE) || (token_before_that == SELECT)) &&
5184 #else
5185       ((token_before_that == FOR) || (token_before_that == CASE)) &&
5186 #endif
5187       (tokstr[0] == 'i' && tokstr[1] == 'n' && tokstr[2] == 0))
5188     {
5189       if (token_before_that == CASE)
5190         {
5191           parser_state |= PST_CASEPAT;
5192           esacs_needed_count++;
5193         }
5194       return (IN);
5195     }
5196
5197   if (last_read_token == WORD &&
5198 #if defined (SELECT_COMMAND)
5199       (token_before_that == FOR || token_before_that == SELECT) &&
5200 #else
5201       (token_before_that == FOR) &&
5202 #endif
5203       (tokstr[0] == 'd' && tokstr[1] == 'o' && tokstr[2] == '\0'))
5204     return (DO);
5205
5206   /* Ditto for ESAC in the CASE case.
5207      Specifically, this handles "case word in esac", which is a legal
5208      construct, certainly because someone will pass an empty arg to the
5209      case construct, and we don't want it to barf.  Of course, we should
5210      insist that the case construct has at least one pattern in it, but
5211      the designers disagree. */
5212   if (esacs_needed_count)
5213     {
5214       esacs_needed_count--;
5215       if (STREQ (tokstr, "esac"))
5216         {
5217           parser_state &= ~PST_CASEPAT;
5218           return (ESAC);
5219         }
5220     }
5221
5222   /* The start of a shell function definition. */
5223   if (parser_state & PST_ALLOWOPNBRC)
5224     {
5225       parser_state &= ~PST_ALLOWOPNBRC;
5226       if (tokstr[0] == '{' && tokstr[1] == '\0')                /* } */
5227         {
5228           open_brace_count++;
5229           function_bstart = line_number;
5230           return ('{');                                 /* } */
5231         }
5232     }
5233
5234   /* We allow a `do' after a for ((...)) without an intervening
5235      list_terminator */
5236   if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == 'd' && tokstr[1] == 'o' && !tokstr[2])
5237     return (DO);
5238   if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == '{' && tokstr[1] == '\0')      /* } */
5239     {
5240       open_brace_count++;
5241       return ('{');                     /* } */
5242     }
5243
5244   if (open_brace_count && reserved_word_acceptable (last_read_token) && tokstr[0] == '}' && !tokstr[1])
5245     {
5246       open_brace_count--;               /* { */
5247       return ('}');
5248     }
5249
5250 #if defined (COMMAND_TIMING)
5251   /* Handle -p after `time'. */
5252   if (last_read_token == TIME && tokstr[0] == '-' && tokstr[1] == 'p' && !tokstr[2])
5253     return (TIMEOPT);
5254   /* Handle -- after `time -p'. */
5255   if (last_read_token == TIMEOPT && tokstr[0] == '-' && tokstr[1] == '-' && !tokstr[2])
5256     return (TIMEIGN);
5257 #endif
5258
5259 #if defined (COND_COMMAND) /* [[ */
5260   if ((parser_state & PST_CONDEXPR) && tokstr[0] == ']' && tokstr[1] == ']' && tokstr[2] == '\0')
5261     return (COND_END);
5262 #endif
5263
5264   return (-1);
5265 }
5266
5267 /* Called from shell.c when Control-C is typed at top level.  Or
5268    by the error rule at top level. */
5269 void
5270 reset_parser ()
5271 {
5272   dstack.delimiter_depth = 0;   /* No delimiters found so far. */
5273   open_brace_count = 0;
5274
5275 #if defined (EXTENDED_GLOB)
5276   /* Reset to global value of extended glob */
5277   if (parser_state & PST_EXTPAT)
5278     extended_glob = global_extglob;
5279 #endif
5280
5281   parser_state = 0;
5282
5283 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
5284   if (pushed_string_list)
5285     free_string_list ();
5286 #endif /* ALIAS || DPAREN_ARITHMETIC */
5287
5288   if (shell_input_line)
5289     {
5290       free (shell_input_line);
5291       shell_input_line = (char *)NULL;
5292       shell_input_line_size = shell_input_line_index = 0;
5293     }
5294
5295   FREE (word_desc_to_read);
5296   word_desc_to_read = (WORD_DESC *)NULL;
5297
5298   eol_ungetc_lookahead = 0;
5299
5300   current_token = '\n';         /* XXX */
5301   last_read_token = '\n';
5302   token_to_read = '\n';
5303 }
5304
5305 /* Read the next token.  Command can be READ (normal operation) or
5306    RESET (to normalize state). */
5307 static int
5308 read_token (command)
5309      int command;
5310 {
5311   int character;                /* Current character. */
5312   int peek_char;                /* Temporary look-ahead character. */
5313   int result;                   /* The thing to return. */
5314
5315   if (command == RESET)
5316     {
5317       reset_parser ();
5318       return ('\n');
5319     }
5320
5321   if (token_to_read)
5322     {
5323       result = token_to_read;
5324       if (token_to_read == WORD || token_to_read == ASSIGNMENT_WORD)
5325         {
5326           yylval.word = word_desc_to_read;
5327           word_desc_to_read = (WORD_DESC *)NULL;
5328         }
5329       token_to_read = 0;
5330       return (result);
5331     }
5332
5333 #if defined (COND_COMMAND)
5334   if ((parser_state & (PST_CONDCMD|PST_CONDEXPR)) == PST_CONDCMD)
5335     {
5336       cond_lineno = line_number;
5337       parser_state |= PST_CONDEXPR;
5338       yylval.command = parse_cond_command ();
5339       if (cond_token != COND_END)
5340         {
5341           cond_error ();
5342           return (-1);
5343         }
5344       token_to_read = COND_END;
5345       parser_state &= ~(PST_CONDEXPR|PST_CONDCMD);
5346       return (COND_CMD);
5347     }
5348 #endif
5349
5350 #if defined (ALIAS)
5351   /* This is a place to jump back to once we have successfully expanded a
5352      token with an alias and pushed the string with push_string () */
5353  re_read_token:
5354 #endif /* ALIAS */
5355
5356   /* Read a single word from input.  Start by skipping blanks. */
5357   while ((character = shell_getc (1)) != EOF && shellblank (character))
5358     ;
5359
5360   if (character == EOF)
5361     {
5362       EOF_Reached = 1;
5363       return (yacc_EOF);
5364     }
5365
5366   if MBTEST(character == '#' && (!interactive || interactive_comments))
5367     {
5368       /* A comment.  Discard until EOL or EOF, and then return a newline. */
5369       discard_until ('\n');
5370       shell_getc (0);
5371       character = '\n'; /* this will take the next if statement and return. */
5372     }
5373
5374   if (character == '\n')
5375     {
5376       /* If we're about to return an unquoted newline, we can go and collect
5377          the text of any pending here document. */
5378       if (need_here_doc)
5379         gather_here_documents ();
5380
5381 #if defined (ALIAS)
5382       parser_state &= ~PST_ALEXPNEXT;
5383 #endif /* ALIAS */
5384
5385       parser_state &= ~PST_ASSIGNOK;
5386
5387       return (character);
5388     }
5389
5390   if (parser_state & PST_REGEXP)
5391     goto tokword;
5392
5393   /* Shell meta-characters. */
5394   if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
5395     {
5396 #if defined (ALIAS)
5397       /* Turn off alias tokenization iff this character sequence would
5398          not leave us ready to read a command. */
5399       if (character == '<' || character == '>')
5400         parser_state &= ~PST_ALEXPNEXT;
5401 #endif /* ALIAS */
5402
5403       parser_state &= ~PST_ASSIGNOK;
5404
5405       peek_char = shell_getc (1);
5406       if (character == peek_char)
5407         {
5408           switch (character)
5409             {
5410             case '<':
5411               /* If '<' then we could be at "<<" or at "<<-".  We have to
5412                  look ahead one more character. */
5413               peek_char = shell_getc (1);
5414               if MBTEST(peek_char == '-')
5415                 return (LESS_LESS_MINUS);
5416               else if MBTEST(peek_char == '<')
5417                 return (LESS_LESS_LESS);
5418               else
5419                 {
5420                   shell_ungetc (peek_char);
5421                   return (LESS_LESS);
5422                 }
5423
5424             case '>':
5425               return (GREATER_GREATER);
5426
5427             case ';':
5428               parser_state |= PST_CASEPAT;
5429 #if defined (ALIAS)
5430               parser_state &= ~PST_ALEXPNEXT;
5431 #endif /* ALIAS */
5432
5433               peek_char = shell_getc (1);
5434               if MBTEST(peek_char == '&')
5435                 return (SEMI_SEMI_AND);
5436               else
5437                 {
5438                   shell_ungetc (peek_char);
5439                   return (SEMI_SEMI);
5440                 }
5441
5442             case '&':
5443               return (AND_AND);
5444
5445             case '|':
5446               return (OR_OR);
5447
5448 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
5449             case '(':           /* ) */
5450               result = parse_dparen (character);
5451               if (result == -2)
5452                 break;
5453               else
5454                 return result;
5455 #endif
5456             }
5457         }
5458       else if MBTEST(character == '<' && peek_char == '&')
5459         return (LESS_AND);
5460       else if MBTEST(character == '>' && peek_char == '&')
5461         return (GREATER_AND);
5462       else if MBTEST(character == '<' && peek_char == '>')
5463         return (LESS_GREATER);
5464       else if MBTEST(character == '>' && peek_char == '|')
5465         return (GREATER_BAR);
5466       else if MBTEST(character == '&' && peek_char == '>')
5467         {
5468           peek_char = shell_getc (1);
5469           if MBTEST(peek_char == '>')
5470             return (AND_GREATER_GREATER);
5471           else
5472             {
5473               shell_ungetc (peek_char);
5474               return (AND_GREATER);
5475             }
5476         }
5477       else if MBTEST(character == '|' && peek_char == '&')
5478         return (BAR_AND);
5479       else if MBTEST(character == ';' && peek_char == '&')
5480         {
5481           parser_state |= PST_CASEPAT;
5482 #if defined (ALIAS)
5483           parser_state &= ~PST_ALEXPNEXT;
5484 #endif /* ALIAS */
5485           return (SEMI_AND);
5486         }
5487
5488       shell_ungetc (peek_char);
5489
5490       /* If we look like we are reading the start of a function
5491          definition, then let the reader know about it so that
5492          we will do the right thing with `{'. */
5493       if MBTEST(character == ')' && last_read_token == '(' && token_before_that == WORD)
5494         {
5495           parser_state |= PST_ALLOWOPNBRC;
5496 #if defined (ALIAS)
5497           parser_state &= ~PST_ALEXPNEXT;
5498 #endif /* ALIAS */
5499           function_dstart = line_number;
5500         }
5501
5502       /* case pattern lists may be preceded by an optional left paren.  If
5503          we're not trying to parse a case pattern list, the left paren
5504          indicates a subshell. */
5505       if MBTEST(character == '(' && (parser_state & PST_CASEPAT) == 0) /* ) */
5506         parser_state |= PST_SUBSHELL;
5507       /*(*/
5508       else if MBTEST((parser_state & PST_CASEPAT) && character == ')')
5509         parser_state &= ~PST_CASEPAT;
5510       /*(*/
5511       else if MBTEST((parser_state & PST_SUBSHELL) && character == ')')
5512         parser_state &= ~PST_SUBSHELL;
5513
5514 #if defined (PROCESS_SUBSTITUTION)
5515       /* Check for the constructs which introduce process substitution.
5516          Shells running in `posix mode' don't do process substitution. */
5517       if MBTEST(posixly_correct || ((character != '>' && character != '<') || peek_char != '(')) /*)*/
5518 #endif /* PROCESS_SUBSTITUTION */
5519         return (character);
5520     }
5521
5522   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */
5523   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5524     return (character);
5525
5526 tokword:
5527   /* Okay, if we got this far, we have to read a word.  Read one,
5528      and then check it against the known ones. */
5529   result = read_token_word (character);
5530 #if defined (ALIAS)
5531   if (result == RE_READ_TOKEN)
5532     goto re_read_token;
5533 #endif
5534   return result;
5535 }
5536
5537 /*
5538  * Match a $(...) or other grouping construct.  This has to handle embedded
5539  * quoted strings ('', ``, "") and nested constructs.  It also must handle
5540  * reprompting the user, if necessary, after reading a newline, and returning
5541  * correct error values if it reads EOF.
5542  */
5543 #define P_FIRSTCLOSE    0x0001
5544 #define P_ALLOWESC      0x0002
5545 #define P_DQUOTE        0x0004
5546 #define P_COMMAND       0x0008  /* parsing a command, so look for comments */
5547 #define P_BACKQUOTE     0x0010  /* parsing a backquoted command substitution */
5548 #define P_ARRAYSUB      0x0020  /* parsing a [...] array subscript for assignment */
5549 #define P_DOLBRACE      0x0040  /* parsing a ${...} construct */
5550
5551 /* Lexical state while parsing a grouping construct or $(...). */
5552 #define LEX_WASDOL      0x001
5553 #define LEX_CKCOMMENT   0x002
5554 #define LEX_INCOMMENT   0x004
5555 #define LEX_PASSNEXT    0x008
5556 #define LEX_RESWDOK     0x010
5557 #define LEX_CKCASE      0x020
5558 #define LEX_INCASE      0x040
5559 #define LEX_INHEREDOC   0x080
5560 #define LEX_HEREDELIM   0x100           /* reading here-doc delimiter */
5561 #define LEX_STRIPDOC    0x200           /* <<- strip tabs from here doc delim */
5562 #define LEX_INWORD      0x400
5563
5564 #define COMSUB_META(ch)         ((ch) == ';' || (ch) == '&' || (ch) == '|')
5565
5566 #define CHECK_NESTRET_ERROR() \
5567   do { \
5568     if (nestret == &matched_pair_error) \
5569       { \
5570         free (ret); \
5571         return &matched_pair_error; \
5572       } \
5573   } while (0)
5574
5575 #define APPEND_NESTRET() \
5576   do { \
5577     if (nestlen) \
5578       { \
5579         RESIZE_MALLOCED_BUFFER (ret, retind, nestlen, retsize, 64); \
5580         strcpy (ret + retind, nestret); \
5581         retind += nestlen; \
5582       } \
5583   } while (0)
5584
5585 static char matched_pair_error;
5586
5587 static char *
5588 parse_matched_pair (qc, open, close, lenp, flags)
5589      int qc;    /* `"' if this construct is within double quotes */
5590      int open, close;
5591      int *lenp, flags;
5592 {
5593   int count, ch, tflags;
5594   int nestlen, ttranslen, start_lineno;
5595   char *ret, *nestret, *ttrans;
5596   int retind, retsize, rflags;
5597   int dolbrace_state;
5598
5599   dolbrace_state = (flags & P_DOLBRACE) ? DOLBRACE_PARAM : 0;
5600
5601 /*itrace("parse_matched_pair[%d]: open = %c close = %c flags = %d", line_number, open, close, flags);*/
5602   count = 1;
5603   tflags = 0;
5604
5605   if ((flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
5606     tflags |= LEX_CKCOMMENT;
5607
5608   /* RFLAGS is the set of flags we want to pass to recursive calls. */
5609   rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE);
5610
5611   ret = (char *)xmalloc (retsize = 64);
5612   retind = 0;
5613
5614   start_lineno = line_number;
5615   while (count)
5616     {
5617       ch = shell_getc (qc != '\'' && (tflags & (LEX_PASSNEXT)) == 0);
5618
5619       if (ch == EOF)
5620         {
5621           free (ret);
5622           parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
5623           EOF_Reached = 1;      /* XXX */
5624           return (&matched_pair_error);
5625         }
5626
5627       /* Possible reprompting. */
5628       if (ch == '\n' && SHOULD_PROMPT ())
5629         prompt_again ();
5630
5631       /* Don't bother counting parens or doing anything else if in a comment
5632          or part of a case statement */
5633       if (tflags & LEX_INCOMMENT)
5634         {
5635           /* Add this character. */
5636           RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
5637           ret[retind++] = ch;
5638
5639           if (ch == '\n')
5640             tflags &= ~LEX_INCOMMENT;
5641
5642           continue;
5643         }
5644
5645       /* Not exactly right yet, should handle shell metacharacters, too.  If
5646          any changes are made to this test, make analogous changes to subst.c:
5647          extract_delimited_string(). */
5648       else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1])))
5649         tflags |= LEX_INCOMMENT;
5650
5651       if (tflags & LEX_PASSNEXT)                /* last char was backslash */
5652         {
5653           tflags &= ~LEX_PASSNEXT;
5654           if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */
5655             {
5656               if (retind > 0)
5657                 retind--;       /* swallow previously-added backslash */
5658               continue;
5659             }
5660
5661           RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
5662           if MBTEST(ch == CTLESC)
5663             ret[retind++] = CTLESC;
5664           ret[retind++] = ch;
5665           continue;
5666         }
5667       /* If we're reparsing the input (e.g., from parse_string_to_word_list),
5668          we've already prepended CTLESC to single-quoted results of $'...'.
5669          We may want to do this for other CTLESC-quoted characters in
5670          reparse, too. */
5671       else if MBTEST((parser_state & PST_REPARSE) && open == '\'' && (ch == CTLESC || ch == CTLNUL))
5672         {
5673           RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
5674           ret[retind++] = ch;
5675           continue;
5676         }
5677       else if MBTEST(ch == CTLESC || ch == CTLNUL)      /* special shell escapes */
5678         {
5679           RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
5680           ret[retind++] = CTLESC;
5681           ret[retind++] = ch;
5682           continue;
5683         }
5684       else if MBTEST(ch == close)               /* ending delimiter */
5685         count--;
5686       /* handle nested ${...} specially. */
5687       else if MBTEST(open != close && (tflags & LEX_WASDOL) && open == '{' && ch == open) /* } */
5688         count++;
5689       else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && ch == open)       /* nested begin */
5690         count++;
5691
5692       /* Add this character. */
5693       RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
5694       ret[retind++] = ch;
5695
5696       /* If we just read the ending character, don't bother continuing. */
5697       if (count == 0)
5698         break;
5699
5700       if (open == '\'')                 /* '' inside grouping construct */
5701         {
5702           if MBTEST((flags & P_ALLOWESC) && ch == '\\')
5703             tflags |= LEX_PASSNEXT;
5704           continue;
5705         }
5706
5707       if MBTEST(ch == '\\')                     /* backslashes */
5708         tflags |= LEX_PASSNEXT;
5709
5710       /* Based on which dolstate is currently in (param, op, or word),
5711          decide what the op is.  We're really only concerned if it's % or
5712          #, so we can turn on a flag that says whether or not we should
5713          treat single quotes as special when inside a double-quoted
5714          ${...}. This logic must agree with subst.c:extract_dollar_brace_string
5715          since they share the same defines. */
5716       /* FLAG POSIX INTERP 221 */
5717       if (flags & P_DOLBRACE)
5718         {
5719           /* ${param%[%]word} */
5720           if MBTEST(dolbrace_state == DOLBRACE_PARAM && ch == '%' && retind > 1)
5721             dolbrace_state = DOLBRACE_QUOTE;
5722           /* ${param#[#]word} */
5723           else if MBTEST(dolbrace_state == DOLBRACE_PARAM && ch == '#' && retind > 1)
5724             dolbrace_state = DOLBRACE_QUOTE;
5725           /* ${param/[/]pat/rep} */
5726           else if MBTEST(dolbrace_state == DOLBRACE_PARAM && ch == '/' && retind > 1)
5727             dolbrace_state = DOLBRACE_QUOTE2;   /* XXX */
5728           /* ${param^[^]pat} */
5729           else if MBTEST(dolbrace_state == DOLBRACE_PARAM && ch == '^' && retind > 1)
5730             dolbrace_state = DOLBRACE_QUOTE;
5731           /* ${param,[,]pat} */
5732           else if MBTEST(dolbrace_state == DOLBRACE_PARAM && ch == ',' && retind > 1)
5733             dolbrace_state = DOLBRACE_QUOTE;
5734           else if MBTEST(dolbrace_state == DOLBRACE_PARAM && strchr ("#%^,~:-=?+/", ch) != 0)
5735             dolbrace_state = DOLBRACE_OP;
5736           else if MBTEST(dolbrace_state == DOLBRACE_OP && strchr ("#%^,~:-=?+/", ch) == 0)
5737             dolbrace_state = DOLBRACE_WORD;
5738         }
5739
5740       /* The big hammer.  Single quotes aren't special in double quotes.  The
5741          problem is that Posix used to say the single quotes are semi-special:
5742          within a double-quoted ${...} construct "an even number of
5743          unescaped double-quotes or single-quotes, if any, shall occur." */
5744       /* This was changed in Austin Group Interp 221 */
5745       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
5746         continue;
5747
5748       /* Could also check open == '`' if we want to parse grouping constructs
5749          inside old-style command substitution. */
5750       if (open != close)                /* a grouping construct */
5751         {
5752           if MBTEST(shellquote (ch))
5753             {
5754               /* '', ``, or "" inside $(...) or other grouping construct. */
5755               push_delimiter (dstack, ch);
5756               if MBTEST((tflags & LEX_WASDOL) && ch == '\'')    /* $'...' inside group */
5757                 nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags);
5758               else
5759                 nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags);
5760               pop_delimiter (dstack);
5761               CHECK_NESTRET_ERROR ();
5762
5763               if MBTEST((tflags & LEX_WASDOL) && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0))
5764                 {
5765                   /* Translate $'...' here. */
5766                   ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen);
5767                   xfree (nestret);
5768
5769                   /* If we're parsing a double-quoted brace expansion and we are
5770                      not in a place where single quotes are treated specially,
5771                      make sure we single-quote the results of the ansi
5772                      expansion because quote removal should remove them later */
5773                   /* FLAG POSIX INTERP 221 */
5774                   if ((shell_compatibility_level > 42) && (rflags & P_DQUOTE) && (dolbrace_state == DOLBRACE_QUOTE2) && (flags & P_DOLBRACE))
5775                     {
5776                       nestret = sh_single_quote (ttrans);
5777                       free (ttrans);
5778                       nestlen = strlen (nestret);
5779                     }
5780                   else if ((rflags & P_DQUOTE) == 0)
5781                     {
5782                       nestret = sh_single_quote (ttrans);
5783                       free (ttrans);
5784                       nestlen = strlen (nestret);
5785                     }
5786                   else
5787                     {
5788                       nestret = ttrans;
5789                       nestlen = ttranslen;
5790                     }
5791                   retind -= 2;          /* back up before the $' */
5792                 }
5793               else if MBTEST((tflags & LEX_WASDOL) && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0))
5794                 {
5795                   /* Locale expand $"..." here. */
5796                   ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen);
5797                   xfree (nestret);
5798
5799                   nestret = sh_mkdoublequoted (ttrans, ttranslen, 0);
5800                   free (ttrans);
5801                   nestlen = ttranslen + 2;
5802                   retind -= 2;          /* back up before the $" */
5803                 }
5804
5805               APPEND_NESTRET ();
5806               FREE (nestret);
5807             }
5808           else if ((flags & P_ARRAYSUB) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '['))      /* ) } ] */
5809             goto parse_dollar_word;
5810         }
5811       /* Parse an old-style command substitution within double quotes as a
5812          single word. */
5813       /* XXX - sh and ksh93 don't do this - XXX */
5814       else if MBTEST(open == '"' && ch == '`')
5815         {
5816           nestret = parse_matched_pair (0, '`', '`', &nestlen, rflags);
5817
5818           CHECK_NESTRET_ERROR ();
5819           APPEND_NESTRET ();
5820
5821           FREE (nestret);
5822         }
5823       else if MBTEST(open != '`' && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '['))     /* ) } ] */
5824         /* check for $(), $[], or ${} inside quoted string. */
5825         {
5826 parse_dollar_word:
5827           if (open == ch)       /* undo previous increment */
5828             count--;
5829           if (ch == '(')                /* ) */
5830             nestret = parse_comsub (0, '(', ')', &nestlen, (rflags|P_COMMAND) & ~P_DQUOTE);
5831           else if (ch == '{')           /* } */
5832             nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
5833           else if (ch == '[')           /* ] */
5834             nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
5835
5836           CHECK_NESTRET_ERROR ();
5837           APPEND_NESTRET ();
5838
5839           FREE (nestret);
5840         }
5841       if MBTEST(ch == '$')
5842         tflags |= LEX_WASDOL;
5843       else
5844         tflags &= ~LEX_WASDOL;
5845     }
5846
5847   ret[retind] = '\0';
5848   if (lenp)
5849     *lenp = retind;
5850 /*itrace("parse_matched_pair[%d]: returning %s", line_number, ret);*/
5851   return ret;
5852 }
5853
5854 /* Parse a $(...) command substitution.  This is messier than I'd like, and
5855    reproduces a lot more of the token-reading code than I'd like. */
5856 static char *
5857 parse_comsub (qc, open, close, lenp, flags)
5858      int qc;    /* `"' if this construct is within double quotes */
5859      int open, close;
5860      int *lenp, flags;
5861 {
5862   int count, ch, peekc, tflags, lex_rwlen, lex_wlen, lex_firstind;
5863   int nestlen, ttranslen, start_lineno;
5864   char *ret, *nestret, *ttrans, *heredelim;
5865   int retind, retsize, rflags, hdlen;
5866
5867   /* Posix interp 217 says arithmetic expressions have precedence, so
5868      assume $(( introduces arithmetic expansion and parse accordingly. */
5869   peekc = shell_getc (0);
5870   shell_ungetc (peekc);
5871   if (peekc == '(')
5872     return (parse_matched_pair (qc, open, close, lenp, 0));
5873
5874 /*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
5875   count = 1;
5876   tflags = LEX_RESWDOK;
5877
5878   if ((flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
5879     tflags |= LEX_CKCASE;
5880   if ((tflags & LEX_CKCASE) && (interactive == 0 || interactive_comments))
5881     tflags |= LEX_CKCOMMENT;
5882
5883   /* RFLAGS is the set of flags we want to pass to recursive calls. */
5884   rflags = (flags & P_DQUOTE);
5885
5886   ret = (char *)xmalloc (retsize = 64);
5887   retind = 0;
5888
5889   start_lineno = line_number;
5890   lex_rwlen = lex_wlen = 0;
5891
5892   heredelim = 0;
5893   lex_firstind = -1;
5894
5895   while (count)
5896     {
5897 comsub_readchar:
5898       ch = shell_getc (qc != '\'' && (tflags & (LEX_INCOMMENT|LEX_PASSNEXT)) == 0);
5899
5900       if (ch == EOF)
5901         {
5902 eof_error:
5903           free (ret);
5904           FREE (heredelim);
5905           parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
5906           EOF_Reached = 1;      /* XXX */
5907           return (&matched_pair_error);
5908         }
5909
5910       /* If we hit the end of a line and are reading the contents of a here
5911          document, and it's not the same line that the document starts on,
5912          check for this line being the here doc delimiter.  Otherwise, if
5913          we're in a here document, mark the next character as the beginning
5914          of a line. */
5915       if (ch == '\n')
5916         {
5917           if ((tflags & LEX_HEREDELIM) && heredelim)
5918             {
5919               tflags &= ~LEX_HEREDELIM;
5920               tflags |= LEX_INHEREDOC;
5921               lex_firstind = retind + 1;
5922             }
5923           else if (tflags & LEX_INHEREDOC)
5924             {
5925               int tind;
5926               tind = lex_firstind;
5927               while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
5928                 tind++;
5929               if (STREQN (ret + tind, heredelim, hdlen))
5930                 {
5931                   tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
5932 /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
5933                   free (heredelim);
5934                   heredelim = 0;
5935                   lex_firstind = -1;
5936                 }
5937               else
5938                 lex_firstind = retind + 1;
5939             }
5940         }
5941
5942       /* Possible reprompting. */
5943       if (ch == '\n' && SHOULD_PROMPT ())
5944         prompt_again ();
5945
5946       /* XXX -- possibly allow here doc to be delimited by ending right
5947          paren. */
5948       if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
5949         {
5950           int tind;
5951 /*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
5952           tind = lex_firstind;
5953           while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
5954             tind++;
5955           if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
5956             {
5957               tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
5958 /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
5959               free (heredelim);
5960               heredelim = 0;
5961               lex_firstind = -1;
5962             }
5963         }
5964
5965       /* Don't bother counting parens or doing anything else if in a comment */
5966       if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC))
5967         {
5968           /* Add this character. */
5969           RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
5970           ret[retind++] = ch;
5971
5972           if ((tflags & LEX_INCOMMENT) && ch == '\n')
5973             {
5974 /*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/
5975               tflags &= ~LEX_INCOMMENT;
5976             }
5977
5978           continue;
5979         }
5980
5981       if (tflags & LEX_PASSNEXT)                /* last char was backslash */
5982         {
5983 /*itrace("parse_comsub:%d: lex_passnext -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/
5984           tflags &= ~LEX_PASSNEXT;
5985           if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */
5986             {
5987               if (retind > 0)
5988                 retind--;       /* swallow previously-added backslash */
5989               continue;
5990             }
5991
5992           RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
5993           if MBTEST(ch == CTLESC)
5994             ret[retind++] = CTLESC;
5995           ret[retind++] = ch;
5996           continue;
5997         }
5998
5999       /* If this is a shell break character, we are not in a word.  If not,
6000          we either start or continue a word. */
6001       if MBTEST(shellbreak (ch))
6002         {
6003           tflags &= ~LEX_INWORD;
6004 /*itrace("parse_comsub:%d: lex_inword -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/
6005         }
6006       else
6007         {
6008           if (tflags & LEX_INWORD)
6009             {
6010               lex_wlen++;
6011 /*itrace("parse_comsub:%d: lex_inword == 1 ch = `%c' lex_wlen = %d (%d)", line_number, ch, lex_wlen, __LINE__);*/
6012             }         
6013           else
6014             {
6015 /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/
6016               tflags |= LEX_INWORD;
6017               lex_wlen = 0;
6018             }
6019         }
6020
6021       /* Skip whitespace */
6022       if MBTEST(shellblank (ch) && (tflags & LEX_HEREDELIM) == 0 && lex_rwlen == 0)
6023         {
6024           /* Add this character. */
6025           RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6026           ret[retind++] = ch;
6027           continue;
6028         }
6029
6030       /* Either we are looking for the start of the here-doc delimiter
6031          (lex_firstind == -1) or we are reading one (lex_firstind >= 0).
6032          If this character is a shell break character and we are reading
6033          the delimiter, save it and note that we are now reading a here
6034          document.  If we've found the start of the delimiter, note it by
6035          setting lex_firstind.  Backslashes can quote shell metacharacters
6036          in here-doc delimiters. */
6037       if (tflags & LEX_HEREDELIM)
6038         {
6039           if (lex_firstind == -1 && shellbreak (ch) == 0)
6040             lex_firstind = retind;
6041 #if 0
6042           else if (heredelim && (tflags & LEX_PASSNEXT) == 0 && ch == '\n')
6043             {
6044               tflags |= LEX_INHEREDOC;
6045               tflags &= ~LEX_HEREDELIM;
6046               lex_firstind = retind + 1;
6047             }
6048 #endif
6049           else if (lex_firstind >= 0 && (tflags & LEX_PASSNEXT) == 0 && shellbreak (ch))
6050             {
6051               if (heredelim == 0)
6052                 {
6053                   nestret = substring (ret, lex_firstind, retind);
6054                   heredelim = string_quote_removal (nestret, 0);
6055                   free (nestret);
6056                   hdlen = STRLEN(heredelim);
6057 /*itrace("parse_comsub:%d: found here doc delimiter `%s' (%d)", line_number, heredelim, hdlen);*/
6058                 }
6059               if (ch == '\n')
6060                 {
6061                   tflags |= LEX_INHEREDOC;
6062                   tflags &= ~LEX_HEREDELIM;
6063                   lex_firstind = retind + 1;
6064                 }
6065               else
6066                 lex_firstind = -1;
6067             }
6068         }
6069
6070       /* Meta-characters that can introduce a reserved word.  Not perfect yet. */
6071       if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && (shellmeta(ch) || ch == '\n'))
6072         {
6073           /* Add this character. */
6074           RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6075           ret[retind++] = ch;
6076           peekc = shell_getc (1);
6077           if (ch == peekc && (ch == '&' || ch == '|' || ch == ';'))     /* two-character tokens */
6078             {
6079               RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6080               ret[retind++] = peekc;
6081 /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
6082               tflags |= LEX_RESWDOK;
6083               lex_rwlen = 0;
6084               continue;
6085             }
6086           else if (ch == '\n' || COMSUB_META(ch))
6087             {
6088               shell_ungetc (peekc);
6089 /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
6090               tflags |= LEX_RESWDOK;
6091               lex_rwlen = 0;
6092               continue;
6093             }
6094           else if (ch == EOF)
6095             goto eof_error;
6096           else
6097             {
6098               /* `unget' the character we just added and fall through */
6099               retind--;
6100               shell_ungetc (peekc);
6101             }
6102         }
6103
6104       /* If we can read a reserved word, try to read one. */
6105       if (tflags & LEX_RESWDOK)
6106         {
6107           if MBTEST(islower (ch))
6108             {
6109               /* Add this character. */
6110               RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6111               ret[retind++] = ch;
6112               lex_rwlen++;
6113               continue;
6114             }
6115           else if MBTEST(lex_rwlen == 4 && shellbreak (ch))
6116             {
6117               if (STREQN (ret + retind - 4, "case", 4))
6118                 {
6119                   tflags |= LEX_INCASE;
6120 /*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/
6121                 }
6122               else if (STREQN (ret + retind - 4, "esac", 4))
6123                 {
6124                   tflags &= ~LEX_INCASE;
6125 /*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/
6126                 }
6127               tflags &= ~LEX_RESWDOK;
6128             }
6129           else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
6130             ;   /* don't modify LEX_RESWDOK if we're starting a comment */
6131           /* Allow `do' followed by space, tab, or newline to preserve the
6132              RESWDOK flag, but reset the reserved word length counter so we
6133              can read another one. */
6134           else if MBTEST(((tflags & LEX_INCASE) == 0) &&
6135                           (isblank(ch) || ch == '\n') &&
6136                           lex_rwlen == 2 &&
6137                           STREQN (ret + retind - 2, "do", 2))
6138             {
6139 /*itrace("parse_comsub:%d: lex_incase == 1 found `%c', found \"do\"", line_number, ch);*/
6140               lex_rwlen = 0;
6141             }
6142           else if MBTEST((tflags & LEX_INCASE) && ch != '\n')
6143             /* If we can read a reserved word and we're in case, we're at the
6144                point where we can read a new pattern list or an esac.  We
6145                handle the esac case above.  If we read a newline, we want to
6146                leave LEX_RESWDOK alone.  If we read anything else, we want to
6147                turn off LEX_RESWDOK, since we're going to read a pattern list. */
6148             {
6149               tflags &= ~LEX_RESWDOK;
6150 /*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/
6151             }
6152           else if MBTEST(shellbreak (ch) == 0)
6153             {
6154               tflags &= ~LEX_RESWDOK;
6155 /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
6156             }
6157 #if 0
6158           /* If we find a space or tab but have read something and it's not
6159              `do', turn off the reserved-word-ok flag */
6160           else if MBTEST(isblank (ch) && lex_rwlen > 0)
6161             {
6162               tflags &= ~LEX_RESWDOK;
6163 /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
6164             }
6165 #endif
6166         }
6167
6168       /* Might be the start of a here-doc delimiter */
6169       if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<')
6170         {
6171           /* Add this character. */
6172           RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6173           ret[retind++] = ch;
6174           peekc = shell_getc (1);
6175           if (peekc == EOF)
6176             goto eof_error;
6177           if (peekc == ch)
6178             {
6179               RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6180               ret[retind++] = peekc;
6181               peekc = shell_getc (1);
6182               if (peekc == EOF)
6183                 goto eof_error;
6184               if (peekc == '-')
6185                 {
6186                   RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6187                   ret[retind++] = peekc;
6188                   tflags |= LEX_STRIPDOC;
6189                 }
6190               else
6191                 shell_ungetc (peekc);
6192               if (peekc != '<')
6193                 {
6194                   tflags |= LEX_HEREDELIM;
6195                   lex_firstind = -1;
6196                 }
6197               continue;
6198             }
6199           else
6200             ch = peekc;         /* fall through and continue XXX */
6201         }
6202       else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0)))
6203         {
6204 /*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/
6205           tflags |= LEX_INCOMMENT;
6206         }
6207
6208       if MBTEST(ch == CTLESC || ch == CTLNUL)   /* special shell escapes */
6209         {
6210           RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
6211           ret[retind++] = CTLESC;
6212           ret[retind++] = ch;
6213           continue;
6214         }
6215 #if 0
6216       else if MBTEST((tflags & LEX_INCASE) && ch == close && close == ')')
6217         tflags &= ~LEX_INCASE;          /* XXX */
6218 #endif
6219       else if MBTEST(ch == close && (tflags & LEX_INCASE) == 0)         /* ending delimiter */
6220         {
6221           count--;
6222 /*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/
6223         }
6224       else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
6225         {
6226           count++;
6227 /*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
6228         }
6229
6230       /* Add this character. */
6231       RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
6232       ret[retind++] = ch;
6233
6234       /* If we just read the ending character, don't bother continuing. */
6235       if (count == 0)
6236         break;
6237
6238       if MBTEST(ch == '\\')                     /* backslashes */
6239         tflags |= LEX_PASSNEXT;
6240
6241       if MBTEST(shellquote (ch))
6242         {
6243           /* '', ``, or "" inside $(...). */
6244           push_delimiter (dstack, ch);
6245           if MBTEST((tflags & LEX_WASDOL) && ch == '\'')        /* $'...' inside group */
6246             nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags);
6247           else
6248             nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags);
6249           pop_delimiter (dstack);
6250           CHECK_NESTRET_ERROR ();
6251
6252           if MBTEST((tflags & LEX_WASDOL) && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0))
6253             {
6254               /* Translate $'...' here. */
6255               ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen);
6256               xfree (nestret);
6257
6258               if ((rflags & P_DQUOTE) == 0)
6259                 {
6260                   nestret = sh_single_quote (ttrans);
6261                   free (ttrans);
6262                   nestlen = strlen (nestret);
6263                 }
6264               else
6265                 {
6266                   nestret = ttrans;
6267                   nestlen = ttranslen;
6268                 }
6269               retind -= 2;              /* back up before the $' */
6270             }
6271           else if MBTEST((tflags & LEX_WASDOL) && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0))
6272             {
6273               /* Locale expand $"..." here. */
6274               ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen);
6275               xfree (nestret);
6276
6277               nestret = sh_mkdoublequoted (ttrans, ttranslen, 0);
6278               free (ttrans);
6279               nestlen = ttranslen + 2;
6280               retind -= 2;              /* back up before the $" */
6281             }
6282
6283           APPEND_NESTRET ();
6284           FREE (nestret);
6285         }
6286       else if MBTEST((tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '['))    /* ) } ] */
6287         /* check for $(), $[], or ${} inside command substitution. */
6288         {
6289           if ((tflags & LEX_INCASE) == 0 && open == ch) /* undo previous increment */
6290             count--;
6291           if (ch == '(')                /* ) */
6292             nestret = parse_comsub (0, '(', ')', &nestlen, (rflags|P_COMMAND) & ~P_DQUOTE);
6293           else if (ch == '{')           /* } */
6294             nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
6295           else if (ch == '[')           /* ] */
6296             nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
6297
6298           CHECK_NESTRET_ERROR ();
6299           APPEND_NESTRET ();
6300
6301           FREE (nestret);
6302         }
6303       if MBTEST(ch == '$')
6304         tflags |= LEX_WASDOL;
6305       else
6306         tflags &= ~LEX_WASDOL;
6307     }
6308
6309   FREE (heredelim);
6310   ret[retind] = '\0';
6311   if (lenp)
6312     *lenp = retind;
6313 /*itrace("parse_comsub:%d: returning `%s'", line_number, ret);*/
6314   return ret;
6315 }
6316
6317 /* Recursively call the parser to parse a $(...) command substitution. */
6318 char *
6319 xparse_dolparen (base, string, indp, flags)
6320      char *base;
6321      char *string;
6322      int *indp;
6323      int flags;
6324 {
6325   sh_parser_state_t ps;
6326   sh_input_line_state_t ls;
6327   int orig_ind, nc, sflags, orig_eof_token;
6328   char *ret, *s, *ep, *ostring;
6329
6330   /*yydebug = 1;*/
6331   orig_ind = *indp;
6332   ostring = string;
6333
6334 /*itrace("xparse_dolparen: size = %d shell_input_line = `%s'", shell_input_line_size, shell_input_line);*/
6335   sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE;
6336   if (flags & SX_NOLONGJMP)
6337     sflags |= SEVAL_NOLONGJMP;
6338   save_parser_state (&ps);
6339   save_input_line_state (&ls);
6340   orig_eof_token = shell_eof_token;
6341
6342   /*(*/
6343   parser_state |= PST_CMDSUBST|PST_EOFTOKEN;    /* allow instant ')' */ /*(*/
6344   shell_eof_token = ')';
6345   parse_string (string, "command substitution", sflags, &ep);
6346
6347   shell_eof_token = orig_eof_token;
6348   restore_parser_state (&ps);
6349   reset_parser ();
6350   /* reset_parser clears shell_input_line and associated variables */
6351   restore_input_line_state (&ls);
6352
6353   token_to_read = 0;
6354
6355   /* Need to find how many characters parse_and_execute consumed, update
6356      *indp, if flags != 0, copy the portion of the string parsed into RET
6357      and return it.  If flags & 1 (EX_NOALLOC) we can return NULL. */
6358
6359   /*(*/
6360   if (ep[-1] != ')')
6361     {
6362 #if DEBUG
6363       if (ep[-1] != '\n')
6364         itrace("xparse_dolparen:%d: ep[-1] != RPAREN (%d), ep = `%s'", line_number, ep[-1], ep);
6365 #endif
6366       while (ep > ostring && ep[-1] == '\n') ep--;
6367     }
6368
6369   nc = ep - ostring;
6370   *indp = ep - base - 1;
6371
6372   /*(*/
6373 #if DEBUG
6374   if (base[*indp] != ')')
6375     itrace("xparse_dolparen:%d: base[%d] != RPAREN (%d), base = `%s'", line_number, *indp, base[*indp], base);
6376 #endif
6377
6378   if (flags & SX_NOALLOC) 
6379     return (char *)NULL;
6380
6381   if (nc == 0)
6382     {
6383       ret = xmalloc (1);
6384       ret[0] = '\0';
6385     }
6386   else
6387     ret = substring (ostring, 0, nc - 1);
6388
6389   return ret;
6390 }
6391
6392 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
6393 /* Parse a double-paren construct.  It can be either an arithmetic
6394    command, an arithmetic `for' command, or a nested subshell.  Returns
6395    the parsed token, -1 on error, or -2 if we didn't do anything and
6396    should just go on. */
6397 static int
6398 parse_dparen (c)
6399      int c;
6400 {
6401   int cmdtyp, sline;
6402   char *wval;
6403   WORD_DESC *wd;
6404
6405 #if defined (ARITH_FOR_COMMAND)
6406   if (last_read_token == FOR)
6407     {
6408       arith_for_lineno = line_number;
6409       cmdtyp = parse_arith_cmd (&wval, 0);
6410       if (cmdtyp == 1)
6411         {
6412           wd = alloc_word_desc ();
6413           wd->word = wval;
6414           yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
6415           return (ARITH_FOR_EXPRS);
6416         }
6417       else
6418         return -1;              /* ERROR */
6419     }
6420 #endif
6421
6422 #if defined (DPAREN_ARITHMETIC)
6423   if (reserved_word_acceptable (last_read_token))
6424     {
6425       sline = line_number;
6426
6427       cmdtyp = parse_arith_cmd (&wval, 0);
6428       if (cmdtyp == 1)  /* arithmetic command */
6429         {
6430           wd = alloc_word_desc ();
6431           wd->word = wval;
6432           wd->flags = W_QUOTED|W_NOSPLIT|W_NOGLOB|W_DQUOTE;
6433           yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
6434           return (ARITH_CMD);
6435         }
6436       else if (cmdtyp == 0)     /* nested subshell */
6437         {
6438           push_string (wval, 0, (alias_t *)NULL);
6439           pushed_string_list->flags = PSH_DPAREN;
6440           if ((parser_state & PST_CASEPAT) == 0)
6441             parser_state |= PST_SUBSHELL;
6442           return (c);
6443         }
6444       else                      /* ERROR */
6445         return -1;
6446     }
6447 #endif
6448
6449   return -2;                    /* XXX */
6450 }
6451
6452 /* We've seen a `(('.  Look for the matching `))'.  If we get it, return 1.
6453    If not, assume it's a nested subshell for backwards compatibility and
6454    return 0.  In any case, put the characters we've consumed into a locally-
6455    allocated buffer and make *ep point to that buffer.  Return -1 on an
6456    error, for example EOF. */
6457 static int
6458 parse_arith_cmd (ep, adddq)
6459      char **ep;
6460      int adddq;
6461 {
6462   int exp_lineno, rval, c;
6463   char *ttok, *tokstr;
6464   int ttoklen;
6465
6466   exp_lineno = line_number;
6467   ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
6468   rval = 1;
6469   if (ttok == &matched_pair_error)
6470     return -1;
6471   /* Check that the next character is the closing right paren.  If
6472      not, this is a syntax error. ( */
6473   c = shell_getc (0);
6474   if MBTEST(c != ')')
6475     rval = 0;
6476
6477   tokstr = (char *)xmalloc (ttoklen + 4);
6478
6479   /* if ADDDQ != 0 then (( ... )) -> "..." */
6480   if (rval == 1 && adddq)       /* arith cmd, add double quotes */
6481     {
6482       tokstr[0] = '"';
6483       strncpy (tokstr + 1, ttok, ttoklen - 1);
6484       tokstr[ttoklen] = '"';
6485       tokstr[ttoklen+1] = '\0';
6486     }
6487   else if (rval == 1)           /* arith cmd, don't add double quotes */
6488     {
6489       strncpy (tokstr, ttok, ttoklen - 1);
6490       tokstr[ttoklen-1] = '\0';
6491     }
6492   else                          /* nested subshell */
6493     {
6494       tokstr[0] = '(';
6495       strncpy (tokstr + 1, ttok, ttoklen - 1);
6496       tokstr[ttoklen] = ')';
6497       tokstr[ttoklen+1] = c;
6498       tokstr[ttoklen+2] = '\0';
6499     }
6500
6501   *ep = tokstr;
6502   FREE (ttok);
6503   return rval;
6504 }
6505 #endif /* DPAREN_ARITHMETIC || ARITH_FOR_COMMAND */
6506
6507 #if defined (COND_COMMAND)
6508 static void
6509 cond_error ()
6510 {
6511   char *etext;
6512
6513   if (EOF_Reached && cond_token != COND_ERROR)          /* [[ */
6514     parser_error (cond_lineno, _("unexpected EOF while looking for `]]'"));
6515   else if (cond_token != COND_ERROR)
6516     {
6517       if (etext = error_token_from_token (cond_token))
6518         {
6519           parser_error (cond_lineno, _("syntax error in conditional expression: unexpected token `%s'"), etext);
6520           free (etext);
6521         }
6522       else
6523         parser_error (cond_lineno, _("syntax error in conditional expression"));
6524     }
6525 }
6526
6527 static COND_COM *
6528 cond_expr ()
6529 {
6530   return (cond_or ());  
6531 }
6532
6533 static COND_COM *
6534 cond_or ()
6535 {
6536   COND_COM *l, *r;
6537
6538   l = cond_and ();
6539   if (cond_token == OR_OR)
6540     {
6541       r = cond_or ();
6542       l = make_cond_node (COND_OR, (WORD_DESC *)NULL, l, r);
6543     }
6544   return l;
6545 }
6546
6547 static COND_COM *
6548 cond_and ()
6549 {
6550   COND_COM *l, *r;
6551
6552   l = cond_term ();
6553   if (cond_token == AND_AND)
6554     {
6555       r = cond_and ();
6556       l = make_cond_node (COND_AND, (WORD_DESC *)NULL, l, r);
6557     }
6558   return l;
6559 }
6560
6561 static int
6562 cond_skip_newlines ()
6563 {
6564   while ((cond_token = read_token (READ)) == '\n')
6565     {
6566       if (SHOULD_PROMPT ())
6567         prompt_again ();
6568     }
6569   return (cond_token);
6570 }
6571
6572 #define COND_RETURN_ERROR() \
6573   do { cond_token = COND_ERROR; return ((COND_COM *)NULL); } while (0)
6574
6575 static COND_COM *
6576 cond_term ()
6577 {
6578   WORD_DESC *op;
6579   COND_COM *term, *tleft, *tright;
6580   int tok, lineno;
6581   char *etext;
6582
6583   /* Read a token.  It can be a left paren, a `!', a unary operator, or a
6584      word that should be the first argument of a binary operator.  Start by
6585      skipping newlines, since this is a compound command. */
6586   tok = cond_skip_newlines ();
6587   lineno = line_number;
6588   if (tok == COND_END)
6589     {
6590       COND_RETURN_ERROR ();
6591     }
6592   else if (tok == '(')
6593     {
6594       term = cond_expr ();
6595       if (cond_token != ')')
6596         {
6597           if (term)
6598             dispose_cond_node (term);           /* ( */
6599           if (etext = error_token_from_token (cond_token))
6600             {
6601               parser_error (lineno, _("unexpected token `%s', expected `)'"), etext);
6602               free (etext);
6603             }
6604           else
6605             parser_error (lineno, _("expected `)'"));
6606           COND_RETURN_ERROR ();
6607         }
6608       term = make_cond_node (COND_EXPR, (WORD_DESC *)NULL, term, (COND_COM *)NULL);
6609       (void)cond_skip_newlines ();
6610     }
6611   else if (tok == BANG || (tok == WORD && (yylval.word->word[0] == '!' && yylval.word->word[1] == '\0')))
6612     {
6613       if (tok == WORD)
6614         dispose_word (yylval.word);     /* not needed */
6615       term = cond_term ();
6616       if (term)
6617         term->flags |= CMD_INVERT_RETURN;
6618     }
6619   else if (tok == WORD && yylval.word->word[0] == '-' && yylval.word->word[2] == 0 && test_unop (yylval.word->word))
6620     {
6621       op = yylval.word;
6622       tok = read_token (READ);
6623       if (tok == WORD)
6624         {
6625           tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
6626           term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL);
6627         }
6628       else
6629         {
6630           dispose_word (op);
6631           if (etext = error_token_from_token (tok))
6632             {
6633               parser_error (line_number, _("unexpected argument `%s' to conditional unary operator"), etext);
6634               free (etext);
6635             }
6636           else
6637             parser_error (line_number, _("unexpected argument to conditional unary operator"));
6638           COND_RETURN_ERROR ();
6639         }
6640
6641       (void)cond_skip_newlines ();
6642     }
6643   else if (tok == WORD)         /* left argument to binary operator */
6644     {
6645       /* lhs */
6646       tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
6647
6648       /* binop */
6649       tok = read_token (READ);
6650       if (tok == WORD && test_binop (yylval.word->word))
6651         {
6652           op = yylval.word;
6653           if (op->word[0] == '=' && (op->word[1] == '\0' || (op->word[1] == '=' && op->word[2] == '\0')))
6654             parser_state |= PST_EXTPAT;
6655           else if (op->word[0] == '!' && op->word[1] == '=' && op->word[2] == '\0')
6656             parser_state |= PST_EXTPAT;
6657         }
6658 #if defined (COND_REGEXP)
6659       else if (tok == WORD && STREQ (yylval.word->word, "=~"))
6660         {
6661           op = yylval.word;
6662           parser_state |= PST_REGEXP;
6663         }
6664 #endif
6665       else if (tok == '<' || tok == '>')
6666         op = make_word_from_token (tok);  /* ( */
6667       /* There should be a check before blindly accepting the `)' that we have
6668          seen the opening `('. */
6669       else if (tok == COND_END || tok == AND_AND || tok == OR_OR || tok == ')')
6670         {
6671           /* Special case.  [[ x ]] is equivalent to [[ -n x ]], just like
6672              the test command.  Similarly for [[ x && expr ]] or
6673              [[ x || expr ]] or [[ (x) ]]. */
6674           op = make_word ("-n");
6675           term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL);
6676           cond_token = tok;
6677           return (term);
6678         }
6679       else
6680         {
6681           if (etext = error_token_from_token (tok))
6682             {
6683               parser_error (line_number, _("unexpected token `%s', conditional binary operator expected"), etext);
6684               free (etext);
6685             }
6686           else
6687             parser_error (line_number, _("conditional binary operator expected"));
6688           dispose_cond_node (tleft);
6689           COND_RETURN_ERROR ();
6690         }
6691
6692       /* rhs */
6693       if (parser_state & PST_EXTPAT)
6694         extended_glob = 1;
6695       tok = read_token (READ);
6696       if (parser_state & PST_EXTPAT)
6697         extended_glob = global_extglob;
6698       parser_state &= ~(PST_REGEXP|PST_EXTPAT);
6699
6700       if (tok == WORD)
6701         {
6702           tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
6703           term = make_cond_node (COND_BINARY, op, tleft, tright);
6704         }
6705       else
6706         {
6707           if (etext = error_token_from_token (tok))
6708             {
6709               parser_error (line_number, _("unexpected argument `%s' to conditional binary operator"), etext);
6710               free (etext);
6711             }
6712           else
6713             parser_error (line_number, _("unexpected argument to conditional binary operator"));
6714           dispose_cond_node (tleft);
6715           dispose_word (op);
6716           COND_RETURN_ERROR ();
6717         }
6718
6719       (void)cond_skip_newlines ();
6720     }
6721   else
6722     {
6723       if (tok < 256)
6724         parser_error (line_number, _("unexpected token `%c' in conditional command"), tok);
6725       else if (etext = error_token_from_token (tok))
6726         {
6727           parser_error (line_number, _("unexpected token `%s' in conditional command"), etext);
6728           free (etext);
6729         }
6730       else
6731         parser_error (line_number, _("unexpected token %d in conditional command"), tok);
6732       COND_RETURN_ERROR ();
6733     }
6734   return (term);
6735 }      
6736
6737 /* This is kind of bogus -- we slip a mini recursive-descent parser in
6738    here to handle the conditional statement syntax. */
6739 static COMMAND *
6740 parse_cond_command ()
6741 {
6742   COND_COM *cexp;
6743
6744   global_extglob = extended_glob;
6745   cexp = cond_expr ();
6746   return (make_cond_command (cexp));
6747 }
6748 #endif
6749
6750 #if defined (ARRAY_VARS)
6751 /* When this is called, it's guaranteed that we don't care about anything
6752    in t beyond i.  We do save and restore the chars, though. */
6753 static int
6754 token_is_assignment (t, i)
6755      char *t;
6756      int i;
6757 {
6758   unsigned char c, c1;
6759   int r;
6760
6761   c = t[i]; c1 = t[i+1];
6762   t[i] = '='; t[i+1] = '\0';
6763   r = assignment (t, (parser_state & PST_COMPASSIGN) != 0);
6764   t[i] = c; t[i+1] = c1;
6765   return r;
6766 }
6767
6768 /* XXX - possible changes here for `+=' */
6769 static int
6770 token_is_ident (t, i)
6771      char *t;
6772      int i;
6773 {
6774   unsigned char c;
6775   int r;
6776
6777   c = t[i];
6778   t[i] = '\0';
6779   r = legal_identifier (t);
6780   t[i] = c;
6781   return r;
6782 }
6783 #endif
6784
6785 static int
6786 read_token_word (character)
6787      int character;
6788 {
6789   /* The value for YYLVAL when a WORD is read. */
6790   WORD_DESC *the_word;
6791
6792   /* Index into the token that we are building. */
6793   int token_index;
6794
6795   /* ALL_DIGITS becomes zero when we see a non-digit. */
6796   int all_digit_token;
6797
6798   /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */
6799   int dollar_present;
6800
6801   /* COMPOUND_ASSIGNMENT becomes non-zero if we are parsing a compound
6802      assignment. */
6803   int compound_assignment;
6804
6805   /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */
6806   int quoted;
6807
6808   /* Non-zero means to ignore the value of the next character, and just
6809      to add it no matter what. */
6810  int pass_next_character;
6811
6812   /* The current delimiting character. */
6813   int cd;
6814   int result, peek_char;
6815   char *ttok, *ttrans;
6816   int ttoklen, ttranslen;
6817   intmax_t lvalue;
6818
6819   if (token_buffer_size < TOKEN_DEFAULT_INITIAL_SIZE)
6820     token = (char *)xrealloc (token, token_buffer_size = TOKEN_DEFAULT_INITIAL_SIZE);
6821
6822   token_index = 0;
6823   all_digit_token = DIGIT (character);
6824   dollar_present = quoted = pass_next_character = compound_assignment = 0;
6825
6826   for (;;)
6827     {
6828       if (character == EOF)
6829         goto got_token;
6830
6831       if (pass_next_character)
6832         {
6833           pass_next_character = 0;
6834           goto got_escaped_character;
6835         }
6836
6837       cd = current_delimiter (dstack);
6838
6839       /* Handle backslashes.  Quote lots of things when not inside of
6840          double-quotes, quote some things inside of double-quotes. */
6841       if MBTEST(character == '\\')
6842         {
6843           peek_char = shell_getc (0);
6844
6845           /* Backslash-newline is ignored in all cases except
6846              when quoted with single quotes. */
6847           if (peek_char == '\n')
6848             {
6849               character = '\n';
6850               goto next_character;
6851             }
6852           else
6853             {
6854               shell_ungetc (peek_char);
6855
6856               /* If the next character is to be quoted, note it now. */
6857               if (cd == 0 || cd == '`' ||
6858                   (cd == '"' && peek_char >= 0 && (sh_syntaxtab[peek_char] & CBSDQUOTE)))
6859                 pass_next_character++;
6860
6861               quoted = 1;
6862               goto got_character;
6863             }
6864         }
6865
6866       /* Parse a matched pair of quote characters. */
6867       if MBTEST(shellquote (character))
6868         {
6869           push_delimiter (dstack, character);
6870           ttok = parse_matched_pair (character, character, character, &ttoklen, (character == '`') ? P_COMMAND : 0);
6871           pop_delimiter (dstack);
6872           if (ttok == &matched_pair_error)
6873             return -1;          /* Bail immediately. */
6874           RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
6875                                   token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
6876           token[token_index++] = character;
6877           strcpy (token + token_index, ttok);
6878           token_index += ttoklen;
6879           all_digit_token = 0;
6880           quoted = 1;
6881           dollar_present |= (character == '"' && strchr (ttok, '$') != 0);
6882           FREE (ttok);
6883           goto next_character;
6884         }
6885
6886 #ifdef COND_REGEXP
6887       /* When parsing a regexp as a single word inside a conditional command,
6888          we need to special-case characters special to both the shell and
6889          regular expressions.  Right now, that is only '(' and '|'. */ /*)*/
6890       if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|'))          /*)*/
6891         {
6892           if (character == '|')
6893             goto got_character;
6894
6895           push_delimiter (dstack, character);
6896           ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
6897           pop_delimiter (dstack);
6898           if (ttok == &matched_pair_error)
6899             return -1;          /* Bail immediately. */
6900           RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
6901                                   token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
6902           token[token_index++] = character;
6903           strcpy (token + token_index, ttok);
6904           token_index += ttoklen;
6905           FREE (ttok);
6906           dollar_present = all_digit_token = 0;
6907           goto next_character;
6908         }
6909 #endif /* COND_REGEXP */
6910
6911 #ifdef EXTENDED_GLOB
6912       /* Parse a ksh-style extended pattern matching specification. */
6913       if MBTEST(extended_glob && PATTERN_CHAR (character))
6914         {
6915           peek_char = shell_getc (1);
6916           if MBTEST(peek_char == '(')           /* ) */
6917             {
6918               push_delimiter (dstack, peek_char);
6919               ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
6920               pop_delimiter (dstack);
6921               if (ttok == &matched_pair_error)
6922                 return -1;              /* Bail immediately. */
6923               RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 3,
6924                                       token_buffer_size,
6925                                       TOKEN_DEFAULT_GROW_SIZE);
6926               token[token_index++] = character;
6927               token[token_index++] = peek_char;
6928               strcpy (token + token_index, ttok);
6929               token_index += ttoklen;
6930               FREE (ttok);
6931               dollar_present = all_digit_token = 0;
6932               goto next_character;
6933             }
6934           else
6935             shell_ungetc (peek_char);
6936         }
6937 #endif /* EXTENDED_GLOB */
6938
6939       /* If the delimiter character is not single quote, parse some of
6940          the shell expansions that must be read as a single word. */
6941       if (shellexp (character))
6942         {
6943           peek_char = shell_getc (1);
6944           /* $(...), <(...), >(...), $((...)), ${...}, and $[...] constructs */
6945           if MBTEST(peek_char == '(' ||
6946                 ((peek_char == '{' || peek_char == '[') && character == '$'))   /* ) ] } */
6947             {
6948               if (peek_char == '{')             /* } */
6949                 ttok = parse_matched_pair (cd, '{', '}', &ttoklen, P_FIRSTCLOSE|P_DOLBRACE);
6950               else if (peek_char == '(')                /* ) */
6951                 {
6952                   /* XXX - push and pop the `(' as a delimiter for use by
6953                      the command-oriented-history code.  This way newlines
6954                      appearing in the $(...) string get added to the
6955                      history literally rather than causing a possibly-
6956                      incorrect `;' to be added. ) */
6957                   push_delimiter (dstack, peek_char);
6958                   ttok = parse_comsub (cd, '(', ')', &ttoklen, P_COMMAND);
6959                   pop_delimiter (dstack);
6960                 }
6961               else
6962                 ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
6963               if (ttok == &matched_pair_error)
6964                 return -1;              /* Bail immediately. */
6965               RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 3,
6966                                       token_buffer_size,
6967                                       TOKEN_DEFAULT_GROW_SIZE);
6968               token[token_index++] = character;
6969               token[token_index++] = peek_char;
6970               strcpy (token + token_index, ttok);
6971               token_index += ttoklen;
6972               FREE (ttok);
6973               dollar_present = 1;
6974               all_digit_token = 0;
6975               goto next_character;
6976             }
6977           /* This handles $'...' and $"..." new-style quoted strings. */
6978           else if MBTEST(character == '$' && (peek_char == '\'' || peek_char == '"'))
6979             {
6980               int first_line;
6981
6982               first_line = line_number;
6983               push_delimiter (dstack, peek_char);
6984               ttok = parse_matched_pair (peek_char, peek_char, peek_char,
6985                                          &ttoklen,
6986                                          (peek_char == '\'') ? P_ALLOWESC : 0);
6987               pop_delimiter (dstack);
6988               if (ttok == &matched_pair_error)
6989                 return -1;
6990               if (peek_char == '\'')
6991                 {
6992                   ttrans = ansiexpand (ttok, 0, ttoklen - 1, &ttranslen);
6993                   free (ttok);
6994
6995                   /* Insert the single quotes and correctly quote any
6996                      embedded single quotes (allowed because P_ALLOWESC was
6997                      passed to parse_matched_pair). */
6998                   ttok = sh_single_quote (ttrans);
6999                   free (ttrans);
7000                   ttranslen = strlen (ttok);
7001                   ttrans = ttok;
7002                 }
7003               else
7004                 {
7005                   /* Try to locale-expand the converted string. */
7006                   ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen);
7007                   free (ttok);
7008
7009                   /* Add the double quotes back */
7010                   ttok = sh_mkdoublequoted (ttrans, ttranslen, 0);
7011                   free (ttrans);
7012                   ttranslen += 2;
7013                   ttrans = ttok;
7014                 }
7015
7016               RESIZE_MALLOCED_BUFFER (token, token_index, ttranslen + 1,
7017                                       token_buffer_size,
7018                                       TOKEN_DEFAULT_GROW_SIZE);
7019               strcpy (token + token_index, ttrans);
7020               token_index += ttranslen;
7021               FREE (ttrans);
7022               quoted = 1;
7023               all_digit_token = 0;
7024               goto next_character;
7025             }
7026           /* This could eventually be extended to recognize all of the
7027              shell's single-character parameter expansions, and set flags.*/
7028           else if MBTEST(character == '$' && peek_char == '$')
7029             {
7030               RESIZE_MALLOCED_BUFFER (token, token_index, 3,
7031                                       token_buffer_size,
7032                                       TOKEN_DEFAULT_GROW_SIZE);
7033               token[token_index++] = '$';
7034               token[token_index++] = peek_char;
7035               dollar_present = 1;
7036               all_digit_token = 0;
7037               goto next_character;
7038             }
7039           else
7040             shell_ungetc (peek_char);
7041         }
7042
7043 #if defined (ARRAY_VARS)
7044       /* Identify possible array subscript assignment; match [...].  If
7045          parser_state&PST_COMPASSIGN, we need to parse [sub]=words treating
7046          `sub' as if it were enclosed in double quotes. */
7047       else if MBTEST(character == '[' &&                /* ] */
7048                      ((token_index > 0 && assignment_acceptable (last_read_token) && token_is_ident (token, token_index)) ||
7049                       (token_index == 0 && (parser_state&PST_COMPASSIGN))))
7050         {
7051           ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARRAYSUB);
7052           if (ttok == &matched_pair_error)
7053             return -1;          /* Bail immediately. */
7054           RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
7055                                   token_buffer_size,
7056                                   TOKEN_DEFAULT_GROW_SIZE);
7057           token[token_index++] = character;
7058           strcpy (token + token_index, ttok);
7059           token_index += ttoklen;
7060           FREE (ttok);
7061           all_digit_token = 0;
7062           goto next_character;
7063         }
7064       /* Identify possible compound array variable assignment. */
7065       else if MBTEST(character == '=' && token_index > 0 && (assignment_acceptable (last_read_token) || (parser_state & PST_ASSIGNOK)) && token_is_assignment (token, token_index))
7066         {
7067           peek_char = shell_getc (1);
7068           if MBTEST(peek_char == '(')           /* ) */
7069             {
7070               ttok = parse_compound_assignment (&ttoklen);
7071
7072               RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 4,
7073                                       token_buffer_size,
7074                                       TOKEN_DEFAULT_GROW_SIZE);
7075
7076               token[token_index++] = '=';
7077               token[token_index++] = '(';
7078               if (ttok)
7079                 {
7080                   strcpy (token + token_index, ttok);
7081                   token_index += ttoklen;
7082                 }
7083               token[token_index++] = ')';
7084               FREE (ttok);
7085               all_digit_token = 0;
7086               compound_assignment = 1;
7087 #if 1
7088               goto next_character;
7089 #else
7090               goto got_token;           /* ksh93 seems to do this */
7091 #endif
7092             }
7093           else
7094             shell_ungetc (peek_char);
7095         }
7096 #endif
7097
7098       /* When not parsing a multi-character word construct, shell meta-
7099          characters break words. */
7100       if MBTEST(shellbreak (character))
7101         {
7102           shell_ungetc (character);
7103           goto got_token;
7104         }
7105
7106 got_character:
7107
7108       if (character == CTLESC || character == CTLNUL)
7109         {
7110           RESIZE_MALLOCED_BUFFER (token, token_index, 2, token_buffer_size,
7111                                   TOKEN_DEFAULT_GROW_SIZE);
7112           token[token_index++] = CTLESC;
7113         }
7114       else
7115 got_escaped_character:
7116         RESIZE_MALLOCED_BUFFER (token, token_index, 1, token_buffer_size,
7117                                 TOKEN_DEFAULT_GROW_SIZE);
7118
7119       token[token_index++] = character;
7120
7121       all_digit_token &= DIGIT (character);
7122       dollar_present |= character == '$';
7123
7124     next_character:
7125       if (character == '\n' && SHOULD_PROMPT ())
7126         prompt_again ();
7127
7128       /* We want to remove quoted newlines (that is, a \<newline> pair)
7129          unless we are within single quotes or pass_next_character is
7130          set (the shell equivalent of literal-next). */
7131       cd = current_delimiter (dstack);
7132       character = shell_getc (cd != '\'' && pass_next_character == 0);
7133     }   /* end for (;;) */
7134
7135 got_token:
7136
7137   /* Calls to RESIZE_MALLOCED_BUFFER ensure there is sufficient room. */
7138   token[token_index] = '\0';
7139
7140   /* Check to see what thing we should return.  If the last_read_token
7141      is a `<', or a `&', or the character which ended this token is
7142      a '>' or '<', then, and ONLY then, is this input token a NUMBER.
7143      Otherwise, it is just a word, and should be returned as such. */
7144   if MBTEST(all_digit_token && (character == '<' || character == '>' ||
7145                     last_read_token == LESS_AND ||
7146                     last_read_token == GREATER_AND))
7147       {
7148         if (legal_number (token, &lvalue) && (int)lvalue == lvalue)
7149           {
7150             yylval.number = lvalue;
7151             return (NUMBER);
7152           }
7153       }
7154
7155   /* Check for special case tokens. */
7156   result = (last_shell_getc_is_singlebyte) ? special_case_tokens (token) : -1;
7157   if (result >= 0)
7158     return result;
7159
7160 #if defined (ALIAS)
7161   /* Posix.2 does not allow reserved words to be aliased, so check for all
7162      of them, including special cases, before expanding the current token
7163      as an alias. */
7164   if MBTEST(posixly_correct)
7165     CHECK_FOR_RESERVED_WORD (token);
7166
7167   /* Aliases are expanded iff EXPAND_ALIASES is non-zero, and quoting
7168      inhibits alias expansion. */
7169   if (expand_aliases && quoted == 0)
7170     {
7171       result = alias_expand_token (token);
7172       if (result == RE_READ_TOKEN)
7173         return (RE_READ_TOKEN);
7174       else if (result == NO_EXPANSION)
7175         parser_state &= ~PST_ALEXPNEXT;
7176     }
7177
7178   /* If not in Posix.2 mode, check for reserved words after alias
7179      expansion. */
7180   if MBTEST(posixly_correct == 0)
7181 #endif
7182     CHECK_FOR_RESERVED_WORD (token);
7183
7184   the_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
7185   the_word->word = (char *)xmalloc (1 + token_index);
7186   the_word->flags = 0;
7187   strcpy (the_word->word, token);
7188   if (dollar_present)
7189     the_word->flags |= W_HASDOLLAR;
7190   if (quoted)
7191     the_word->flags |= W_QUOTED;                /*(*/
7192   if (compound_assignment && token[token_index-1] == ')')
7193     the_word->flags |= W_COMPASSIGN;
7194   /* A word is an assignment if it appears at the beginning of a
7195      simple command, or after another assignment word.  This is
7196      context-dependent, so it cannot be handled in the grammar. */
7197   if (assignment (token, (parser_state & PST_COMPASSIGN) != 0))
7198     {
7199       the_word->flags |= W_ASSIGNMENT;
7200       /* Don't perform word splitting on assignment statements. */
7201       if (assignment_acceptable (last_read_token) || (parser_state & PST_COMPASSIGN) != 0)
7202         {
7203           the_word->flags |= W_NOSPLIT;
7204           if (parser_state & PST_COMPASSIGN)
7205             the_word->flags |= W_NOGLOB;        /* XXX - W_NOBRACE? */
7206         }
7207     }
7208
7209   if (command_token_position (last_read_token))
7210     {
7211       struct builtin *b;
7212       b = builtin_address_internal (token, 0);
7213       if (b && (b->flags & ASSIGNMENT_BUILTIN))
7214         parser_state |= PST_ASSIGNOK;
7215       else if (STREQ (token, "eval") || STREQ (token, "let"))
7216         parser_state |= PST_ASSIGNOK;
7217     }
7218
7219   yylval.word = the_word;
7220
7221   if (token[0] == '{' && token[token_index-1] == '}' &&
7222       (character == '<' || character == '>'))
7223     {
7224       /* can use token; already copied to the_word */
7225       token[token_index-1] = '\0';
7226 #if defined (ARRAY_VARS)
7227       if (legal_identifier (token+1) || valid_array_reference (token+1))
7228 #else
7229       if (legal_identifier (token+1))
7230 #endif
7231         {
7232           strcpy (the_word->word, token+1);
7233 /*itrace("read_token_word: returning REDIR_WORD for %s", the_word->word);*/
7234           return (REDIR_WORD);
7235         }
7236     }
7237
7238   result = ((the_word->flags & (W_ASSIGNMENT|W_NOSPLIT)) == (W_ASSIGNMENT|W_NOSPLIT))
7239                 ? ASSIGNMENT_WORD : WORD;
7240
7241   switch (last_read_token)
7242     {
7243     case FUNCTION:
7244       parser_state |= PST_ALLOWOPNBRC;
7245       function_dstart = line_number;
7246       break;
7247     case CASE:
7248     case SELECT:
7249     case FOR:
7250       if (word_top < MAX_CASE_NEST)
7251         word_top++;
7252       word_lineno[word_top] = line_number;
7253       break;
7254     }
7255
7256   return (result);
7257 }
7258
7259 /* Return 1 if TOKSYM is a token that after being read would allow
7260    a reserved word to be seen, else 0. */
7261 static int
7262 reserved_word_acceptable (toksym)
7263      int toksym;
7264 {
7265   switch (toksym)
7266     {
7267     case '\n':
7268     case ';':
7269     case '(':
7270     case ')':
7271     case '|':
7272     case '&':
7273     case '{':
7274     case '}':           /* XXX */
7275     case AND_AND:
7276     case BANG:
7277     case BAR_AND:
7278     case DO:
7279     case DONE:
7280     case ELIF:
7281     case ELSE:
7282     case ESAC:
7283     case FI:
7284     case IF:
7285     case OR_OR:
7286     case SEMI_SEMI:
7287     case SEMI_AND:
7288     case SEMI_SEMI_AND:
7289     case THEN:
7290     case TIME:
7291     case TIMEOPT:
7292     case TIMEIGN:
7293     case COPROC:
7294     case UNTIL:
7295     case WHILE:
7296     case 0:
7297       return 1;
7298     default:
7299 #if defined (COPROCESS_SUPPORT)
7300       if (last_read_token == WORD && token_before_that == COPROC)
7301         return 1;
7302 #endif
7303       if (last_read_token == WORD && token_before_that == FUNCTION)
7304         return 1;
7305       return 0;
7306     }
7307 }
7308     
7309 /* Return the index of TOKEN in the alist of reserved words, or -1 if
7310    TOKEN is not a shell reserved word. */
7311 int
7312 find_reserved_word (tokstr)
7313      char *tokstr;
7314 {
7315   int i;
7316   for (i = 0; word_token_alist[i].word; i++)
7317     if (STREQ (tokstr, word_token_alist[i].word))
7318       return i;
7319   return -1;
7320 }
7321
7322 /* An interface to let the rest of the shell (primarily the completion
7323    system) know what the parser is expecting. */
7324 int
7325 parser_in_command_position ()
7326 {
7327   return (command_token_position (last_read_token));
7328 }
7329
7330 #if 0
7331 #if defined (READLINE)
7332 /* Called after each time readline is called.  This insures that whatever
7333    the new prompt string is gets propagated to readline's local prompt
7334    variable. */
7335 static void
7336 reset_readline_prompt ()
7337 {
7338   char *temp_prompt;
7339
7340   if (prompt_string_pointer)
7341     {
7342       temp_prompt = (*prompt_string_pointer)
7343                         ? decode_prompt_string (*prompt_string_pointer)
7344                         : (char *)NULL;
7345
7346       if (temp_prompt == 0)
7347         {
7348           temp_prompt = (char *)xmalloc (1);
7349           temp_prompt[0] = '\0';
7350         }
7351
7352       FREE (current_readline_prompt);
7353       current_readline_prompt = temp_prompt;
7354     }
7355 }
7356 #endif /* READLINE */
7357 #endif /* 0 */
7358
7359 #if defined (HISTORY)
7360 /* A list of tokens which can be followed by newlines, but not by
7361    semi-colons.  When concatenating multiple lines of history, the
7362    newline separator for such tokens is replaced with a space. */
7363 static const int no_semi_successors[] = {
7364   '\n', '{', '(', ')', ';', '&', '|',
7365   CASE, DO, ELSE, IF, SEMI_SEMI, SEMI_AND, SEMI_SEMI_AND, THEN, UNTIL,
7366   WHILE, AND_AND, OR_OR, IN,
7367   0
7368 };
7369
7370 /* If we are not within a delimited expression, try to be smart
7371    about which separators can be semi-colons and which must be
7372    newlines.  Returns the string that should be added into the
7373    history entry.  LINE is the line we're about to add; it helps
7374    make some more intelligent decisions in certain cases. */
7375 char *
7376 history_delimiting_chars (line)
7377      const char *line;
7378 {
7379   static int last_was_heredoc = 0;      /* was the last entry the start of a here document? */
7380   register int i;
7381
7382   if ((parser_state & PST_HEREDOC) == 0)
7383     last_was_heredoc = 0;
7384
7385   if (dstack.delimiter_depth != 0)
7386     return ("\n");
7387
7388   /* We look for current_command_line_count == 2 because we are looking to
7389      add the first line of the body of the here document (the second line
7390      of the command).  We also keep LAST_WAS_HEREDOC as a private sentinel
7391      variable to note when we think we added the first line of a here doc
7392      (the one with a "<<" somewhere in it) */
7393   if (parser_state & PST_HEREDOC)
7394     {
7395       if (last_was_heredoc)
7396         {
7397           last_was_heredoc = 0;
7398           return "\n";
7399         }
7400       return (current_command_line_count == 2 ? "\n" : "");
7401     }
7402
7403   if (parser_state & PST_COMPASSIGN)
7404     return (" ");
7405
7406   /* First, handle some special cases. */
7407   /*(*/
7408   /* If we just read `()', assume it's a function definition, and don't
7409      add a semicolon.  If the token before the `)' was not `(', and we're
7410      not in the midst of parsing a case statement, assume it's a
7411      parenthesized command and add the semicolon. */
7412   /*)(*/
7413   if (token_before_that == ')')
7414     {
7415       if (two_tokens_ago == '(')        /*)*/   /* function def */
7416         return " ";
7417       /* This does not work for subshells inside case statement
7418          command lists.  It's a suboptimal solution. */
7419       else if (parser_state & PST_CASESTMT)     /* case statement pattern */
7420         return " ";
7421       else      
7422         return "; ";                            /* (...) subshell */
7423     }
7424   else if (token_before_that == WORD && two_tokens_ago == FUNCTION)
7425     return " ";         /* function def using `function name' without `()' */
7426
7427   /* If we're not in a here document, but we think we're about to parse one,
7428      and we would otherwise return a `;', return a newline to delimit the
7429      line with the here-doc delimiter */
7430   else if ((parser_state & PST_HEREDOC) == 0 && current_command_line_count > 1 && last_read_token == '\n' && strstr (line, "<<"))
7431     {
7432       last_was_heredoc = 1;
7433       return "\n";
7434     }
7435
7436   else if (token_before_that == WORD && two_tokens_ago == FOR)
7437     {
7438       /* Tricky.  `for i\nin ...' should not have a semicolon, but
7439          `for i\ndo ...' should.  We do what we can. */
7440       for (i = shell_input_line_index; whitespace (shell_input_line[i]); i++)
7441         ;
7442       if (shell_input_line[i] && shell_input_line[i] == 'i' && shell_input_line[i+1] == 'n')
7443         return " ";
7444       return ";";
7445     }
7446   else if (two_tokens_ago == CASE && token_before_that == WORD && (parser_state & PST_CASESTMT))
7447     return " ";
7448
7449   for (i = 0; no_semi_successors[i]; i++)
7450     {
7451       if (token_before_that == no_semi_successors[i])
7452         return (" ");
7453     }
7454
7455   return ("; ");
7456 }
7457 #endif /* HISTORY */
7458
7459 /* Issue a prompt, or prepare to issue a prompt when the next character
7460    is read. */
7461 static void
7462 prompt_again ()
7463 {
7464   char *temp_prompt;
7465
7466   if (interactive == 0 || expanding_alias ())   /* XXX */
7467     return;
7468
7469   ps1_prompt = get_string_value ("PS1");
7470   ps2_prompt = get_string_value ("PS2");
7471
7472   if (!prompt_string_pointer)
7473     prompt_string_pointer = &ps1_prompt;
7474
7475   temp_prompt = *prompt_string_pointer
7476                         ? decode_prompt_string (*prompt_string_pointer)
7477                         : (char *)NULL;
7478
7479   if (temp_prompt == 0)
7480     {
7481       temp_prompt = (char *)xmalloc (1);
7482       temp_prompt[0] = '\0';
7483     }
7484
7485   current_prompt_string = *prompt_string_pointer;
7486   prompt_string_pointer = &ps2_prompt;
7487
7488 #if defined (READLINE)
7489   if (!no_line_editing)
7490     {
7491       FREE (current_readline_prompt);
7492       current_readline_prompt = temp_prompt;
7493     }
7494   else
7495 #endif  /* READLINE */
7496     {
7497       FREE (current_decoded_prompt);
7498       current_decoded_prompt = temp_prompt;
7499     }
7500 }
7501
7502 int
7503 get_current_prompt_level ()
7504 {
7505   return ((current_prompt_string && current_prompt_string == ps2_prompt) ? 2 : 1);
7506 }
7507
7508 void
7509 set_current_prompt_level (x)
7510      int x;
7511 {
7512   prompt_string_pointer = (x == 2) ? &ps2_prompt : &ps1_prompt;
7513   current_prompt_string = *prompt_string_pointer;
7514 }
7515       
7516 static void
7517 print_prompt ()
7518 {
7519   fprintf (stderr, "%s", current_decoded_prompt);
7520   fflush (stderr);
7521 }
7522
7523 /* Return a string which will be printed as a prompt.  The string
7524    may contain special characters which are decoded as follows:
7525
7526         \a      bell (ascii 07)
7527         \d      the date in Day Mon Date format
7528         \e      escape (ascii 033)
7529         \h      the hostname up to the first `.'
7530         \H      the hostname
7531         \j      the number of active jobs
7532         \l      the basename of the shell's tty device name
7533         \n      CRLF
7534         \r      CR
7535         \s      the name of the shell
7536         \t      the time in 24-hour hh:mm:ss format
7537         \T      the time in 12-hour hh:mm:ss format
7538         \@      the time in 12-hour hh:mm am/pm format
7539         \A      the time in 24-hour hh:mm format
7540         \D{fmt} the result of passing FMT to strftime(3)
7541         \u      your username
7542         \v      the version of bash (e.g., 2.00)
7543         \V      the release of bash, version + patchlevel (e.g., 2.00.0)
7544         \w      the current working directory
7545         \W      the last element of $PWD
7546         \!      the history number of this command
7547         \#      the command number of this command
7548         \$      a $ or a # if you are root
7549         \nnn    character code nnn in octal
7550         \\      a backslash
7551         \[      begin a sequence of non-printing chars
7552         \]      end a sequence of non-printing chars
7553 */
7554 #define PROMPT_GROWTH 48
7555 char *
7556 decode_prompt_string (string)
7557      char *string;
7558 {
7559   WORD_LIST *list;
7560   char *result, *t;
7561   struct dstack save_dstack;
7562   int last_exit_value, last_comsub_pid;
7563 #if defined (PROMPT_STRING_DECODE)
7564   int result_size, result_index;
7565   int c, n, i;
7566   char *temp, octal_string[4];
7567   struct tm *tm;  
7568   time_t the_time;
7569   char timebuf[128];
7570   char *timefmt;
7571
7572   result = (char *)xmalloc (result_size = PROMPT_GROWTH);
7573   result[result_index = 0] = 0;
7574   temp = (char *)NULL;
7575
7576   while (c = *string++)
7577     {
7578       if (posixly_correct && c == '!')
7579         {
7580           if (*string == '!')
7581             {
7582               temp = savestring ("!");
7583               goto add_string;
7584             }
7585           else
7586             {
7587 #if !defined (HISTORY)
7588                 temp = savestring ("1");
7589 #else /* HISTORY */
7590                 temp = itos (history_number ());
7591 #endif /* HISTORY */
7592                 string--;       /* add_string increments string again. */
7593                 goto add_string;
7594             }
7595         }
7596       if (c == '\\')
7597         {
7598           c = *string;
7599
7600           switch (c)
7601             {
7602             case '0':
7603             case '1':
7604             case '2':
7605             case '3':
7606             case '4':
7607             case '5':
7608             case '6':
7609             case '7':
7610               strncpy (octal_string, string, 3);
7611               octal_string[3] = '\0';
7612
7613               n = read_octal (octal_string);
7614               temp = (char *)xmalloc (3);
7615
7616               if (n == CTLESC || n == CTLNUL)
7617                 {
7618                   temp[0] = CTLESC;
7619                   temp[1] = n;
7620                   temp[2] = '\0';
7621                 }
7622               else if (n == -1)
7623                 {
7624                   temp[0] = '\\';
7625                   temp[1] = '\0';
7626                 }
7627               else
7628                 {
7629                   temp[0] = n;
7630                   temp[1] = '\0';
7631                 }
7632
7633               for (c = 0; n != -1 && c < 3 && ISOCTAL (*string); c++)
7634                 string++;
7635
7636               c = 0;            /* tested at add_string: */
7637               goto add_string;
7638
7639             case 'd':
7640             case 't':
7641             case 'T':
7642             case '@':
7643             case 'A':
7644               /* Make the current time/date into a string. */
7645               (void) time (&the_time);
7646 #if defined (HAVE_TZSET)
7647               sv_tz ("TZ");             /* XXX -- just make sure */
7648 #endif
7649               tm = localtime (&the_time);
7650
7651               if (c == 'd')
7652                 n = strftime (timebuf, sizeof (timebuf), "%a %b %d", tm);
7653               else if (c == 't')
7654                 n = strftime (timebuf, sizeof (timebuf), "%H:%M:%S", tm);
7655               else if (c == 'T')
7656                 n = strftime (timebuf, sizeof (timebuf), "%I:%M:%S", tm);
7657               else if (c == '@')
7658                 n = strftime (timebuf, sizeof (timebuf), "%I:%M %p", tm);
7659               else if (c == 'A')
7660                 n = strftime (timebuf, sizeof (timebuf), "%H:%M", tm);
7661
7662               if (n == 0)
7663                 timebuf[0] = '\0';
7664               else
7665                 timebuf[sizeof(timebuf) - 1] = '\0';
7666
7667               temp = savestring (timebuf);
7668               goto add_string;
7669
7670             case 'D':           /* strftime format */
7671               if (string[1] != '{')             /* } */
7672                 goto not_escape;
7673
7674               (void) time (&the_time);
7675               tm = localtime (&the_time);
7676               string += 2;                      /* skip { */
7677               timefmt = xmalloc (strlen (string) + 3);
7678               for (t = timefmt; *string && *string != '}'; )
7679                 *t++ = *string++;
7680               *t = '\0';
7681               c = *string;      /* tested at add_string */
7682               if (timefmt[0] == '\0')
7683                 {
7684                   timefmt[0] = '%';
7685                   timefmt[1] = 'X';     /* locale-specific current time */
7686                   timefmt[2] = '\0';
7687                 }
7688               n = strftime (timebuf, sizeof (timebuf), timefmt, tm);
7689               free (timefmt);
7690
7691               if (n == 0)
7692                 timebuf[0] = '\0';
7693               else
7694                 timebuf[sizeof(timebuf) - 1] = '\0';
7695
7696               if (promptvars || posixly_correct)
7697                 /* Make sure that expand_prompt_string is called with a
7698                    second argument of Q_DOUBLE_QUOTES if we use this
7699                    function here. */
7700                 temp = sh_backslash_quote_for_double_quotes (timebuf);
7701               else
7702                 temp = savestring (timebuf);
7703               goto add_string;
7704               
7705             case 'n':
7706               temp = (char *)xmalloc (3);
7707               temp[0] = no_line_editing ? '\n' : '\r';
7708               temp[1] = no_line_editing ? '\0' : '\n';
7709               temp[2] = '\0';
7710               goto add_string;
7711
7712             case 's':
7713               temp = base_pathname (shell_name);
7714               temp = savestring (temp);
7715               goto add_string;
7716
7717             case 'v':
7718             case 'V':
7719               temp = (char *)xmalloc (16);
7720               if (c == 'v')
7721                 strcpy (temp, dist_version);
7722               else
7723                 sprintf (temp, "%s.%d", dist_version, patch_level);
7724               goto add_string;
7725
7726             case 'w':
7727             case 'W':
7728               {
7729                 /* Use the value of PWD because it is much more efficient. */
7730                 char t_string[PATH_MAX];
7731                 int tlen;
7732
7733                 temp = get_string_value ("PWD");
7734
7735                 if (temp == 0)
7736                   {
7737                     if (getcwd (t_string, sizeof(t_string)) == 0)
7738                       {
7739                         t_string[0] = '.';
7740                         tlen = 1;
7741                       }
7742                     else
7743                       tlen = strlen (t_string);
7744                   }
7745                 else
7746                   {
7747                     tlen = sizeof (t_string) - 1;
7748                     strncpy (t_string, temp, tlen);
7749                   }
7750                 t_string[tlen] = '\0';
7751
7752 #if defined (MACOSX)
7753                 /* Convert from "fs" format to "input" format */
7754                 temp = fnx_fromfs (t_string, strlen (t_string));
7755                 if (temp != t_string)
7756                   strcpy (t_string, temp);
7757 #endif
7758
7759 #define ROOT_PATH(x)    ((x)[0] == '/' && (x)[1] == 0)
7760 #define DOUBLE_SLASH_ROOT(x)    ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0)
7761                 /* Abbreviate \W as ~ if $PWD == $HOME */
7762                 if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0))
7763                   {
7764                     if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0)
7765                       {
7766                         t = strrchr (t_string, '/');
7767                         if (t)
7768                           memmove (t_string, t + 1, strlen (t));        /* strlen(t) to copy NULL */
7769                       }
7770                   }
7771 #undef ROOT_PATH
7772 #undef DOUBLE_SLASH_ROOT
7773                 else
7774                   {
7775                     /* polite_directory_format is guaranteed to return a string
7776                        no longer than PATH_MAX - 1 characters. */
7777                     temp = polite_directory_format (t_string);
7778                     if (temp != t_string)
7779                       strcpy (t_string, temp);
7780                   }
7781
7782                 temp = trim_pathname (t_string, PATH_MAX - 1);
7783                 /* If we're going to be expanding the prompt string later,
7784                    quote the directory name. */
7785                 if (promptvars || posixly_correct)
7786                   /* Make sure that expand_prompt_string is called with a
7787                      second argument of Q_DOUBLE_QUOTES if we use this
7788                      function here. */
7789                   temp = sh_backslash_quote_for_double_quotes (t_string);
7790                 else
7791                   temp = savestring (t_string);
7792
7793                 goto add_string;
7794               }
7795
7796             case 'u':
7797               if (current_user.user_name == 0)
7798                 get_current_user_info ();
7799               temp = savestring (current_user.user_name);
7800               goto add_string;
7801
7802             case 'h':
7803             case 'H':
7804               temp = savestring (current_host_name);
7805               if (c == 'h' && (t = (char *)strchr (temp, '.')))
7806                 *t = '\0';
7807               goto add_string;
7808
7809             case '#':
7810               temp = itos (current_command_number);
7811               goto add_string;
7812
7813             case '!':
7814 #if !defined (HISTORY)
7815               temp = savestring ("1");
7816 #else /* HISTORY */
7817               temp = itos (history_number ());
7818 #endif /* HISTORY */
7819               goto add_string;
7820
7821             case '$':
7822               t = temp = (char *)xmalloc (3);
7823               if ((promptvars || posixly_correct) && (current_user.euid != 0))
7824                 *t++ = '\\';
7825               *t++ = current_user.euid == 0 ? '#' : '$';
7826               *t = '\0';
7827               goto add_string;
7828
7829             case 'j':
7830               temp = itos (count_all_jobs ());
7831               goto add_string;
7832
7833             case 'l':
7834 #if defined (HAVE_TTYNAME)
7835               temp = (char *)ttyname (fileno (stdin));
7836               t = temp ? base_pathname (temp) : "tty";
7837               temp = savestring (t);
7838 #else
7839               temp = savestring ("tty");
7840 #endif /* !HAVE_TTYNAME */
7841               goto add_string;
7842
7843 #if defined (READLINE)
7844             case '[':
7845             case ']':
7846               if (no_line_editing)
7847                 {
7848                   string++;
7849                   break;
7850                 }
7851               temp = (char *)xmalloc (3);
7852               n = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
7853               i = 0;
7854               if (n == CTLESC || n == CTLNUL)
7855                 temp[i++] = CTLESC;
7856               temp[i++] = n;
7857               temp[i] = '\0';
7858               goto add_string;
7859 #endif /* READLINE */
7860
7861             case '\\':
7862             case 'a':
7863             case 'e':
7864             case 'r':
7865               temp = (char *)xmalloc (2);
7866               if (c == 'a')
7867                 temp[0] = '\07';
7868               else if (c == 'e')
7869                 temp[0] = '\033';
7870               else if (c == 'r')
7871                 temp[0] = '\r';
7872               else                      /* (c == '\\') */
7873                 temp[0] = c;
7874               temp[1] = '\0';
7875               goto add_string;
7876
7877             default:
7878 not_escape:
7879               temp = (char *)xmalloc (3);
7880               temp[0] = '\\';
7881               temp[1] = c;
7882               temp[2] = '\0';
7883
7884             add_string:
7885               if (c)
7886                 string++;
7887               result =
7888                 sub_append_string (temp, result, &result_index, &result_size);
7889               temp = (char *)NULL; /* Freed in sub_append_string (). */
7890               result[result_index] = '\0';
7891               break;
7892             }
7893         }
7894       else
7895         {
7896           RESIZE_MALLOCED_BUFFER (result, result_index, 3, result_size, PROMPT_GROWTH);
7897           result[result_index++] = c;
7898           result[result_index] = '\0';
7899         }
7900     }
7901 #else /* !PROMPT_STRING_DECODE */
7902   result = savestring (string);
7903 #endif /* !PROMPT_STRING_DECODE */
7904
7905   /* Save the delimiter stack and point `dstack' to temp space so any
7906      command substitutions in the prompt string won't result in screwing
7907      up the parser's quoting state. */
7908   save_dstack = dstack;
7909   dstack = temp_dstack;
7910   dstack.delimiter_depth = 0;
7911
7912   /* Perform variable and parameter expansion and command substitution on
7913      the prompt string. */
7914   if (promptvars || posixly_correct)
7915     {
7916       last_exit_value = last_command_exit_value;
7917       last_comsub_pid = last_command_subst_pid;
7918       list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0);
7919       free (result);
7920       result = string_list (list);
7921       dispose_words (list);
7922       last_command_exit_value = last_exit_value;
7923       last_command_subst_pid = last_comsub_pid;
7924     }
7925   else
7926     {
7927       t = dequote_string (result);
7928       free (result);
7929       result = t;
7930     }
7931
7932   dstack = save_dstack;
7933
7934   return (result);
7935 }
7936
7937 /************************************************
7938  *                                              *
7939  *              ERROR HANDLING                  *
7940  *                                              *
7941  ************************************************/
7942
7943 /* Report a syntax error, and restart the parser.  Call here for fatal
7944    errors. */
7945 int
7946 yyerror (msg)
7947      const char *msg;
7948 {
7949   report_syntax_error ((char *)NULL);
7950   reset_parser ();
7951   return (0);
7952 }
7953
7954 static char *
7955 error_token_from_token (tok)
7956      int tok;
7957 {
7958   char *t;
7959
7960   if (t = find_token_in_alist (tok, word_token_alist, 0))
7961     return t;
7962
7963   if (t = find_token_in_alist (tok, other_token_alist, 0))
7964     return t;
7965
7966   t = (char *)NULL;
7967   /* This stuff is dicy and needs closer inspection */
7968   switch (current_token)
7969     {
7970     case WORD:
7971     case ASSIGNMENT_WORD:
7972       if (yylval.word)
7973         t = savestring (yylval.word->word);
7974       break;
7975     case NUMBER:
7976       t = itos (yylval.number);
7977       break;
7978     case ARITH_CMD:
7979       if (yylval.word_list)
7980         t = string_list (yylval.word_list);
7981       break;
7982     case ARITH_FOR_EXPRS:
7983       if (yylval.word_list)
7984         t = string_list_internal (yylval.word_list, " ; ");
7985       break;
7986     case COND_CMD:
7987       t = (char *)NULL;         /* punt */
7988       break;
7989     }
7990
7991   return t;
7992 }
7993
7994 static char *
7995 error_token_from_text ()
7996 {
7997   char *msg, *t;
7998   int token_end, i;
7999
8000   t = shell_input_line;
8001   i = shell_input_line_index;
8002   token_end = 0;
8003   msg = (char *)NULL;
8004
8005   if (i && t[i] == '\0')
8006     i--;
8007
8008   while (i && (whitespace (t[i]) || t[i] == '\n'))
8009     i--;
8010
8011   if (i)
8012     token_end = i + 1;
8013
8014   while (i && (member (t[i], " \n\t;|&") == 0))
8015     i--;
8016
8017   while (i != token_end && (whitespace (t[i]) || t[i] == '\n'))
8018     i++;
8019
8020   /* Return our idea of the offending token. */
8021   if (token_end || (i == 0 && token_end == 0))
8022     {
8023       if (token_end)
8024         msg = substring (t, i, token_end);
8025       else      /* one-character token */
8026         {
8027           msg = (char *)xmalloc (2);
8028           msg[0] = t[i];
8029           msg[1] = '\0';
8030         }
8031     }
8032
8033   return (msg);
8034 }
8035
8036 static void
8037 print_offending_line ()
8038 {
8039   char *msg;
8040   int token_end;
8041
8042   msg = savestring (shell_input_line);
8043   token_end = strlen (msg);
8044   while (token_end && msg[token_end - 1] == '\n')
8045     msg[--token_end] = '\0';
8046
8047   parser_error (line_number, "`%s'", msg);
8048   free (msg);
8049 }
8050
8051 /* Report a syntax error with line numbers, etc.
8052    Call here for recoverable errors.  If you have a message to print,
8053    then place it in MESSAGE, otherwise pass NULL and this will figure
8054    out an appropriate message for you. */
8055 static void
8056 report_syntax_error (message)
8057      char *message;
8058 {
8059   char *msg, *p;
8060
8061   if (message)
8062     {
8063       parser_error (line_number, "%s", message);
8064       if (interactive && EOF_Reached)
8065         EOF_Reached = 0;
8066       last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
8067       return;
8068     }
8069
8070   /* If the line of input we're reading is not null, try to find the
8071      objectionable token.  First, try to figure out what token the
8072      parser's complaining about by looking at current_token. */
8073   if (current_token != 0 && EOF_Reached == 0 && (msg = error_token_from_token (current_token)))
8074     {
8075       if (ansic_shouldquote (msg))
8076         {
8077           p = ansic_quote (msg, 0, NULL);
8078           free (msg);
8079           msg = p;
8080         }
8081       parser_error (line_number, _("syntax error near unexpected token `%s'"), msg);
8082       free (msg);
8083
8084       if (interactive == 0)
8085         print_offending_line ();
8086
8087       last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
8088       return;
8089     }
8090
8091   /* If looking at the current token doesn't prove fruitful, try to find the
8092      offending token by analyzing the text of the input line near the current
8093      input line index and report what we find. */
8094   if (shell_input_line && *shell_input_line)
8095     {
8096       msg = error_token_from_text ();
8097       if (msg)
8098         {
8099           parser_error (line_number, _("syntax error near `%s'"), msg);
8100           free (msg);
8101         }
8102
8103       /* If not interactive, print the line containing the error. */
8104       if (interactive == 0)
8105         print_offending_line ();
8106     }
8107   else
8108     {
8109       msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
8110       parser_error (line_number, "%s", msg);
8111       /* When the shell is interactive, this file uses EOF_Reached
8112          only for error reporting.  Other mechanisms are used to
8113          decide whether or not to exit. */
8114       if (interactive && EOF_Reached)
8115         EOF_Reached = 0;
8116     }
8117
8118   last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
8119 }
8120
8121 /* ??? Needed function. ??? We have to be able to discard the constructs
8122    created during parsing.  In the case of error, we want to return
8123    allocated objects to the memory pool.  In the case of no error, we want
8124    to throw away the information about where the allocated objects live.
8125    (dispose_command () will actually free the command.) */
8126 static void
8127 discard_parser_constructs (error_p)
8128      int error_p;
8129 {
8130 }
8131
8132 /************************************************
8133  *                                              *
8134  *              EOF HANDLING                    *
8135  *                                              *
8136  ************************************************/
8137
8138 /* Do that silly `type "bye" to exit' stuff.  You know, "ignoreeof". */
8139
8140 /* A flag denoting whether or not ignoreeof is set. */
8141 int ignoreeof = 0;
8142
8143 /* The number of times that we have encountered an EOF character without
8144    another character intervening.  When this gets above the limit, the
8145    shell terminates. */
8146 int eof_encountered = 0;
8147
8148 /* The limit for eof_encountered. */
8149 int eof_encountered_limit = 10;
8150
8151 /* If we have EOF as the only input unit, this user wants to leave
8152    the shell.  If the shell is not interactive, then just leave.
8153    Otherwise, if ignoreeof is set, and we haven't done this the
8154    required number of times in a row, print a message. */
8155 static void
8156 handle_eof_input_unit ()
8157 {
8158   if (interactive)
8159     {
8160       /* shell.c may use this to decide whether or not to write out the
8161          history, among other things.  We use it only for error reporting
8162          in this file. */
8163       if (EOF_Reached)
8164         EOF_Reached = 0;
8165
8166       /* If the user wants to "ignore" eof, then let her do so, kind of. */
8167       if (ignoreeof)
8168         {
8169           if (eof_encountered < eof_encountered_limit)
8170             {
8171               fprintf (stderr, _("Use \"%s\" to leave the shell.\n"),
8172                        login_shell ? "logout" : "exit");
8173               eof_encountered++;
8174               /* Reset the parsing state. */
8175               last_read_token = current_token = '\n';
8176               /* Reset the prompt string to be $PS1. */
8177               prompt_string_pointer = (char **)NULL;
8178               prompt_again ();
8179               return;
8180             }
8181         }
8182
8183       /* In this case EOF should exit the shell.  Do it now. */
8184       reset_parser ();
8185       exit_builtin ((WORD_LIST *)NULL);
8186     }
8187   else
8188     {
8189       /* We don't write history files, etc., for non-interactive shells. */
8190       EOF_Reached = 1;
8191     }
8192 }
8193
8194 /************************************************
8195  *                                              *
8196  *      STRING PARSING FUNCTIONS                *
8197  *                                              *
8198  ************************************************/
8199
8200 /* It's very important that these two functions treat the characters
8201    between ( and ) identically. */
8202
8203 static WORD_LIST parse_string_error;
8204
8205 /* Take a string and run it through the shell parser, returning the
8206    resultant word list.  Used by compound array assignment. */
8207 WORD_LIST *
8208 parse_string_to_word_list (s, flags, whom)
8209      char *s;
8210      int flags;
8211      const char *whom;
8212 {
8213   WORD_LIST *wl;
8214   int tok, orig_current_token, orig_line_number, orig_input_terminator;
8215   int orig_line_count;
8216   int old_echo_input, old_expand_aliases;
8217 #if defined (HISTORY)
8218   int old_remember_on_history, old_history_expansion_inhibited;
8219 #endif
8220
8221 #if defined (HISTORY)
8222   old_remember_on_history = remember_on_history;
8223 #  if defined (BANG_HISTORY)
8224   old_history_expansion_inhibited = history_expansion_inhibited;
8225 #  endif
8226   bash_history_disable ();
8227 #endif
8228
8229   orig_line_number = line_number;
8230   orig_line_count = current_command_line_count;
8231   orig_input_terminator = shell_input_line_terminator;
8232   old_echo_input = echo_input_at_read;
8233   old_expand_aliases = expand_aliases;
8234
8235   push_stream (1);
8236   last_read_token = WORD;               /* WORD to allow reserved words here */
8237   current_command_line_count = 0;
8238   echo_input_at_read = expand_aliases = 0;
8239
8240   with_input_from_string (s, whom);
8241   wl = (WORD_LIST *)NULL;
8242
8243   if (flags & 1)
8244     parser_state |= PST_COMPASSIGN|PST_REPARSE;
8245
8246   while ((tok = read_token (READ)) != yacc_EOF)
8247     {
8248       if (tok == '\n' && *bash_input.location.string == '\0')
8249         break;
8250       if (tok == '\n')          /* Allow newlines in compound assignments */
8251         continue;
8252       if (tok != WORD && tok != ASSIGNMENT_WORD)
8253         {
8254           line_number = orig_line_number + line_number - 1;
8255           orig_current_token = current_token;
8256           current_token = tok;
8257           yyerror (NULL);       /* does the right thing */
8258           current_token = orig_current_token;
8259           if (wl)
8260             dispose_words (wl);
8261           wl = &parse_string_error;
8262           break;
8263         }
8264       wl = make_word_list (yylval.word, wl);
8265     }
8266   
8267   last_read_token = '\n';
8268   pop_stream ();
8269
8270 #if defined (HISTORY)
8271   remember_on_history = old_remember_on_history;
8272 #  if defined (BANG_HISTORY)
8273   history_expansion_inhibited = old_history_expansion_inhibited;
8274 #  endif /* BANG_HISTORY */
8275 #endif /* HISTORY */
8276
8277   echo_input_at_read = old_echo_input;
8278   expand_aliases = old_expand_aliases;
8279
8280   current_command_line_count = orig_line_count;
8281   shell_input_line_terminator = orig_input_terminator;
8282
8283   if (flags & 1)
8284     parser_state &= ~(PST_COMPASSIGN|PST_REPARSE);
8285
8286   if (wl == &parse_string_error)
8287     {
8288       last_command_exit_value = EXECUTION_FAILURE;
8289       if (interactive_shell == 0 && posixly_correct)
8290         jump_to_top_level (FORCE_EOF);
8291       else
8292         jump_to_top_level (DISCARD);
8293     }
8294
8295   return (REVERSE_LIST (wl, WORD_LIST *));
8296 }
8297
8298 static char *
8299 parse_compound_assignment (retlenp)
8300      int *retlenp;
8301 {
8302   WORD_LIST *wl, *rl;
8303   int tok, orig_line_number, orig_token_size, orig_last_token, assignok;
8304   char *saved_token, *ret;
8305
8306   saved_token = token;
8307   orig_token_size = token_buffer_size;
8308   orig_line_number = line_number;
8309   orig_last_token = last_read_token;
8310
8311   last_read_token = WORD;       /* WORD to allow reserved words here */
8312
8313   token = (char *)NULL;
8314   token_buffer_size = 0;
8315
8316   assignok = parser_state&PST_ASSIGNOK;         /* XXX */
8317
8318   wl = (WORD_LIST *)NULL;       /* ( */
8319   parser_state |= PST_COMPASSIGN;
8320
8321   while ((tok = read_token (READ)) != ')')
8322     {
8323       if (tok == '\n')                  /* Allow newlines in compound assignments */
8324         {
8325           if (SHOULD_PROMPT ())
8326             prompt_again ();
8327           continue;
8328         }
8329       if (tok != WORD && tok != ASSIGNMENT_WORD)
8330         {
8331           current_token = tok;  /* for error reporting */
8332           if (tok == yacc_EOF)  /* ( */
8333             parser_error (orig_line_number, _("unexpected EOF while looking for matching `)'"));
8334           else
8335             yyerror(NULL);      /* does the right thing */
8336           if (wl)
8337             dispose_words (wl);
8338           wl = &parse_string_error;
8339           break;
8340         }
8341       wl = make_word_list (yylval.word, wl);
8342     }
8343
8344   FREE (token);
8345   token = saved_token;
8346   token_buffer_size = orig_token_size;
8347
8348   parser_state &= ~PST_COMPASSIGN;
8349
8350   if (wl == &parse_string_error)
8351     {
8352       last_command_exit_value = EXECUTION_FAILURE;
8353       last_read_token = '\n';   /* XXX */
8354       if (interactive_shell == 0 && posixly_correct)
8355         jump_to_top_level (FORCE_EOF);
8356       else
8357         jump_to_top_level (DISCARD);
8358     }
8359
8360   last_read_token = orig_last_token;            /* XXX - was WORD? */
8361
8362   if (wl)
8363     {
8364       rl = REVERSE_LIST (wl, WORD_LIST *);
8365       ret = string_list (rl);
8366       dispose_words (rl);
8367     }
8368   else
8369     ret = (char *)NULL;
8370
8371   if (retlenp)
8372     *retlenp = (ret && *ret) ? strlen (ret) : 0;
8373
8374   if (assignok)
8375     parser_state |= PST_ASSIGNOK;
8376
8377   return ret;
8378 }
8379
8380 /************************************************
8381  *                                              *
8382  *   SAVING AND RESTORING PARTIAL PARSE STATE   *
8383  *                                              *
8384  ************************************************/
8385
8386 sh_parser_state_t *
8387 save_parser_state (ps)
8388      sh_parser_state_t *ps;
8389 {
8390   if (ps == 0)
8391     ps = (sh_parser_state_t *)xmalloc (sizeof (sh_parser_state_t));
8392   if (ps == 0)
8393     return ((sh_parser_state_t *)NULL);
8394
8395   ps->parser_state = parser_state;
8396   ps->token_state = save_token_state ();
8397
8398   ps->input_line_terminator = shell_input_line_terminator;
8399   ps->eof_encountered = eof_encountered;
8400
8401   ps->prompt_string_pointer = prompt_string_pointer;
8402
8403   ps->current_command_line_count = current_command_line_count;
8404
8405 #if defined (HISTORY)
8406   ps->remember_on_history = remember_on_history;
8407 #  if defined (BANG_HISTORY)
8408   ps->history_expansion_inhibited = history_expansion_inhibited;
8409 #  endif
8410 #endif
8411
8412   ps->last_command_exit_value = last_command_exit_value;
8413 #if defined (ARRAY_VARS)
8414   ps->pipestatus = save_pipestatus_array ();
8415 #endif
8416     
8417   ps->last_shell_builtin = last_shell_builtin;
8418   ps->this_shell_builtin = this_shell_builtin;
8419
8420   ps->expand_aliases = expand_aliases;
8421   ps->echo_input_at_read = echo_input_at_read;
8422   ps->need_here_doc = need_here_doc;
8423
8424   ps->token = token;
8425   ps->token_buffer_size = token_buffer_size;
8426   /* Force reallocation on next call to read_token_word */
8427   token = 0;
8428   token_buffer_size = 0;
8429
8430   return (ps);
8431 }
8432
8433 void
8434 restore_parser_state (ps)
8435      sh_parser_state_t *ps;
8436 {
8437   if (ps == 0)
8438     return;
8439
8440   parser_state = ps->parser_state;
8441   if (ps->token_state)
8442     {
8443       restore_token_state (ps->token_state);
8444       free (ps->token_state);
8445     }
8446
8447   shell_input_line_terminator = ps->input_line_terminator;
8448   eof_encountered = ps->eof_encountered;
8449
8450   prompt_string_pointer = ps->prompt_string_pointer;
8451
8452   current_command_line_count = ps->current_command_line_count;
8453
8454 #if defined (HISTORY)
8455   remember_on_history = ps->remember_on_history;
8456 #  if defined (BANG_HISTORY)
8457   history_expansion_inhibited = ps->history_expansion_inhibited;
8458 #  endif
8459 #endif
8460
8461   last_command_exit_value = ps->last_command_exit_value;
8462 #if defined (ARRAY_VARS)
8463   restore_pipestatus_array (ps->pipestatus);
8464 #endif
8465
8466   last_shell_builtin = ps->last_shell_builtin;
8467   this_shell_builtin = ps->this_shell_builtin;
8468
8469   expand_aliases = ps->expand_aliases;
8470   echo_input_at_read = ps->echo_input_at_read;
8471   need_here_doc = ps->need_here_doc;
8472
8473   FREE (token);
8474   token = ps->token;
8475   token_buffer_size = ps->token_buffer_size;
8476 }
8477
8478 sh_input_line_state_t *
8479 save_input_line_state (ls)
8480      sh_input_line_state_t *ls;
8481 {
8482   if (ls == 0)
8483     ls = (sh_input_line_state_t *)xmalloc (sizeof (sh_input_line_state_t));
8484   if (ls == 0)
8485     return ((sh_input_line_state_t *)NULL);
8486
8487   ls->input_line = shell_input_line;
8488   ls->input_line_size = shell_input_line_size;
8489   ls->input_line_len = shell_input_line_len;
8490   ls->input_line_index = shell_input_line_index;
8491
8492   /* force reallocation */
8493   shell_input_line = 0;
8494   shell_input_line_size = shell_input_line_len = shell_input_line_index = 0;
8495
8496   return ls;
8497 }
8498
8499 void
8500 restore_input_line_state (ls)
8501      sh_input_line_state_t *ls;
8502 {
8503   FREE (shell_input_line);
8504   shell_input_line = ls->input_line;
8505   shell_input_line_size = ls->input_line_size;
8506   shell_input_line_len = ls->input_line_len;
8507   shell_input_line_index = ls->input_line_index;
8508
8509   set_line_mbstate ();
8510 }
8511
8512 /************************************************
8513  *                                              *
8514  *      MULTIBYTE CHARACTER HANDLING            *
8515  *                                              *
8516  ************************************************/
8517
8518 #if defined (HANDLE_MULTIBYTE)
8519 static void
8520 set_line_mbstate ()
8521 {
8522   int c;
8523   size_t i, previ, len;
8524   mbstate_t mbs, prevs;
8525   size_t mbclen;
8526
8527   if (shell_input_line == NULL)
8528     return;
8529   len = strlen (shell_input_line);      /* XXX - shell_input_line_len ? */
8530   FREE (shell_input_line_property);
8531   shell_input_line_property = (char *)xmalloc (len + 1);
8532
8533   memset (&prevs, '\0', sizeof (mbstate_t));
8534   for (i = previ = 0; i < len; i++)
8535     {
8536       mbs = prevs;
8537
8538       c = shell_input_line[i];
8539       if (c == EOF)
8540         {
8541           size_t j;
8542           for (j = i; j < len; j++)
8543             shell_input_line_property[j] = 1;
8544           break;
8545         }
8546
8547       mbclen = mbrlen (shell_input_line + previ, i - previ + 1, &mbs);
8548       if (mbclen == 1 || mbclen == (size_t)-1)
8549         {
8550           mbclen = 1;
8551           previ = i + 1;
8552         }
8553       else if (mbclen == (size_t)-2)
8554         mbclen = 0;
8555       else if (mbclen > 1)
8556         {
8557           mbclen = 0;
8558           previ = i + 1;
8559           prevs = mbs;
8560         }
8561       else
8562         {
8563           /* XXX - what to do if mbrlen returns 0? (null wide character) */
8564           size_t j;
8565           for (j = i; j < len; j++)
8566             shell_input_line_property[j] = 1;
8567           break;
8568         }
8569
8570       shell_input_line_property[i] = mbclen;
8571     }
8572 }
8573 #endif /* HANDLE_MULTIBYTE */
8574