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