1 /* parse.y - Yacc grammar for bash. */
3 /* Copyright (C) 1989-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
24 #include "bashtypes.h"
29 #if defined (HAVE_UNISTD_H)
33 #if defined (HAVE_LOCALE_H)
38 #include "chartypes.h"
45 #define NEED_STRFTIME_DECL /* used in externs.h */
51 #include "mailcheck.h"
54 #include "builtins/common.h"
55 #include "builtins/builtext.h"
59 #if defined (READLINE)
60 # include "bashline.h"
61 # include <readline/readline.h>
65 # include "bashhist.h"
66 # include <readline/history.h>
69 #if defined (JOB_CONTROL)
71 #endif /* JOB_CONTROL */
76 typedef void *alias_t;
79 #if defined (PROMPT_STRING_DECODE)
81 # include <sys/param.h>
84 # if defined (TM_IN_SYS_TIME)
85 # include <sys/types.h>
86 # include <sys/time.h>
87 # endif /* TM_IN_SYS_TIME */
89 #endif /* PROMPT_STRING_DECODE */
91 #define RE_READ_TOKEN -99
92 #define NO_EXPANSION -100
100 #if defined (HANDLE_MULTIBYTE)
101 # define last_shell_getc_is_singlebyte \
102 ((shell_input_line_index > 1) \
103 ? shell_input_line_property[shell_input_line_index - 1] \
105 # define MBTEST(x) ((x) && last_shell_getc_is_singlebyte)
107 # define last_shell_getc_is_singlebyte 1
108 # define MBTEST(x) ((x))
111 #if defined (EXTENDED_GLOB)
112 extern int extended_glob;
115 extern int eof_encountered;
116 extern int no_line_editing, running_under_emacs;
117 extern int current_command_number;
118 extern int sourcelevel, parse_and_execute_level;
119 extern int posixly_correct;
120 extern int last_command_exit_value;
121 extern pid_t last_command_subst_pid;
122 extern char *shell_name, *current_host_name;
123 extern char *dist_version;
124 extern int patch_level;
125 extern int dump_translatable_strings, dump_po_strings;
126 extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
127 #if defined (BUFFERED_INPUT)
128 extern int bash_input_fd_changed;
132 /* **************************************************************** */
134 /* "Forward" declarations */
136 /* **************************************************************** */
139 static void debug_parser __P((int));
142 static int yy_getc __P((void));
143 static int yy_ungetc __P((int));
145 #if defined (READLINE)
146 static int yy_readline_get __P((void));
147 static int yy_readline_unget __P((int));
150 static int yy_string_get __P((void));
151 static int yy_string_unget __P((int));
152 static void rewind_input_string __P((void));
153 static int yy_stream_get __P((void));
154 static int yy_stream_unget __P((int));
156 static int shell_getc __P((int));
157 static void shell_ungetc __P((int));
158 static void discard_until __P((int));
160 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
161 static void push_string __P((char *, int, alias_t *));
162 static void pop_string __P((void));
163 static void free_string_list __P((void));
166 static char *read_a_line __P((int));
168 static int reserved_word_acceptable __P((int));
169 static int yylex __P((void));
170 static int alias_expand_token __P((char *));
171 static int time_command_acceptable __P((void));
172 static int special_case_tokens __P((char *));
173 static int read_token __P((int));
174 static char *parse_matched_pair __P((int, int, int, int *, int));
175 static char *parse_comsub __P((int, int, int, int *, int));
176 #if defined (ARRAY_VARS)
177 static char *parse_compound_assignment __P((int *));
179 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
180 static int parse_dparen __P((int));
181 static int parse_arith_cmd __P((char **, int));
183 #if defined (COND_COMMAND)
184 static void cond_error __P((void));
185 static COND_COM *cond_expr __P((void));
186 static COND_COM *cond_or __P((void));
187 static COND_COM *cond_and __P((void));
188 static COND_COM *cond_term __P((void));
189 static int cond_skip_newlines __P((void));
190 static COMMAND *parse_cond_command __P((void));
192 #if defined (ARRAY_VARS)
193 static int token_is_assignment __P((char *, int));
194 static int token_is_ident __P((char *, int));
196 static int read_token_word __P((int));
197 static void discard_parser_constructs __P((int));
199 static char *error_token_from_token __P((int));
200 static char *error_token_from_text __P((void));
201 static void print_offending_line __P((void));
202 static void report_syntax_error __P((char *));
204 static void handle_eof_input_unit __P((void));
205 static void prompt_again __P((void));
207 static void reset_readline_prompt __P((void));
209 static void print_prompt __P((void));
211 #if defined (HANDLE_MULTIBYTE)
212 static void set_line_mbstate __P((void));
213 static char *shell_input_line_property = NULL;
215 # define set_line_mbstate()
218 extern int yyerror __P((const char *));
224 /* Default prompt strings */
225 char *primary_prompt = PPROMPT;
226 char *secondary_prompt = SPROMPT;
228 /* PROMPT_STRING_POINTER points to one of these, never to an actual string. */
229 char *ps1_prompt, *ps2_prompt;
231 /* Handle on the current prompt string. Indirectly points through
232 ps1_ or ps2_prompt. */
233 char **prompt_string_pointer = (char **)NULL;
234 char *current_prompt_string;
236 /* Non-zero means we expand aliases in commands. */
237 int expand_aliases = 0;
239 /* If non-zero, the decoded prompt string undergoes parameter and
240 variable substitution, command substitution, arithmetic substitution,
241 string expansion, process substitution, and quote removal in
242 decode_prompt_string. */
245 /* If non-zero, $'...' and $"..." are expanded when they appear within
246 a ${...} expansion, even when the expansion appears within double
248 int extended_quote = 1;
250 /* The number of lines read from input while creating the current command. */
251 int current_command_line_count;
253 /* The token that currently denotes the end of parse. */
256 /* The token currently being read. */
259 /* The current parser state. */
262 /* Variables to manage the task of reading here documents, because we need to
263 defer the reading until after a complete command has been collected. */
264 static REDIRECT *redir_stack[10];
267 /* Where shell input comes from. History expansion is performed on each
268 line when the shell is interactive. */
269 static char *shell_input_line = (char *)NULL;
270 static int shell_input_line_index;
271 static int shell_input_line_size; /* Amount allocated for shell_input_line. */
272 static int shell_input_line_len; /* strlen (shell_input_line) */
274 /* Either zero or EOF. */
275 static int shell_input_line_terminator;
277 /* The line number in a script on which a function definition starts. */
278 static int function_dstart;
280 /* The line number in a script on which a function body starts. */
281 static int function_bstart;
283 /* The line number in a script at which an arithmetic for command starts. */
284 static int arith_for_lineno;
286 /* The decoded prompt string. Used if READLINE is not defined or if
287 editing is turned off. Analogous to current_readline_prompt. */
288 static char *current_decoded_prompt;
290 /* The last read token, or NULL. read_token () uses this for context
292 static int last_read_token;
294 /* The token read prior to last_read_token. */
295 static int token_before_that;
297 /* The token read prior to token_before_that. */
298 static int two_tokens_ago;
300 static int global_extglob;
302 /* The line number in a script where the word in a `case WORD', `select WORD'
303 or `for WORD' begins. This is a nested command maximum, since the array
304 index is decremented after a case, select, or for command is parsed. */
305 #define MAX_CASE_NEST 128
306 static int word_lineno[MAX_CASE_NEST];
307 static int word_top = -1;
309 /* If non-zero, it is the token that we want read_token to return
310 regardless of what text is (or isn't) present to be read. This
311 is reset by read_token. If token_to_read == WORD or
312 ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */
313 static int token_to_read;
314 static WORD_DESC *word_desc_to_read;
316 static REDIRECTEE source;
317 static REDIRECTEE redir;
321 WORD_DESC *word; /* the word that we read. */
322 int number; /* the number that we read. */
323 WORD_LIST *word_list;
327 PATTERN_LIST *pattern;
330 /* Reserved words. Members of the first group are only recognized
331 in the case that they are preceded by a list_terminator. Members
332 of the second group are for [[...]] commands. Members of the
333 third group are recognized only under special circumstances. */
334 %token IF THEN ELSE ELIF FI CASE ESAC FOR SELECT WHILE UNTIL DO DONE FUNCTION COPROC
335 %token COND_START COND_END COND_ERROR
336 %token IN BANG TIME TIMEOPT
338 /* More general tokens. yylex () knows how to make these. */
339 %token <word> WORD ASSIGNMENT_WORD REDIR_WORD
340 %token <number> NUMBER
341 %token <word_list> ARITH_CMD ARITH_FOR_EXPRS
342 %token <command> COND_CMD
343 %token AND_AND OR_OR GREATER_GREATER LESS_LESS LESS_AND LESS_LESS_LESS
344 %token GREATER_AND SEMI_SEMI SEMI_AND SEMI_SEMI_AND
345 %token LESS_LESS_MINUS AND_GREATER AND_GREATER_GREATER LESS_GREATER
346 %token GREATER_BAR BAR_AND
348 /* The types that the various syntactical units return. */
350 %type <command> inputunit command pipeline pipeline_command
351 %type <command> list list0 list1 compound_list simple_list simple_list1
352 %type <command> simple_command shell_command
353 %type <command> for_command select_command case_command group_command
354 %type <command> arith_command
355 %type <command> cond_command
356 %type <command> arith_for_command
357 %type <command> coproc
358 %type <command> function_def function_body if_command elif_clause subshell
359 %type <redirect> redirection redirection_list
360 %type <element> simple_command_element
361 %type <word_list> word_list pattern
362 %type <pattern> pattern_list case_clause_sequence case_clause
363 %type <number> timespec
364 %type <number> list_terminator
368 %left '&' ';' '\n' yacc_EOF
373 inputunit: simple_list simple_list_terminator
375 /* Case of regular command. Discard the error
376 safety net,and return the command just parsed. */
379 /* discard_parser_constructs (0); */
380 if (parser_state & PST_CMDSUBST)
381 parser_state |= PST_EOFTOKEN;
386 /* Case of regular command, but not a very
387 interesting one. Return a NULL command. */
388 global_command = (COMMAND *)NULL;
389 if (parser_state & PST_CMDSUBST)
390 parser_state |= PST_EOFTOKEN;
395 /* Error during parsing. Return NULL command. */
396 global_command = (COMMAND *)NULL;
398 /* discard_parser_constructs (1); */
399 if (interactive && parse_and_execute_level == 0)
410 /* Case of EOF seen by itself. Do ignoreeof or
412 global_command = (COMMAND *)NULL;
413 handle_eof_input_unit ();
419 { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
421 { $$ = make_word_list ($2, $1); }
424 redirection: '>' WORD
428 $$ = make_redirection (source, r_output_direction, redir, 0);
434 $$ = make_redirection (source, r_input_direction, redir, 0);
440 $$ = make_redirection (source, r_output_direction, redir, 0);
446 $$ = make_redirection (source, r_input_direction, redir, 0);
448 | REDIR_WORD '>' WORD
450 source.filename = $1;
452 $$ = make_redirection (source, r_output_direction, redir, REDIR_VARASSIGN);
454 | REDIR_WORD '<' WORD
456 source.filename = $1;
458 $$ = make_redirection (source, r_input_direction, redir, REDIR_VARASSIGN);
460 | GREATER_GREATER WORD
464 $$ = make_redirection (source, r_appending_to, redir, 0);
466 | NUMBER GREATER_GREATER WORD
470 $$ = make_redirection (source, r_appending_to, redir, 0);
472 | REDIR_WORD GREATER_GREATER WORD
474 source.filename = $1;
476 $$ = make_redirection (source, r_appending_to, redir, REDIR_VARASSIGN);
482 $$ = make_redirection (source, r_output_force, redir, 0);
484 | NUMBER GREATER_BAR WORD
488 $$ = make_redirection (source, r_output_force, redir, 0);
490 | REDIR_WORD GREATER_BAR WORD
492 source.filename = $1;
494 $$ = make_redirection (source, r_output_force, redir, REDIR_VARASSIGN);
500 $$ = make_redirection (source, r_input_output, redir, 0);
502 | NUMBER LESS_GREATER WORD
506 $$ = make_redirection (source, r_input_output, redir, 0);
508 | REDIR_WORD LESS_GREATER WORD
510 source.filename = $1;
512 $$ = make_redirection (source, r_input_output, redir, REDIR_VARASSIGN);
518 $$ = make_redirection (source, r_reading_until, redir, 0);
519 redir_stack[need_here_doc++] = $$;
521 | NUMBER LESS_LESS WORD
525 $$ = make_redirection (source, r_reading_until, redir, 0);
526 redir_stack[need_here_doc++] = $$;
528 | REDIR_WORD LESS_LESS WORD
530 source.filename = $1;
532 $$ = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
533 redir_stack[need_here_doc++] = $$;
535 | LESS_LESS_MINUS WORD
539 $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
540 redir_stack[need_here_doc++] = $$;
542 | NUMBER LESS_LESS_MINUS WORD
546 $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
547 redir_stack[need_here_doc++] = $$;
549 | REDIR_WORD LESS_LESS_MINUS WORD
551 source.filename = $1;
553 $$ = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
554 redir_stack[need_here_doc++] = $$;
556 | LESS_LESS_LESS WORD
560 $$ = make_redirection (source, r_reading_string, redir, 0);
562 | NUMBER LESS_LESS_LESS WORD
566 $$ = make_redirection (source, r_reading_string, redir, 0);
568 | REDIR_WORD LESS_LESS_LESS WORD
570 source.filename = $1;
572 $$ = make_redirection (source, r_reading_string, redir, REDIR_VARASSIGN);
578 $$ = make_redirection (source, r_duplicating_input, redir, 0);
580 | NUMBER LESS_AND NUMBER
584 $$ = make_redirection (source, r_duplicating_input, redir, 0);
586 | REDIR_WORD LESS_AND NUMBER
588 source.filename = $1;
590 $$ = make_redirection (source, r_duplicating_input, redir, REDIR_VARASSIGN);
596 $$ = make_redirection (source, r_duplicating_output, redir, 0);
598 | NUMBER GREATER_AND NUMBER
602 $$ = make_redirection (source, r_duplicating_output, redir, 0);
604 | REDIR_WORD GREATER_AND NUMBER
606 source.filename = $1;
608 $$ = make_redirection (source, r_duplicating_output, redir, REDIR_VARASSIGN);
614 $$ = make_redirection (source, r_duplicating_input_word, redir, 0);
616 | NUMBER LESS_AND WORD
620 $$ = make_redirection (source, r_duplicating_input_word, redir, 0);
622 | REDIR_WORD LESS_AND WORD
624 source.filename = $1;
626 $$ = make_redirection (source, r_duplicating_input_word, redir, REDIR_VARASSIGN);
632 $$ = make_redirection (source, r_duplicating_output_word, redir, 0);
634 | NUMBER GREATER_AND WORD
638 $$ = make_redirection (source, r_duplicating_output_word, redir, 0);
640 | REDIR_WORD GREATER_AND WORD
642 source.filename = $1;
644 $$ = make_redirection (source, r_duplicating_output_word, redir, REDIR_VARASSIGN);
650 $$ = make_redirection (source, r_close_this, redir, 0);
652 | NUMBER GREATER_AND '-'
656 $$ = make_redirection (source, r_close_this, redir, 0);
658 | REDIR_WORD GREATER_AND '-'
660 source.filename = $1;
662 $$ = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN);
668 $$ = make_redirection (source, r_close_this, redir, 0);
670 | NUMBER LESS_AND '-'
674 $$ = make_redirection (source, r_close_this, redir, 0);
676 | REDIR_WORD LESS_AND '-'
678 source.filename = $1;
680 $$ = make_redirection (source, r_close_this, redir, REDIR_VARASSIGN);
686 $$ = make_redirection (source, r_err_and_out, redir, 0);
688 | AND_GREATER_GREATER WORD
692 $$ = make_redirection (source, r_append_err_and_out, redir, 0);
696 simple_command_element: WORD
697 { $$.word = $1; $$.redirect = 0; }
699 { $$.word = $1; $$.redirect = 0; }
701 { $$.redirect = $1; $$.word = 0; }
704 redirection_list: redirection
708 | redirection_list redirection
710 register REDIRECT *t;
712 for (t = $1; t->next; t = t->next)
719 simple_command: simple_command_element
720 { $$ = make_simple_command ($1, (COMMAND *)NULL); }
721 | simple_command simple_command_element
722 { $$ = make_simple_command ($2, $1); }
725 command: simple_command
726 { $$ = clean_simple_command ($1); }
729 | shell_command redirection_list
736 register REDIRECT *t;
737 for (t = tc->redirects; t->next; t = t->next)
751 shell_command: for_command
755 | WHILE compound_list DO compound_list DONE
756 { $$ = make_while_command ($2, $4); }
757 | UNTIL compound_list DO compound_list DONE
758 { $$ = make_until_command ($2, $4); }
775 for_command: FOR WORD newline_list DO compound_list DONE
777 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
778 if (word_top > 0) word_top--;
780 | FOR WORD newline_list '{' compound_list '}'
782 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
783 if (word_top > 0) word_top--;
785 | FOR WORD ';' newline_list DO compound_list DONE
787 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
788 if (word_top > 0) word_top--;
790 | FOR WORD ';' newline_list '{' compound_list '}'
792 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
793 if (word_top > 0) word_top--;
795 | FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE
797 $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
798 if (word_top > 0) word_top--;
800 | FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}'
802 $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
803 if (word_top > 0) word_top--;
805 | FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE
807 $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
808 if (word_top > 0) word_top--;
810 | FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}'
812 $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
813 if (word_top > 0) word_top--;
817 arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_list DONE
819 $$ = make_arith_for_command ($2, $6, arith_for_lineno);
820 if (word_top > 0) word_top--;
822 | FOR ARITH_FOR_EXPRS list_terminator newline_list '{' compound_list '}'
824 $$ = make_arith_for_command ($2, $6, arith_for_lineno);
825 if (word_top > 0) word_top--;
827 | FOR ARITH_FOR_EXPRS DO compound_list DONE
829 $$ = make_arith_for_command ($2, $4, arith_for_lineno);
830 if (word_top > 0) word_top--;
832 | FOR ARITH_FOR_EXPRS '{' compound_list '}'
834 $$ = make_arith_for_command ($2, $4, arith_for_lineno);
835 if (word_top > 0) word_top--;
839 select_command: SELECT WORD newline_list DO list DONE
841 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
842 if (word_top > 0) word_top--;
844 | SELECT WORD newline_list '{' list '}'
846 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
847 if (word_top > 0) word_top--;
849 | SELECT WORD ';' newline_list DO list DONE
851 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
852 if (word_top > 0) word_top--;
854 | SELECT WORD ';' newline_list '{' list '}'
856 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
857 if (word_top > 0) word_top--;
859 | SELECT WORD newline_list IN word_list list_terminator newline_list DO list DONE
861 $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
862 if (word_top > 0) word_top--;
864 | SELECT WORD newline_list IN word_list list_terminator newline_list '{' list '}'
866 $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
867 if (word_top > 0) word_top--;
871 case_command: CASE WORD newline_list IN newline_list ESAC
873 $$ = make_case_command ($2, (PATTERN_LIST *)NULL, word_lineno[word_top]);
874 if (word_top > 0) word_top--;
876 | CASE WORD newline_list IN case_clause_sequence newline_list ESAC
878 $$ = make_case_command ($2, $5, word_lineno[word_top]);
879 if (word_top > 0) word_top--;
881 | CASE WORD newline_list IN case_clause ESAC
883 $$ = make_case_command ($2, $5, word_lineno[word_top]);
884 if (word_top > 0) word_top--;
888 function_def: WORD '(' ')' newline_list function_body
889 { $$ = make_function_def ($1, $5, function_dstart, function_bstart); }
891 | FUNCTION WORD '(' ')' newline_list function_body
892 { $$ = make_function_def ($2, $6, function_dstart, function_bstart); }
894 | FUNCTION WORD newline_list function_body
895 { $$ = make_function_def ($2, $4, function_dstart, function_bstart); }
898 function_body: shell_command
900 | shell_command redirection_list
905 /* According to Posix.2 3.9.5, redirections
906 specified after the body of a function should
907 be attached to the function and performed when
908 the function is executed, not as part of the
909 function definition command. */
910 /* XXX - I don't think it matters, but we might
911 want to change this in the future to avoid
912 problems differentiating between a function
913 definition with a redirection and a function
914 definition containing a single command with a
915 redirection. The two are semantically equivalent,
916 though -- the only difference is in how the
917 command printing code displays the redirections. */
920 register REDIRECT *t;
921 for (t = tc->redirects; t->next; t = t->next)
931 subshell: '(' compound_list ')'
933 $$ = make_subshell_command ($2);
934 $$->flags |= CMD_WANT_SUBSHELL;
938 coproc: COPROC shell_command
940 $$ = make_coproc_command ("COPROC", $2);
941 $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
943 | COPROC shell_command redirection_list
950 register REDIRECT *t;
951 for (t = tc->redirects; t->next; t = t->next)
957 $$ = make_coproc_command ("COPROC", $2);
958 $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
960 | COPROC WORD shell_command
962 $$ = make_coproc_command ($2->word, $3);
963 $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
965 | COPROC WORD shell_command redirection_list
972 register REDIRECT *t;
973 for (t = tc->redirects; t->next; t = t->next)
979 $$ = make_coproc_command ($2->word, $3);
980 $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
982 | COPROC simple_command
984 $$ = make_coproc_command ("COPROC", clean_simple_command ($2));
985 $$->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
989 if_command: IF compound_list THEN compound_list FI
990 { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
991 | IF compound_list THEN compound_list ELSE compound_list FI
992 { $$ = make_if_command ($2, $4, $6); }
993 | IF compound_list THEN compound_list elif_clause FI
994 { $$ = make_if_command ($2, $4, $5); }
998 group_command: '{' compound_list '}'
999 { $$ = make_group_command ($2); }
1002 arith_command: ARITH_CMD
1003 { $$ = make_arith_command ($1); }
1006 cond_command: COND_START COND_CMD COND_END
1010 elif_clause: ELIF compound_list THEN compound_list
1011 { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
1012 | ELIF compound_list THEN compound_list ELSE compound_list
1013 { $$ = make_if_command ($2, $4, $6); }
1014 | ELIF compound_list THEN compound_list elif_clause
1015 { $$ = make_if_command ($2, $4, $5); }
1018 case_clause: pattern_list
1019 | case_clause_sequence pattern_list
1020 { $2->next = $1; $$ = $2; }
1023 pattern_list: newline_list pattern ')' compound_list
1024 { $$ = make_pattern_list ($2, $4); }
1025 | newline_list pattern ')' newline_list
1026 { $$ = make_pattern_list ($2, (COMMAND *)NULL); }
1027 | newline_list '(' pattern ')' compound_list
1028 { $$ = make_pattern_list ($3, $5); }
1029 | newline_list '(' pattern ')' newline_list
1030 { $$ = make_pattern_list ($3, (COMMAND *)NULL); }
1033 case_clause_sequence: pattern_list SEMI_SEMI
1035 | case_clause_sequence pattern_list SEMI_SEMI
1036 { $2->next = $1; $$ = $2; }
1037 | pattern_list SEMI_AND
1038 { $1->flags |= CASEPAT_FALLTHROUGH; $$ = $1; }
1039 | case_clause_sequence pattern_list SEMI_AND
1040 { $2->flags |= CASEPAT_FALLTHROUGH; $2->next = $1; $$ = $2; }
1041 | pattern_list SEMI_SEMI_AND
1042 { $1->flags |= CASEPAT_TESTNEXT; $$ = $1; }
1043 | case_clause_sequence pattern_list SEMI_SEMI_AND
1044 { $2->flags |= CASEPAT_TESTNEXT; $2->next = $1; $$ = $2; }
1048 { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
1050 { $$ = make_word_list ($3, $1); }
1053 /* A list allows leading or trailing newlines and
1054 newlines as operators (equivalent to semicolons).
1055 It must end with a newline or semicolon.
1056 Lists are used within commands such as if, for, while. */
1058 list: newline_list list0
1062 gather_here_documents ();
1067 | newline_list list1
1073 list0: list1 '\n' newline_list
1074 | list1 '&' newline_list
1076 if ($1->type == cm_connection)
1077 $$ = connect_async_list ($1, (COMMAND *)NULL, '&');
1079 $$ = command_connect ($1, (COMMAND *)NULL, '&');
1081 | list1 ';' newline_list
1085 list1: list1 AND_AND newline_list list1
1086 { $$ = command_connect ($1, $4, AND_AND); }
1087 | list1 OR_OR newline_list list1
1088 { $$ = command_connect ($1, $4, OR_OR); }
1089 | list1 '&' newline_list list1
1091 if ($1->type == cm_connection)
1092 $$ = connect_async_list ($1, $4, '&');
1094 $$ = command_connect ($1, $4, '&');
1096 | list1 ';' newline_list list1
1097 { $$ = command_connect ($1, $4, ';'); }
1098 | list1 '\n' newline_list list1
1099 { $$ = command_connect ($1, $4, ';'); }
1104 simple_list_terminator: '\n'
1108 list_terminator:'\n'
1120 /* A simple_list is a list that contains no significant newlines
1121 and no leading or trailing newlines. Newlines are allowed
1122 only following operators, where they are not significant.
1124 This is what an inputunit consists of. */
1126 simple_list: simple_list1
1130 gather_here_documents ();
1131 if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token)
1133 global_command = $1;
1134 eof_encountered = 0;
1135 rewind_input_string ();
1141 if ($1->type == cm_connection)
1142 $$ = connect_async_list ($1, (COMMAND *)NULL, '&');
1144 $$ = command_connect ($1, (COMMAND *)NULL, '&');
1146 gather_here_documents ();
1147 if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token)
1149 global_command = $1;
1150 eof_encountered = 0;
1151 rewind_input_string ();
1159 gather_here_documents ();
1160 if ((parser_state & PST_CMDSUBST) && current_token == shell_eof_token)
1162 global_command = $1;
1163 eof_encountered = 0;
1164 rewind_input_string ();
1170 simple_list1: simple_list1 AND_AND newline_list simple_list1
1171 { $$ = command_connect ($1, $4, AND_AND); }
1172 | simple_list1 OR_OR newline_list simple_list1
1173 { $$ = command_connect ($1, $4, OR_OR); }
1174 | simple_list1 '&' simple_list1
1176 if ($1->type == cm_connection)
1177 $$ = connect_async_list ($1, $3, '&');
1179 $$ = command_connect ($1, $3, '&');
1181 | simple_list1 ';' simple_list1
1182 { $$ = command_connect ($1, $3, ';'); }
1188 pipeline_command: pipeline
1193 $2->flags |= CMD_INVERT_RETURN;
1202 | timespec BANG pipeline
1205 $3->flags |= $1|CMD_INVERT_RETURN;
1208 | BANG timespec pipeline
1211 $3->flags |= $2|CMD_INVERT_RETURN;
1214 | timespec list_terminator
1218 /* Boy, this is unclean. `time' by itself can
1219 time a null command. We cheat and push a
1220 newline back if the list_terminator was a newline
1221 to avoid the double-newline problem (one to
1222 terminate this, one to terminate the command) */
1225 $$ = make_simple_command (x, (COMMAND *)NULL);
1227 /* XXX - let's cheat and push a newline back */
1229 token_to_read = '\n';
1234 pipeline: pipeline '|' newline_list pipeline
1235 { $$ = command_connect ($1, $4, '|'); }
1236 | pipeline BAR_AND newline_list pipeline
1238 /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
1243 tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
1246 r = make_redirection (sd, r_duplicating_output, rd, 0);
1249 register REDIRECT *t;
1250 for (t = tc->redirects; t->next; t = t->next)
1257 $$ = command_connect ($1, $4, '|');
1264 { $$ = CMD_TIME_PIPELINE; }
1266 { $$ = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
1270 /* Initial size to allocate for tokens, and the
1271 amount to grow them by. */
1272 #define TOKEN_DEFAULT_INITIAL_SIZE 496
1273 #define TOKEN_DEFAULT_GROW_SIZE 512
1275 /* Should we call prompt_again? */
1276 #define SHOULD_PROMPT() \
1277 (interactive && (bash_input.type == st_stdin || bash_input.type == st_stream))
1280 # define expanding_alias() (pushed_string_list && pushed_string_list->expander)
1282 # define expanding_alias() 0
1285 /* Global var is non-zero when end of file has been reached. */
1286 int EOF_Reached = 0;
1299 /* yy_getc () returns the next available character from input or EOF.
1300 yy_ungetc (c) makes `c' the next character to read.
1301 init_yy_io (get, unget, type, location) makes the function GET the
1302 installed function for getting the next character, makes UNGET the
1303 installed function for un-getting a character, sets the type of stream
1304 (either string or file) from TYPE, and makes LOCATION point to where
1305 the input is coming from. */
1307 /* Unconditionally returns end-of-file. */
1314 /* Variable containing the current get and unget functions.
1315 See ./input.h for a clearer description. */
1316 BASH_INPUT bash_input;
1318 /* Set all of the fields in BASH_INPUT to NULL. Free bash_input.name if it
1319 is non-null, avoiding a memory leak. */
1321 initialize_bash_input ()
1323 bash_input.type = st_none;
1324 FREE (bash_input.name);
1325 bash_input.name = (char *)NULL;
1326 bash_input.location.file = (FILE *)NULL;
1327 bash_input.location.string = (char *)NULL;
1328 bash_input.getter = (sh_cget_func_t *)NULL;
1329 bash_input.ungetter = (sh_cunget_func_t *)NULL;
1332 /* Set the contents of the current bash input stream from
1333 GET, UNGET, TYPE, NAME, and LOCATION. */
1335 init_yy_io (get, unget, type, name, location)
1336 sh_cget_func_t *get;
1337 sh_cunget_func_t *unget;
1338 enum stream_type type;
1340 INPUT_STREAM location;
1342 bash_input.type = type;
1343 FREE (bash_input.name);
1344 bash_input.name = name ? savestring (name) : (char *)NULL;
1348 memcpy((char *)&bash_input.location.string, (char *)&location.string, sizeof(location));
1350 bash_input.location = location;
1352 bash_input.getter = get;
1353 bash_input.ungetter = unget;
1359 return (bash_input.name ? bash_input.name : "stdin");
1362 /* Call this to get the next character of input. */
1366 return (*(bash_input.getter)) ();
1369 /* Call this to unget C. That is, to make C the next character
1375 return (*(bash_input.ungetter)) (c);
1378 #if defined (BUFFERED_INPUT)
1379 #ifdef INCLUDE_UNUSED
1381 input_file_descriptor ()
1383 switch (bash_input.type)
1386 return (fileno (bash_input.location.file));
1388 return (bash_input.location.buffered_fd);
1391 return (fileno (stdin));
1395 #endif /* BUFFERED_INPUT */
1397 /* **************************************************************** */
1399 /* Let input be read from readline (). */
1401 /* **************************************************************** */
1403 #if defined (READLINE)
1404 char *current_readline_prompt = (char *)NULL;
1405 char *current_readline_line = (char *)NULL;
1406 int current_readline_line_index = 0;
1411 SigHandler *old_sigint;
1415 if (!current_readline_line)
1417 if (!bash_readline_initialized)
1418 initialize_readline ();
1420 #if defined (JOB_CONTROL)
1422 give_terminal_to (shell_pgrp, 0);
1423 #endif /* JOB_CONTROL */
1425 old_sigint = (SigHandler *)NULL;
1426 if (signal_is_ignored (SIGINT) == 0)
1428 old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
1429 interrupt_immediately++;
1431 terminate_immediately = 1;
1433 current_readline_line = readline (current_readline_prompt ?
1434 current_readline_prompt : "");
1436 terminate_immediately = 0;
1437 if (signal_is_ignored (SIGINT) == 0 && old_sigint)
1439 interrupt_immediately--;
1440 set_signal_handler (SIGINT, old_sigint);
1444 /* Reset the prompt to the decoded value of prompt_string_pointer. */
1445 reset_readline_prompt ();
1448 if (current_readline_line == 0)
1451 current_readline_line_index = 0;
1452 line_len = strlen (current_readline_line);
1454 current_readline_line = (char *)xrealloc (current_readline_line, 2 + line_len);
1455 current_readline_line[line_len++] = '\n';
1456 current_readline_line[line_len] = '\0';
1459 if (current_readline_line[current_readline_line_index] == 0)
1461 free (current_readline_line);
1462 current_readline_line = (char *)NULL;
1463 return (yy_readline_get ());
1467 c = current_readline_line[current_readline_line_index++];
1473 yy_readline_unget (c)
1476 if (current_readline_line_index && current_readline_line)
1477 current_readline_line[--current_readline_line_index] = c;
1482 with_input_from_stdin ()
1484 INPUT_STREAM location;
1486 if (bash_input.type != st_stdin && stream_on_stack (st_stdin) == 0)
1488 location.string = current_readline_line;
1489 init_yy_io (yy_readline_get, yy_readline_unget,
1490 st_stdin, "readline stdin", location);
1494 #else /* !READLINE */
1497 with_input_from_stdin ()
1499 with_input_from_stream (stdin, "stdin");
1501 #endif /* !READLINE */
1503 /* **************************************************************** */
1505 /* Let input come from STRING. STRING is zero terminated. */
1507 /* **************************************************************** */
1512 register char *string;
1513 register unsigned char c;
1515 string = bash_input.location.string;
1517 /* If the string doesn't exist, or is empty, EOF found. */
1518 if (string && *string)
1521 bash_input.location.string = string;
1532 *(--bash_input.location.string) = c;
1537 with_input_from_string (string, name)
1541 INPUT_STREAM location;
1543 location.string = string;
1544 init_yy_io (yy_string_get, yy_string_unget, st_string, name, location);
1547 /* Count the number of characters we've consumed from bash_input.location.string
1548 and read into shell_input_line, but have not returned from shell_getc.
1549 That is the true input location. Rewind bash_input.location.string by
1550 that number of characters, so it points to the last character actually
1551 consumed by the parser. */
1553 rewind_input_string ()
1557 /* number of unconsumed characters in the input -- XXX need to take newlines
1558 into account, e.g., $(...\n) */
1559 xchars = shell_input_line_len - shell_input_line_index;
1560 if (bash_input.location.string[-1] == '\n')
1563 /* XXX - how to reflect bash_input.location.string back to string passed to
1564 parse_and_execute or xparse_dolparen? xparse_dolparen needs to know how
1565 far into the string we parsed. parse_and_execute knows where bash_input.
1566 location.string is, and how far from orig_string that is -- that's the
1567 number of characters the command consumed. */
1569 /* bash_input.location.string - xchars should be where we parsed to */
1570 /* need to do more validation on xchars value for sanity -- test cases. */
1571 bash_input.location.string -= xchars;
1574 /* **************************************************************** */
1576 /* Let input come from STREAM. */
1578 /* **************************************************************** */
1580 /* These two functions used to test the value of the HAVE_RESTARTABLE_SYSCALLS
1581 define, and just use getc/ungetc if it was defined, but since bash
1582 installs its signal handlers without the SA_RESTART flag, some signals
1583 (like SIGCHLD, SIGWINCH, etc.) received during a read(2) will not cause
1584 the read to be restarted. We need to restart it ourselves. */
1592 if (bash_input.location.file)
1596 interrupt_immediately++;
1597 terminate_immediately++;
1599 result = getc_with_restart (bash_input.location.file);
1602 interrupt_immediately--;
1603 terminate_immediately--;
1613 return (ungetc_with_restart (c, bash_input.location.file));
1617 with_input_from_stream (stream, name)
1621 INPUT_STREAM location;
1623 location.file = stream;
1624 init_yy_io (yy_stream_get, yy_stream_unget, st_stream, name, location);
1627 typedef struct stream_saver {
1628 struct stream_saver *next;
1629 BASH_INPUT bash_input;
1631 #if defined (BUFFERED_INPUT)
1632 BUFFERED_STREAM *bstream;
1633 #endif /* BUFFERED_INPUT */
1636 /* The globally known line number. */
1637 int line_number = 0;
1639 #if defined (COND_COMMAND)
1640 static int cond_lineno;
1641 static int cond_token;
1644 STREAM_SAVER *stream_list = (STREAM_SAVER *)NULL;
1647 push_stream (reset_lineno)
1650 STREAM_SAVER *saver = (STREAM_SAVER *)xmalloc (sizeof (STREAM_SAVER));
1652 xbcopy ((char *)&bash_input, (char *)&(saver->bash_input), sizeof (BASH_INPUT));
1654 #if defined (BUFFERED_INPUT)
1655 saver->bstream = (BUFFERED_STREAM *)NULL;
1656 /* If we have a buffered stream, clear out buffers[fd]. */
1657 if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
1658 saver->bstream = set_buffered_stream (bash_input.location.buffered_fd,
1659 (BUFFERED_STREAM *)NULL);
1660 #endif /* BUFFERED_INPUT */
1662 saver->line = line_number;
1663 bash_input.name = (char *)NULL;
1664 saver->next = stream_list;
1665 stream_list = saver;
1678 STREAM_SAVER *saver = stream_list;
1681 stream_list = stream_list->next;
1683 init_yy_io (saver->bash_input.getter,
1684 saver->bash_input.ungetter,
1685 saver->bash_input.type,
1686 saver->bash_input.name,
1687 saver->bash_input.location);
1689 #if defined (BUFFERED_INPUT)
1690 /* If we have a buffered stream, restore buffers[fd]. */
1691 /* If the input file descriptor was changed while this was on the
1692 save stack, update the buffered fd to the new file descriptor and
1693 re-establish the buffer <-> bash_input fd correspondence. */
1694 if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
1696 if (bash_input_fd_changed)
1698 bash_input_fd_changed = 0;
1699 if (default_buffered_input >= 0)
1701 bash_input.location.buffered_fd = default_buffered_input;
1702 saver->bstream->b_fd = default_buffered_input;
1703 SET_CLOSE_ON_EXEC (default_buffered_input);
1706 /* XXX could free buffered stream returned as result here. */
1707 set_buffered_stream (bash_input.location.buffered_fd, saver->bstream);
1709 #endif /* BUFFERED_INPUT */
1711 line_number = saver->line;
1713 FREE (saver->bash_input.name);
1718 /* Return 1 if a stream of type TYPE is saved on the stack. */
1720 stream_on_stack (type)
1721 enum stream_type type;
1723 register STREAM_SAVER *s;
1725 for (s = stream_list; s; s = s->next)
1726 if (s->bash_input.type == type)
1731 /* Save the current token state and return it in a malloced array. */
1737 ret = (int *)xmalloc (4 * sizeof (int));
1738 ret[0] = last_read_token;
1739 ret[1] = token_before_that;
1740 ret[2] = two_tokens_ago;
1741 ret[3] = current_token;
1746 restore_token_state (ts)
1751 last_read_token = ts[0];
1752 token_before_that = ts[1];
1753 two_tokens_ago = ts[2];
1754 current_token = ts[3];
1758 * This is used to inhibit alias expansion and reserved word recognition
1759 * inside case statement pattern lists. A `case statement pattern list' is:
1761 * everything between the `in' in a `case word in' and the next ')'
1763 * everything between a `;;' and the next `)' or `esac'
1766 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
1768 #define END_OF_ALIAS 0
1771 * Pseudo-global variables used in implementing token-wise alias expansion.
1775 * Pushing and popping strings. This works together with shell_getc to
1776 * implement alias expansion on a per-token basis.
1779 typedef struct string_saver {
1780 struct string_saver *next;
1781 int expand_alias; /* Value to set expand_alias to when string is popped. */
1784 alias_t *expander; /* alias that caused this line to be pushed. */
1786 int saved_line_size, saved_line_index, saved_line_terminator;
1789 STRING_SAVER *pushed_string_list = (STRING_SAVER *)NULL;
1792 * Push the current shell_input_line onto a stack of such lines and make S
1793 * the current input. Used when expanding aliases. EXPAND is used to set
1794 * the value of expand_next_token when the string is popped, so that the
1795 * word after the alias in the original line is handled correctly when the
1796 * alias expands to multiple words. TOKEN is the token that was expanded
1797 * into S; it is saved and used to prevent infinite recursive expansion.
1800 push_string (s, expand, ap)
1805 STRING_SAVER *temp = (STRING_SAVER *)xmalloc (sizeof (STRING_SAVER));
1807 temp->expand_alias = expand;
1808 temp->saved_line = shell_input_line;
1809 temp->saved_line_size = shell_input_line_size;
1810 temp->saved_line_index = shell_input_line_index;
1811 temp->saved_line_terminator = shell_input_line_terminator;
1813 temp->expander = ap;
1815 temp->next = pushed_string_list;
1816 pushed_string_list = temp;
1820 ap->flags |= AL_BEINGEXPANDED;
1823 shell_input_line = s;
1824 shell_input_line_size = strlen (s);
1825 shell_input_line_index = 0;
1826 shell_input_line_terminator = '\0';
1828 parser_state &= ~PST_ALEXPNEXT; /* XXX */
1831 set_line_mbstate ();
1835 * Make the top of the pushed_string stack be the current shell input.
1836 * Only called when there is something on the stack. Called from shell_getc
1837 * when it thinks it has consumed the string generated by an alias expansion
1838 * and needs to return to the original input line.
1845 FREE (shell_input_line);
1846 shell_input_line = pushed_string_list->saved_line;
1847 shell_input_line_index = pushed_string_list->saved_line_index;
1848 shell_input_line_size = pushed_string_list->saved_line_size;
1849 shell_input_line_terminator = pushed_string_list->saved_line_terminator;
1851 if (pushed_string_list->expand_alias)
1852 parser_state |= PST_ALEXPNEXT;
1854 parser_state &= ~PST_ALEXPNEXT;
1856 t = pushed_string_list;
1857 pushed_string_list = pushed_string_list->next;
1861 t->expander->flags &= ~AL_BEINGEXPANDED;
1866 set_line_mbstate ();
1872 register STRING_SAVER *t, *t1;
1874 for (t = pushed_string_list; t; )
1877 FREE (t->saved_line);
1880 t->expander->flags &= ~AL_BEINGEXPANDED;
1885 pushed_string_list = (STRING_SAVER *)NULL;
1888 #endif /* ALIAS || DPAREN_ARITHMETIC */
1891 free_pushed_string_input ()
1893 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
1894 free_string_list ();
1898 /* Return a line of text, taken from wherever yylex () reads input.
1899 If there is no more input, then we return NULL. If REMOVE_QUOTED_NEWLINE
1900 is non-zero, we remove unquoted \<newline> pairs. This is used by
1901 read_secondary_line to read here documents. */
1903 read_a_line (remove_quoted_newline)
1904 int remove_quoted_newline;
1906 static char *line_buffer = (char *)NULL;
1907 static int buffer_size = 0;
1908 int indx, c, peekc, pass_next;
1910 #if defined (READLINE)
1911 if (no_line_editing && SHOULD_PROMPT ())
1913 if (SHOULD_PROMPT ())
1917 pass_next = indx = 0;
1920 /* Allow immediate exit if interrupted during input. */
1925 /* Ignore null bytes in input. */
1929 internal_warning ("read_a_line: ignored null byte in input");
1934 /* If there is no more input, then we return NULL. */
1937 if (interactive && bash_input.type == st_stream)
1940 return ((char *)NULL);
1944 /* `+2' in case the final character in the buffer is a newline. */
1945 RESIZE_MALLOCED_BUFFER (line_buffer, indx, 2, buffer_size, 128);
1947 /* IF REMOVE_QUOTED_NEWLINES is non-zero, we are reading a
1948 here document with an unquoted delimiter. In this case,
1949 the line will be expanded as if it were in double quotes.
1950 We allow a backslash to escape the next character, but we
1951 need to treat the backslash specially only if a backslash
1952 quoting a backslash-newline pair appears in the line. */
1955 line_buffer[indx++] = c;
1958 else if (c == '\\' && remove_quoted_newline)
1964 continue; /* Make the unquoted \<newline> pair disappear. */
1970 line_buffer[indx++] = c; /* Preserve the backslash. */
1974 line_buffer[indx++] = c;
1978 line_buffer[indx] = '\0';
1979 return (line_buffer);
1984 /* Return a line as in read_a_line (), but insure that the prompt is
1985 the secondary prompt. This is used to read the lines of a here
1986 document. REMOVE_QUOTED_NEWLINE is non-zero if we should remove
1987 newlines quoted with backslashes while reading the line. It is
1988 non-zero unless the delimiter of the here document was quoted. */
1990 read_secondary_line (remove_quoted_newline)
1991 int remove_quoted_newline;
1996 prompt_string_pointer = &ps2_prompt;
1997 if (SHOULD_PROMPT())
1999 ret = read_a_line (remove_quoted_newline);
2000 #if defined (HISTORY)
2001 if (ret && remember_on_history && (parser_state & PST_HEREDOC))
2003 /* To make adding the the here-document body right, we need to rely
2004 on history_delimiting_chars() returning \n for the first line of
2005 the here-document body and the null string for the second and
2006 subsequent lines, so we avoid double newlines.
2007 current_command_line_count == 2 for the first line of the body. */
2009 current_command_line_count++;
2010 maybe_add_history (ret);
2012 #endif /* HISTORY */
2016 /* **************************************************************** */
2020 /* **************************************************************** */
2022 /* Reserved words. These are only recognized as the first word of a
2024 STRING_INT_ALIST word_token_alist[] = {
2033 #if defined (SELECT_COMMAND)
2034 { "select", SELECT },
2041 { "function", FUNCTION },
2042 #if defined (COMMAND_TIMING)
2048 #if defined (COND_COMMAND)
2049 { "[[", COND_START },
2052 #if defined (COPROCESS_SUPPORT)
2053 { "coproc", COPROC },
2058 /* other tokens that can be returned by read_token() */
2059 STRING_INT_ALIST other_token_alist[] = {
2060 /* Multiple-character tokens with special values */
2064 { ">>", GREATER_GREATER },
2065 { "<<", LESS_LESS },
2067 { ">&", GREATER_AND },
2068 { ";;", SEMI_SEMI },
2070 { ";;&", SEMI_SEMI_AND },
2071 { "<<-", LESS_LESS_MINUS },
2072 { "<<<", LESS_LESS_LESS },
2073 { "&>", AND_GREATER },
2074 { "&>>", AND_GREATER_GREATER },
2075 { "<>", LESS_GREATER },
2076 { ">|", GREATER_BAR },
2078 { "EOF", yacc_EOF },
2079 /* Tokens whose value is the character itself */
2090 { "newline", '\n' },
2094 /* others not listed here:
2095 WORD look at yylval.word
2096 ASSIGNMENT_WORD look at yylval.word
2097 NUMBER look at yylval.number
2098 ARITH_CMD look at yylval.word_list
2099 ARITH_FOR_EXPRS look at yylval.word_list
2100 COND_CMD look at yylval.command
2103 /* These are used by read_token_word, but appear up here so that shell_getc
2104 can use them to decide when to add otherwise blank lines to the history. */
2106 /* The primary delimiter stack. */
2107 struct dstack dstack = { (char *)NULL, 0, 0 };
2109 /* A temporary delimiter stack to be used when decoding prompt strings.
2110 This is needed because command substitutions in prompt strings (e.g., PS2)
2111 can screw up the parser's quoting state. */
2112 static struct dstack temp_dstack = { (char *)NULL, 0, 0 };
2114 /* Macro for accessing the top delimiter on the stack. Returns the
2115 delimiter or zero if none. */
2116 #define current_delimiter(ds) \
2117 (ds.delimiter_depth ? ds.delimiters[ds.delimiter_depth - 1] : 0)
2119 #define push_delimiter(ds, character) \
2122 if (ds.delimiter_depth + 2 > ds.delimiter_space) \
2123 ds.delimiters = (char *)xrealloc \
2124 (ds.delimiters, (ds.delimiter_space += 10) * sizeof (char)); \
2125 ds.delimiters[ds.delimiter_depth] = character; \
2126 ds.delimiter_depth++; \
2130 #define pop_delimiter(ds) ds.delimiter_depth--
2132 /* Return the next shell input character. This always reads characters
2133 from shell_input_line; when that line is exhausted, it is time to
2134 read the next line. This is called by read_token when the shell is
2135 processing normal command input. */
2137 /* This implements one-character lookahead/lookbehind across physical input
2138 lines, to avoid something being lost because it's pushed back with
2139 shell_ungetc when we're at the start of a line. */
2140 static int eol_ungetc_lookahead = 0;
2143 shell_getc (remove_quoted_newline)
2144 int remove_quoted_newline;
2152 if (sigwinch_received)
2154 sigwinch_received = 0;
2155 get_new_window_size (0, (int *)0, (int *)0);
2158 if (eol_ungetc_lookahead)
2160 c = eol_ungetc_lookahead;
2161 eol_ungetc_lookahead = 0;
2165 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
2166 /* If shell_input_line[shell_input_line_index] == 0, but there is
2167 something on the pushed list of strings, then we don't want to go
2168 off and get another line. We let the code down below handle it. */
2170 if (!shell_input_line || ((!shell_input_line[shell_input_line_index]) &&
2171 (pushed_string_list == (STRING_SAVER *)NULL)))
2172 #else /* !ALIAS && !DPAREN_ARITHMETIC */
2173 if (!shell_input_line || !shell_input_line[shell_input_line_index])
2174 #endif /* !ALIAS && !DPAREN_ARITHMETIC */
2180 /* Allow immediate exit if interrupted during input. */
2184 shell_input_line_terminator = 0;
2186 /* If the shell is interatctive, but not currently printing a prompt
2187 (interactive_shell && interactive == 0), we don't want to print
2188 notifies or cleanup the jobs -- we want to defer it until we do
2189 print the next prompt. */
2190 if (interactive_shell == 0 || SHOULD_PROMPT())
2192 #if defined (JOB_CONTROL)
2193 /* This can cause a problem when reading a command as the result
2194 of a trap, when the trap is called from flush_child. This call
2195 had better not cause jobs to disappear from the job table in
2196 that case, or we will have big trouble. */
2197 notify_and_cleanup ();
2198 #else /* !JOB_CONTROL */
2199 cleanup_dead_jobs ();
2200 #endif /* !JOB_CONTROL */
2203 #if defined (READLINE)
2204 if (no_line_editing && SHOULD_PROMPT())
2206 if (SHOULD_PROMPT())
2210 if (bash_input.type == st_stream)
2217 /* Allow immediate exit if interrupted during input. */
2223 internal_warning ("shell_getc: ignored null byte in input");
2228 RESIZE_MALLOCED_BUFFER (shell_input_line, i, 2, shell_input_line_size, 256);
2232 if (bash_input.type == st_stream)
2236 shell_input_line_terminator = EOF;
2238 shell_input_line[i] = '\0';
2242 shell_input_line[i++] = c;
2246 shell_input_line[--i] = '\0';
2247 current_command_line_count++;
2252 shell_input_line_index = 0;
2253 shell_input_line_len = i; /* == strlen (shell_input_line) */
2255 set_line_mbstate ();
2257 #if defined (HISTORY)
2258 if (remember_on_history && shell_input_line && shell_input_line[0])
2261 # if defined (BANG_HISTORY)
2264 /* If the current delimiter is a single quote, we should not be
2265 performing history expansion, even if we're on a different
2266 line from the original single quote. */
2267 old_hist = history_expansion_inhibited;
2268 if (current_delimiter (dstack) == '\'')
2269 history_expansion_inhibited = 1;
2271 expansions = pre_process_line (shell_input_line, 1, 1);
2272 # if defined (BANG_HISTORY)
2273 history_expansion_inhibited = old_hist;
2275 if (expansions != shell_input_line)
2277 free (shell_input_line);
2278 shell_input_line = expansions;
2279 shell_input_line_len = shell_input_line ?
2280 strlen (shell_input_line) : 0;
2281 if (!shell_input_line_len)
2282 current_command_line_count--;
2284 /* We have to force the xrealloc below because we don't know
2285 the true allocated size of shell_input_line anymore. */
2286 shell_input_line_size = shell_input_line_len;
2288 set_line_mbstate ();
2291 /* Try to do something intelligent with blank lines encountered while
2292 entering multi-line commands. XXX - this is grotesque */
2293 else if (remember_on_history && shell_input_line &&
2294 shell_input_line[0] == '\0' &&
2295 current_command_line_count > 1)
2297 if (current_delimiter (dstack))
2298 /* We know shell_input_line[0] == 0 and we're reading some sort of
2299 quoted string. This means we've got a line consisting of only
2300 a newline in a quoted string. We want to make sure this line
2301 gets added to the history. */
2302 maybe_add_history (shell_input_line);
2306 hdcs = history_delimiting_chars ();
2307 if (hdcs && hdcs[0] == ';')
2308 maybe_add_history (shell_input_line);
2312 #endif /* HISTORY */
2314 if (shell_input_line)
2316 /* Lines that signify the end of the shell's input should not be
2318 if (echo_input_at_read && (shell_input_line[0] ||
2319 shell_input_line_terminator != EOF))
2320 fprintf (stderr, "%s\n", shell_input_line);
2324 shell_input_line_size = 0;
2325 prompt_string_pointer = ¤t_prompt_string;
2326 if (SHOULD_PROMPT ())
2331 /* Add the newline to the end of this string, iff the string does
2332 not already end in an EOF character. */
2333 if (shell_input_line_terminator != EOF)
2335 if (shell_input_line_len + 3 > shell_input_line_size)
2336 shell_input_line = (char *)xrealloc (shell_input_line,
2337 1 + (shell_input_line_size += 2));
2339 shell_input_line[shell_input_line_len] = '\n';
2340 shell_input_line[shell_input_line_len + 1] = '\0';
2342 set_line_mbstate ();
2346 uc = shell_input_line[shell_input_line_index];
2349 shell_input_line_index++;
2351 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
2352 /* If UC is NULL, we have reached the end of the current input string. If
2353 pushed_string_list is non-empty, it's time to pop to the previous string
2354 because we have fully consumed the result of the last alias expansion.
2355 Do it transparently; just return the next character of the string popped
2358 if (!uc && (pushed_string_list != (STRING_SAVER *)NULL))
2361 uc = shell_input_line[shell_input_line_index];
2363 shell_input_line_index++;
2365 #endif /* ALIAS || DPAREN_ARITHMETIC */
2367 if MBTEST(uc == '\\' && remove_quoted_newline && shell_input_line[shell_input_line_index] == '\n')
2369 if (SHOULD_PROMPT ())
2372 /* XXX - what do we do here if we're expanding an alias whose definition
2373 ends with a newline? Recall that we inhibit the appending of a
2374 space in mk_alexpansion() if newline is the last character. */
2375 #if 0 /* XXX - bash-4.2 (jonathan@claggett.org) */
2376 if (expanding_alias () && shell_input_line[shell_input_line_index+1] == '\0')
2386 if (!uc && shell_input_line_terminator == EOF)
2387 return ((shell_input_line_index != 0) ? '\n' : EOF);
2392 /* Put C back into the input for the shell. This might need changes for
2393 HANDLE_MULTIBYTE around EOLs. Since we (currently) never push back a
2394 character different than we read, shell_input_line_property doesn't need
2395 to change when manipulating shell_input_line. The define for
2396 last_shell_getc_is_singlebyte should take care of it, though. */
2401 if (shell_input_line && shell_input_line_index)
2402 shell_input_line[--shell_input_line_index] = c;
2404 eol_ungetc_lookahead = c;
2407 #ifdef INCLUDE_UNUSED
2408 /* Back the input pointer up by one, effectively `ungetting' a character. */
2412 if (shell_input_line && shell_input_line_index)
2413 shell_input_line_index--;
2417 /* Discard input until CHARACTER is seen, then push that character back
2418 onto the input stream. */
2420 discard_until (character)
2425 while ((c = shell_getc (0)) != EOF && c != character)
2433 execute_variable_command (command, vname)
2434 char *command, *vname;
2437 sh_parser_state_t ps;
2439 save_parser_state (&ps);
2440 last_lastarg = get_string_value ("_");
2442 last_lastarg = savestring (last_lastarg);
2444 parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST);
2446 restore_parser_state (&ps);
2447 bind_variable ("_", last_lastarg, 0);
2448 FREE (last_lastarg);
2450 if (token_to_read == '\n') /* reset_parser was called */
2454 /* Place to remember the token. We try to keep the buffer
2455 at a reasonable size, but it can grow. */
2456 static char *token = (char *)NULL;
2458 /* Current size of the token buffer. */
2459 static int token_buffer_size;
2461 /* Command to read_token () explaining what we want it to do. */
2464 #define prompt_is_ps1 \
2465 (!prompt_string_pointer || prompt_string_pointer == &ps1_prompt)
2467 /* Function for yyparse to call. yylex keeps track of
2468 the last two tokens read, and calls read_token. */
2472 if (interactive && (current_token == 0 || current_token == '\n'))
2474 /* Before we print a prompt, we might have to check mailboxes.
2475 We do this only if it is time to do so. Notice that only here
2476 is the mail alarm reset; nothing takes place in check_mail ()
2477 except the checking of mail. Please don't change this. */
2478 if (prompt_is_ps1 && time_to_check_mail ())
2481 reset_mail_timer ();
2484 /* Avoid printing a prompt if we're not going to read anything, e.g.
2485 after resetting the parser with read_token (RESET). */
2486 if (token_to_read == 0 && SHOULD_PROMPT ())
2490 two_tokens_ago = token_before_that;
2491 token_before_that = last_read_token;
2492 last_read_token = current_token;
2493 current_token = read_token (READ);
2495 if ((parser_state & PST_EOFTOKEN) && current_token == shell_eof_token)
2497 current_token = yacc_EOF;
2498 if (bash_input.type == st_string)
2499 rewind_input_string ();
2501 parser_state &= ~PST_EOFTOKEN;
2503 return (current_token);
2506 /* When non-zero, we have read the required tokens
2507 which allow ESAC to be the next one read. */
2508 static int esacs_needed_count;
2511 gather_here_documents ()
2516 while (need_here_doc)
2518 parser_state |= PST_HEREDOC;
2519 make_here_document (redir_stack[r++], line_number);
2520 parser_state &= ~PST_HEREDOC;
2525 /* When non-zero, an open-brace used to create a group is awaiting a close
2527 static int open_brace_count;
2529 #define command_token_position(token) \
2530 (((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
2531 ((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
2533 #define assignment_acceptable(token) \
2534 (command_token_position(token) && ((parser_state & PST_CASEPAT) == 0))
2536 /* Check to see if TOKEN is a reserved word and return the token
2538 #define CHECK_FOR_RESERVED_WORD(tok) \
2540 if (!dollar_present && !quoted && \
2541 reserved_word_acceptable (last_read_token)) \
2544 for (i = 0; word_token_alist[i].word != (char *)NULL; i++) \
2545 if (STREQ (tok, word_token_alist[i].word)) \
2547 if ((parser_state & PST_CASEPAT) && (word_token_alist[i].token != ESAC)) \
2549 if (word_token_alist[i].token == TIME && time_command_acceptable () == 0) \
2551 if (word_token_alist[i].token == ESAC) \
2552 parser_state &= ~(PST_CASEPAT|PST_CASESTMT); \
2553 else if (word_token_alist[i].token == CASE) \
2554 parser_state |= PST_CASESTMT; \
2555 else if (word_token_alist[i].token == COND_END) \
2556 parser_state &= ~(PST_CONDCMD|PST_CONDEXPR); \
2557 else if (word_token_alist[i].token == COND_START) \
2558 parser_state |= PST_CONDCMD; \
2559 else if (word_token_alist[i].token == '{') \
2560 open_brace_count++; \
2561 else if (word_token_alist[i].token == '}' && open_brace_count) \
2562 open_brace_count--; \
2563 return (word_token_alist[i].token); \
2570 /* OK, we have a token. Let's try to alias expand it, if (and only if)
2573 It is eligible for expansion if EXPAND_ALIASES is set, and
2574 the token is unquoted and the last token read was a command
2575 separator (or expand_next_token is set), and we are currently
2576 processing an alias (pushed_string_list is non-empty) and this
2577 token is not the same as the current or any previously
2580 Special cases that disqualify:
2581 In a pattern list in a case statement (parser_state & PST_CASEPAT). */
2591 r = xmalloc (l + 2);
2593 #if 0 /* XXX - bash-4.2 */
2594 if (r[l -1] != ' ' && r[l -1] != '\n')
2604 alias_expand_token (tokstr)
2610 if (((parser_state & PST_ALEXPNEXT) || command_token_position (last_read_token)) &&
2611 (parser_state & PST_CASEPAT) == 0)
2613 ap = find_alias (tokstr);
2615 /* Currently expanding this token. */
2616 if (ap && (ap->flags & AL_BEINGEXPANDED))
2617 return (NO_EXPANSION);
2619 /* mk_alexpansion puts an extra space on the end of the alias expansion,
2620 so the lookahead by the parser works right. If this gets changed,
2621 make sure the code in shell_getc that deals with reaching the end of
2622 an expanded alias is changed with it. */
2623 expanded = ap ? mk_alexpansion (ap->value) : (char *)NULL;
2627 push_string (expanded, ap->flags & AL_EXPANDNEXT, ap);
2628 return (RE_READ_TOKEN);
2631 /* This is an eligible token that does not have an expansion. */
2632 return (NO_EXPANSION);
2634 return (NO_EXPANSION);
2639 time_command_acceptable ()
2641 #if defined (COMMAND_TIMING)
2642 switch (last_read_token)
2661 #endif /* COMMAND_TIMING */
2664 /* Handle special cases of token recognition:
2665 IN is recognized if the last token was WORD and the token
2666 before that was FOR or CASE or SELECT.
2668 DO is recognized if the last token was WORD and the token
2669 before that was FOR or SELECT.
2671 ESAC is recognized if the last token caused `esacs_needed_count'
2674 `{' is recognized if the last token as WORD and the token
2675 before that was FUNCTION, or if we just parsed an arithmetic
2678 `}' is recognized if there is an unclosed `{' present.
2680 `-p' is returned as TIMEOPT if the last read token was TIME.
2682 ']]' is returned as COND_END if the parser is currently parsing
2683 a conditional expression ((parser_state & PST_CONDEXPR) != 0)
2685 `time' is returned as TIME if and only if it is immediately
2686 preceded by one of `;', `\n', `||', `&&', or `&'.
2690 special_case_tokens (tokstr)
2693 if ((last_read_token == WORD) &&
2694 #if defined (SELECT_COMMAND)
2695 ((token_before_that == FOR) || (token_before_that == CASE) || (token_before_that == SELECT)) &&
2697 ((token_before_that == FOR) || (token_before_that == CASE)) &&
2699 (tokstr[0] == 'i' && tokstr[1] == 'n' && tokstr[2] == 0))
2701 if (token_before_that == CASE)
2703 parser_state |= PST_CASEPAT;
2704 esacs_needed_count++;
2709 if (last_read_token == WORD &&
2710 #if defined (SELECT_COMMAND)
2711 (token_before_that == FOR || token_before_that == SELECT) &&
2713 (token_before_that == FOR) &&
2715 (tokstr[0] == 'd' && tokstr[1] == 'o' && tokstr[2] == '\0'))
2718 /* Ditto for ESAC in the CASE case.
2719 Specifically, this handles "case word in esac", which is a legal
2720 construct, certainly because someone will pass an empty arg to the
2721 case construct, and we don't want it to barf. Of course, we should
2722 insist that the case construct has at least one pattern in it, but
2723 the designers disagree. */
2724 if (esacs_needed_count)
2726 esacs_needed_count--;
2727 if (STREQ (tokstr, "esac"))
2729 parser_state &= ~PST_CASEPAT;
2734 /* The start of a shell function definition. */
2735 if (parser_state & PST_ALLOWOPNBRC)
2737 parser_state &= ~PST_ALLOWOPNBRC;
2738 if (tokstr[0] == '{' && tokstr[1] == '\0') /* } */
2741 function_bstart = line_number;
2742 return ('{'); /* } */
2746 /* We allow a `do' after a for ((...)) without an intervening
2748 if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == 'd' && tokstr[1] == 'o' && !tokstr[2])
2750 if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == '{' && tokstr[1] == '\0') /* } */
2753 return ('{'); /* } */
2756 if (open_brace_count && reserved_word_acceptable (last_read_token) && tokstr[0] == '}' && !tokstr[1])
2758 open_brace_count--; /* { */
2762 #if defined (COMMAND_TIMING)
2763 /* Handle -p after `time'. */
2764 if (last_read_token == TIME && tokstr[0] == '-' && tokstr[1] == 'p' && !tokstr[2])
2769 #if defined (COMMAND_TIMING)
2770 if (STREQ (token, "time") && ((parser_state & PST_CASEPAT) == 0) && time_command_acceptable ())
2772 #endif /* COMMAND_TIMING */
2775 #if defined (COND_COMMAND) /* [[ */
2776 if ((parser_state & PST_CONDEXPR) && tokstr[0] == ']' && tokstr[1] == ']' && tokstr[2] == '\0')
2783 /* Called from shell.c when Control-C is typed at top level. Or
2784 by the error rule at top level. */
2788 dstack.delimiter_depth = 0; /* No delimiters found so far. */
2789 open_brace_count = 0;
2791 #if defined (EXTENDED_GLOB)
2792 /* Reset to global value of extended glob */
2793 if (parser_state & PST_EXTPAT)
2794 extended_glob = global_extglob;
2799 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
2800 if (pushed_string_list)
2801 free_string_list ();
2802 #endif /* ALIAS || DPAREN_ARITHMETIC */
2804 if (shell_input_line)
2806 free (shell_input_line);
2807 shell_input_line = (char *)NULL;
2808 shell_input_line_size = shell_input_line_index = 0;
2811 FREE (word_desc_to_read);
2812 word_desc_to_read = (WORD_DESC *)NULL;
2814 current_token = '\n'; /* XXX */
2815 last_read_token = '\n';
2816 token_to_read = '\n';
2819 /* Read the next token. Command can be READ (normal operation) or
2820 RESET (to normalize state). */
2822 read_token (command)
2825 int character; /* Current character. */
2826 int peek_char; /* Temporary look-ahead character. */
2827 int result; /* The thing to return. */
2829 if (command == RESET)
2837 result = token_to_read;
2838 if (token_to_read == WORD || token_to_read == ASSIGNMENT_WORD)
2840 yylval.word = word_desc_to_read;
2841 word_desc_to_read = (WORD_DESC *)NULL;
2847 #if defined (COND_COMMAND)
2848 if ((parser_state & (PST_CONDCMD|PST_CONDEXPR)) == PST_CONDCMD)
2850 cond_lineno = line_number;
2851 parser_state |= PST_CONDEXPR;
2852 yylval.command = parse_cond_command ();
2853 if (cond_token != COND_END)
2858 token_to_read = COND_END;
2859 parser_state &= ~(PST_CONDEXPR|PST_CONDCMD);
2865 /* This is a place to jump back to once we have successfully expanded a
2866 token with an alias and pushed the string with push_string () */
2870 /* Read a single word from input. Start by skipping blanks. */
2871 while ((character = shell_getc (1)) != EOF && shellblank (character))
2874 if (character == EOF)
2880 if MBTEST(character == '#' && (!interactive || interactive_comments))
2882 /* A comment. Discard until EOL or EOF, and then return a newline. */
2883 discard_until ('\n');
2885 character = '\n'; /* this will take the next if statement and return. */
2888 if (character == '\n')
2890 /* If we're about to return an unquoted newline, we can go and collect
2891 the text of any pending here document. */
2893 gather_here_documents ();
2896 parser_state &= ~PST_ALEXPNEXT;
2899 parser_state &= ~PST_ASSIGNOK;
2904 if (parser_state & PST_REGEXP)
2907 /* Shell meta-characters. */
2908 if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
2911 /* Turn off alias tokenization iff this character sequence would
2912 not leave us ready to read a command. */
2913 if (character == '<' || character == '>')
2914 parser_state &= ~PST_ALEXPNEXT;
2917 parser_state &= ~PST_ASSIGNOK;
2919 peek_char = shell_getc (1);
2920 if (character == peek_char)
2925 /* If '<' then we could be at "<<" or at "<<-". We have to
2926 look ahead one more character. */
2927 peek_char = shell_getc (1);
2928 if MBTEST(peek_char == '-')
2929 return (LESS_LESS_MINUS);
2930 else if MBTEST(peek_char == '<')
2931 return (LESS_LESS_LESS);
2934 shell_ungetc (peek_char);
2939 return (GREATER_GREATER);
2942 parser_state |= PST_CASEPAT;
2944 parser_state &= ~PST_ALEXPNEXT;
2947 peek_char = shell_getc (1);
2948 if MBTEST(peek_char == '&')
2949 return (SEMI_SEMI_AND);
2952 shell_ungetc (peek_char);
2962 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
2964 result = parse_dparen (character);
2972 else if MBTEST(character == '<' && peek_char == '&')
2974 else if MBTEST(character == '>' && peek_char == '&')
2975 return (GREATER_AND);
2976 else if MBTEST(character == '<' && peek_char == '>')
2977 return (LESS_GREATER);
2978 else if MBTEST(character == '>' && peek_char == '|')
2979 return (GREATER_BAR);
2980 else if MBTEST(character == '&' && peek_char == '>')
2982 peek_char = shell_getc (1);
2983 if MBTEST(peek_char == '>')
2984 return (AND_GREATER_GREATER);
2987 shell_ungetc (peek_char);
2988 return (AND_GREATER);
2991 else if MBTEST(character == '|' && peek_char == '&')
2993 else if MBTEST(character == ';' && peek_char == '&')
2995 parser_state |= PST_CASEPAT;
2997 parser_state &= ~PST_ALEXPNEXT;
3002 shell_ungetc (peek_char);
3004 /* If we look like we are reading the start of a function
3005 definition, then let the reader know about it so that
3006 we will do the right thing with `{'. */
3007 if MBTEST(character == ')' && last_read_token == '(' && token_before_that == WORD)
3009 parser_state |= PST_ALLOWOPNBRC;
3011 parser_state &= ~PST_ALEXPNEXT;
3013 function_dstart = line_number;
3016 /* case pattern lists may be preceded by an optional left paren. If
3017 we're not trying to parse a case pattern list, the left paren
3018 indicates a subshell. */
3019 if MBTEST(character == '(' && (parser_state & PST_CASEPAT) == 0) /* ) */
3020 parser_state |= PST_SUBSHELL;
3022 else if MBTEST((parser_state & PST_CASEPAT) && character == ')')
3023 parser_state &= ~PST_CASEPAT;
3025 else if MBTEST((parser_state & PST_SUBSHELL) && character == ')')
3026 parser_state &= ~PST_SUBSHELL;
3028 #if defined (PROCESS_SUBSTITUTION)
3029 /* Check for the constructs which introduce process substitution.
3030 Shells running in `posix mode' don't do process substitution. */
3031 if MBTEST(posixly_correct || ((character != '>' && character != '<') || peek_char != '(')) /*)*/
3032 #endif /* PROCESS_SUBSTITUTION */
3036 /* Hack <&- (close stdin) case. Also <&N- (dup and close). */
3037 if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
3041 /* Okay, if we got this far, we have to read a word. Read one,
3042 and then check it against the known ones. */
3043 result = read_token_word (character);
3045 if (result == RE_READ_TOKEN)
3052 * Match a $(...) or other grouping construct. This has to handle embedded
3053 * quoted strings ('', ``, "") and nested constructs. It also must handle
3054 * reprompting the user, if necessary, after reading a newline, and returning
3055 * correct error values if it reads EOF.
3057 #define P_FIRSTCLOSE 0x01
3058 #define P_ALLOWESC 0x02
3059 #define P_DQUOTE 0x04
3060 #define P_COMMAND 0x08 /* parsing a command, so look for comments */
3061 #define P_BACKQUOTE 0x10 /* parsing a backquoted command substitution */
3062 #define P_ARRAYSUB 0x20 /* parsing a [...] array subscript for assignment */
3064 /* Lexical state while parsing a grouping construct or $(...). */
3065 #define LEX_WASDOL 0x001
3066 #define LEX_CKCOMMENT 0x002
3067 #define LEX_INCOMMENT 0x004
3068 #define LEX_PASSNEXT 0x008
3069 #define LEX_RESWDOK 0x010
3070 #define LEX_CKCASE 0x020
3071 #define LEX_INCASE 0x040
3072 #define LEX_INHEREDOC 0x080
3073 #define LEX_HEREDELIM 0x100 /* reading here-doc delimiter */
3074 #define LEX_STRIPDOC 0x200 /* <<- strip tabs from here doc delim */
3075 #define LEX_INWORD 0x400
3077 #define COMSUB_META(ch) ((ch) == ';' || (ch) == '&' || (ch) == '|')
3079 #define CHECK_NESTRET_ERROR() \
3081 if (nestret == &matched_pair_error) \
3084 return &matched_pair_error; \
3088 #define APPEND_NESTRET() \
3092 RESIZE_MALLOCED_BUFFER (ret, retind, nestlen, retsize, 64); \
3093 strcpy (ret + retind, nestret); \
3094 retind += nestlen; \
3098 static char matched_pair_error;
3101 parse_matched_pair (qc, open, close, lenp, flags)
3102 int qc; /* `"' if this construct is within double quotes */
3106 int count, ch, tflags;
3107 int nestlen, ttranslen, start_lineno;
3108 char *ret, *nestret, *ttrans;
3109 int retind, retsize, rflags;
3111 /*itrace("parse_matched_pair[%d]: open = %c close = %c flags = %d", line_number, open, close, flags);*/
3115 if ((flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
3116 tflags |= LEX_CKCOMMENT;
3118 /* RFLAGS is the set of flags we want to pass to recursive calls. */
3119 rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE);
3121 ret = (char *)xmalloc (retsize = 64);
3124 start_lineno = line_number;
3127 ch = shell_getc (qc != '\'' && (tflags & LEX_PASSNEXT) == 0);
3132 parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
3133 EOF_Reached = 1; /* XXX */
3134 return (&matched_pair_error);
3137 /* Possible reprompting. */
3138 if (ch == '\n' && SHOULD_PROMPT ())
3141 /* Don't bother counting parens or doing anything else if in a comment
3142 or part of a case statement */
3143 if (tflags & LEX_INCOMMENT)
3145 /* Add this character. */
3146 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3150 tflags &= ~LEX_INCOMMENT;
3155 /* Not exactly right yet, should handle shell metacharacters, too. If
3156 any changes are made to this test, make analogous changes to subst.c:
3157 extract_delimited_string(). */
3158 else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1])))
3159 tflags |= LEX_INCOMMENT;
3161 if (tflags & LEX_PASSNEXT) /* last char was backslash */
3163 tflags &= ~LEX_PASSNEXT;
3164 if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */
3167 retind--; /* swallow previously-added backslash */
3171 RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
3172 if MBTEST(ch == CTLESC || ch == CTLNUL)
3173 ret[retind++] = CTLESC;
3177 /* If we're reparsing the input (e.g., from parse_string_to_word_list),
3178 we've already prepended CTLESC to single-quoted results of $'...'.
3179 We may want to do this for other CTLESC-quoted characters in
3181 else if MBTEST((parser_state & PST_REPARSE) && open == '\'' && (ch == CTLESC || ch == CTLNUL))
3183 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3187 else if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */
3189 RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
3190 ret[retind++] = CTLESC;
3194 else if MBTEST(ch == close) /* ending delimiter */
3196 /* handle nested ${...} specially. */
3197 else if MBTEST(open != close && (tflags & LEX_WASDOL) && open == '{' && ch == open) /* } */
3199 else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && ch == open) /* nested begin */
3202 /* Add this character. */
3203 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3206 /* If we just read the ending character, don't bother continuing. */
3210 if (open == '\'') /* '' inside grouping construct */
3212 if MBTEST((flags & P_ALLOWESC) && ch == '\\')
3213 tflags |= LEX_PASSNEXT;
3217 if MBTEST(ch == '\\') /* backslashes */
3218 tflags |= LEX_PASSNEXT;
3221 /* The big hammer. Single quotes aren't special in double quotes. The
3222 problem is that Posix says the single quotes are semi-special:
3223 within a double-quoted ${...} construct "an even number of
3224 unescaped double-quotes or single-quotes, if any, shall occur." */
3225 if MBTEST(open == '{' && (flags & P_DQUOTE) && ch == '\'') /* } */
3229 /* Could also check open == '`' if we want to parse grouping constructs
3230 inside old-style command substitution. */
3231 if (open != close) /* a grouping construct */
3233 if MBTEST(shellquote (ch))
3235 /* '', ``, or "" inside $(...) or other grouping construct. */
3236 push_delimiter (dstack, ch);
3237 if MBTEST((tflags & LEX_WASDOL) && ch == '\'') /* $'...' inside group */
3238 nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags);
3240 nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags);
3241 pop_delimiter (dstack);
3242 CHECK_NESTRET_ERROR ();
3244 if MBTEST((tflags & LEX_WASDOL) && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0))
3246 /* Translate $'...' here. */
3247 ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen);
3250 if ((rflags & P_DQUOTE) == 0)
3252 nestret = sh_single_quote (ttrans);
3254 nestlen = strlen (nestret);
3259 nestlen = ttranslen;
3261 retind -= 2; /* back up before the $' */
3263 else if MBTEST((tflags & LEX_WASDOL) && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0))
3265 /* Locale expand $"..." here. */
3266 ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen);
3269 nestret = sh_mkdoublequoted (ttrans, ttranslen, 0);
3271 nestlen = ttranslen + 2;
3272 retind -= 2; /* back up before the $" */
3278 else if ((flags & P_ARRAYSUB) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
3279 goto parse_dollar_word;
3281 /* Parse an old-style command substitution within double quotes as a
3283 /* XXX - sh and ksh93 don't do this - XXX */
3284 else if MBTEST(open == '"' && ch == '`')
3286 nestret = parse_matched_pair (0, '`', '`', &nestlen, rflags);
3288 CHECK_NESTRET_ERROR ();
3293 else if MBTEST(open != '`' && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
3294 /* check for $(), $[], or ${} inside quoted string. */
3297 if (open == ch) /* undo previous increment */
3299 if (ch == '(') /* ) */
3300 nestret = parse_comsub (0, '(', ')', &nestlen, (rflags|P_COMMAND) & ~P_DQUOTE);
3301 else if (ch == '{') /* } */
3302 nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags);
3303 else if (ch == '[') /* ] */
3304 nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
3306 CHECK_NESTRET_ERROR ();
3311 if MBTEST(ch == '$')
3312 tflags |= LEX_WASDOL;
3314 tflags &= ~LEX_WASDOL;
3320 /*itrace("parse_matched_pair[%d]: returning %s", line_number, ret);*/
3324 /* Parse a $(...) command substitution. This is messier than I'd like, and
3325 reproduces a lot more of the token-reading code than I'd like. */
3327 parse_comsub (qc, open, close, lenp, flags)
3328 int qc; /* `"' if this construct is within double quotes */
3332 int count, ch, peekc, tflags, lex_rwlen, lex_wlen, lex_firstind;
3333 int nestlen, ttranslen, start_lineno;
3334 char *ret, *nestret, *ttrans, *heredelim;
3335 int retind, retsize, rflags, hdlen;
3337 /*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
3339 tflags = LEX_RESWDOK;
3341 if ((flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
3342 tflags |= LEX_CKCASE;
3343 if ((tflags & LEX_CKCASE) && (interactive == 0 || interactive_comments))
3344 tflags |= LEX_CKCOMMENT;
3346 /* RFLAGS is the set of flags we want to pass to recursive calls. */
3347 rflags = (flags & P_DQUOTE);
3349 ret = (char *)xmalloc (retsize = 64);
3352 start_lineno = line_number;
3353 lex_rwlen = lex_wlen = 0;
3361 ch = shell_getc (qc != '\'' && (tflags & LEX_PASSNEXT) == 0);
3368 parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
3369 EOF_Reached = 1; /* XXX */
3370 return (&matched_pair_error);
3373 /* If we hit the end of a line and are reading the contents of a here
3374 document, and it's not the same line that the document starts on,
3375 check for this line being the here doc delimiter. Otherwise, if
3376 we're in a here document, mark the next character as the beginning
3380 if ((tflags & LEX_HEREDELIM) && heredelim)
3382 tflags &= ~LEX_HEREDELIM;
3383 tflags |= LEX_INHEREDOC;
3384 lex_firstind = retind + 1;
3386 else if (tflags & LEX_INHEREDOC)
3389 tind = lex_firstind;
3390 while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
3392 if (STREQN (ret + tind, heredelim, hdlen))
3394 tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
3395 /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
3401 lex_firstind = retind + 1;
3405 /* Possible reprompting. */
3406 if (ch == '\n' && SHOULD_PROMPT ())
3409 /* XXX -- possibly allow here doc to be delimited by ending right
3411 if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
3414 /*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
3415 tind = lex_firstind;
3416 while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
3418 if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
3420 tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
3421 /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
3428 /* Don't bother counting parens or doing anything else if in a comment */
3429 if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC))
3431 /* Add this character. */
3432 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3435 if ((tflags & LEX_INCOMMENT) && ch == '\n')
3437 /*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/
3438 tflags &= ~LEX_INCOMMENT;
3444 if (tflags & LEX_PASSNEXT) /* last char was backslash */
3446 /*itrace("parse_comsub:%d: lex_passnext -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/
3447 tflags &= ~LEX_PASSNEXT;
3448 if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */
3451 retind--; /* swallow previously-added backslash */
3455 RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
3456 if MBTEST(ch == CTLESC || ch == CTLNUL)
3457 ret[retind++] = CTLESC;
3462 /* If this is a shell break character, we are not in a word. If not,
3463 we either start or continue a word. */
3464 if MBTEST(shellbreak (ch))
3466 tflags &= ~LEX_INWORD;
3467 /*itrace("parse_comsub:%d: lex_inword -> 0 ch = `%c' (%d)", line_number, ch, __LINE__);*/
3471 if (tflags & LEX_INWORD)
3474 /*itrace("parse_comsub:%d: lex_inword == 1 ch = `%c' lex_wlen = %d (%d)", line_number, ch, lex_wlen, __LINE__);*/
3478 /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/
3479 tflags |= LEX_INWORD;
3484 /* Skip whitespace */
3485 if MBTEST(shellblank (ch) && lex_rwlen == 0)
3487 /* Add this character. */
3488 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3493 /* Either we are looking for the start of the here-doc delimiter
3494 (lex_firstind == -1) or we are reading one (lex_firstind >= 0).
3495 If this character is a shell break character and we are reading
3496 the delimiter, save it and note that we are now reading a here
3497 document. If we've found the start of the delimiter, note it by
3498 setting lex_firstind. Backslashes can quote shell metacharacters
3499 in here-doc delimiters. */
3500 if (tflags & LEX_HEREDELIM)
3502 if (lex_firstind == -1 && shellbreak (ch) == 0)
3503 lex_firstind = retind;
3505 else if (heredelim && (tflags & LEX_PASSNEXT) == 0 && ch == '\n')
3507 tflags |= LEX_INHEREDOC;
3508 tflags &= ~LEX_HEREDELIM;
3509 lex_firstind = retind + 1;
3512 else if (lex_firstind >= 0 && (tflags & LEX_PASSNEXT) == 0 && shellbreak (ch))
3516 nestret = substring (ret, lex_firstind, retind);
3517 heredelim = string_quote_removal (nestret, 0);
3519 hdlen = STRLEN(heredelim);
3520 /*itrace("parse_comsub:%d: found here doc delimiter `%s' (%d)", line_number, heredelim, hdlen);*/
3524 tflags |= LEX_INHEREDOC;
3525 tflags &= ~LEX_HEREDELIM;
3526 lex_firstind = retind + 1;
3533 /* Meta-characters that can introduce a reserved word. Not perfect yet. */
3534 if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && (shellmeta(ch) || ch == '\n'))
3536 /* Add this character. */
3537 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3539 peekc = shell_getc (1);
3540 if (ch == peekc && (ch == '&' || ch == '|' || ch == ';')) /* two-character tokens */
3542 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3543 ret[retind++] = peekc;
3544 /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
3545 tflags |= LEX_RESWDOK;
3549 else if (ch == '\n' || COMSUB_META(ch))
3551 shell_ungetc (peekc);
3552 /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
3553 tflags |= LEX_RESWDOK;
3561 /* `unget' the character we just added and fall through */
3563 shell_ungetc (peekc);
3567 /* If we can read a reserved word, try to read one. */
3568 if (tflags & LEX_RESWDOK)
3570 if MBTEST(islower (ch))
3572 /* Add this character. */
3573 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3578 else if MBTEST(lex_rwlen == 4 && shellbreak (ch))
3580 if (STREQN (ret + retind - 4, "case", 4))
3582 tflags |= LEX_INCASE;
3583 /*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/
3585 else if (STREQN (ret + retind - 4, "esac", 4))
3587 tflags &= ~LEX_INCASE;
3588 /*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/
3590 tflags &= ~LEX_RESWDOK;
3592 else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
3593 ; /* don't modify LEX_RESWDOK if we're starting a comment */
3594 else if MBTEST((tflags & LEX_INCASE) && ch != '\n')
3595 /* If we can read a reserved word and we're in case, we're at the
3596 point where we can read a new pattern list or an esac. We
3597 handle the esac case above. If we read a newline, we want to
3598 leave LEX_RESWDOK alone. If we read anything else, we want to
3599 turn off LEX_RESWDOK, since we're going to read a pattern list. */
3601 tflags &= ~LEX_RESWDOK;
3602 /*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/
3604 else if MBTEST(shellbreak (ch) == 0)
3606 tflags &= ~LEX_RESWDOK;
3607 /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
3611 /* Might be the start of a here-doc delimiter */
3612 if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<')
3614 /* Add this character. */
3615 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3617 peekc = shell_getc (1);
3622 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3623 ret[retind++] = peekc;
3624 peekc = shell_getc (1);
3629 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3630 ret[retind++] = peekc;
3631 tflags |= LEX_STRIPDOC;
3634 shell_ungetc (peekc);
3637 tflags |= LEX_HEREDELIM;
3643 ch = peekc; /* fall through and continue XXX */
3645 else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0)))
3647 /*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/
3648 tflags |= LEX_INCOMMENT;
3651 if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */
3653 RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
3654 ret[retind++] = CTLESC;
3659 else if MBTEST((tflags & LEX_INCASE) && ch == close && close == ')')
3660 tflags &= ~LEX_INCASE; /* XXX */
3662 else if MBTEST(ch == close && (tflags & LEX_INCASE) == 0) /* ending delimiter */
3665 /*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/
3667 else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
3670 /*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
3673 /* Add this character. */
3674 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
3677 /* If we just read the ending character, don't bother continuing. */
3681 if MBTEST(ch == '\\') /* backslashes */
3682 tflags |= LEX_PASSNEXT;
3684 if MBTEST(shellquote (ch))
3686 /* '', ``, or "" inside $(...). */
3687 push_delimiter (dstack, ch);
3688 if MBTEST((tflags & LEX_WASDOL) && ch == '\'') /* $'...' inside group */
3689 nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags);
3691 nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags);
3692 pop_delimiter (dstack);
3693 CHECK_NESTRET_ERROR ();
3695 if MBTEST((tflags & LEX_WASDOL) && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0))
3697 /* Translate $'...' here. */
3698 ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen);
3701 if ((rflags & P_DQUOTE) == 0)
3703 nestret = sh_single_quote (ttrans);
3705 nestlen = strlen (nestret);
3710 nestlen = ttranslen;
3712 retind -= 2; /* back up before the $' */
3714 else if MBTEST((tflags & LEX_WASDOL) && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0))
3716 /* Locale expand $"..." here. */
3717 ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen);
3720 nestret = sh_mkdoublequoted (ttrans, ttranslen, 0);
3722 nestlen = ttranslen + 2;
3723 retind -= 2; /* back up before the $" */
3729 else if MBTEST((tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
3730 /* check for $(), $[], or ${} inside command substitution. */
3732 if ((tflags & LEX_INCASE) == 0 && open == ch) /* undo previous increment */
3734 if (ch == '(') /* ) */
3735 nestret = parse_comsub (0, '(', ')', &nestlen, (rflags|P_COMMAND) & ~P_DQUOTE);
3736 else if (ch == '{') /* } */
3737 nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags);
3738 else if (ch == '[') /* ] */
3739 nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
3741 CHECK_NESTRET_ERROR ();
3746 if MBTEST(ch == '$')
3747 tflags |= LEX_WASDOL;
3749 tflags &= ~LEX_WASDOL;
3756 /*itrace("parse_comsub:%d: returning `%s'", line_number, ret);*/
3760 /* XXX - this needs to handle functionality like subst.c:no_longjmp_on_fatal_error;
3761 maybe extract_command_subst should handle it. */
3763 xparse_dolparen (base, string, indp, flags)
3769 sh_parser_state_t ps;
3770 int orig_ind, nc, sflags;
3771 char *ret, *s, *ep, *ostring;
3777 sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE;
3778 if (flags & SX_NOLONGJMP)
3779 sflags |= SEVAL_NOLONGJMP;
3780 save_parser_state (&ps);
3783 parser_state |= PST_CMDSUBST|PST_EOFTOKEN; /* allow instant ')' */ /*(*/
3784 shell_eof_token = ')';
3785 parse_string (string, "command substitution", sflags, &ep);
3787 restore_parser_state (&ps);
3792 /* Need to find how many characters parse_and_execute consumed, update
3793 *indp, if flags != 0, copy the portion of the string parsed into RET
3794 and return it. If flags & 1 (EX_NOALLOC) we can return NULL. */
3801 itrace("xparse_dolparen:%d: ep[-1] != RPAREN (%d), ep = `%s'", line_number, ep[-1], ep);
3803 while (ep > ostring && ep[-1] == '\n') ep--;
3807 *indp = ep - base - 1;
3811 if (base[*indp] != ')')
3812 itrace("xparse_dolparen:%d: base[%d] != RPAREN (%d), base = `%s'", line_number, *indp, base[*indp], base);
3815 if (flags & SX_NOALLOC)
3816 return (char *)NULL;
3824 ret = substring (ostring, 0, nc - 1);
3829 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
3830 /* Parse a double-paren construct. It can be either an arithmetic
3831 command, an arithmetic `for' command, or a nested subshell. Returns
3832 the parsed token, -1 on error, or -2 if we didn't do anything and
3833 should just go on. */
3842 #if defined (ARITH_FOR_COMMAND)
3843 if (last_read_token == FOR)
3845 arith_for_lineno = line_number;
3846 cmdtyp = parse_arith_cmd (&wval, 0);
3849 wd = alloc_word_desc ();
3851 yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
3852 return (ARITH_FOR_EXPRS);
3855 return -1; /* ERROR */
3859 #if defined (DPAREN_ARITHMETIC)
3860 if (reserved_word_acceptable (last_read_token))
3862 sline = line_number;
3864 cmdtyp = parse_arith_cmd (&wval, 0);
3865 if (cmdtyp == 1) /* arithmetic command */
3867 wd = alloc_word_desc ();
3869 wd->flags = W_QUOTED|W_NOSPLIT|W_NOGLOB|W_DQUOTE;
3870 yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
3873 else if (cmdtyp == 0) /* nested subshell */
3875 push_string (wval, 0, (alias_t *)NULL);
3876 if ((parser_state & PST_CASEPAT) == 0)
3877 parser_state |= PST_SUBSHELL;
3885 return -2; /* XXX */
3888 /* We've seen a `(('. Look for the matching `))'. If we get it, return 1.
3889 If not, assume it's a nested subshell for backwards compatibility and
3890 return 0. In any case, put the characters we've consumed into a locally-
3891 allocated buffer and make *ep point to that buffer. Return -1 on an
3892 error, for example EOF. */
3894 parse_arith_cmd (ep, adddq)
3898 int exp_lineno, rval, c;
3899 char *ttok, *tokstr;
3902 exp_lineno = line_number;
3903 ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
3905 if (ttok == &matched_pair_error)
3907 /* Check that the next character is the closing right paren. If
3908 not, this is a syntax error. ( */
3913 tokstr = (char *)xmalloc (ttoklen + 4);
3915 /* if ADDDQ != 0 then (( ... )) -> "..." */
3916 if (rval == 1 && adddq) /* arith cmd, add double quotes */
3919 strncpy (tokstr + 1, ttok, ttoklen - 1);
3920 tokstr[ttoklen] = '"';
3921 tokstr[ttoklen+1] = '\0';
3923 else if (rval == 1) /* arith cmd, don't add double quotes */
3925 strncpy (tokstr, ttok, ttoklen - 1);
3926 tokstr[ttoklen-1] = '\0';
3928 else /* nested subshell */
3931 strncpy (tokstr + 1, ttok, ttoklen - 1);
3932 tokstr[ttoklen] = ')';
3933 tokstr[ttoklen+1] = c;
3934 tokstr[ttoklen+2] = '\0';
3941 #endif /* DPAREN_ARITHMETIC || ARITH_FOR_COMMAND */
3943 #if defined (COND_COMMAND)
3949 if (EOF_Reached && cond_token != COND_ERROR) /* [[ */
3950 parser_error (cond_lineno, _("unexpected EOF while looking for `]]'"));
3951 else if (cond_token != COND_ERROR)
3953 if (etext = error_token_from_token (cond_token))
3955 parser_error (cond_lineno, _("syntax error in conditional expression: unexpected token `%s'"), etext);
3959 parser_error (cond_lineno, _("syntax error in conditional expression"));
3966 return (cond_or ());
3975 if (cond_token == OR_OR)
3978 l = make_cond_node (COND_OR, (WORD_DESC *)NULL, l, r);
3989 if (cond_token == AND_AND)
3992 l = make_cond_node (COND_AND, (WORD_DESC *)NULL, l, r);
3998 cond_skip_newlines ()
4000 while ((cond_token = read_token (READ)) == '\n')
4002 if (SHOULD_PROMPT ())
4005 return (cond_token);
4008 #define COND_RETURN_ERROR() \
4009 do { cond_token = COND_ERROR; return ((COND_COM *)NULL); } while (0)
4015 COND_COM *term, *tleft, *tright;
4019 /* Read a token. It can be a left paren, a `!', a unary operator, or a
4020 word that should be the first argument of a binary operator. Start by
4021 skipping newlines, since this is a compound command. */
4022 tok = cond_skip_newlines ();
4023 lineno = line_number;
4024 if (tok == COND_END)
4026 COND_RETURN_ERROR ();
4028 else if (tok == '(')
4030 term = cond_expr ();
4031 if (cond_token != ')')
4034 dispose_cond_node (term); /* ( */
4035 if (etext = error_token_from_token (cond_token))
4037 parser_error (lineno, _("unexpected token `%s', expected `)'"), etext);
4041 parser_error (lineno, _("expected `)'"));
4042 COND_RETURN_ERROR ();
4044 term = make_cond_node (COND_EXPR, (WORD_DESC *)NULL, term, (COND_COM *)NULL);
4045 (void)cond_skip_newlines ();
4047 else if (tok == BANG || (tok == WORD && (yylval.word->word[0] == '!' && yylval.word->word[1] == '\0')))
4050 dispose_word (yylval.word); /* not needed */
4051 term = cond_term ();
4053 term->flags |= CMD_INVERT_RETURN;
4055 else if (tok == WORD && yylval.word->word[0] == '-' && yylval.word->word[2] == 0 && test_unop (yylval.word->word))
4058 tok = read_token (READ);
4061 tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
4062 term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL);
4067 if (etext = error_token_from_token (tok))
4069 parser_error (line_number, _("unexpected argument `%s' to conditional unary operator"), etext);
4073 parser_error (line_number, _("unexpected argument to conditional unary operator"));
4074 COND_RETURN_ERROR ();
4077 (void)cond_skip_newlines ();
4079 else if (tok == WORD) /* left argument to binary operator */
4082 tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
4085 tok = read_token (READ);
4086 if (tok == WORD && test_binop (yylval.word->word))
4089 if (op->word[0] == '=' && (op->word[1] == '\0' || (op->word[1] == '=' && op->word[2] == '\0')))
4090 parser_state |= PST_EXTPAT;
4091 else if (op->word[0] == '!' && op->word[1] == '=' && op->word[2] == '\0')
4092 parser_state |= PST_EXTPAT;
4094 #if defined (COND_REGEXP)
4095 else if (tok == WORD && STREQ (yylval.word->word, "=~"))
4098 parser_state |= PST_REGEXP;
4101 else if (tok == '<' || tok == '>')
4102 op = make_word_from_token (tok); /* ( */
4103 /* There should be a check before blindly accepting the `)' that we have
4104 seen the opening `('. */
4105 else if (tok == COND_END || tok == AND_AND || tok == OR_OR || tok == ')')
4107 /* Special case. [[ x ]] is equivalent to [[ -n x ]], just like
4108 the test command. Similarly for [[ x && expr ]] or
4109 [[ x || expr ]] or [[ (x) ]]. */
4110 op = make_word ("-n");
4111 term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL);
4117 if (etext = error_token_from_token (tok))
4119 parser_error (line_number, _("unexpected token `%s', conditional binary operator expected"), etext);
4123 parser_error (line_number, _("conditional binary operator expected"));
4124 dispose_cond_node (tleft);
4125 COND_RETURN_ERROR ();
4129 if (parser_state & PST_EXTPAT)
4131 tok = read_token (READ);
4132 if (parser_state & PST_EXTPAT)
4133 extended_glob = global_extglob;
4134 parser_state &= ~(PST_REGEXP|PST_EXTPAT);
4138 tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
4139 term = make_cond_node (COND_BINARY, op, tleft, tright);
4143 if (etext = error_token_from_token (tok))
4145 parser_error (line_number, _("unexpected argument `%s' to conditional binary operator"), etext);
4149 parser_error (line_number, _("unexpected argument to conditional binary operator"));
4150 dispose_cond_node (tleft);
4152 COND_RETURN_ERROR ();
4155 (void)cond_skip_newlines ();
4160 parser_error (line_number, _("unexpected token `%c' in conditional command"), tok);
4161 else if (etext = error_token_from_token (tok))
4163 parser_error (line_number, _("unexpected token `%s' in conditional command"), etext);
4167 parser_error (line_number, _("unexpected token %d in conditional command"), tok);
4168 COND_RETURN_ERROR ();
4173 /* This is kind of bogus -- we slip a mini recursive-descent parser in
4174 here to handle the conditional statement syntax. */
4176 parse_cond_command ()
4180 global_extglob = extended_glob;
4181 cexp = cond_expr ();
4182 return (make_cond_command (cexp));
4186 #if defined (ARRAY_VARS)
4187 /* When this is called, it's guaranteed that we don't care about anything
4188 in t beyond i. We do save and restore the chars, though. */
4190 token_is_assignment (t, i)
4194 unsigned char c, c1;
4197 c = t[i]; c1 = t[i+1];
4198 t[i] = '='; t[i+1] = '\0';
4199 r = assignment (t, (parser_state & PST_COMPASSIGN) != 0);
4200 t[i] = c; t[i+1] = c1;
4204 /* XXX - possible changes here for `+=' */
4206 token_is_ident (t, i)
4215 r = legal_identifier (t);
4222 read_token_word (character)
4225 /* The value for YYLVAL when a WORD is read. */
4226 WORD_DESC *the_word;
4228 /* Index into the token that we are building. */
4231 /* ALL_DIGITS becomes zero when we see a non-digit. */
4232 int all_digit_token;
4234 /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */
4237 /* COMPOUND_ASSIGNMENT becomes non-zero if we are parsing a compound
4239 int compound_assignment;
4241 /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */
4244 /* Non-zero means to ignore the value of the next character, and just
4245 to add it no matter what. */
4246 int pass_next_character;
4248 /* The current delimiting character. */
4250 int result, peek_char;
4251 char *ttok, *ttrans;
4252 int ttoklen, ttranslen;
4255 if (token_buffer_size < TOKEN_DEFAULT_INITIAL_SIZE)
4256 token = (char *)xrealloc (token, token_buffer_size = TOKEN_DEFAULT_INITIAL_SIZE);
4259 all_digit_token = DIGIT (character);
4260 dollar_present = quoted = pass_next_character = compound_assignment = 0;
4264 if (character == EOF)
4267 if (pass_next_character)
4269 pass_next_character = 0;
4270 goto got_escaped_character;
4273 cd = current_delimiter (dstack);
4275 /* Handle backslashes. Quote lots of things when not inside of
4276 double-quotes, quote some things inside of double-quotes. */
4277 if MBTEST(character == '\\')
4279 peek_char = shell_getc (0);
4281 /* Backslash-newline is ignored in all cases except
4282 when quoted with single quotes. */
4283 if (peek_char == '\n')
4286 goto next_character;
4290 shell_ungetc (peek_char);
4292 /* If the next character is to be quoted, note it now. */
4293 if (cd == 0 || cd == '`' ||
4294 (cd == '"' && peek_char >= 0 && (sh_syntaxtab[peek_char] & CBSDQUOTE)))
4295 pass_next_character++;
4302 /* Parse a matched pair of quote characters. */
4303 if MBTEST(shellquote (character))
4305 push_delimiter (dstack, character);
4306 ttok = parse_matched_pair (character, character, character, &ttoklen, (character == '`') ? P_COMMAND : 0);
4307 pop_delimiter (dstack);
4308 if (ttok == &matched_pair_error)
4309 return -1; /* Bail immediately. */
4310 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
4311 token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
4312 token[token_index++] = character;
4313 strcpy (token + token_index, ttok);
4314 token_index += ttoklen;
4315 all_digit_token = 0;
4317 dollar_present |= (character == '"' && strchr (ttok, '$') != 0);
4319 goto next_character;
4323 /* When parsing a regexp as a single word inside a conditional command,
4324 we need to special-case characters special to both the shell and
4325 regular expressions. Right now, that is only '(' and '|'. */ /*)*/
4326 if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/
4328 if (character == '|')
4331 push_delimiter (dstack, character);
4332 ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
4333 pop_delimiter (dstack);
4334 if (ttok == &matched_pair_error)
4335 return -1; /* Bail immediately. */
4336 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
4337 token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
4338 token[token_index++] = character;
4339 strcpy (token + token_index, ttok);
4340 token_index += ttoklen;
4342 dollar_present = all_digit_token = 0;
4343 goto next_character;
4345 #endif /* COND_REGEXP */
4347 #ifdef EXTENDED_GLOB
4348 /* Parse a ksh-style extended pattern matching specification. */
4349 if MBTEST(extended_glob && PATTERN_CHAR (character))
4351 peek_char = shell_getc (1);
4352 if MBTEST(peek_char == '(') /* ) */
4354 push_delimiter (dstack, peek_char);
4355 ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
4356 pop_delimiter (dstack);
4357 if (ttok == &matched_pair_error)
4358 return -1; /* Bail immediately. */
4359 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
4361 TOKEN_DEFAULT_GROW_SIZE);
4362 token[token_index++] = character;
4363 token[token_index++] = peek_char;
4364 strcpy (token + token_index, ttok);
4365 token_index += ttoklen;
4367 dollar_present = all_digit_token = 0;
4368 goto next_character;
4371 shell_ungetc (peek_char);
4373 #endif /* EXTENDED_GLOB */
4375 /* If the delimiter character is not single quote, parse some of
4376 the shell expansions that must be read as a single word. */
4377 if (shellexp (character))
4379 peek_char = shell_getc (1);
4380 /* $(...), <(...), >(...), $((...)), ${...}, and $[...] constructs */
4381 if MBTEST(peek_char == '(' || \
4382 ((peek_char == '{' || peek_char == '[') && character == '$')) /* ) ] } */
4384 if (peek_char == '{') /* } */
4385 ttok = parse_matched_pair (cd, '{', '}', &ttoklen, P_FIRSTCLOSE);
4386 else if (peek_char == '(') /* ) */
4388 /* XXX - push and pop the `(' as a delimiter for use by
4389 the command-oriented-history code. This way newlines
4390 appearing in the $(...) string get added to the
4391 history literally rather than causing a possibly-
4392 incorrect `;' to be added. ) */
4393 push_delimiter (dstack, peek_char);
4394 ttok = parse_comsub (cd, '(', ')', &ttoklen, P_COMMAND);
4395 pop_delimiter (dstack);
4398 ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
4399 if (ttok == &matched_pair_error)
4400 return -1; /* Bail immediately. */
4401 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
4403 TOKEN_DEFAULT_GROW_SIZE);
4404 token[token_index++] = character;
4405 token[token_index++] = peek_char;
4406 strcpy (token + token_index, ttok);
4407 token_index += ttoklen;
4410 all_digit_token = 0;
4411 goto next_character;
4413 /* This handles $'...' and $"..." new-style quoted strings. */
4414 else if MBTEST(character == '$' && (peek_char == '\'' || peek_char == '"'))
4418 first_line = line_number;
4419 push_delimiter (dstack, peek_char);
4420 ttok = parse_matched_pair (peek_char, peek_char, peek_char,
4422 (peek_char == '\'') ? P_ALLOWESC : 0);
4423 pop_delimiter (dstack);
4424 if (ttok == &matched_pair_error)
4426 if (peek_char == '\'')
4428 ttrans = ansiexpand (ttok, 0, ttoklen - 1, &ttranslen);
4431 /* Insert the single quotes and correctly quote any
4432 embedded single quotes (allowed because P_ALLOWESC was
4433 passed to parse_matched_pair). */
4434 ttok = sh_single_quote (ttrans);
4436 ttranslen = strlen (ttok);
4441 /* Try to locale-expand the converted string. */
4442 ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen);
4445 /* Add the double quotes back */
4446 ttok = sh_mkdoublequoted (ttrans, ttranslen, 0);
4452 RESIZE_MALLOCED_BUFFER (token, token_index, ttranslen + 2,
4454 TOKEN_DEFAULT_GROW_SIZE);
4455 strcpy (token + token_index, ttrans);
4456 token_index += ttranslen;
4459 all_digit_token = 0;
4460 goto next_character;
4462 /* This could eventually be extended to recognize all of the
4463 shell's single-character parameter expansions, and set flags.*/
4464 else if MBTEST(character == '$' && peek_char == '$')
4466 ttok = (char *)xmalloc (3);
4467 ttok[0] = ttok[1] = '$';
4469 RESIZE_MALLOCED_BUFFER (token, token_index, 3,
4471 TOKEN_DEFAULT_GROW_SIZE);
4472 strcpy (token + token_index, ttok);
4475 all_digit_token = 0;
4477 goto next_character;
4480 shell_ungetc (peek_char);
4483 #if defined (ARRAY_VARS)
4484 /* Identify possible array subscript assignment; match [...]. If
4485 parser_state&PST_COMPASSIGN, we need to parse [sub]=words treating
4486 `sub' as if it were enclosed in double quotes. */
4487 else if MBTEST(character == '[' && /* ] */
4488 ((token_index > 0 && assignment_acceptable (last_read_token) && token_is_ident (token, token_index)) ||
4489 (token_index == 0 && (parser_state&PST_COMPASSIGN))))
4491 ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARRAYSUB);
4492 if (ttok == &matched_pair_error)
4493 return -1; /* Bail immediately. */
4494 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
4496 TOKEN_DEFAULT_GROW_SIZE);
4497 token[token_index++] = character;
4498 strcpy (token + token_index, ttok);
4499 token_index += ttoklen;
4501 all_digit_token = 0;
4502 goto next_character;
4504 /* Identify possible compound array variable assignment. */
4505 else if MBTEST(character == '=' && token_index > 0 && (assignment_acceptable (last_read_token) || (parser_state & PST_ASSIGNOK)) && token_is_assignment (token, token_index))
4507 peek_char = shell_getc (1);
4508 if MBTEST(peek_char == '(') /* ) */
4510 ttok = parse_compound_assignment (&ttoklen);
4512 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 4,
4514 TOKEN_DEFAULT_GROW_SIZE);
4516 token[token_index++] = '=';
4517 token[token_index++] = '(';
4520 strcpy (token + token_index, ttok);
4521 token_index += ttoklen;
4523 token[token_index++] = ')';
4525 all_digit_token = 0;
4526 compound_assignment = 1;
4528 goto next_character;
4530 goto got_token; /* ksh93 seems to do this */
4534 shell_ungetc (peek_char);
4538 /* When not parsing a multi-character word construct, shell meta-
4539 characters break words. */
4540 if MBTEST(shellbreak (character))
4542 shell_ungetc (character);
4548 if (character == CTLESC || character == CTLNUL)
4549 token[token_index++] = CTLESC;
4551 got_escaped_character:
4553 all_digit_token &= DIGIT (character);
4554 dollar_present |= character == '$';
4556 token[token_index++] = character;
4558 RESIZE_MALLOCED_BUFFER (token, token_index, 1, token_buffer_size,
4559 TOKEN_DEFAULT_GROW_SIZE);
4562 if (character == '\n' && SHOULD_PROMPT ())
4565 /* We want to remove quoted newlines (that is, a \<newline> pair)
4566 unless we are within single quotes or pass_next_character is
4567 set (the shell equivalent of literal-next). */
4568 cd = current_delimiter (dstack);
4569 character = shell_getc (cd != '\'' && pass_next_character == 0);
4570 } /* end for (;;) */
4574 token[token_index] = '\0';
4576 /* Check to see what thing we should return. If the last_read_token
4577 is a `<', or a `&', or the character which ended this token is
4578 a '>' or '<', then, and ONLY then, is this input token a NUMBER.
4579 Otherwise, it is just a word, and should be returned as such. */
4580 if MBTEST(all_digit_token && (character == '<' || character == '>' || \
4581 last_read_token == LESS_AND || \
4582 last_read_token == GREATER_AND))
4584 if (legal_number (token, &lvalue) && (int)lvalue == lvalue)
4585 yylval.number = lvalue;
4591 /* Check for special case tokens. */
4592 result = (last_shell_getc_is_singlebyte) ? special_case_tokens (token) : -1;
4597 /* Posix.2 does not allow reserved words to be aliased, so check for all
4598 of them, including special cases, before expanding the current token
4600 if MBTEST(posixly_correct)
4601 CHECK_FOR_RESERVED_WORD (token);
4603 /* Aliases are expanded iff EXPAND_ALIASES is non-zero, and quoting
4604 inhibits alias expansion. */
4605 if (expand_aliases && quoted == 0)
4607 result = alias_expand_token (token);
4608 if (result == RE_READ_TOKEN)
4609 return (RE_READ_TOKEN);
4610 else if (result == NO_EXPANSION)
4611 parser_state &= ~PST_ALEXPNEXT;
4614 /* If not in Posix.2 mode, check for reserved words after alias
4616 if MBTEST(posixly_correct == 0)
4618 CHECK_FOR_RESERVED_WORD (token);
4620 the_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
4621 the_word->word = (char *)xmalloc (1 + token_index);
4622 the_word->flags = 0;
4623 strcpy (the_word->word, token);
4625 the_word->flags |= W_HASDOLLAR;
4627 the_word->flags |= W_QUOTED; /*(*/
4628 if (compound_assignment && token[token_index-1] == ')')
4629 the_word->flags |= W_COMPASSIGN;
4630 /* A word is an assignment if it appears at the beginning of a
4631 simple command, or after another assignment word. This is
4632 context-dependent, so it cannot be handled in the grammar. */
4633 if (assignment (token, (parser_state & PST_COMPASSIGN) != 0))
4635 the_word->flags |= W_ASSIGNMENT;
4636 /* Don't perform word splitting on assignment statements. */
4637 if (assignment_acceptable (last_read_token) || (parser_state & PST_COMPASSIGN) != 0)
4638 the_word->flags |= W_NOSPLIT;
4641 if (command_token_position (last_read_token))
4644 b = builtin_address_internal (token, 0);
4645 if (b && (b->flags & ASSIGNMENT_BUILTIN))
4646 parser_state |= PST_ASSIGNOK;
4647 else if (STREQ (token, "eval") || STREQ (token, "let"))
4648 parser_state |= PST_ASSIGNOK;
4651 yylval.word = the_word;
4653 if (token[0] == '{' && token[token_index-1] == '}' &&
4654 (character == '<' || character == '>'))
4656 /* can use token; already copied to the_word */
4657 token[token_index-1] = '\0';
4658 if (legal_identifier (token+1))
4660 strcpy (the_word->word, token+1);
4661 /*itrace("read_token_word: returning REDIR_WORD for %s", the_word->word);*/
4662 return (REDIR_WORD);
4666 result = ((the_word->flags & (W_ASSIGNMENT|W_NOSPLIT)) == (W_ASSIGNMENT|W_NOSPLIT))
4667 ? ASSIGNMENT_WORD : WORD;
4669 switch (last_read_token)
4672 parser_state |= PST_ALLOWOPNBRC;
4673 function_dstart = line_number;
4678 if (word_top < MAX_CASE_NEST)
4680 word_lineno[word_top] = line_number;
4687 /* Return 1 if TOKSYM is a token that after being read would allow
4688 a reserved word to be seen, else 0. */
4690 reserved_word_acceptable (toksym)
4726 #if defined (COPROCESS_SUPPORT)
4727 if (last_read_token == WORD && token_before_that == COPROC)
4734 /* Return the index of TOKEN in the alist of reserved words, or -1 if
4735 TOKEN is not a shell reserved word. */
4737 find_reserved_word (tokstr)
4741 for (i = 0; word_token_alist[i].word; i++)
4742 if (STREQ (tokstr, word_token_alist[i].word))
4748 #if defined (READLINE)
4749 /* Called after each time readline is called. This insures that whatever
4750 the new prompt string is gets propagated to readline's local prompt
4753 reset_readline_prompt ()
4757 if (prompt_string_pointer)
4759 temp_prompt = (*prompt_string_pointer)
4760 ? decode_prompt_string (*prompt_string_pointer)
4763 if (temp_prompt == 0)
4765 temp_prompt = (char *)xmalloc (1);
4766 temp_prompt[0] = '\0';
4769 FREE (current_readline_prompt);
4770 current_readline_prompt = temp_prompt;
4773 #endif /* READLINE */
4776 #if defined (HISTORY)
4777 /* A list of tokens which can be followed by newlines, but not by
4778 semi-colons. When concatenating multiple lines of history, the
4779 newline separator for such tokens is replaced with a space. */
4780 static const int no_semi_successors[] = {
4781 '\n', '{', '(', ')', ';', '&', '|',
4782 CASE, DO, ELSE, IF, SEMI_SEMI, SEMI_AND, SEMI_SEMI_AND, THEN, UNTIL,
4783 WHILE, AND_AND, OR_OR, IN,
4787 /* If we are not within a delimited expression, try to be smart
4788 about which separators can be semi-colons and which must be
4789 newlines. Returns the string that should be added into the
4792 history_delimiting_chars ()
4796 if (dstack.delimiter_depth != 0)
4799 /* We look for current_command_line_count == 2 because we are looking to
4800 add the first line of the body of the here document (the second line
4802 if (parser_state & PST_HEREDOC)
4803 return (current_command_line_count == 2 ? "\n" : "");
4805 /* First, handle some special cases. */
4807 /* If we just read `()', assume it's a function definition, and don't
4808 add a semicolon. If the token before the `)' was not `(', and we're
4809 not in the midst of parsing a case statement, assume it's a
4810 parenthesized command and add the semicolon. */
4812 if (token_before_that == ')')
4814 if (two_tokens_ago == '(') /*)*/ /* function def */
4816 /* This does not work for subshells inside case statement
4817 command lists. It's a suboptimal solution. */
4818 else if (parser_state & PST_CASESTMT) /* case statement pattern */
4821 return "; "; /* (...) subshell */
4823 else if (token_before_that == WORD && two_tokens_ago == FUNCTION)
4824 return " "; /* function def using `function name' without `()' */
4826 else if (token_before_that == WORD && two_tokens_ago == FOR)
4828 /* Tricky. `for i\nin ...' should not have a semicolon, but
4829 `for i\ndo ...' should. We do what we can. */
4830 for (i = shell_input_line_index; whitespace (shell_input_line[i]); i++)
4832 if (shell_input_line[i] && shell_input_line[i] == 'i' && shell_input_line[i+1] == 'n')
4836 else if (two_tokens_ago == CASE && token_before_that == WORD && (parser_state & PST_CASESTMT))
4839 for (i = 0; no_semi_successors[i]; i++)
4841 if (token_before_that == no_semi_successors[i])
4847 #endif /* HISTORY */
4849 /* Issue a prompt, or prepare to issue a prompt when the next character
4856 if (interactive == 0 || expanding_alias ()) /* XXX */
4859 ps1_prompt = get_string_value ("PS1");
4860 ps2_prompt = get_string_value ("PS2");
4862 if (!prompt_string_pointer)
4863 prompt_string_pointer = &ps1_prompt;
4865 temp_prompt = *prompt_string_pointer
4866 ? decode_prompt_string (*prompt_string_pointer)
4869 if (temp_prompt == 0)
4871 temp_prompt = (char *)xmalloc (1);
4872 temp_prompt[0] = '\0';
4875 current_prompt_string = *prompt_string_pointer;
4876 prompt_string_pointer = &ps2_prompt;
4878 #if defined (READLINE)
4879 if (!no_line_editing)
4881 FREE (current_readline_prompt);
4882 current_readline_prompt = temp_prompt;
4885 #endif /* READLINE */
4887 FREE (current_decoded_prompt);
4888 current_decoded_prompt = temp_prompt;
4893 get_current_prompt_level ()
4895 return ((current_prompt_string && current_prompt_string == ps2_prompt) ? 2 : 1);
4899 set_current_prompt_level (x)
4902 prompt_string_pointer = (x == 2) ? &ps2_prompt : &ps1_prompt;
4903 current_prompt_string = *prompt_string_pointer;
4909 fprintf (stderr, "%s", current_decoded_prompt);
4913 /* Return a string which will be printed as a prompt. The string
4914 may contain special characters which are decoded as follows:
4917 \d the date in Day Mon Date format
4918 \e escape (ascii 033)
4919 \h the hostname up to the first `.'
4921 \j the number of active jobs
4922 \l the basename of the shell's tty device name
4925 \s the name of the shell
4926 \t the time in 24-hour hh:mm:ss format
4927 \T the time in 12-hour hh:mm:ss format
4928 \@ the time in 12-hour hh:mm am/pm format
4929 \A the time in 24-hour hh:mm format
4930 \D{fmt} the result of passing FMT to strftime(3)
4932 \v the version of bash (e.g., 2.00)
4933 \V the release of bash, version + patchlevel (e.g., 2.00.0)
4934 \w the current working directory
4935 \W the last element of $PWD
4936 \! the history number of this command
4937 \# the command number of this command
4938 \$ a $ or a # if you are root
4939 \nnn character code nnn in octal
4941 \[ begin a sequence of non-printing chars
4942 \] end a sequence of non-printing chars
4944 #define PROMPT_GROWTH 48
4946 decode_prompt_string (string)
4951 struct dstack save_dstack;
4952 int last_exit_value, last_comsub_pid;
4953 #if defined (PROMPT_STRING_DECODE)
4954 int result_size, result_index;
4956 char *temp, octal_string[4];
4962 result = (char *)xmalloc (result_size = PROMPT_GROWTH);
4963 result[result_index = 0] = 0;
4964 temp = (char *)NULL;
4966 while (c = *string++)
4968 if (posixly_correct && c == '!')
4972 temp = savestring ("!");
4977 #if !defined (HISTORY)
4978 temp = savestring ("1");
4980 temp = itos (history_number ());
4981 #endif /* HISTORY */
4982 string--; /* add_string increments string again. */
5000 strncpy (octal_string, string, 3);
5001 octal_string[3] = '\0';
5003 n = read_octal (octal_string);
5004 temp = (char *)xmalloc (3);
5006 if (n == CTLESC || n == CTLNUL)
5023 for (c = 0; n != -1 && c < 3 && ISOCTAL (*string); c++)
5026 c = 0; /* tested at add_string: */
5034 /* Make the current time/date into a string. */
5035 (void) time (&the_time);
5036 tm = localtime (&the_time);
5039 n = strftime (timebuf, sizeof (timebuf), "%a %b %d", tm);
5041 n = strftime (timebuf, sizeof (timebuf), "%H:%M:%S", tm);
5043 n = strftime (timebuf, sizeof (timebuf), "%I:%M:%S", tm);
5045 n = strftime (timebuf, sizeof (timebuf), "%I:%M %p", tm);
5047 n = strftime (timebuf, sizeof (timebuf), "%H:%M", tm);
5052 timebuf[sizeof(timebuf) - 1] = '\0';
5054 temp = savestring (timebuf);
5057 case 'D': /* strftime format */
5058 if (string[1] != '{') /* } */
5061 (void) time (&the_time);
5062 tm = localtime (&the_time);
5063 string += 2; /* skip { */
5064 timefmt = xmalloc (strlen (string) + 3);
5065 for (t = timefmt; *string && *string != '}'; )
5068 c = *string; /* tested at add_string */
5069 if (timefmt[0] == '\0')
5072 timefmt[1] = 'X'; /* locale-specific current time */
5075 n = strftime (timebuf, sizeof (timebuf), timefmt, tm);
5081 timebuf[sizeof(timebuf) - 1] = '\0';
5083 if (promptvars || posixly_correct)
5084 /* Make sure that expand_prompt_string is called with a
5085 second argument of Q_DOUBLE_QUOTES if we use this
5087 temp = sh_backslash_quote_for_double_quotes (timebuf);
5089 temp = savestring (timebuf);
5093 temp = (char *)xmalloc (3);
5094 temp[0] = no_line_editing ? '\n' : '\r';
5095 temp[1] = no_line_editing ? '\0' : '\n';
5100 temp = base_pathname (shell_name);
5101 temp = savestring (temp);
5106 temp = (char *)xmalloc (16);
5108 strcpy (temp, dist_version);
5110 sprintf (temp, "%s.%d", dist_version, patch_level);
5116 /* Use the value of PWD because it is much more efficient. */
5117 char t_string[PATH_MAX];
5120 temp = get_string_value ("PWD");
5124 if (getcwd (t_string, sizeof(t_string)) == 0)
5130 tlen = strlen (t_string);
5134 tlen = sizeof (t_string) - 1;
5135 strncpy (t_string, temp, tlen);
5137 t_string[tlen] = '\0';
5139 #if defined (MACOSX)
5140 /* Convert from "fs" format to "input" format */
5141 temp = fnx_fromfs (t_string, strlen (t_string));
5142 if (temp != t_string)
5143 strcpy (t_string, temp);
5146 #define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0)
5147 #define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0)
5148 /* Abbreviate \W as ~ if $PWD == $HOME */
5149 if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0))
5151 if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0)
5153 t = strrchr (t_string, '/');
5155 strcpy (t_string, t + 1);
5159 #undef DOUBLE_SLASH_ROOT
5161 /* polite_directory_format is guaranteed to return a string
5162 no longer than PATH_MAX - 1 characters. */
5163 strcpy (t_string, polite_directory_format (t_string));
5165 temp = trim_pathname (t_string, PATH_MAX - 1);
5166 /* If we're going to be expanding the prompt string later,
5167 quote the directory name. */
5168 if (promptvars || posixly_correct)
5169 /* Make sure that expand_prompt_string is called with a
5170 second argument of Q_DOUBLE_QUOTES if we use this
5172 temp = sh_backslash_quote_for_double_quotes (t_string);
5174 temp = savestring (t_string);
5180 if (current_user.user_name == 0)
5181 get_current_user_info ();
5182 temp = savestring (current_user.user_name);
5187 temp = savestring (current_host_name);
5188 if (c == 'h' && (t = (char *)strchr (temp, '.')))
5193 temp = itos (current_command_number);
5197 #if !defined (HISTORY)
5198 temp = savestring ("1");
5200 temp = itos (history_number ());
5201 #endif /* HISTORY */
5205 t = temp = (char *)xmalloc (3);
5206 if ((promptvars || posixly_correct) && (current_user.euid != 0))
5208 *t++ = current_user.euid == 0 ? '#' : '$';
5213 temp = itos (count_all_jobs ());
5217 #if defined (HAVE_TTYNAME)
5218 temp = (char *)ttyname (fileno (stdin));
5219 t = temp ? base_pathname (temp) : "tty";
5220 temp = savestring (t);
5222 temp = savestring ("tty");
5223 #endif /* !HAVE_TTYNAME */
5226 #if defined (READLINE)
5229 if (no_line_editing)
5234 temp = (char *)xmalloc (3);
5235 n = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
5237 if (n == CTLESC || n == CTLNUL)
5242 #endif /* READLINE */
5248 temp = (char *)xmalloc (2);
5255 else /* (c == '\\') */
5262 temp = (char *)xmalloc (3);
5271 sub_append_string (temp, result, &result_index, &result_size);
5272 temp = (char *)NULL; /* Freed in sub_append_string (). */
5273 result[result_index] = '\0';
5279 RESIZE_MALLOCED_BUFFER (result, result_index, 3, result_size, PROMPT_GROWTH);
5280 result[result_index++] = c;
5281 result[result_index] = '\0';
5284 #else /* !PROMPT_STRING_DECODE */
5285 result = savestring (string);
5286 #endif /* !PROMPT_STRING_DECODE */
5288 /* Save the delimiter stack and point `dstack' to temp space so any
5289 command substitutions in the prompt string won't result in screwing
5290 up the parser's quoting state. */
5291 save_dstack = dstack;
5292 dstack = temp_dstack;
5293 dstack.delimiter_depth = 0;
5295 /* Perform variable and parameter expansion and command substitution on
5296 the prompt string. */
5297 if (promptvars || posixly_correct)
5299 last_exit_value = last_command_exit_value;
5300 last_comsub_pid = last_command_subst_pid;
5301 list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0);
5303 result = string_list (list);
5304 dispose_words (list);
5305 last_command_exit_value = last_exit_value;
5306 last_command_subst_pid = last_comsub_pid;
5310 t = dequote_string (result);
5315 dstack = save_dstack;
5320 /************************************************
5324 ************************************************/
5326 /* Report a syntax error, and restart the parser. Call here for fatal
5332 report_syntax_error ((char *)NULL);
5338 error_token_from_token (tok)
5343 if (t = find_token_in_alist (tok, word_token_alist, 0))
5346 if (t = find_token_in_alist (tok, other_token_alist, 0))
5350 /* This stuff is dicy and needs closer inspection */
5351 switch (current_token)
5354 case ASSIGNMENT_WORD:
5356 t = savestring (yylval.word->word);
5359 t = itos (yylval.number);
5362 if (yylval.word_list)
5363 t = string_list (yylval.word_list);
5365 case ARITH_FOR_EXPRS:
5366 if (yylval.word_list)
5367 t = string_list_internal (yylval.word_list, " ; ");
5370 t = (char *)NULL; /* punt */
5378 error_token_from_text ()
5383 t = shell_input_line;
5384 i = shell_input_line_index;
5388 if (i && t[i] == '\0')
5391 while (i && (whitespace (t[i]) || t[i] == '\n'))
5397 while (i && (member (t[i], " \n\t;|&") == 0))
5400 while (i != token_end && (whitespace (t[i]) || t[i] == '\n'))
5403 /* Return our idea of the offending token. */
5404 if (token_end || (i == 0 && token_end == 0))
5407 msg = substring (t, i, token_end);
5408 else /* one-character token */
5410 msg = (char *)xmalloc (2);
5420 print_offending_line ()
5425 msg = savestring (shell_input_line);
5426 token_end = strlen (msg);
5427 while (token_end && msg[token_end - 1] == '\n')
5428 msg[--token_end] = '\0';
5430 parser_error (line_number, "`%s'", msg);
5434 /* Report a syntax error with line numbers, etc.
5435 Call here for recoverable errors. If you have a message to print,
5436 then place it in MESSAGE, otherwise pass NULL and this will figure
5437 out an appropriate message for you. */
5439 report_syntax_error (message)
5446 parser_error (line_number, "%s", message);
5447 if (interactive && EOF_Reached)
5449 last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
5453 /* If the line of input we're reading is not null, try to find the
5454 objectionable token. First, try to figure out what token the
5455 parser's complaining about by looking at current_token. */
5456 if (current_token != 0 && EOF_Reached == 0 && (msg = error_token_from_token (current_token)))
5458 parser_error (line_number, _("syntax error near unexpected token `%s'"), msg);
5461 if (interactive == 0)
5462 print_offending_line ();
5464 last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
5468 /* If looking at the current token doesn't prove fruitful, try to find the
5469 offending token by analyzing the text of the input line near the current
5470 input line index and report what we find. */
5471 if (shell_input_line && *shell_input_line)
5473 msg = error_token_from_text ();
5476 parser_error (line_number, _("syntax error near `%s'"), msg);
5480 /* If not interactive, print the line containing the error. */
5481 if (interactive == 0)
5482 print_offending_line ();
5486 msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
5487 parser_error (line_number, "%s", msg);
5488 /* When the shell is interactive, this file uses EOF_Reached
5489 only for error reporting. Other mechanisms are used to
5490 decide whether or not to exit. */
5491 if (interactive && EOF_Reached)
5495 last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
5498 /* ??? Needed function. ??? We have to be able to discard the constructs
5499 created during parsing. In the case of error, we want to return
5500 allocated objects to the memory pool. In the case of no error, we want
5501 to throw away the information about where the allocated objects live.
5502 (dispose_command () will actually free the command.) */
5504 discard_parser_constructs (error_p)
5509 /************************************************
5513 ************************************************/
5515 /* Do that silly `type "bye" to exit' stuff. You know, "ignoreeof". */
5517 /* A flag denoting whether or not ignoreeof is set. */
5520 /* The number of times that we have encountered an EOF character without
5521 another character intervening. When this gets above the limit, the
5522 shell terminates. */
5523 int eof_encountered = 0;
5525 /* The limit for eof_encountered. */
5526 int eof_encountered_limit = 10;
5528 /* If we have EOF as the only input unit, this user wants to leave
5529 the shell. If the shell is not interactive, then just leave.
5530 Otherwise, if ignoreeof is set, and we haven't done this the
5531 required number of times in a row, print a message. */
5533 handle_eof_input_unit ()
5537 /* shell.c may use this to decide whether or not to write out the
5538 history, among other things. We use it only for error reporting
5543 /* If the user wants to "ignore" eof, then let her do so, kind of. */
5546 if (eof_encountered < eof_encountered_limit)
5548 fprintf (stderr, _("Use \"%s\" to leave the shell.\n"),
5549 login_shell ? "logout" : "exit");
5551 /* Reset the parsing state. */
5552 last_read_token = current_token = '\n';
5553 /* Reset the prompt string to be $PS1. */
5554 prompt_string_pointer = (char **)NULL;
5560 /* In this case EOF should exit the shell. Do it now. */
5562 exit_builtin ((WORD_LIST *)NULL);
5566 /* We don't write history files, etc., for non-interactive shells. */
5571 /************************************************
5573 * STRING PARSING FUNCTIONS *
5575 ************************************************/
5577 /* It's very important that these two functions treat the characters
5578 between ( and ) identically. */
5580 static WORD_LIST parse_string_error;
5582 /* Take a string and run it through the shell parser, returning the
5583 resultant word list. Used by compound array assignment. */
5585 parse_string_to_word_list (s, flags, whom)
5591 int tok, orig_current_token, orig_line_number, orig_input_terminator;
5592 int orig_line_count;
5593 int old_echo_input, old_expand_aliases;
5594 #if defined (HISTORY)
5595 int old_remember_on_history, old_history_expansion_inhibited;
5598 #if defined (HISTORY)
5599 old_remember_on_history = remember_on_history;
5600 # if defined (BANG_HISTORY)
5601 old_history_expansion_inhibited = history_expansion_inhibited;
5603 bash_history_disable ();
5606 orig_line_number = line_number;
5607 orig_line_count = current_command_line_count;
5608 orig_input_terminator = shell_input_line_terminator;
5609 old_echo_input = echo_input_at_read;
5610 old_expand_aliases = expand_aliases;
5613 last_read_token = WORD; /* WORD to allow reserved words here */
5614 current_command_line_count = 0;
5615 echo_input_at_read = expand_aliases = 0;
5617 with_input_from_string (s, whom);
5618 wl = (WORD_LIST *)NULL;
5621 parser_state |= PST_COMPASSIGN|PST_REPARSE;
5623 while ((tok = read_token (READ)) != yacc_EOF)
5625 if (tok == '\n' && *bash_input.location.string == '\0')
5627 if (tok == '\n') /* Allow newlines in compound assignments */
5629 if (tok != WORD && tok != ASSIGNMENT_WORD)
5631 line_number = orig_line_number + line_number - 1;
5632 orig_current_token = current_token;
5633 current_token = tok;
5634 yyerror (NULL); /* does the right thing */
5635 current_token = orig_current_token;
5638 wl = &parse_string_error;
5641 wl = make_word_list (yylval.word, wl);
5644 last_read_token = '\n';
5647 #if defined (HISTORY)
5648 remember_on_history = old_remember_on_history;
5649 # if defined (BANG_HISTORY)
5650 history_expansion_inhibited = old_history_expansion_inhibited;
5651 # endif /* BANG_HISTORY */
5652 #endif /* HISTORY */
5654 echo_input_at_read = old_echo_input;
5655 expand_aliases = old_expand_aliases;
5657 current_command_line_count = orig_line_count;
5658 shell_input_line_terminator = orig_input_terminator;
5661 parser_state &= ~(PST_COMPASSIGN|PST_REPARSE);
5663 if (wl == &parse_string_error)
5665 last_command_exit_value = EXECUTION_FAILURE;
5666 if (interactive_shell == 0 && posixly_correct)
5667 jump_to_top_level (FORCE_EOF);
5669 jump_to_top_level (DISCARD);
5672 return (REVERSE_LIST (wl, WORD_LIST *));
5676 parse_compound_assignment (retlenp)
5680 int tok, orig_line_number, orig_token_size, orig_last_token, assignok;
5681 char *saved_token, *ret;
5683 saved_token = token;
5684 orig_token_size = token_buffer_size;
5685 orig_line_number = line_number;
5686 orig_last_token = last_read_token;
5688 last_read_token = WORD; /* WORD to allow reserved words here */
5690 token = (char *)NULL;
5691 token_buffer_size = 0;
5693 assignok = parser_state&PST_ASSIGNOK; /* XXX */
5695 wl = (WORD_LIST *)NULL; /* ( */
5696 parser_state |= PST_COMPASSIGN;
5698 while ((tok = read_token (READ)) != ')')
5700 if (tok == '\n') /* Allow newlines in compound assignments */
5702 if (SHOULD_PROMPT ())
5706 if (tok != WORD && tok != ASSIGNMENT_WORD)
5708 current_token = tok; /* for error reporting */
5709 if (tok == yacc_EOF) /* ( */
5710 parser_error (orig_line_number, _("unexpected EOF while looking for matching `)'"));
5712 yyerror(NULL); /* does the right thing */
5715 wl = &parse_string_error;
5718 wl = make_word_list (yylval.word, wl);
5722 token = saved_token;
5723 token_buffer_size = orig_token_size;
5725 parser_state &= ~PST_COMPASSIGN;
5727 if (wl == &parse_string_error)
5729 last_command_exit_value = EXECUTION_FAILURE;
5730 last_read_token = '\n'; /* XXX */
5731 if (interactive_shell == 0 && posixly_correct)
5732 jump_to_top_level (FORCE_EOF);
5734 jump_to_top_level (DISCARD);
5737 last_read_token = orig_last_token; /* XXX - was WORD? */
5741 rl = REVERSE_LIST (wl, WORD_LIST *);
5742 ret = string_list (rl);
5749 *retlenp = (ret && *ret) ? strlen (ret) : 0;
5752 parser_state |= PST_ASSIGNOK;
5757 /************************************************
5759 * SAVING AND RESTORING PARTIAL PARSE STATE *
5761 ************************************************/
5764 save_parser_state (ps)
5765 sh_parser_state_t *ps;
5767 #if defined (ARRAY_VARS)
5772 ps = (sh_parser_state_t *)xmalloc (sizeof (sh_parser_state_t));
5774 return ((sh_parser_state_t *)NULL);
5776 ps->parser_state = parser_state;
5777 ps->token_state = save_token_state ();
5779 ps->input_line_terminator = shell_input_line_terminator;
5780 ps->eof_encountered = eof_encountered;
5782 ps->current_command_line_count = current_command_line_count;
5784 #if defined (HISTORY)
5785 ps->remember_on_history = remember_on_history;
5786 # if defined (BANG_HISTORY)
5787 ps->history_expansion_inhibited = history_expansion_inhibited;
5791 ps->last_command_exit_value = last_command_exit_value;
5792 #if defined (ARRAY_VARS)
5793 v = find_variable ("PIPESTATUS");
5794 if (v && array_p (v) && array_cell (v))
5795 ps->pipestatus = array_copy (array_cell (v));
5797 ps->pipestatus = (ARRAY *)NULL;
5800 ps->last_shell_builtin = last_shell_builtin;
5801 ps->this_shell_builtin = this_shell_builtin;
5803 ps->expand_aliases = expand_aliases;
5804 ps->echo_input_at_read = echo_input_at_read;
5810 restore_parser_state (ps)
5811 sh_parser_state_t *ps;
5813 #if defined (ARRAY_VARS)
5820 parser_state = ps->parser_state;
5821 if (ps->token_state)
5823 restore_token_state (ps->token_state);
5824 free (ps->token_state);
5827 shell_input_line_terminator = ps->input_line_terminator;
5828 eof_encountered = ps->eof_encountered;
5830 current_command_line_count = ps->current_command_line_count;
5832 #if defined (HISTORY)
5833 remember_on_history = ps->remember_on_history;
5834 # if defined (BANG_HISTORY)
5835 history_expansion_inhibited = ps->history_expansion_inhibited;
5839 last_command_exit_value = ps->last_command_exit_value;
5840 #if defined (ARRAY_VARS)
5841 v = find_variable ("PIPESTATUS");
5842 if (v && array_p (v) && array_cell (v))
5844 array_dispose (array_cell (v));
5845 var_setarray (v, ps->pipestatus);
5849 last_shell_builtin = ps->last_shell_builtin;
5850 this_shell_builtin = ps->this_shell_builtin;
5852 expand_aliases = ps->expand_aliases;
5853 echo_input_at_read = ps->echo_input_at_read;
5856 /************************************************
5858 * MULTIBYTE CHARACTER HANDLING *
5860 ************************************************/
5862 #if defined (HANDLE_MULTIBYTE)
5866 int i, previ, len, c;
5867 mbstate_t mbs, prevs;
5870 if (shell_input_line == NULL)
5872 len = strlen (shell_input_line); /* XXX - shell_input_line_len ? */
5873 FREE (shell_input_line_property);
5874 shell_input_line_property = (char *)xmalloc (len + 1);
5876 memset (&prevs, '\0', sizeof (mbstate_t));
5877 for (i = previ = 0; i < len; i++)
5881 c = shell_input_line[i];
5885 for (j = i; j < len; j++)
5886 shell_input_line_property[j] = 1;
5890 mbclen = mbrlen (shell_input_line + previ, i - previ + 1, &mbs);
5891 if (mbclen == 1 || mbclen == (size_t)-1)
5896 else if (mbclen == (size_t)-2)
5898 else if (mbclen > 1)
5906 /* XXX - what to do if mbrlen returns 0? (null wide character) */
5908 for (j = i; j < len; j++)
5909 shell_input_line_property[j] = 1;
5913 shell_input_line_property[i] = mbclen;
5916 #endif /* HANDLE_MULTIBYTE */