1 /* Yacc grammar for bash. */
3 /* Copyright (C) 1989-2006 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 it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License along
18 with Bash; see the file LICENSE. If not, write to the Free Software
19 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
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;
119 extern int posixly_correct;
120 extern int last_command_exit_value;
121 extern char *shell_name, *current_host_name;
122 extern char *dist_version;
123 extern int patch_level;
124 extern int dump_translatable_strings, dump_po_strings;
125 extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
126 #if defined (BUFFERED_INPUT)
127 extern int bash_input_fd_changed;
131 /* **************************************************************** */
133 /* "Forward" declarations */
135 /* **************************************************************** */
138 static void debug_parser __P((int));
141 static int yy_getc __P((void));
142 static int yy_ungetc __P((int));
144 #if defined (READLINE)
145 static int yy_readline_get __P((void));
146 static int yy_readline_unget __P((int));
149 static int yy_string_get __P((void));
150 static int yy_string_unget __P((int));
151 static int yy_stream_get __P((void));
152 static int yy_stream_unget __P((int));
154 static int shell_getc __P((int));
155 static void shell_ungetc __P((int));
156 static void discard_until __P((int));
158 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
159 static void push_string __P((char *, int, alias_t *));
160 static void pop_string __P((void));
161 static void free_string_list __P((void));
164 static char *read_a_line __P((int));
166 static int reserved_word_acceptable __P((int));
167 static int yylex __P((void));
168 static int alias_expand_token __P((char *));
169 static int time_command_acceptable __P((void));
170 static int special_case_tokens __P((char *));
171 static int read_token __P((int));
172 static char *parse_matched_pair __P((int, int, int, int *, int));
173 #if defined (ARRAY_VARS)
174 static char *parse_compound_assignment __P((int *));
176 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
177 static int parse_dparen __P((int));
178 static int parse_arith_cmd __P((char **, int));
180 #if defined (COND_COMMAND)
181 static void cond_error __P((void));
182 static COND_COM *cond_expr __P((void));
183 static COND_COM *cond_or __P((void));
184 static COND_COM *cond_and __P((void));
185 static COND_COM *cond_term __P((void));
186 static int cond_skip_newlines __P((void));
187 static COMMAND *parse_cond_command __P((void));
189 #if defined (ARRAY_VARS)
190 static int token_is_assignment __P((char *, int));
191 static int token_is_ident __P((char *, int));
193 static int read_token_word __P((int));
194 static void discard_parser_constructs __P((int));
196 static char *error_token_from_token __P((int));
197 static char *error_token_from_text __P((void));
198 static void print_offending_line __P((void));
199 static void report_syntax_error __P((char *));
201 static void handle_eof_input_unit __P((void));
202 static void prompt_again __P((void));
204 static void reset_readline_prompt __P((void));
206 static void print_prompt __P((void));
208 #if defined (HANDLE_MULTIBYTE)
209 static void set_line_mbstate __P((void));
210 static char *shell_input_line_property = NULL;
212 # define set_line_mbstate()
215 extern int yyerror __P((const char *));
221 /* Default prompt strings */
222 char *primary_prompt = PPROMPT;
223 char *secondary_prompt = SPROMPT;
225 /* PROMPT_STRING_POINTER points to one of these, never to an actual string. */
226 char *ps1_prompt, *ps2_prompt;
228 /* Handle on the current prompt string. Indirectly points through
229 ps1_ or ps2_prompt. */
230 char **prompt_string_pointer = (char **)NULL;
231 char *current_prompt_string;
233 /* Non-zero means we expand aliases in commands. */
234 int expand_aliases = 0;
236 /* If non-zero, the decoded prompt string undergoes parameter and
237 variable substitution, command substitution, arithmetic substitution,
238 string expansion, process substitution, and quote removal in
239 decode_prompt_string. */
242 /* If non-zero, $'...' and $"..." are expanded when they appear within
243 a ${...} expansion, even when the expansion appears within double
245 int extended_quote = 1;
247 /* The decoded prompt string. Used if READLINE is not defined or if
248 editing is turned off. Analogous to current_readline_prompt. */
249 static char *current_decoded_prompt;
251 /* The number of lines read from input while creating the current command. */
252 int current_command_line_count;
254 /* Variables to manage the task of reading here documents, because we need to
255 defer the reading until after a complete command has been collected. */
256 static REDIRECT *redir_stack[10];
259 /* Where shell input comes from. History expansion is performed on each
260 line when the shell is interactive. */
261 static char *shell_input_line = (char *)NULL;
262 static int shell_input_line_index;
263 static int shell_input_line_size; /* Amount allocated for shell_input_line. */
264 static int shell_input_line_len; /* strlen (shell_input_line) */
266 /* Either zero or EOF. */
267 static int shell_input_line_terminator;
269 /* The line number in a script on which a function definition starts. */
270 static int function_dstart;
272 /* The line number in a script on which a function body starts. */
273 static int function_bstart;
275 /* The line number in a script at which an arithmetic for command starts. */
276 static int arith_for_lineno;
278 /* The line number in a script where the word in a `case WORD', `select WORD'
279 or `for WORD' begins. This is a nested command maximum, since the array
280 index is decremented after a case, select, or for command is parsed. */
281 #define MAX_CASE_NEST 128
282 static int word_lineno[MAX_CASE_NEST];
283 static int word_top = -1;
285 /* If non-zero, it is the token that we want read_token to return
286 regardless of what text is (or isn't) present to be read. This
287 is reset by read_token. If token_to_read == WORD or
288 ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */
289 static int token_to_read;
290 static WORD_DESC *word_desc_to_read;
292 static REDIRECTEE redir;
296 WORD_DESC *word; /* the word that we read. */
297 int number; /* the number that we read. */
298 WORD_LIST *word_list;
302 PATTERN_LIST *pattern;
305 /* Reserved words. Members of the first group are only recognized
306 in the case that they are preceded by a list_terminator. Members
307 of the second group are for [[...]] commands. Members of the
308 third group are recognized only under special circumstances. */
309 %token IF THEN ELSE ELIF FI CASE ESAC FOR SELECT WHILE UNTIL DO DONE FUNCTION
310 %token COND_START COND_END COND_ERROR
311 %token IN BANG TIME TIMEOPT
313 /* More general tokens. yylex () knows how to make these. */
314 %token <word> WORD ASSIGNMENT_WORD
315 %token <number> NUMBER
316 %token <word_list> ARITH_CMD ARITH_FOR_EXPRS
317 %token <command> COND_CMD
318 %token AND_AND OR_OR GREATER_GREATER LESS_LESS LESS_AND LESS_LESS_LESS
319 %token GREATER_AND SEMI_SEMI LESS_LESS_MINUS AND_GREATER LESS_GREATER
322 /* The types that the various syntactical units return. */
324 %type <command> inputunit command pipeline pipeline_command
325 %type <command> list list0 list1 compound_list simple_list simple_list1
326 %type <command> simple_command shell_command
327 %type <command> for_command select_command case_command group_command
328 %type <command> arith_command
329 %type <command> cond_command
330 %type <command> arith_for_command
331 %type <command> function_def function_body if_command elif_clause subshell
332 %type <redirect> redirection redirection_list
333 %type <element> simple_command_element
334 %type <word_list> word_list pattern
335 %type <pattern> pattern_list case_clause_sequence case_clause
336 %type <number> timespec
337 %type <number> list_terminator
341 %left '&' ';' '\n' yacc_EOF
346 inputunit: simple_list simple_list_terminator
348 /* Case of regular command. Discard the error
349 safety net,and return the command just parsed. */
352 /* discard_parser_constructs (0); */
357 /* Case of regular command, but not a very
358 interesting one. Return a NULL command. */
359 global_command = (COMMAND *)NULL;
364 /* Error during parsing. Return NULL command. */
365 global_command = (COMMAND *)NULL;
367 /* discard_parser_constructs (1); */
379 /* Case of EOF seen by itself. Do ignoreeof or
381 global_command = (COMMAND *)NULL;
382 handle_eof_input_unit ();
388 { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
390 { $$ = make_word_list ($2, $1); }
393 redirection: '>' WORD
396 $$ = make_redirection (1, r_output_direction, redir);
401 $$ = make_redirection (0, r_input_direction, redir);
406 $$ = make_redirection ($1, r_output_direction, redir);
411 $$ = make_redirection ($1, r_input_direction, redir);
413 | GREATER_GREATER WORD
416 $$ = make_redirection (1, r_appending_to, redir);
418 | NUMBER GREATER_GREATER WORD
421 $$ = make_redirection ($1, r_appending_to, redir);
426 $$ = make_redirection (0, r_reading_until, redir);
427 redir_stack[need_here_doc++] = $$;
429 | NUMBER LESS_LESS WORD
432 $$ = make_redirection ($1, r_reading_until, redir);
433 redir_stack[need_here_doc++] = $$;
435 | LESS_LESS_LESS WORD
438 $$ = make_redirection (0, r_reading_string, redir);
440 | NUMBER LESS_LESS_LESS WORD
443 $$ = make_redirection ($1, r_reading_string, redir);
448 $$ = make_redirection (0, r_duplicating_input, redir);
450 | NUMBER LESS_AND NUMBER
453 $$ = make_redirection ($1, r_duplicating_input, redir);
458 $$ = make_redirection (1, r_duplicating_output, redir);
460 | NUMBER GREATER_AND NUMBER
463 $$ = make_redirection ($1, r_duplicating_output, redir);
468 $$ = make_redirection (0, r_duplicating_input_word, redir);
470 | NUMBER LESS_AND WORD
473 $$ = make_redirection ($1, r_duplicating_input_word, redir);
478 $$ = make_redirection (1, r_duplicating_output_word, redir);
480 | NUMBER GREATER_AND WORD
483 $$ = make_redirection ($1, r_duplicating_output_word, redir);
485 | LESS_LESS_MINUS WORD
488 $$ = make_redirection
489 (0, r_deblank_reading_until, redir);
490 redir_stack[need_here_doc++] = $$;
492 | NUMBER LESS_LESS_MINUS WORD
495 $$ = make_redirection
496 ($1, r_deblank_reading_until, redir);
497 redir_stack[need_here_doc++] = $$;
502 $$ = make_redirection (1, r_close_this, redir);
504 | NUMBER GREATER_AND '-'
507 $$ = make_redirection ($1, r_close_this, redir);
512 $$ = make_redirection (0, r_close_this, redir);
514 | NUMBER LESS_AND '-'
517 $$ = make_redirection ($1, r_close_this, redir);
522 $$ = make_redirection (1, r_err_and_out, redir);
524 | NUMBER LESS_GREATER WORD
527 $$ = make_redirection ($1, r_input_output, redir);
532 $$ = make_redirection (0, r_input_output, redir);
537 $$ = make_redirection (1, r_output_force, redir);
539 | NUMBER GREATER_BAR WORD
542 $$ = make_redirection ($1, r_output_force, redir);
546 simple_command_element: WORD
547 { $$.word = $1; $$.redirect = 0; }
549 { $$.word = $1; $$.redirect = 0; }
551 { $$.redirect = $1; $$.word = 0; }
554 redirection_list: redirection
558 | redirection_list redirection
560 register REDIRECT *t;
562 for (t = $1; t->next; t = t->next)
569 simple_command: simple_command_element
570 { $$ = make_simple_command ($1, (COMMAND *)NULL); }
571 | simple_command simple_command_element
572 { $$ = make_simple_command ($2, $1); }
575 command: simple_command
576 { $$ = clean_simple_command ($1); }
579 | shell_command redirection_list
586 register REDIRECT *t;
587 for (t = tc->redirects; t->next; t = t->next)
599 shell_command: for_command
603 | WHILE compound_list DO compound_list DONE
604 { $$ = make_while_command ($2, $4); }
605 | UNTIL compound_list DO compound_list DONE
606 { $$ = make_until_command ($2, $4); }
623 for_command: FOR WORD newline_list DO compound_list DONE
625 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
626 if (word_top > 0) word_top--;
628 | FOR WORD newline_list '{' compound_list '}'
630 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
631 if (word_top > 0) word_top--;
633 | FOR WORD ';' newline_list DO compound_list DONE
635 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
636 if (word_top > 0) word_top--;
638 | FOR WORD ';' newline_list '{' compound_list '}'
640 $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
641 if (word_top > 0) word_top--;
643 | FOR WORD newline_list IN word_list list_terminator newline_list DO compound_list DONE
645 $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
646 if (word_top > 0) word_top--;
648 | FOR WORD newline_list IN word_list list_terminator newline_list '{' compound_list '}'
650 $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
651 if (word_top > 0) word_top--;
653 | FOR WORD newline_list IN list_terminator newline_list DO compound_list DONE
655 $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
656 if (word_top > 0) word_top--;
658 | FOR WORD newline_list IN list_terminator newline_list '{' compound_list '}'
660 $$ = make_for_command ($2, (WORD_LIST *)NULL, $8, word_lineno[word_top]);
661 if (word_top > 0) word_top--;
665 arith_for_command: FOR ARITH_FOR_EXPRS list_terminator newline_list DO compound_list DONE
667 $$ = make_arith_for_command ($2, $6, arith_for_lineno);
668 if (word_top > 0) word_top--;
670 | FOR ARITH_FOR_EXPRS list_terminator newline_list '{' compound_list '}'
672 $$ = make_arith_for_command ($2, $6, arith_for_lineno);
673 if (word_top > 0) word_top--;
675 | FOR ARITH_FOR_EXPRS DO compound_list DONE
677 $$ = make_arith_for_command ($2, $4, arith_for_lineno);
678 if (word_top > 0) word_top--;
680 | FOR ARITH_FOR_EXPRS '{' compound_list '}'
682 $$ = make_arith_for_command ($2, $4, arith_for_lineno);
683 if (word_top > 0) word_top--;
687 select_command: SELECT WORD newline_list DO list DONE
689 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
690 if (word_top > 0) word_top--;
692 | SELECT WORD newline_list '{' list '}'
694 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
695 if (word_top > 0) word_top--;
697 | SELECT WORD ';' newline_list DO list DONE
699 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
700 if (word_top > 0) word_top--;
702 | SELECT WORD ';' newline_list '{' list '}'
704 $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6, word_lineno[word_top]);
705 if (word_top > 0) word_top--;
707 | SELECT WORD newline_list IN word_list list_terminator newline_list DO list DONE
709 $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
710 if (word_top > 0) word_top--;
712 | SELECT WORD newline_list IN word_list list_terminator newline_list '{' list '}'
714 $$ = make_select_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9, word_lineno[word_top]);
715 if (word_top > 0) word_top--;
719 case_command: CASE WORD newline_list IN newline_list ESAC
721 $$ = make_case_command ($2, (PATTERN_LIST *)NULL, word_lineno[word_top]);
722 if (word_top > 0) word_top--;
724 | CASE WORD newline_list IN case_clause_sequence newline_list ESAC
726 $$ = make_case_command ($2, $5, word_lineno[word_top]);
727 if (word_top > 0) word_top--;
729 | CASE WORD newline_list IN case_clause ESAC
731 $$ = make_case_command ($2, $5, word_lineno[word_top]);
732 if (word_top > 0) word_top--;
736 function_def: WORD '(' ')' newline_list function_body
737 { $$ = make_function_def ($1, $5, function_dstart, function_bstart); }
739 | FUNCTION WORD '(' ')' newline_list function_body
740 { $$ = make_function_def ($2, $6, function_dstart, function_bstart); }
742 | FUNCTION WORD newline_list function_body
743 { $$ = make_function_def ($2, $4, function_dstart, function_bstart); }
747 function_body: shell_command
749 | shell_command redirection_list
754 /* According to Posix.2 3.9.5, redirections
755 specified after the body of a function should
756 be attached to the function and performed when
757 the function is executed, not as part of the
758 function definition command. */
759 /* XXX - I don't think it matters, but we might
760 want to change this in the future to avoid
761 problems differentiating between a function
762 definition with a redirection and a function
763 definition containing a single command with a
764 redirection. The two are semantically equivalent,
765 though -- the only difference is in how the
766 command printing code displays the redirections. */
769 register REDIRECT *t;
770 for (t = tc->redirects; t->next; t = t->next)
780 subshell: '(' compound_list ')'
782 $$ = make_subshell_command ($2);
783 $$->flags |= CMD_WANT_SUBSHELL;
787 if_command: IF compound_list THEN compound_list FI
788 { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
789 | IF compound_list THEN compound_list ELSE compound_list FI
790 { $$ = make_if_command ($2, $4, $6); }
791 | IF compound_list THEN compound_list elif_clause FI
792 { $$ = make_if_command ($2, $4, $5); }
796 group_command: '{' compound_list '}'
797 { $$ = make_group_command ($2); }
800 arith_command: ARITH_CMD
801 { $$ = make_arith_command ($1); }
804 cond_command: COND_START COND_CMD COND_END
808 elif_clause: ELIF compound_list THEN compound_list
809 { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
810 | ELIF compound_list THEN compound_list ELSE compound_list
811 { $$ = make_if_command ($2, $4, $6); }
812 | ELIF compound_list THEN compound_list elif_clause
813 { $$ = make_if_command ($2, $4, $5); }
816 case_clause: pattern_list
817 | case_clause_sequence pattern_list
818 { $2->next = $1; $$ = $2; }
821 pattern_list: newline_list pattern ')' compound_list
822 { $$ = make_pattern_list ($2, $4); }
823 | newline_list pattern ')' newline_list
824 { $$ = make_pattern_list ($2, (COMMAND *)NULL); }
825 | newline_list '(' pattern ')' compound_list
826 { $$ = make_pattern_list ($3, $5); }
827 | newline_list '(' pattern ')' newline_list
828 { $$ = make_pattern_list ($3, (COMMAND *)NULL); }
831 case_clause_sequence: pattern_list SEMI_SEMI
832 | case_clause_sequence pattern_list SEMI_SEMI
833 { $2->next = $1; $$ = $2; }
837 { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
839 { $$ = make_word_list ($3, $1); }
842 /* A list allows leading or trailing newlines and
843 newlines as operators (equivalent to semicolons).
844 It must end with a newline or semicolon.
845 Lists are used within commands such as if, for, while. */
847 list: newline_list list0
851 gather_here_documents ();
862 list0: list1 '\n' newline_list
863 | list1 '&' newline_list
865 if ($1->type == cm_connection)
866 $$ = connect_async_list ($1, (COMMAND *)NULL, '&');
868 $$ = command_connect ($1, (COMMAND *)NULL, '&');
870 | list1 ';' newline_list
874 list1: list1 AND_AND newline_list list1
875 { $$ = command_connect ($1, $4, AND_AND); }
876 | list1 OR_OR newline_list list1
877 { $$ = command_connect ($1, $4, OR_OR); }
878 | list1 '&' newline_list list1
880 if ($1->type == cm_connection)
881 $$ = connect_async_list ($1, $4, '&');
883 $$ = command_connect ($1, $4, '&');
885 | list1 ';' newline_list list1
886 { $$ = command_connect ($1, $4, ';'); }
887 | list1 '\n' newline_list list1
888 { $$ = command_connect ($1, $4, ';'); }
893 simple_list_terminator: '\n'
909 /* A simple_list is a list that contains no significant newlines
910 and no leading or trailing newlines. Newlines are allowed
911 only following operators, where they are not significant.
913 This is what an inputunit consists of. */
915 simple_list: simple_list1
919 gather_here_documents ();
923 if ($1->type == cm_connection)
924 $$ = connect_async_list ($1, (COMMAND *)NULL, '&');
926 $$ = command_connect ($1, (COMMAND *)NULL, '&');
928 gather_here_documents ();
934 gather_here_documents ();
938 simple_list1: simple_list1 AND_AND newline_list simple_list1
939 { $$ = command_connect ($1, $4, AND_AND); }
940 | simple_list1 OR_OR newline_list simple_list1
941 { $$ = command_connect ($1, $4, OR_OR); }
942 | simple_list1 '&' simple_list1
944 if ($1->type == cm_connection)
945 $$ = connect_async_list ($1, $3, '&');
947 $$ = command_connect ($1, $3, '&');
949 | simple_list1 ';' simple_list1
950 { $$ = command_connect ($1, $3, ';'); }
956 pipeline_command: pipeline
961 $2->flags |= CMD_INVERT_RETURN;
970 | timespec BANG pipeline
973 $3->flags |= $1|CMD_INVERT_RETURN;
976 | BANG timespec pipeline
979 $3->flags |= $2|CMD_INVERT_RETURN;
982 | timespec list_terminator
986 /* Boy, this is unclean. `time' by itself can
987 time a null command. We cheat and push a
988 newline back if the list_terminator was a newline
989 to avoid the double-newline problem (one to
990 terminate this, one to terminate the command) */
993 $$ = make_simple_command (x, (COMMAND *)NULL);
995 /* XXX - let's cheat and push a newline back */
997 token_to_read = '\n';
1003 pipeline '|' newline_list pipeline
1004 { $$ = command_connect ($1, $4, '|'); }
1010 { $$ = CMD_TIME_PIPELINE; }
1012 { $$ = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
1016 /* Possible states for the parser that require it to do special things. */
1017 #define PST_CASEPAT 0x0001 /* in a case pattern list */
1018 #define PST_ALEXPNEXT 0x0002 /* expand next word for aliases */
1019 #define PST_ALLOWOPNBRC 0x0004 /* allow open brace for function def */
1020 #define PST_NEEDCLOSBRC 0x0008 /* need close brace */
1021 #define PST_DBLPAREN 0x0010 /* double-paren parsing */
1022 #define PST_SUBSHELL 0x0020 /* ( ... ) subshell */
1023 #define PST_CMDSUBST 0x0040 /* $( ... ) command substitution */
1024 #define PST_CASESTMT 0x0080 /* parsing a case statement */
1025 #define PST_CONDCMD 0x0100 /* parsing a [[...]] command */
1026 #define PST_CONDEXPR 0x0200 /* parsing the guts of [[...]] */
1027 #define PST_ARITHFOR 0x0400 /* parsing an arithmetic for command */
1028 #define PST_ALEXPAND 0x0800 /* OK to expand aliases - unused */
1029 #define PST_CMDTOKEN 0x1000 /* command token OK - unused */
1030 #define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */
1031 #define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */
1033 /* Initial size to allocate for tokens, and the
1034 amount to grow them by. */
1035 #define TOKEN_DEFAULT_INITIAL_SIZE 496
1036 #define TOKEN_DEFAULT_GROW_SIZE 512
1038 /* Should we call prompt_again? */
1039 #define SHOULD_PROMPT() \
1040 (interactive && (bash_input.type == st_stdin || bash_input.type == st_stream))
1043 # define expanding_alias() (pushed_string_list && pushed_string_list->expander)
1045 # define expanding_alias() 0
1048 /* The token currently being read. */
1049 static int current_token;
1051 /* The last read token, or NULL. read_token () uses this for context
1053 static int last_read_token;
1055 /* The token read prior to last_read_token. */
1056 static int token_before_that;
1058 /* The token read prior to token_before_that. */
1059 static int two_tokens_ago;
1061 /* The current parser state. */
1062 static int parser_state;
1064 /* Global var is non-zero when end of file has been reached. */
1065 int EOF_Reached = 0;
1078 /* yy_getc () returns the next available character from input or EOF.
1079 yy_ungetc (c) makes `c' the next character to read.
1080 init_yy_io (get, unget, type, location) makes the function GET the
1081 installed function for getting the next character, makes UNGET the
1082 installed function for un-getting a character, sets the type of stream
1083 (either string or file) from TYPE, and makes LOCATION point to where
1084 the input is coming from. */
1086 /* Unconditionally returns end-of-file. */
1093 /* Variable containing the current get and unget functions.
1094 See ./input.h for a clearer description. */
1095 BASH_INPUT bash_input;
1097 /* Set all of the fields in BASH_INPUT to NULL. Free bash_input.name if it
1098 is non-null, avoiding a memory leak. */
1100 initialize_bash_input ()
1102 bash_input.type = st_none;
1103 FREE (bash_input.name);
1104 bash_input.name = (char *)NULL;
1105 bash_input.location.file = (FILE *)NULL;
1106 bash_input.location.string = (char *)NULL;
1107 bash_input.getter = (sh_cget_func_t *)NULL;
1108 bash_input.ungetter = (sh_cunget_func_t *)NULL;
1111 /* Set the contents of the current bash input stream from
1112 GET, UNGET, TYPE, NAME, and LOCATION. */
1114 init_yy_io (get, unget, type, name, location)
1115 sh_cget_func_t *get;
1116 sh_cunget_func_t *unget;
1117 enum stream_type type;
1119 INPUT_STREAM location;
1121 bash_input.type = type;
1122 FREE (bash_input.name);
1123 bash_input.name = name ? savestring (name) : (char *)NULL;
1127 memcpy((char *)&bash_input.location.string, (char *)&location.string, sizeof(location));
1129 bash_input.location = location;
1131 bash_input.getter = get;
1132 bash_input.ungetter = unget;
1138 return (bash_input.name ? bash_input.name : "stdin");
1141 /* Call this to get the next character of input. */
1145 return (*(bash_input.getter)) ();
1148 /* Call this to unget C. That is, to make C the next character
1154 return (*(bash_input.ungetter)) (c);
1157 #if defined (BUFFERED_INPUT)
1158 #ifdef INCLUDE_UNUSED
1160 input_file_descriptor ()
1162 switch (bash_input.type)
1165 return (fileno (bash_input.location.file));
1167 return (bash_input.location.buffered_fd);
1170 return (fileno (stdin));
1174 #endif /* BUFFERED_INPUT */
1176 /* **************************************************************** */
1178 /* Let input be read from readline (). */
1180 /* **************************************************************** */
1182 #if defined (READLINE)
1183 char *current_readline_prompt = (char *)NULL;
1184 char *current_readline_line = (char *)NULL;
1185 int current_readline_line_index = 0;
1190 SigHandler *old_sigint;
1194 if (!current_readline_line)
1196 if (!bash_readline_initialized)
1197 initialize_readline ();
1199 #if defined (JOB_CONTROL)
1201 give_terminal_to (shell_pgrp, 0);
1202 #endif /* JOB_CONTROL */
1204 old_sigint = (SigHandler *)NULL;
1205 if (signal_is_ignored (SIGINT) == 0)
1207 old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
1208 interrupt_immediately++;
1210 terminate_immediately = 1;
1212 current_readline_line = readline (current_readline_prompt ?
1213 current_readline_prompt : "");
1215 terminate_immediately = 0;
1216 if (signal_is_ignored (SIGINT) == 0 && old_sigint)
1218 interrupt_immediately--;
1219 set_signal_handler (SIGINT, old_sigint);
1223 /* Reset the prompt to the decoded value of prompt_string_pointer. */
1224 reset_readline_prompt ();
1227 if (current_readline_line == 0)
1230 current_readline_line_index = 0;
1231 line_len = strlen (current_readline_line);
1233 current_readline_line = (char *)xrealloc (current_readline_line, 2 + line_len);
1234 current_readline_line[line_len++] = '\n';
1235 current_readline_line[line_len] = '\0';
1238 if (current_readline_line[current_readline_line_index] == 0)
1240 free (current_readline_line);
1241 current_readline_line = (char *)NULL;
1242 return (yy_readline_get ());
1246 c = current_readline_line[current_readline_line_index++];
1252 yy_readline_unget (c)
1255 if (current_readline_line_index && current_readline_line)
1256 current_readline_line[--current_readline_line_index] = c;
1261 with_input_from_stdin ()
1263 INPUT_STREAM location;
1265 if (bash_input.type != st_stdin && stream_on_stack (st_stdin) == 0)
1267 location.string = current_readline_line;
1268 init_yy_io (yy_readline_get, yy_readline_unget,
1269 st_stdin, "readline stdin", location);
1273 #else /* !READLINE */
1276 with_input_from_stdin ()
1278 with_input_from_stream (stdin, "stdin");
1280 #endif /* !READLINE */
1282 /* **************************************************************** */
1284 /* Let input come from STRING. STRING is zero terminated. */
1286 /* **************************************************************** */
1291 register char *string;
1292 register unsigned char c;
1294 string = bash_input.location.string;
1296 /* If the string doesn't exist, or is empty, EOF found. */
1297 if (string && *string)
1300 bash_input.location.string = string;
1311 *(--bash_input.location.string) = c;
1316 with_input_from_string (string, name)
1320 INPUT_STREAM location;
1322 location.string = string;
1323 init_yy_io (yy_string_get, yy_string_unget, st_string, name, location);
1326 /* **************************************************************** */
1328 /* Let input come from STREAM. */
1330 /* **************************************************************** */
1332 /* These two functions used to test the value of the HAVE_RESTARTABLE_SYSCALLS
1333 define, and just use getc/ungetc if it was defined, but since bash
1334 installs its signal handlers without the SA_RESTART flag, some signals
1335 (like SIGCHLD, SIGWINCH, etc.) received during a read(2) will not cause
1336 the read to be restarted. We need to restart it ourselves. */
1344 if (bash_input.location.file)
1348 interrupt_immediately++;
1349 terminate_immediately++;
1351 result = getc_with_restart (bash_input.location.file);
1354 interrupt_immediately--;
1355 terminate_immediately--;
1365 return (ungetc_with_restart (c, bash_input.location.file));
1369 with_input_from_stream (stream, name)
1373 INPUT_STREAM location;
1375 location.file = stream;
1376 init_yy_io (yy_stream_get, yy_stream_unget, st_stream, name, location);
1379 typedef struct stream_saver {
1380 struct stream_saver *next;
1381 BASH_INPUT bash_input;
1383 #if defined (BUFFERED_INPUT)
1384 BUFFERED_STREAM *bstream;
1385 #endif /* BUFFERED_INPUT */
1388 /* The globally known line number. */
1389 int line_number = 0;
1391 #if defined (COND_COMMAND)
1392 static int cond_lineno;
1393 static int cond_token;
1396 STREAM_SAVER *stream_list = (STREAM_SAVER *)NULL;
1399 push_stream (reset_lineno)
1402 STREAM_SAVER *saver = (STREAM_SAVER *)xmalloc (sizeof (STREAM_SAVER));
1404 xbcopy ((char *)&bash_input, (char *)&(saver->bash_input), sizeof (BASH_INPUT));
1406 #if defined (BUFFERED_INPUT)
1407 saver->bstream = (BUFFERED_STREAM *)NULL;
1408 /* If we have a buffered stream, clear out buffers[fd]. */
1409 if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
1410 saver->bstream = set_buffered_stream (bash_input.location.buffered_fd,
1411 (BUFFERED_STREAM *)NULL);
1412 #endif /* BUFFERED_INPUT */
1414 saver->line = line_number;
1415 bash_input.name = (char *)NULL;
1416 saver->next = stream_list;
1417 stream_list = saver;
1430 STREAM_SAVER *saver = stream_list;
1433 stream_list = stream_list->next;
1435 init_yy_io (saver->bash_input.getter,
1436 saver->bash_input.ungetter,
1437 saver->bash_input.type,
1438 saver->bash_input.name,
1439 saver->bash_input.location);
1441 #if defined (BUFFERED_INPUT)
1442 /* If we have a buffered stream, restore buffers[fd]. */
1443 /* If the input file descriptor was changed while this was on the
1444 save stack, update the buffered fd to the new file descriptor and
1445 re-establish the buffer <-> bash_input fd correspondence. */
1446 if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
1448 if (bash_input_fd_changed)
1450 bash_input_fd_changed = 0;
1451 if (default_buffered_input >= 0)
1453 bash_input.location.buffered_fd = default_buffered_input;
1454 saver->bstream->b_fd = default_buffered_input;
1455 SET_CLOSE_ON_EXEC (default_buffered_input);
1458 /* XXX could free buffered stream returned as result here. */
1459 set_buffered_stream (bash_input.location.buffered_fd, saver->bstream);
1461 #endif /* BUFFERED_INPUT */
1463 line_number = saver->line;
1465 FREE (saver->bash_input.name);
1470 /* Return 1 if a stream of type TYPE is saved on the stack. */
1472 stream_on_stack (type)
1473 enum stream_type type;
1475 register STREAM_SAVER *s;
1477 for (s = stream_list; s; s = s->next)
1478 if (s->bash_input.type == type)
1483 /* Save the current token state and return it in a malloced array. */
1489 ret = (int *)xmalloc (3 * sizeof (int));
1490 ret[0] = last_read_token;
1491 ret[1] = token_before_that;
1492 ret[2] = two_tokens_ago;
1497 restore_token_state (ts)
1502 last_read_token = ts[0];
1503 token_before_that = ts[1];
1504 two_tokens_ago = ts[2];
1508 * This is used to inhibit alias expansion and reserved word recognition
1509 * inside case statement pattern lists. A `case statement pattern list' is:
1511 * everything between the `in' in a `case word in' and the next ')'
1513 * everything between a `;;' and the next `)' or `esac'
1516 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
1518 #define END_OF_ALIAS 0
1521 * Pseudo-global variables used in implementing token-wise alias expansion.
1525 * Pushing and popping strings. This works together with shell_getc to
1526 * implement alias expansion on a per-token basis.
1529 typedef struct string_saver {
1530 struct string_saver *next;
1531 int expand_alias; /* Value to set expand_alias to when string is popped. */
1534 alias_t *expander; /* alias that caused this line to be pushed. */
1536 int saved_line_size, saved_line_index, saved_line_terminator;
1539 STRING_SAVER *pushed_string_list = (STRING_SAVER *)NULL;
1542 * Push the current shell_input_line onto a stack of such lines and make S
1543 * the current input. Used when expanding aliases. EXPAND is used to set
1544 * the value of expand_next_token when the string is popped, so that the
1545 * word after the alias in the original line is handled correctly when the
1546 * alias expands to multiple words. TOKEN is the token that was expanded
1547 * into S; it is saved and used to prevent infinite recursive expansion.
1550 push_string (s, expand, ap)
1555 STRING_SAVER *temp = (STRING_SAVER *)xmalloc (sizeof (STRING_SAVER));
1557 temp->expand_alias = expand;
1558 temp->saved_line = shell_input_line;
1559 temp->saved_line_size = shell_input_line_size;
1560 temp->saved_line_index = shell_input_line_index;
1561 temp->saved_line_terminator = shell_input_line_terminator;
1563 temp->expander = ap;
1565 temp->next = pushed_string_list;
1566 pushed_string_list = temp;
1570 ap->flags |= AL_BEINGEXPANDED;
1573 shell_input_line = s;
1574 shell_input_line_size = strlen (s);
1575 shell_input_line_index = 0;
1576 shell_input_line_terminator = '\0';
1578 parser_state &= ~PST_ALEXPNEXT; /* XXX */
1581 set_line_mbstate ();
1585 * Make the top of the pushed_string stack be the current shell input.
1586 * Only called when there is something on the stack. Called from shell_getc
1587 * when it thinks it has consumed the string generated by an alias expansion
1588 * and needs to return to the original input line.
1595 FREE (shell_input_line);
1596 shell_input_line = pushed_string_list->saved_line;
1597 shell_input_line_index = pushed_string_list->saved_line_index;
1598 shell_input_line_size = pushed_string_list->saved_line_size;
1599 shell_input_line_terminator = pushed_string_list->saved_line_terminator;
1601 if (pushed_string_list->expand_alias)
1602 parser_state |= PST_ALEXPNEXT;
1604 parser_state &= ~PST_ALEXPNEXT;
1606 t = pushed_string_list;
1607 pushed_string_list = pushed_string_list->next;
1611 t->expander->flags &= ~AL_BEINGEXPANDED;
1616 set_line_mbstate ();
1622 register STRING_SAVER *t, *t1;
1624 for (t = pushed_string_list; t; )
1627 FREE (t->saved_line);
1630 t->expander->flags &= ~AL_BEINGEXPANDED;
1635 pushed_string_list = (STRING_SAVER *)NULL;
1638 #endif /* ALIAS || DPAREN_ARITHMETIC */
1641 free_pushed_string_input ()
1643 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
1644 free_string_list ();
1648 /* Return a line of text, taken from wherever yylex () reads input.
1649 If there is no more input, then we return NULL. If REMOVE_QUOTED_NEWLINE
1650 is non-zero, we remove unquoted \<newline> pairs. This is used by
1651 read_secondary_line to read here documents. */
1653 read_a_line (remove_quoted_newline)
1654 int remove_quoted_newline;
1656 static char *line_buffer = (char *)NULL;
1657 static int buffer_size = 0;
1658 int indx = 0, c, peekc, pass_next;
1660 #if defined (READLINE)
1661 if (no_line_editing && SHOULD_PROMPT ())
1663 if (SHOULD_PROMPT ())
1670 /* Allow immediate exit if interrupted during input. */
1675 /* Ignore null bytes in input. */
1679 internal_warning ("read_a_line: ignored null byte in input");
1684 /* If there is no more input, then we return NULL. */
1687 if (interactive && bash_input.type == st_stream)
1690 return ((char *)NULL);
1694 /* `+2' in case the final character in the buffer is a newline. */
1695 RESIZE_MALLOCED_BUFFER (line_buffer, indx, 2, buffer_size, 128);
1697 /* IF REMOVE_QUOTED_NEWLINES is non-zero, we are reading a
1698 here document with an unquoted delimiter. In this case,
1699 the line will be expanded as if it were in double quotes.
1700 We allow a backslash to escape the next character, but we
1701 need to treat the backslash specially only if a backslash
1702 quoting a backslash-newline pair appears in the line. */
1705 line_buffer[indx++] = c;
1708 else if (c == '\\' && remove_quoted_newline)
1714 continue; /* Make the unquoted \<newline> pair disappear. */
1720 line_buffer[indx++] = c; /* Preserve the backslash. */
1724 line_buffer[indx++] = c;
1728 line_buffer[indx] = '\0';
1729 return (line_buffer);
1734 /* Return a line as in read_a_line (), but insure that the prompt is
1735 the secondary prompt. This is used to read the lines of a here
1736 document. REMOVE_QUOTED_NEWLINE is non-zero if we should remove
1737 newlines quoted with backslashes while reading the line. It is
1738 non-zero unless the delimiter of the here document was quoted. */
1740 read_secondary_line (remove_quoted_newline)
1741 int remove_quoted_newline;
1743 prompt_string_pointer = &ps2_prompt;
1744 if (SHOULD_PROMPT())
1746 return (read_a_line (remove_quoted_newline));
1749 /* **************************************************************** */
1753 /* **************************************************************** */
1755 /* Reserved words. These are only recognized as the first word of a
1757 STRING_INT_ALIST word_token_alist[] = {
1766 #if defined (SELECT_COMMAND)
1767 { "select", SELECT },
1774 { "function", FUNCTION },
1775 #if defined (COMMAND_TIMING)
1781 #if defined (COND_COMMAND)
1782 { "[[", COND_START },
1788 /* other tokens that can be returned by read_token() */
1789 STRING_INT_ALIST other_token_alist[] = {
1790 /* Multiple-character tokens with special values */
1794 { ">>", GREATER_GREATER },
1795 { "<<", LESS_LESS },
1797 { ">&", GREATER_AND },
1798 { ";;", SEMI_SEMI },
1799 { "<<-", LESS_LESS_MINUS },
1800 { "<<<", LESS_LESS_LESS },
1801 { "&>", AND_GREATER },
1802 { "<>", LESS_GREATER },
1803 { ">|", GREATER_BAR },
1804 { "EOF", yacc_EOF },
1805 /* Tokens whose value is the character itself */
1816 { "newline", '\n' },
1820 /* others not listed here:
1821 WORD look at yylval.word
1822 ASSIGNMENT_WORD look at yylval.word
1823 NUMBER look at yylval.number
1824 ARITH_CMD look at yylval.word_list
1825 ARITH_FOR_EXPRS look at yylval.word_list
1826 COND_CMD look at yylval.command
1829 /* These are used by read_token_word, but appear up here so that shell_getc
1830 can use them to decide when to add otherwise blank lines to the history. */
1832 /* The primary delimiter stack. */
1833 struct dstack dstack = { (char *)NULL, 0, 0 };
1835 /* A temporary delimiter stack to be used when decoding prompt strings.
1836 This is needed because command substitutions in prompt strings (e.g., PS2)
1837 can screw up the parser's quoting state. */
1838 static struct dstack temp_dstack = { (char *)NULL, 0, 0 };
1840 /* Macro for accessing the top delimiter on the stack. Returns the
1841 delimiter or zero if none. */
1842 #define current_delimiter(ds) \
1843 (ds.delimiter_depth ? ds.delimiters[ds.delimiter_depth - 1] : 0)
1845 #define push_delimiter(ds, character) \
1848 if (ds.delimiter_depth + 2 > ds.delimiter_space) \
1849 ds.delimiters = (char *)xrealloc \
1850 (ds.delimiters, (ds.delimiter_space += 10) * sizeof (char)); \
1851 ds.delimiters[ds.delimiter_depth] = character; \
1852 ds.delimiter_depth++; \
1856 #define pop_delimiter(ds) ds.delimiter_depth--
1858 /* Return the next shell input character. This always reads characters
1859 from shell_input_line; when that line is exhausted, it is time to
1860 read the next line. This is called by read_token when the shell is
1861 processing normal command input. */
1863 /* This implements one-character lookahead/lookbehind across physical input
1864 lines, to avoid something being lost because it's pushed back with
1865 shell_ungetc when we're at the start of a line. */
1866 static int eol_ungetc_lookahead = 0;
1869 shell_getc (remove_quoted_newline)
1870 int remove_quoted_newline;
1878 if (sigwinch_received)
1880 sigwinch_received = 0;
1881 get_new_window_size (0, (int *)0, (int *)0);
1884 if (eol_ungetc_lookahead)
1886 c = eol_ungetc_lookahead;
1887 eol_ungetc_lookahead = 0;
1891 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
1892 /* If shell_input_line[shell_input_line_index] == 0, but there is
1893 something on the pushed list of strings, then we don't want to go
1894 off and get another line. We let the code down below handle it. */
1896 if (!shell_input_line || ((!shell_input_line[shell_input_line_index]) &&
1897 (pushed_string_list == (STRING_SAVER *)NULL)))
1898 #else /* !ALIAS && !DPAREN_ARITHMETIC */
1899 if (!shell_input_line || !shell_input_line[shell_input_line_index])
1900 #endif /* !ALIAS && !DPAREN_ARITHMETIC */
1906 /* Allow immediate exit if interrupted during input. */
1910 shell_input_line_terminator = 0;
1912 /* If the shell is interatctive, but not currently printing a prompt
1913 (interactive_shell && interactive == 0), we don't want to print
1914 notifies or cleanup the jobs -- we want to defer it until we do
1915 print the next prompt. */
1916 if (interactive_shell == 0 || SHOULD_PROMPT())
1918 #if defined (JOB_CONTROL)
1919 /* This can cause a problem when reading a command as the result
1920 of a trap, when the trap is called from flush_child. This call
1921 had better not cause jobs to disappear from the job table in
1922 that case, or we will have big trouble. */
1923 notify_and_cleanup ();
1924 #else /* !JOB_CONTROL */
1925 cleanup_dead_jobs ();
1926 #endif /* !JOB_CONTROL */
1929 #if defined (READLINE)
1930 if (no_line_editing && SHOULD_PROMPT())
1932 if (SHOULD_PROMPT())
1936 if (bash_input.type == st_stream)
1943 /* Allow immediate exit if interrupted during input. */
1949 internal_warning ("shell_getc: ignored null byte in input");
1954 RESIZE_MALLOCED_BUFFER (shell_input_line, i, 2, shell_input_line_size, 256);
1958 if (bash_input.type == st_stream)
1962 shell_input_line_terminator = EOF;
1964 shell_input_line[i] = '\0';
1968 shell_input_line[i++] = c;
1972 shell_input_line[--i] = '\0';
1973 current_command_line_count++;
1978 shell_input_line_index = 0;
1979 shell_input_line_len = i; /* == strlen (shell_input_line) */
1981 set_line_mbstate ();
1983 #if defined (HISTORY)
1984 if (remember_on_history && shell_input_line && shell_input_line[0])
1987 # if defined (BANG_HISTORY)
1990 /* If the current delimiter is a single quote, we should not be
1991 performing history expansion, even if we're on a different
1992 line from the original single quote. */
1993 old_hist = history_expansion_inhibited;
1994 if (current_delimiter (dstack) == '\'')
1995 history_expansion_inhibited = 1;
1997 expansions = pre_process_line (shell_input_line, 1, 1);
1998 # if defined (BANG_HISTORY)
1999 history_expansion_inhibited = old_hist;
2001 if (expansions != shell_input_line)
2003 free (shell_input_line);
2004 shell_input_line = expansions;
2005 shell_input_line_len = shell_input_line ?
2006 strlen (shell_input_line) : 0;
2007 if (!shell_input_line_len)
2008 current_command_line_count--;
2010 /* We have to force the xrealloc below because we don't know
2011 the true allocated size of shell_input_line anymore. */
2012 shell_input_line_size = shell_input_line_len;
2014 set_line_mbstate ();
2017 /* Try to do something intelligent with blank lines encountered while
2018 entering multi-line commands. XXX - this is grotesque */
2019 else if (remember_on_history && shell_input_line &&
2020 shell_input_line[0] == '\0' &&
2021 current_command_line_count > 1)
2023 if (current_delimiter (dstack))
2024 /* We know shell_input_line[0] == 0 and we're reading some sort of
2025 quoted string. This means we've got a line consisting of only
2026 a newline in a quoted string. We want to make sure this line
2027 gets added to the history. */
2028 maybe_add_history (shell_input_line);
2032 hdcs = history_delimiting_chars ();
2033 if (hdcs && hdcs[0] == ';')
2034 maybe_add_history (shell_input_line);
2038 #endif /* HISTORY */
2040 if (shell_input_line)
2042 /* Lines that signify the end of the shell's input should not be
2044 if (echo_input_at_read && (shell_input_line[0] ||
2045 shell_input_line_terminator != EOF))
2046 fprintf (stderr, "%s\n", shell_input_line);
2050 shell_input_line_size = 0;
2051 prompt_string_pointer = ¤t_prompt_string;
2052 if (SHOULD_PROMPT ())
2057 /* Add the newline to the end of this string, iff the string does
2058 not already end in an EOF character. */
2059 if (shell_input_line_terminator != EOF)
2061 if (shell_input_line_len + 3 > shell_input_line_size)
2062 shell_input_line = (char *)xrealloc (shell_input_line,
2063 1 + (shell_input_line_size += 2));
2065 shell_input_line[shell_input_line_len] = '\n';
2066 shell_input_line[shell_input_line_len + 1] = '\0';
2068 set_line_mbstate ();
2072 uc = shell_input_line[shell_input_line_index];
2075 shell_input_line_index++;
2077 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
2078 /* If UC is NULL, we have reached the end of the current input string. If
2079 pushed_string_list is non-empty, it's time to pop to the previous string
2080 because we have fully consumed the result of the last alias expansion.
2081 Do it transparently; just return the next character of the string popped
2083 if (!uc && (pushed_string_list != (STRING_SAVER *)NULL))
2086 uc = shell_input_line[shell_input_line_index];
2088 shell_input_line_index++;
2090 #endif /* ALIAS || DPAREN_ARITHMETIC */
2092 if MBTEST(uc == '\\' && remove_quoted_newline && shell_input_line[shell_input_line_index] == '\n')
2094 if (SHOULD_PROMPT ())
2100 if (!uc && shell_input_line_terminator == EOF)
2101 return ((shell_input_line_index != 0) ? '\n' : EOF);
2106 /* Put C back into the input for the shell. This might need changes for
2107 HANDLE_MULTIBYTE around EOLs. Since we (currently) never push back a
2108 character different than we read, shell_input_line_property doesn't need
2109 to change when manipulating shell_input_line. The define for
2110 last_shell_getc_is_singlebyte should take care of it, though. */
2115 if (shell_input_line && shell_input_line_index)
2116 shell_input_line[--shell_input_line_index] = c;
2118 eol_ungetc_lookahead = c;
2121 #ifdef INCLUDE_UNUSED
2122 /* Back the input pointer up by one, effectively `ungetting' a character. */
2126 if (shell_input_line && shell_input_line_index)
2127 shell_input_line_index--;
2131 /* Discard input until CHARACTER is seen, then push that character back
2132 onto the input stream. */
2134 discard_until (character)
2139 while ((c = shell_getc (0)) != EOF && c != character)
2147 execute_variable_command (command, vname)
2148 char *command, *vname;
2151 sh_parser_state_t ps;
2153 save_parser_state (&ps);
2154 last_lastarg = get_string_value ("_");
2156 last_lastarg = savestring (last_lastarg);
2158 parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST);
2160 restore_parser_state (&ps);
2161 bind_variable ("_", last_lastarg, 0);
2162 FREE (last_lastarg);
2164 if (token_to_read == '\n') /* reset_parser was called */
2168 /* Place to remember the token. We try to keep the buffer
2169 at a reasonable size, but it can grow. */
2170 static char *token = (char *)NULL;
2172 /* Current size of the token buffer. */
2173 static int token_buffer_size;
2175 /* Command to read_token () explaining what we want it to do. */
2178 #define prompt_is_ps1 \
2179 (!prompt_string_pointer || prompt_string_pointer == &ps1_prompt)
2181 /* Function for yyparse to call. yylex keeps track of
2182 the last two tokens read, and calls read_token. */
2186 if (interactive && (current_token == 0 || current_token == '\n'))
2188 /* Before we print a prompt, we might have to check mailboxes.
2189 We do this only if it is time to do so. Notice that only here
2190 is the mail alarm reset; nothing takes place in check_mail ()
2191 except the checking of mail. Please don't change this. */
2192 if (prompt_is_ps1 && time_to_check_mail ())
2195 reset_mail_timer ();
2198 /* Avoid printing a prompt if we're not going to read anything, e.g.
2199 after resetting the parser with read_token (RESET). */
2200 if (token_to_read == 0 && SHOULD_PROMPT ())
2204 two_tokens_ago = token_before_that;
2205 token_before_that = last_read_token;
2206 last_read_token = current_token;
2207 current_token = read_token (READ);
2208 return (current_token);
2211 /* When non-zero, we have read the required tokens
2212 which allow ESAC to be the next one read. */
2213 static int esacs_needed_count;
2216 gather_here_documents ()
2219 while (need_here_doc)
2221 make_here_document (redir_stack[r++]);
2226 /* When non-zero, an open-brace used to create a group is awaiting a close
2228 static int open_brace_count;
2230 #define command_token_position(token) \
2231 (((token) == ASSIGNMENT_WORD) || \
2232 ((token) != SEMI_SEMI && reserved_word_acceptable(token)))
2234 #define assignment_acceptable(token) \
2235 (command_token_position(token) && ((parser_state & PST_CASEPAT) == 0))
2237 /* Check to see if TOKEN is a reserved word and return the token
2239 #define CHECK_FOR_RESERVED_WORD(tok) \
2241 if (!dollar_present && !quoted && \
2242 reserved_word_acceptable (last_read_token)) \
2245 for (i = 0; word_token_alist[i].word != (char *)NULL; i++) \
2246 if (STREQ (tok, word_token_alist[i].word)) \
2248 if ((parser_state & PST_CASEPAT) && (word_token_alist[i].token != ESAC)) \
2250 if (word_token_alist[i].token == TIME && time_command_acceptable () == 0) \
2252 if (word_token_alist[i].token == ESAC) \
2253 parser_state &= ~(PST_CASEPAT|PST_CASESTMT); \
2254 else if (word_token_alist[i].token == CASE) \
2255 parser_state |= PST_CASESTMT; \
2256 else if (word_token_alist[i].token == COND_END) \
2257 parser_state &= ~(PST_CONDCMD|PST_CONDEXPR); \
2258 else if (word_token_alist[i].token == COND_START) \
2259 parser_state |= PST_CONDCMD; \
2260 else if (word_token_alist[i].token == '{') \
2261 open_brace_count++; \
2262 else if (word_token_alist[i].token == '}' && open_brace_count) \
2263 open_brace_count--; \
2264 return (word_token_alist[i].token); \
2271 /* OK, we have a token. Let's try to alias expand it, if (and only if)
2274 It is eligible for expansion if EXPAND_ALIASES is set, and
2275 the token is unquoted and the last token read was a command
2276 separator (or expand_next_token is set), and we are currently
2277 processing an alias (pushed_string_list is non-empty) and this
2278 token is not the same as the current or any previously
2281 Special cases that disqualify:
2282 In a pattern list in a case statement (parser_state & PST_CASEPAT). */
2292 r = xmalloc (l + 2);
2301 alias_expand_token (tokstr)
2307 if (((parser_state & PST_ALEXPNEXT) || command_token_position (last_read_token)) &&
2308 (parser_state & PST_CASEPAT) == 0)
2310 ap = find_alias (tokstr);
2312 /* Currently expanding this token. */
2313 if (ap && (ap->flags & AL_BEINGEXPANDED))
2314 return (NO_EXPANSION);
2316 /* mk_alexpansion puts an extra space on the end of the alias expansion,
2317 so the lookahead by the parser works right. If this gets changed,
2318 make sure the code in shell_getc that deals with reaching the end of
2319 an expanded alias is changed with it. */
2320 expanded = ap ? mk_alexpansion (ap->value) : (char *)NULL;
2324 push_string (expanded, ap->flags & AL_EXPANDNEXT, ap);
2325 return (RE_READ_TOKEN);
2328 /* This is an eligible token that does not have an expansion. */
2329 return (NO_EXPANSION);
2331 return (NO_EXPANSION);
2336 time_command_acceptable ()
2338 #if defined (COMMAND_TIMING)
2339 switch (last_read_token)
2358 #endif /* COMMAND_TIMING */
2361 /* Handle special cases of token recognition:
2362 IN is recognized if the last token was WORD and the token
2363 before that was FOR or CASE or SELECT.
2365 DO is recognized if the last token was WORD and the token
2366 before that was FOR or SELECT.
2368 ESAC is recognized if the last token caused `esacs_needed_count'
2371 `{' is recognized if the last token as WORD and the token
2372 before that was FUNCTION, or if we just parsed an arithmetic
2375 `}' is recognized if there is an unclosed `{' present.
2377 `-p' is returned as TIMEOPT if the last read token was TIME.
2379 ']]' is returned as COND_END if the parser is currently parsing
2380 a conditional expression ((parser_state & PST_CONDEXPR) != 0)
2382 `time' is returned as TIME if and only if it is immediately
2383 preceded by one of `;', `\n', `||', `&&', or `&'.
2387 special_case_tokens (tokstr)
2390 if ((last_read_token == WORD) &&
2391 #if defined (SELECT_COMMAND)
2392 ((token_before_that == FOR) || (token_before_that == CASE) || (token_before_that == SELECT)) &&
2394 ((token_before_that == FOR) || (token_before_that == CASE)) &&
2396 (tokstr[0] == 'i' && tokstr[1] == 'n' && tokstr[2] == 0))
2398 if (token_before_that == CASE)
2400 parser_state |= PST_CASEPAT;
2401 esacs_needed_count++;
2406 if (last_read_token == WORD &&
2407 #if defined (SELECT_COMMAND)
2408 (token_before_that == FOR || token_before_that == SELECT) &&
2410 (token_before_that == FOR) &&
2412 (tokstr[0] == 'd' && tokstr[1] == 'o' && tokstr[2] == '\0'))
2415 /* Ditto for ESAC in the CASE case.
2416 Specifically, this handles "case word in esac", which is a legal
2417 construct, certainly because someone will pass an empty arg to the
2418 case construct, and we don't want it to barf. Of course, we should
2419 insist that the case construct has at least one pattern in it, but
2420 the designers disagree. */
2421 if (esacs_needed_count)
2423 esacs_needed_count--;
2424 if (STREQ (tokstr, "esac"))
2426 parser_state &= ~PST_CASEPAT;
2431 /* The start of a shell function definition. */
2432 if (parser_state & PST_ALLOWOPNBRC)
2434 parser_state &= ~PST_ALLOWOPNBRC;
2435 if (tokstr[0] == '{' && tokstr[1] == '\0') /* } */
2438 function_bstart = line_number;
2439 return ('{'); /* } */
2443 /* We allow a `do' after a for ((...)) without an intervening
2445 if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == 'd' && tokstr[1] == 'o' && !tokstr[2])
2447 if (last_read_token == ARITH_FOR_EXPRS && tokstr[0] == '{' && tokstr[1] == '\0') /* } */
2450 return ('{'); /* } */
2453 if (open_brace_count && reserved_word_acceptable (last_read_token) && tokstr[0] == '}' && !tokstr[1])
2455 open_brace_count--; /* { */
2459 #if defined (COMMAND_TIMING)
2460 /* Handle -p after `time'. */
2461 if (last_read_token == TIME && tokstr[0] == '-' && tokstr[1] == 'p' && !tokstr[2])
2466 #if defined (COMMAND_TIMING)
2467 if (STREQ (token, "time") && ((parser_state & PST_CASEPAT) == 0) && time_command_acceptable ())
2469 #endif /* COMMAND_TIMING */
2472 #if defined (COND_COMMAND) /* [[ */
2473 if ((parser_state & PST_CONDEXPR) && tokstr[0] == ']' && tokstr[1] == ']' && tokstr[2] == '\0')
2480 /* Called from shell.c when Control-C is typed at top level. Or
2481 by the error rule at top level. */
2485 dstack.delimiter_depth = 0; /* No delimiters found so far. */
2486 open_brace_count = 0;
2490 #if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
2491 if (pushed_string_list)
2492 free_string_list ();
2493 #endif /* ALIAS || DPAREN_ARITHMETIC */
2495 if (shell_input_line)
2497 free (shell_input_line);
2498 shell_input_line = (char *)NULL;
2499 shell_input_line_size = shell_input_line_index = 0;
2502 FREE (word_desc_to_read);
2503 word_desc_to_read = (WORD_DESC *)NULL;
2505 last_read_token = '\n';
2506 token_to_read = '\n';
2509 /* Read the next token. Command can be READ (normal operation) or
2510 RESET (to normalize state). */
2512 read_token (command)
2515 int character; /* Current character. */
2516 int peek_char; /* Temporary look-ahead character. */
2517 int result; /* The thing to return. */
2519 if (command == RESET)
2527 result = token_to_read;
2528 if (token_to_read == WORD || token_to_read == ASSIGNMENT_WORD)
2530 yylval.word = word_desc_to_read;
2531 word_desc_to_read = (WORD_DESC *)NULL;
2537 #if defined (COND_COMMAND)
2538 if ((parser_state & (PST_CONDCMD|PST_CONDEXPR)) == PST_CONDCMD)
2540 cond_lineno = line_number;
2541 parser_state |= PST_CONDEXPR;
2542 yylval.command = parse_cond_command ();
2543 if (cond_token != COND_END)
2548 token_to_read = COND_END;
2549 parser_state &= ~(PST_CONDEXPR|PST_CONDCMD);
2555 /* This is a place to jump back to once we have successfully expanded a
2556 token with an alias and pushed the string with push_string () */
2560 /* Read a single word from input. Start by skipping blanks. */
2561 while ((character = shell_getc (1)) != EOF && shellblank (character))
2564 if (character == EOF)
2570 if MBTEST(character == '#' && (!interactive || interactive_comments))
2572 /* A comment. Discard until EOL or EOF, and then return a newline. */
2573 discard_until ('\n');
2575 character = '\n'; /* this will take the next if statement and return. */
2578 if (character == '\n')
2580 /* If we're about to return an unquoted newline, we can go and collect
2581 the text of any pending here document. */
2583 gather_here_documents ();
2586 parser_state &= ~PST_ALEXPNEXT;
2589 parser_state &= ~PST_ASSIGNOK;
2594 /* Shell meta-characters. */
2595 if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
2598 /* Turn off alias tokenization iff this character sequence would
2599 not leave us ready to read a command. */
2600 if (character == '<' || character == '>')
2601 parser_state &= ~PST_ALEXPNEXT;
2604 parser_state &= ~PST_ASSIGNOK;
2606 peek_char = shell_getc (1);
2607 if (character == peek_char)
2612 /* If '<' then we could be at "<<" or at "<<-". We have to
2613 look ahead one more character. */
2614 peek_char = shell_getc (1);
2615 if (peek_char == '-')
2616 return (LESS_LESS_MINUS);
2617 else if (peek_char == '<')
2618 return (LESS_LESS_LESS);
2621 shell_ungetc (peek_char);
2626 return (GREATER_GREATER);
2629 parser_state |= PST_CASEPAT;
2631 parser_state &= ~PST_ALEXPNEXT;
2642 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
2644 result = parse_dparen (character);
2652 else if MBTEST(character == '<' && peek_char == '&')
2654 else if MBTEST(character == '>' && peek_char == '&')
2655 return (GREATER_AND);
2656 else if MBTEST(character == '<' && peek_char == '>')
2657 return (LESS_GREATER);
2658 else if MBTEST(character == '>' && peek_char == '|')
2659 return (GREATER_BAR);
2660 else if MBTEST(peek_char == '>' && character == '&')
2661 return (AND_GREATER);
2663 shell_ungetc (peek_char);
2665 /* If we look like we are reading the start of a function
2666 definition, then let the reader know about it so that
2667 we will do the right thing with `{'. */
2668 if MBTEST(character == ')' && last_read_token == '(' && token_before_that == WORD)
2670 parser_state |= PST_ALLOWOPNBRC;
2672 parser_state &= ~PST_ALEXPNEXT;
2674 function_dstart = line_number;
2677 /* case pattern lists may be preceded by an optional left paren. If
2678 we're not trying to parse a case pattern list, the left paren
2679 indicates a subshell. */
2680 if MBTEST(character == '(' && (parser_state & PST_CASEPAT) == 0) /* ) */
2681 parser_state |= PST_SUBSHELL;
2683 else if MBTEST((parser_state & PST_CASEPAT) && character == ')')
2684 parser_state &= ~PST_CASEPAT;
2686 else if MBTEST((parser_state & PST_SUBSHELL) && character == ')')
2687 parser_state &= ~PST_SUBSHELL;
2689 #if defined (PROCESS_SUBSTITUTION)
2690 /* Check for the constructs which introduce process substitution.
2691 Shells running in `posix mode' don't do process substitution. */
2692 if MBTEST(posixly_correct || ((character != '>' && character != '<') || peek_char != '(')) /*)*/
2693 #endif /* PROCESS_SUBSTITUTION */
2697 /* Hack <&- (close stdin) case. Also <&N- (dup and close). */
2698 if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
2701 /* Okay, if we got this far, we have to read a word. Read one,
2702 and then check it against the known ones. */
2703 result = read_token_word (character);
2705 if (result == RE_READ_TOKEN)
2712 * Match a $(...) or other grouping construct. This has to handle embedded
2713 * quoted strings ('', ``, "") and nested constructs. It also must handle
2714 * reprompting the user, if necessary, after reading a newline, and returning
2715 * correct error values if it reads EOF.
2717 #define P_FIRSTCLOSE 0x01
2718 #define P_ALLOWESC 0x02
2719 #define P_DQUOTE 0x04
2720 #define P_COMMAND 0x08 /* parsing a command, so look for comments */
2721 #define P_BACKQUOTE 0x10 /* parsing a backquoted command substitution */
2723 static char matched_pair_error;
2725 parse_matched_pair (qc, open, close, lenp, flags)
2726 int qc; /* `"' if this construct is within double quotes */
2730 int count, ch, was_dollar, in_comment, check_comment;
2731 int pass_next_character, backq_backslash, nestlen, ttranslen, start_lineno;
2732 char *ret, *nestret, *ttrans;
2733 int retind, retsize, rflags;
2735 /* itrace("parse_matched_pair: open = %c close = %c", open, close); */
2737 pass_next_character = backq_backslash = was_dollar = in_comment = 0;
2738 check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
2740 /* RFLAGS is the set of flags we want to pass to recursive calls. */
2741 rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE);
2743 ret = (char *)xmalloc (retsize = 64);
2746 start_lineno = line_number;
2749 ch = shell_getc (qc != '\'' && pass_next_character == 0 && backq_backslash == 0);
2754 parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
2755 EOF_Reached = 1; /* XXX */
2756 return (&matched_pair_error);
2759 /* Possible reprompting. */
2760 if (ch == '\n' && SHOULD_PROMPT ())
2765 /* Add this character. */
2766 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
2774 /* Not exactly right yet, should handle shell metacharacters, too. If
2775 any changes are made to this test, make analogous changes to subst.c:
2776 extract_delimited_string(). */
2777 else if MBTEST(check_comment && in_comment == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || whitespace (ret[retind - 1])))
2780 /* last char was backslash inside backquoted command substitution */
2781 if (backq_backslash)
2783 backq_backslash = 0;
2784 /* Placeholder for adding special characters */
2787 if (pass_next_character) /* last char was backslash */
2789 pass_next_character = 0;
2790 if (qc != '\'' && ch == '\n') /* double-quoted \<newline> disappears. */
2792 if (retind > 0) retind--; /* swallow previously-added backslash */
2796 RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
2797 if MBTEST(ch == CTLESC || ch == CTLNUL)
2798 ret[retind++] = CTLESC;
2802 else if MBTEST(ch == CTLESC || ch == CTLNUL) /* special shell escapes */
2804 RESIZE_MALLOCED_BUFFER (ret, retind, 2, retsize, 64);
2805 ret[retind++] = CTLESC;
2809 else if MBTEST(ch == close) /* ending delimiter */
2811 /* handle nested ${...} specially. */
2812 else if MBTEST(open != close && was_dollar && open == '{' && ch == open) /* } */
2814 else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && ch == open) /* nested begin */
2817 /* Add this character. */
2818 RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
2821 if (open == '\'') /* '' inside grouping construct */
2823 if MBTEST((flags & P_ALLOWESC) && ch == '\\')
2824 pass_next_character++;
2826 else if MBTEST((flags & P_BACKQUOTE) && ch == '\\')
2832 if MBTEST(ch == '\\') /* backslashes */
2833 pass_next_character++;
2835 if (open != close) /* a grouping construct */
2837 if MBTEST(shellquote (ch))
2839 /* '', ``, or "" inside $(...) or other grouping construct. */
2840 push_delimiter (dstack, ch);
2841 if MBTEST(was_dollar && ch == '\'') /* $'...' inside group */
2842 nestret = parse_matched_pair (ch, ch, ch, &nestlen, P_ALLOWESC|rflags);
2844 nestret = parse_matched_pair (ch, ch, ch, &nestlen, rflags);
2845 pop_delimiter (dstack);
2846 if (nestret == &matched_pair_error)
2849 return &matched_pair_error;
2851 if MBTEST(was_dollar && ch == '\'' && (extended_quote || (rflags & P_DQUOTE) == 0))
2853 /* Translate $'...' here. */
2854 ttrans = ansiexpand (nestret, 0, nestlen - 1, &ttranslen);
2857 if ((rflags & P_DQUOTE) == 0)
2859 nestret = sh_single_quote (ttrans);
2861 nestlen = strlen (nestret);
2866 nestlen = ttranslen;
2868 retind -= 2; /* back up before the $' */
2870 else if MBTEST(was_dollar && ch == '"' && (extended_quote || (rflags & P_DQUOTE) == 0))
2872 /* Locale expand $"..." here. */
2873 ttrans = localeexpand (nestret, 0, nestlen - 1, start_lineno, &ttranslen);
2876 nestret = sh_mkdoublequoted (ttrans, ttranslen, 0);
2878 nestlen = ttranslen + 2;
2879 retind -= 2; /* back up before the $" */
2884 RESIZE_MALLOCED_BUFFER (ret, retind, nestlen, retsize, 64);
2885 strcpy (ret + retind, nestret);
2891 /* Parse an old-style command substitution within double quotes as a
2893 /* XXX - sh and ksh93 don't do this - XXX */
2894 else if MBTEST(open == '"' && ch == '`')
2896 nestret = parse_matched_pair (0, '`', '`', &nestlen, rflags);
2898 if (nestret == &matched_pair_error)
2901 return &matched_pair_error;
2905 RESIZE_MALLOCED_BUFFER (ret, retind, nestlen, retsize, 64);
2906 strcpy (ret + retind, nestret);
2912 else if MBTEST(qc == '`' && (ch == '"' || ch == '\'') && in_comment == 0)
2914 /* Add P_BACKQUOTE so backslash quotes the next character and
2915 shell_getc does the right thing with \<newline>. We do this for
2916 a measure of backwards compatibility -- it's not strictly the
2917 right POSIX thing. */
2918 nestret = parse_matched_pair (0, ch, ch, &nestlen, rflags|P_BACKQUOTE);
2922 else if MBTEST(open != '`' && was_dollar && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
2923 /* check for $(), $[], or ${} inside quoted string. */
2925 if (open == ch) /* undo previous increment */
2927 if (ch == '(') /* ) */
2928 nestret = parse_matched_pair (0, '(', ')', &nestlen, rflags & ~P_DQUOTE);
2929 else if (ch == '{') /* } */
2930 nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|rflags);
2931 else if (ch == '[') /* ] */
2932 nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
2936 was_dollar = MBTEST(ch == '$');
2945 #if defined (DPAREN_ARITHMETIC) || defined (ARITH_FOR_COMMAND)
2946 /* Parse a double-paren construct. It can be either an arithmetic
2947 command, an arithmetic `for' command, or a nested subshell. Returns
2948 the parsed token, -1 on error, or -2 if we didn't do anything and
2949 should just go on. */
2958 #if defined (ARITH_FOR_COMMAND)
2959 if (last_read_token == FOR)
2961 arith_for_lineno = line_number;
2962 cmdtyp = parse_arith_cmd (&wval, 0);
2965 wd = alloc_word_desc ();
2967 yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
2968 return (ARITH_FOR_EXPRS);
2971 return -1; /* ERROR */
2975 #if defined (DPAREN_ARITHMETIC)
2976 if (reserved_word_acceptable (last_read_token))
2978 sline = line_number;
2980 cmdtyp = parse_arith_cmd (&wval, 0);
2981 if (cmdtyp == 1) /* arithmetic command */
2983 wd = alloc_word_desc ();
2985 wd->flags = W_QUOTED|W_NOSPLIT|W_NOGLOB|W_DQUOTE;
2986 yylval.word_list = make_word_list (wd, (WORD_LIST *)NULL);
2989 else if (cmdtyp == 0) /* nested subshell */
2991 push_string (wval, 0, (alias_t *)NULL);
2992 if ((parser_state & PST_CASEPAT) == 0)
2993 parser_state |= PST_SUBSHELL;
3001 return -2; /* XXX */
3004 /* We've seen a `(('. Look for the matching `))'. If we get it, return 1.
3005 If not, assume it's a nested subshell for backwards compatibility and
3006 return 0. In any case, put the characters we've consumed into a locally-
3007 allocated buffer and make *ep point to that buffer. Return -1 on an
3008 error, for example EOF. */
3010 parse_arith_cmd (ep, adddq)
3014 int exp_lineno, rval, c;
3015 char *ttok, *tokstr;
3018 exp_lineno = line_number;
3019 ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
3021 if (ttok == &matched_pair_error)
3023 /* Check that the next character is the closing right paren. If
3024 not, this is a syntax error. ( */
3029 tokstr = (char *)xmalloc (ttoklen + 4);
3031 /* if ADDDQ != 0 then (( ... )) -> "..." */
3032 if (rval == 1 && adddq) /* arith cmd, add double quotes */
3035 strncpy (tokstr + 1, ttok, ttoklen - 1);
3036 tokstr[ttoklen] = '"';
3037 tokstr[ttoklen+1] = '\0';
3039 else if (rval == 1) /* arith cmd, don't add double quotes */
3041 strncpy (tokstr, ttok, ttoklen - 1);
3042 tokstr[ttoklen-1] = '\0';
3044 else /* nested subshell */
3047 strncpy (tokstr + 1, ttok, ttoklen - 1);
3048 tokstr[ttoklen] = ')';
3049 tokstr[ttoklen+1] = c;
3050 tokstr[ttoklen+2] = '\0';
3057 #endif /* DPAREN_ARITHMETIC || ARITH_FOR_COMMAND */
3059 #if defined (COND_COMMAND)
3065 if (EOF_Reached && cond_token != COND_ERROR) /* [[ */
3066 parser_error (cond_lineno, _("unexpected EOF while looking for `]]'"));
3067 else if (cond_token != COND_ERROR)
3069 if (etext = error_token_from_token (cond_token))
3071 parser_error (cond_lineno, _("syntax error in conditional expression: unexpected token `%s'"), etext);
3075 parser_error (cond_lineno, _("syntax error in conditional expression"));
3082 return (cond_or ());
3091 if (cond_token == OR_OR)
3094 l = make_cond_node (COND_OR, (WORD_DESC *)NULL, l, r);
3105 if (cond_token == AND_AND)
3108 l = make_cond_node (COND_AND, (WORD_DESC *)NULL, l, r);
3114 cond_skip_newlines ()
3116 while ((cond_token = read_token (READ)) == '\n')
3118 if (SHOULD_PROMPT ())
3121 return (cond_token);
3124 #define COND_RETURN_ERROR() \
3125 do { cond_token = COND_ERROR; return ((COND_COM *)NULL); } while (0)
3131 COND_COM *term, *tleft, *tright;
3135 /* Read a token. It can be a left paren, a `!', a unary operator, or a
3136 word that should be the first argument of a binary operator. Start by
3137 skipping newlines, since this is a compound command. */
3138 tok = cond_skip_newlines ();
3139 lineno = line_number;
3140 if (tok == COND_END)
3142 COND_RETURN_ERROR ();
3144 else if (tok == '(')
3146 term = cond_expr ();
3147 if (cond_token != ')')
3150 dispose_cond_node (term); /* ( */
3151 if (etext = error_token_from_token (cond_token))
3153 parser_error (lineno, _("unexpected token `%s', expected `)'"), etext);
3157 parser_error (lineno, _("expected `)'"));
3158 COND_RETURN_ERROR ();
3160 term = make_cond_node (COND_EXPR, (WORD_DESC *)NULL, term, (COND_COM *)NULL);
3161 (void)cond_skip_newlines ();
3163 else if (tok == BANG || (tok == WORD && (yylval.word->word[0] == '!' && yylval.word->word[1] == '\0')))
3166 dispose_word (yylval.word); /* not needed */
3167 term = cond_term ();
3169 term->flags |= CMD_INVERT_RETURN;
3171 else if (tok == WORD && test_unop (yylval.word->word))
3174 tok = read_token (READ);
3177 tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
3178 term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL);
3183 if (etext = error_token_from_token (tok))
3185 parser_error (line_number, _("unexpected argument `%s' to conditional unary operator"), etext);
3189 parser_error (line_number, _("unexpected argument to conditional unary operator"));
3190 COND_RETURN_ERROR ();
3193 (void)cond_skip_newlines ();
3195 else if (tok == WORD) /* left argument to binary operator */
3198 tleft = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
3201 tok = read_token (READ);
3202 if (tok == WORD && test_binop (yylval.word->word))
3204 #if defined (COND_REGEXP)
3205 else if (tok == WORD && STREQ (yylval.word->word,"=~"))
3208 else if (tok == '<' || tok == '>')
3209 op = make_word_from_token (tok); /* ( */
3210 /* There should be a check before blindly accepting the `)' that we have
3211 seen the opening `('. */
3212 else if (tok == COND_END || tok == AND_AND || tok == OR_OR || tok == ')')
3214 /* Special case. [[ x ]] is equivalent to [[ -n x ]], just like
3215 the test command. Similarly for [[ x && expr ]] or
3216 [[ x || expr ]] or [[ (x) ]]. */
3217 op = make_word ("-n");
3218 term = make_cond_node (COND_UNARY, op, tleft, (COND_COM *)NULL);
3224 if (etext = error_token_from_token (tok))
3226 parser_error (line_number, _("unexpected token `%s', conditional binary operator expected"), etext);
3230 parser_error (line_number, _("conditional binary operator expected"));
3231 dispose_cond_node (tleft);
3232 COND_RETURN_ERROR ();
3236 tok = read_token (READ);
3239 tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
3240 term = make_cond_node (COND_BINARY, op, tleft, tright);
3244 if (etext = error_token_from_token (tok))
3246 parser_error (line_number, _("unexpected argument `%s' to conditional binary operator"), etext);
3250 parser_error (line_number, _("unexpected argument to conditional binary operator"));
3251 dispose_cond_node (tleft);
3253 COND_RETURN_ERROR ();
3256 (void)cond_skip_newlines ();
3261 parser_error (line_number, _("unexpected token `%c' in conditional command"), tok);
3262 else if (etext = error_token_from_token (tok))
3264 parser_error (line_number, _("unexpected token `%s' in conditional command"), etext);
3268 parser_error (line_number, _("unexpected token %d in conditional command"), tok);
3269 COND_RETURN_ERROR ();
3274 /* This is kind of bogus -- we slip a mini recursive-descent parser in
3275 here to handle the conditional statement syntax. */
3277 parse_cond_command ()
3281 cexp = cond_expr ();
3282 return (make_cond_command (cexp));
3286 #if defined (ARRAY_VARS)
3287 /* When this is called, it's guaranteed that we don't care about anything
3288 in t beyond i. We do save and restore the chars, though. */
3290 token_is_assignment (t, i)
3294 unsigned char c, c1;
3297 c = t[i]; c1 = t[i+1];
3298 t[i] = '='; t[i+1] = '\0';
3299 r = assignment (t, (parser_state & PST_COMPASSIGN) != 0);
3300 t[i] = c; t[i+1] = c1;
3304 /* XXX - possible changes here for `+=' */
3306 token_is_ident (t, i)
3315 r = legal_identifier (t);
3322 read_token_word (character)
3325 /* The value for YYLVAL when a WORD is read. */
3326 WORD_DESC *the_word;
3328 /* Index into the token that we are building. */
3331 /* ALL_DIGITS becomes zero when we see a non-digit. */
3332 int all_digit_token;
3334 /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */
3337 /* COMPOUND_ASSIGNMENT becomes non-zero if we are parsing a compound
3339 int compound_assignment;
3341 /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */
3344 /* Non-zero means to ignore the value of the next character, and just
3345 to add it no matter what. */
3346 int pass_next_character;
3348 /* The current delimiting character. */
3350 int result, peek_char;
3351 char *ttok, *ttrans;
3352 int ttoklen, ttranslen;
3355 if (token_buffer_size < TOKEN_DEFAULT_INITIAL_SIZE)
3356 token = (char *)xrealloc (token, token_buffer_size = TOKEN_DEFAULT_INITIAL_SIZE);
3359 all_digit_token = DIGIT (character);
3360 dollar_present = quoted = pass_next_character = compound_assignment = 0;
3364 if (character == EOF)
3367 if (pass_next_character)
3369 pass_next_character = 0;
3373 cd = current_delimiter (dstack);
3375 /* Handle backslashes. Quote lots of things when not inside of
3376 double-quotes, quote some things inside of double-quotes. */
3377 if MBTEST(character == '\\')
3379 peek_char = shell_getc (0);
3381 /* Backslash-newline is ignored in all cases except
3382 when quoted with single quotes. */
3383 if (peek_char == '\n')
3386 goto next_character;
3390 shell_ungetc (peek_char);
3392 /* If the next character is to be quoted, note it now. */
3393 if (cd == 0 || cd == '`' ||
3394 (cd == '"' && peek_char >= 0 && (sh_syntaxtab[peek_char] & CBSDQUOTE)))
3395 pass_next_character++;
3402 /* Parse a matched pair of quote characters. */
3403 if MBTEST(shellquote (character))
3405 push_delimiter (dstack, character);
3406 ttok = parse_matched_pair (character, character, character, &ttoklen, (character == '`') ? P_COMMAND : 0);
3407 pop_delimiter (dstack);
3408 if (ttok == &matched_pair_error)
3409 return -1; /* Bail immediately. */
3410 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
3411 token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
3412 token[token_index++] = character;
3413 strcpy (token + token_index, ttok);
3414 token_index += ttoklen;
3415 all_digit_token = 0;
3417 dollar_present |= (character == '"' && strchr (ttok, '$') != 0);
3419 goto next_character;
3422 #ifdef EXTENDED_GLOB
3423 /* Parse a ksh-style extended pattern matching specification. */
3424 if (extended_glob && PATTERN_CHAR (character))
3426 peek_char = shell_getc (1);
3427 if MBTEST(peek_char == '(') /* ) */
3429 push_delimiter (dstack, peek_char);
3430 ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
3431 pop_delimiter (dstack);
3432 if (ttok == &matched_pair_error)
3433 return -1; /* Bail immediately. */
3434 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
3436 TOKEN_DEFAULT_GROW_SIZE);
3437 token[token_index++] = character;
3438 token[token_index++] = peek_char;
3439 strcpy (token + token_index, ttok);
3440 token_index += ttoklen;
3442 dollar_present = all_digit_token = 0;
3443 goto next_character;
3446 shell_ungetc (peek_char);
3448 #endif /* EXTENDED_GLOB */
3450 /* If the delimiter character is not single quote, parse some of
3451 the shell expansions that must be read as a single word. */
3452 if (shellexp (character))
3454 peek_char = shell_getc (1);
3455 /* $(...), <(...), >(...), $((...)), ${...}, and $[...] constructs */
3456 if MBTEST(peek_char == '(' || \
3457 ((peek_char == '{' || peek_char == '[') && character == '$')) /* ) ] } */
3459 if (peek_char == '{') /* } */
3460 ttok = parse_matched_pair (cd, '{', '}', &ttoklen, P_FIRSTCLOSE);
3461 else if (peek_char == '(') /* ) */
3463 /* XXX - push and pop the `(' as a delimiter for use by
3464 the command-oriented-history code. This way newlines
3465 appearing in the $(...) string get added to the
3466 history literally rather than causing a possibly-
3467 incorrect `;' to be added. ) */
3468 push_delimiter (dstack, peek_char);
3469 ttok = parse_matched_pair (cd, '(', ')', &ttoklen, P_COMMAND);
3470 pop_delimiter (dstack);
3473 ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
3474 if (ttok == &matched_pair_error)
3475 return -1; /* Bail immediately. */
3476 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
3478 TOKEN_DEFAULT_GROW_SIZE);
3479 token[token_index++] = character;
3480 token[token_index++] = peek_char;
3481 strcpy (token + token_index, ttok);
3482 token_index += ttoklen;
3485 all_digit_token = 0;
3486 goto next_character;
3488 /* This handles $'...' and $"..." new-style quoted strings. */
3489 else if MBTEST(character == '$' && (peek_char == '\'' || peek_char == '"'))
3493 first_line = line_number;
3494 push_delimiter (dstack, peek_char);
3495 ttok = parse_matched_pair (peek_char, peek_char, peek_char,
3497 (peek_char == '\'') ? P_ALLOWESC : 0);
3498 pop_delimiter (dstack);
3499 if (ttok == &matched_pair_error)
3501 if (peek_char == '\'')
3503 ttrans = ansiexpand (ttok, 0, ttoklen - 1, &ttranslen);
3506 /* Insert the single quotes and correctly quote any
3507 embedded single quotes (allowed because P_ALLOWESC was
3508 passed to parse_matched_pair). */
3509 ttok = sh_single_quote (ttrans);
3511 ttranslen = strlen (ttok);
3516 /* Try to locale-expand the converted string. */
3517 ttrans = localeexpand (ttok, 0, ttoklen - 1, first_line, &ttranslen);
3520 /* Add the double quotes back */
3521 ttok = sh_mkdoublequoted (ttrans, ttranslen, 0);
3527 RESIZE_MALLOCED_BUFFER (token, token_index, ttranslen + 2,
3529 TOKEN_DEFAULT_GROW_SIZE);
3530 strcpy (token + token_index, ttrans);
3531 token_index += ttranslen;
3534 all_digit_token = 0;
3535 goto next_character;
3537 /* This could eventually be extended to recognize all of the
3538 shell's single-character parameter expansions, and set flags.*/
3539 else if MBTEST(character == '$' && peek_char == '$')
3541 ttok = (char *)xmalloc (3);
3542 ttok[0] = ttok[1] = '$';
3544 RESIZE_MALLOCED_BUFFER (token, token_index, 3,
3546 TOKEN_DEFAULT_GROW_SIZE);
3547 strcpy (token + token_index, ttok);
3550 all_digit_token = 0;
3552 goto next_character;
3555 shell_ungetc (peek_char);
3558 #if defined (ARRAY_VARS)
3559 /* Identify possible array subscript assignment; match [...] */
3560 else if MBTEST(character == '[' && token_index > 0 && assignment_acceptable (last_read_token) && token_is_ident (token, token_index)) /* ] */
3562 ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
3563 if (ttok == &matched_pair_error)
3564 return -1; /* Bail immediately. */
3565 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
3567 TOKEN_DEFAULT_GROW_SIZE);
3568 token[token_index++] = character;
3569 strcpy (token + token_index, ttok);
3570 token_index += ttoklen;
3572 all_digit_token = 0;
3573 goto next_character;
3575 /* Identify possible compound array variable assignment. */
3576 else if MBTEST(character == '=' && token_index > 0 && (assignment_acceptable (last_read_token) || (parser_state & PST_ASSIGNOK)) && token_is_assignment (token, token_index))
3578 peek_char = shell_getc (1);
3579 if MBTEST(peek_char == '(') /* ) */
3581 ttok = parse_compound_assignment (&ttoklen);
3583 RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 4,
3585 TOKEN_DEFAULT_GROW_SIZE);
3587 token[token_index++] = '=';
3588 token[token_index++] = '(';
3591 strcpy (token + token_index, ttok);
3592 token_index += ttoklen;
3594 token[token_index++] = ')';
3596 all_digit_token = 0;
3597 compound_assignment = 1;
3599 goto next_character;
3601 goto got_token; /* ksh93 seems to do this */
3605 shell_ungetc (peek_char);
3609 /* When not parsing a multi-character word construct, shell meta-
3610 characters break words. */
3611 if MBTEST(shellbreak (character))
3613 shell_ungetc (character);
3619 all_digit_token &= DIGIT (character);
3620 dollar_present |= character == '$';
3622 if (character == CTLESC || character == CTLNUL)
3623 token[token_index++] = CTLESC;
3625 token[token_index++] = character;
3627 RESIZE_MALLOCED_BUFFER (token, token_index, 1, token_buffer_size,
3628 TOKEN_DEFAULT_GROW_SIZE);
3631 if (character == '\n' && SHOULD_PROMPT ())
3634 /* We want to remove quoted newlines (that is, a \<newline> pair)
3635 unless we are within single quotes or pass_next_character is
3636 set (the shell equivalent of literal-next). */
3637 cd = current_delimiter (dstack);
3638 character = shell_getc (cd != '\'' && pass_next_character == 0);
3639 } /* end for (;;) */
3643 token[token_index] = '\0';
3645 /* Check to see what thing we should return. If the last_read_token
3646 is a `<', or a `&', or the character which ended this token is
3647 a '>' or '<', then, and ONLY then, is this input token a NUMBER.
3648 Otherwise, it is just a word, and should be returned as such. */
3649 if MBTEST(all_digit_token && (character == '<' || character == '>' || \
3650 last_read_token == LESS_AND || \
3651 last_read_token == GREATER_AND))
3653 if (legal_number (token, &lvalue) && (int)lvalue == lvalue)
3654 yylval.number = lvalue;
3660 /* Check for special case tokens. */
3661 result = (last_shell_getc_is_singlebyte) ? special_case_tokens (token) : -1;
3666 /* Posix.2 does not allow reserved words to be aliased, so check for all
3667 of them, including special cases, before expanding the current token
3669 if MBTEST(posixly_correct)
3670 CHECK_FOR_RESERVED_WORD (token);
3672 /* Aliases are expanded iff EXPAND_ALIASES is non-zero, and quoting
3673 inhibits alias expansion. */
3674 if (expand_aliases && quoted == 0)
3676 result = alias_expand_token (token);
3677 if (result == RE_READ_TOKEN)
3678 return (RE_READ_TOKEN);
3679 else if (result == NO_EXPANSION)
3680 parser_state &= ~PST_ALEXPNEXT;
3683 /* If not in Posix.2 mode, check for reserved words after alias
3685 if MBTEST(posixly_correct == 0)
3687 CHECK_FOR_RESERVED_WORD (token);
3689 the_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
3690 the_word->word = (char *)xmalloc (1 + token_index);
3691 the_word->flags = 0;
3692 strcpy (the_word->word, token);
3694 the_word->flags |= W_HASDOLLAR;
3696 the_word->flags |= W_QUOTED; /*(*/
3697 if (compound_assignment && token[token_index-1] == ')')
3698 the_word->flags |= W_COMPASSIGN;
3699 /* A word is an assignment if it appears at the beginning of a
3700 simple command, or after another assignment word. This is
3701 context-dependent, so it cannot be handled in the grammar. */
3702 if (assignment (token, (parser_state & PST_COMPASSIGN) != 0))
3704 the_word->flags |= W_ASSIGNMENT;
3705 /* Don't perform word splitting on assignment statements. */
3706 if (assignment_acceptable (last_read_token) || (parser_state & PST_COMPASSIGN) != 0)
3707 the_word->flags |= W_NOSPLIT;
3710 if (command_token_position (last_read_token))
3713 b = builtin_address_internal (token, 0);
3714 if (b && (b->flags & ASSIGNMENT_BUILTIN))
3715 parser_state |= PST_ASSIGNOK;
3716 else if (STREQ (token, "eval") || STREQ (token, "let"))
3717 parser_state |= PST_ASSIGNOK;
3720 yylval.word = the_word;
3722 result = ((the_word->flags & (W_ASSIGNMENT|W_NOSPLIT)) == (W_ASSIGNMENT|W_NOSPLIT))
3723 ? ASSIGNMENT_WORD : WORD;
3725 switch (last_read_token)
3728 parser_state |= PST_ALLOWOPNBRC;
3729 function_dstart = line_number;
3734 if (word_top < MAX_CASE_NEST)
3736 word_lineno[word_top] = line_number;
3743 /* Return 1 if TOKSYM is a token that after being read would allow
3744 a reserved word to be seen, else 0. */
3746 reserved_word_acceptable (toksym)
3782 /* Return the index of TOKEN in the alist of reserved words, or -1 if
3783 TOKEN is not a shell reserved word. */
3785 find_reserved_word (tokstr)
3789 for (i = 0; word_token_alist[i].word; i++)
3790 if (STREQ (tokstr, word_token_alist[i].word))
3796 #if defined (READLINE)
3797 /* Called after each time readline is called. This insures that whatever
3798 the new prompt string is gets propagated to readline's local prompt
3801 reset_readline_prompt ()
3805 if (prompt_string_pointer)
3807 temp_prompt = (*prompt_string_pointer)
3808 ? decode_prompt_string (*prompt_string_pointer)
3811 if (temp_prompt == 0)
3813 temp_prompt = (char *)xmalloc (1);
3814 temp_prompt[0] = '\0';
3817 FREE (current_readline_prompt);
3818 current_readline_prompt = temp_prompt;
3821 #endif /* READLINE */
3824 #if defined (HISTORY)
3825 /* A list of tokens which can be followed by newlines, but not by
3826 semi-colons. When concatenating multiple lines of history, the
3827 newline separator for such tokens is replaced with a space. */
3828 static int no_semi_successors[] = {
3829 '\n', '{', '(', ')', ';', '&', '|',
3830 CASE, DO, ELSE, IF, SEMI_SEMI, THEN, UNTIL, WHILE, AND_AND, OR_OR, IN,
3834 /* If we are not within a delimited expression, try to be smart
3835 about which separators can be semi-colons and which must be
3836 newlines. Returns the string that should be added into the
3839 history_delimiting_chars ()
3843 if (dstack.delimiter_depth != 0)
3846 /* First, handle some special cases. */
3848 /* If we just read `()', assume it's a function definition, and don't
3849 add a semicolon. If the token before the `)' was not `(', and we're
3850 not in the midst of parsing a case statement, assume it's a
3851 parenthesized command and add the semicolon. */
3853 if (token_before_that == ')')
3855 if (two_tokens_ago == '(') /*)*/ /* function def */
3857 /* This does not work for subshells inside case statement
3858 command lists. It's a suboptimal solution. */
3859 else if (parser_state & PST_CASESTMT) /* case statement pattern */
3862 return "; "; /* (...) subshell */
3864 else if (token_before_that == WORD && two_tokens_ago == FUNCTION)
3865 return " "; /* function def using `function name' without `()' */
3867 else if (token_before_that == WORD && two_tokens_ago == FOR)
3869 /* Tricky. `for i\nin ...' should not have a semicolon, but
3870 `for i\ndo ...' should. We do what we can. */
3871 for (i = shell_input_line_index; whitespace(shell_input_line[i]); i++)
3873 if (shell_input_line[i] && shell_input_line[i] == 'i' && shell_input_line[i+1] == 'n')
3877 else if (two_tokens_ago == CASE && token_before_that == WORD && (parser_state & PST_CASESTMT))
3880 for (i = 0; no_semi_successors[i]; i++)
3882 if (token_before_that == no_semi_successors[i])
3888 #endif /* HISTORY */
3890 /* Issue a prompt, or prepare to issue a prompt when the next character
3897 if (interactive == 0 || expanding_alias()) /* XXX */
3900 ps1_prompt = get_string_value ("PS1");
3901 ps2_prompt = get_string_value ("PS2");
3903 if (!prompt_string_pointer)
3904 prompt_string_pointer = &ps1_prompt;
3906 temp_prompt = *prompt_string_pointer
3907 ? decode_prompt_string (*prompt_string_pointer)
3910 if (temp_prompt == 0)
3912 temp_prompt = (char *)xmalloc (1);
3913 temp_prompt[0] = '\0';
3916 current_prompt_string = *prompt_string_pointer;
3917 prompt_string_pointer = &ps2_prompt;
3919 #if defined (READLINE)
3920 if (!no_line_editing)
3922 FREE (current_readline_prompt);
3923 current_readline_prompt = temp_prompt;
3926 #endif /* READLINE */
3928 FREE (current_decoded_prompt);
3929 current_decoded_prompt = temp_prompt;
3934 get_current_prompt_level ()
3936 return ((current_prompt_string && current_prompt_string == ps2_prompt) ? 2 : 1);
3940 set_current_prompt_level (x)
3943 prompt_string_pointer = (x == 2) ? &ps2_prompt : &ps1_prompt;
3944 current_prompt_string = *prompt_string_pointer;
3950 fprintf (stderr, "%s", current_decoded_prompt);
3954 /* Return a string which will be printed as a prompt. The string
3955 may contain special characters which are decoded as follows:
3958 \d the date in Day Mon Date format
3959 \e escape (ascii 033)
3960 \h the hostname up to the first `.'
3962 \j the number of active jobs
3963 \l the basename of the shell's tty device name
3966 \s the name of the shell
3967 \t the time in 24-hour hh:mm:ss format
3968 \T the time in 12-hour hh:mm:ss format
3969 \@ the time in 12-hour hh:mm am/pm format
3970 \A the time in 24-hour hh:mm format
3971 \D{fmt} the result of passing FMT to strftime(3)
3973 \v the version of bash (e.g., 2.00)
3974 \V the release of bash, version + patchlevel (e.g., 2.00.0)
3975 \w the current working directory
3976 \W the last element of $PWD
3977 \! the history number of this command
3978 \# the command number of this command
3979 \$ a $ or a # if you are root
3980 \nnn character code nnn in octal
3982 \[ begin a sequence of non-printing chars
3983 \] end a sequence of non-printing chars
3985 #define PROMPT_GROWTH 48
3987 decode_prompt_string (string)
3992 struct dstack save_dstack;
3993 int last_exit_value;
3994 #if defined (PROMPT_STRING_DECODE)
3995 int result_size, result_index;
3997 char *temp, octal_string[4];
4003 result = (char *)xmalloc (result_size = PROMPT_GROWTH);
4004 result[result_index = 0] = 0;
4005 temp = (char *)NULL;
4007 while (c = *string++)
4009 if (posixly_correct && c == '!')
4013 temp = savestring ("!");
4018 #if !defined (HISTORY)
4019 temp = savestring ("1");
4021 temp = itos (history_number ());
4022 #endif /* HISTORY */
4023 string--; /* add_string increments string again. */
4041 strncpy (octal_string, string, 3);
4042 octal_string[3] = '\0';
4044 n = read_octal (octal_string);
4045 temp = (char *)xmalloc (3);
4047 if (n == CTLESC || n == CTLNUL)
4064 for (c = 0; n != -1 && c < 3 && ISOCTAL (*string); c++)
4067 c = 0; /* tested at add_string: */
4075 /* Make the current time/date into a string. */
4076 (void) time (&the_time);
4077 tm = localtime (&the_time);
4080 n = strftime (timebuf, sizeof (timebuf), "%a %b %d", tm);
4082 n = strftime (timebuf, sizeof (timebuf), "%H:%M:%S", tm);
4084 n = strftime (timebuf, sizeof (timebuf), "%I:%M:%S", tm);
4086 n = strftime (timebuf, sizeof (timebuf), "%I:%M %p", tm);
4088 n = strftime (timebuf, sizeof (timebuf), "%H:%M", tm);
4093 timebuf[sizeof(timebuf) - 1] = '\0';
4095 temp = savestring (timebuf);
4098 case 'D': /* strftime format */
4099 if (string[1] != '{') /* } */
4102 (void) time (&the_time);
4103 tm = localtime (&the_time);
4104 string += 2; /* skip { */
4105 timefmt = xmalloc (strlen (string) + 3);
4106 for (t = timefmt; *string && *string != '}'; )
4109 c = *string; /* tested at add_string */
4110 if (timefmt[0] == '\0')
4113 timefmt[1] = 'X'; /* locale-specific current time */
4116 n = strftime (timebuf, sizeof (timebuf), timefmt, tm);
4122 timebuf[sizeof(timebuf) - 1] = '\0';
4124 if (promptvars || posixly_correct)
4125 /* Make sure that expand_prompt_string is called with a
4126 second argument of Q_DOUBLE_QUOTES if we use this
4128 temp = sh_backslash_quote_for_double_quotes (timebuf);
4130 temp = savestring (timebuf);
4134 temp = (char *)xmalloc (3);
4135 temp[0] = no_line_editing ? '\n' : '\r';
4136 temp[1] = no_line_editing ? '\0' : '\n';
4141 temp = base_pathname (shell_name);
4142 temp = savestring (temp);
4147 temp = (char *)xmalloc (16);
4149 strcpy (temp, dist_version);
4151 sprintf (temp, "%s.%d", dist_version, patch_level);
4157 /* Use the value of PWD because it is much more efficient. */
4158 char t_string[PATH_MAX];
4161 temp = get_string_value ("PWD");
4165 if (getcwd (t_string, sizeof(t_string)) == 0)
4171 tlen = strlen (t_string);
4175 tlen = sizeof (t_string) - 1;
4176 strncpy (t_string, temp, tlen);
4178 t_string[tlen] = '\0';
4180 #define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0)
4181 #define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0)
4182 /* Abbreviate \W as ~ if $PWD == $HOME */
4183 if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0))
4185 if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0)
4187 t = strrchr (t_string, '/');
4189 strcpy (t_string, t + 1);
4193 #undef DOUBLE_SLASH_ROOT
4195 /* polite_directory_format is guaranteed to return a string
4196 no longer than PATH_MAX - 1 characters. */
4197 strcpy (t_string, polite_directory_format (t_string));
4199 /* If we're going to be expanding the prompt string later,
4200 quote the directory name. */
4201 if (promptvars || posixly_correct)
4202 /* Make sure that expand_prompt_string is called with a
4203 second argument of Q_DOUBLE_QUOTES if we use this
4205 temp = sh_backslash_quote_for_double_quotes (t_string);
4207 temp = savestring (t_string);
4213 if (current_user.user_name == 0)
4214 get_current_user_info ();
4215 temp = savestring (current_user.user_name);
4220 temp = savestring (current_host_name);
4221 if (c == 'h' && (t = (char *)strchr (temp, '.')))
4226 temp = itos (current_command_number);
4230 #if !defined (HISTORY)
4231 temp = savestring ("1");
4233 temp = itos (history_number ());
4234 #endif /* HISTORY */
4238 t = temp = (char *)xmalloc (3);
4239 if ((promptvars || posixly_correct) && (current_user.euid != 0))
4241 *t++ = current_user.euid == 0 ? '#' : '$';
4246 temp = itos (count_all_jobs ());
4250 #if defined (HAVE_TTYNAME)
4251 temp = (char *)ttyname (fileno (stdin));
4252 t = temp ? base_pathname (temp) : "tty";
4253 temp = savestring (t);
4255 temp = savestring ("tty");
4256 #endif /* !HAVE_TTYNAME */
4259 #if defined (READLINE)
4262 if (no_line_editing)
4267 temp = (char *)xmalloc (3);
4268 n = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
4270 if (n == CTLESC || n == CTLNUL)
4275 #endif /* READLINE */
4281 temp = (char *)xmalloc (2);
4288 else /* (c == '\\') */
4295 temp = (char *)xmalloc (3);
4304 sub_append_string (temp, result, &result_index, &result_size);
4305 temp = (char *)NULL; /* Freed in sub_append_string (). */
4306 result[result_index] = '\0';
4312 RESIZE_MALLOCED_BUFFER (result, result_index, 3, result_size, PROMPT_GROWTH);
4313 result[result_index++] = c;
4314 result[result_index] = '\0';
4317 #else /* !PROMPT_STRING_DECODE */
4318 result = savestring (string);
4319 #endif /* !PROMPT_STRING_DECODE */
4321 /* Save the delimiter stack and point `dstack' to temp space so any
4322 command substitutions in the prompt string won't result in screwing
4323 up the parser's quoting state. */
4324 save_dstack = dstack;
4325 dstack = temp_dstack;
4326 dstack.delimiter_depth = 0;
4328 /* Perform variable and parameter expansion and command substitution on
4329 the prompt string. */
4330 if (promptvars || posixly_correct)
4332 last_exit_value = last_command_exit_value;
4333 list = expand_prompt_string (result, Q_DOUBLE_QUOTES);
4335 result = string_list (list);
4336 dispose_words (list);
4337 last_command_exit_value = last_exit_value;
4341 t = dequote_string (result);
4346 dstack = save_dstack;
4351 /************************************************
4355 ************************************************/
4357 /* Report a syntax error, and restart the parser. Call here for fatal
4363 report_syntax_error ((char *)NULL);
4369 error_token_from_token (tok)
4374 if (t = find_token_in_alist (tok, word_token_alist, 0))
4377 if (t = find_token_in_alist (tok, other_token_alist, 0))
4381 /* This stuff is dicy and needs closer inspection */
4382 switch (current_token)
4385 case ASSIGNMENT_WORD:
4387 t = savestring (yylval.word->word);
4390 t = itos (yylval.number);
4393 if (yylval.word_list)
4394 t = string_list (yylval.word_list);
4396 case ARITH_FOR_EXPRS:
4397 if (yylval.word_list)
4398 t = string_list_internal (yylval.word_list, " ; ");
4401 t = (char *)NULL; /* punt */
4409 error_token_from_text ()
4414 t = shell_input_line;
4415 i = shell_input_line_index;
4419 if (i && t[i] == '\0')
4422 while (i && (whitespace (t[i]) || t[i] == '\n'))
4428 while (i && (member (t[i], " \n\t;|&") == 0))
4431 while (i != token_end && (whitespace (t[i]) || t[i] == '\n'))
4434 /* Return our idea of the offending token. */
4435 if (token_end || (i == 0 && token_end == 0))
4438 msg = substring (t, i, token_end);
4439 else /* one-character token */
4441 msg = (char *)xmalloc (2);
4451 print_offending_line ()
4456 msg = savestring (shell_input_line);
4457 token_end = strlen (msg);
4458 while (token_end && msg[token_end - 1] == '\n')
4459 msg[--token_end] = '\0';
4461 parser_error (line_number, "`%s'", msg);
4465 /* Report a syntax error with line numbers, etc.
4466 Call here for recoverable errors. If you have a message to print,
4467 then place it in MESSAGE, otherwise pass NULL and this will figure
4468 out an appropriate message for you. */
4470 report_syntax_error (message)
4477 parser_error (line_number, "%s", message);
4478 if (interactive && EOF_Reached)
4480 last_command_exit_value = EX_USAGE;
4484 /* If the line of input we're reading is not null, try to find the
4485 objectionable token. First, try to figure out what token the
4486 parser's complaining about by looking at current_token. */
4487 if (current_token != 0 && EOF_Reached == 0 && (msg = error_token_from_token (current_token)))
4489 parser_error (line_number, _("syntax error near unexpected token `%s'"), msg);
4492 if (interactive == 0)
4493 print_offending_line ();
4495 last_command_exit_value = EX_USAGE;
4499 /* If looking at the current token doesn't prove fruitful, try to find the
4500 offending token by analyzing the text of the input line near the current
4501 input line index and report what we find. */
4502 if (shell_input_line && *shell_input_line)
4504 msg = error_token_from_text ();
4507 parser_error (line_number, _("syntax error near `%s'"), msg);
4511 /* If not interactive, print the line containing the error. */
4512 if (interactive == 0)
4513 print_offending_line ();
4517 msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
4518 parser_error (line_number, "%s", msg);
4519 /* When the shell is interactive, this file uses EOF_Reached
4520 only for error reporting. Other mechanisms are used to
4521 decide whether or not to exit. */
4522 if (interactive && EOF_Reached)
4526 last_command_exit_value = EX_USAGE;
4529 /* ??? Needed function. ??? We have to be able to discard the constructs
4530 created during parsing. In the case of error, we want to return
4531 allocated objects to the memory pool. In the case of no error, we want
4532 to throw away the information about where the allocated objects live.
4533 (dispose_command () will actually free the command.) */
4535 discard_parser_constructs (error_p)
4540 /************************************************
4544 ************************************************/
4546 /* Do that silly `type "bye" to exit' stuff. You know, "ignoreeof". */
4548 /* A flag denoting whether or not ignoreeof is set. */
4551 /* The number of times that we have encountered an EOF character without
4552 another character intervening. When this gets above the limit, the
4553 shell terminates. */
4554 int eof_encountered = 0;
4556 /* The limit for eof_encountered. */
4557 int eof_encountered_limit = 10;
4559 /* If we have EOF as the only input unit, this user wants to leave
4560 the shell. If the shell is not interactive, then just leave.
4561 Otherwise, if ignoreeof is set, and we haven't done this the
4562 required number of times in a row, print a message. */
4564 handle_eof_input_unit ()
4568 /* shell.c may use this to decide whether or not to write out the
4569 history, among other things. We use it only for error reporting
4574 /* If the user wants to "ignore" eof, then let her do so, kind of. */
4577 if (eof_encountered < eof_encountered_limit)
4579 fprintf (stderr, _("Use \"%s\" to leave the shell.\n"),
4580 login_shell ? "logout" : "exit");
4582 /* Reset the parsing state. */
4583 last_read_token = current_token = '\n';
4584 /* Reset the prompt string to be $PS1. */
4585 prompt_string_pointer = (char **)NULL;
4591 /* In this case EOF should exit the shell. Do it now. */
4593 exit_builtin ((WORD_LIST *)NULL);
4597 /* We don't write history files, etc., for non-interactive shells. */
4602 /************************************************
4604 * STRING PARSING FUNCTIONS *
4606 ************************************************/
4608 /* It's very important that these two functions treat the characters
4609 between ( and ) identically. */
4611 static WORD_LIST parse_string_error;
4613 /* Take a string and run it through the shell parser, returning the
4614 resultant word list. Used by compound array assignment. */
4616 parse_string_to_word_list (s, flags, whom)
4622 int tok, orig_current_token, orig_line_number, orig_input_terminator;
4623 int orig_line_count;
4624 int old_echo_input, old_expand_aliases;
4625 #if defined (HISTORY)
4626 int old_remember_on_history, old_history_expansion_inhibited;
4629 #if defined (HISTORY)
4630 old_remember_on_history = remember_on_history;
4631 # if defined (BANG_HISTORY)
4632 old_history_expansion_inhibited = history_expansion_inhibited;
4634 bash_history_disable ();
4637 orig_line_number = line_number;
4638 orig_line_count = current_command_line_count;
4639 orig_input_terminator = shell_input_line_terminator;
4640 old_echo_input = echo_input_at_read;
4641 old_expand_aliases = expand_aliases;
4644 last_read_token = WORD; /* WORD to allow reserved words here */
4645 current_command_line_count = 0;
4646 echo_input_at_read = expand_aliases = 0;
4648 with_input_from_string (s, whom);
4649 wl = (WORD_LIST *)NULL;
4652 parser_state |= PST_COMPASSIGN;
4654 while ((tok = read_token (READ)) != yacc_EOF)
4656 if (tok == '\n' && *bash_input.location.string == '\0')
4658 if (tok == '\n') /* Allow newlines in compound assignments */
4660 if (tok != WORD && tok != ASSIGNMENT_WORD)
4662 line_number = orig_line_number + line_number - 1;
4663 orig_current_token = current_token;
4664 current_token = tok;
4665 yyerror (NULL); /* does the right thing */
4666 current_token = orig_current_token;
4669 wl = &parse_string_error;
4672 wl = make_word_list (yylval.word, wl);
4675 last_read_token = '\n';
4678 #if defined (HISTORY)
4679 remember_on_history = old_remember_on_history;
4680 # if defined (BANG_HISTORY)
4681 history_expansion_inhibited = old_history_expansion_inhibited;
4682 # endif /* BANG_HISTORY */
4683 #endif /* HISTORY */
4685 echo_input_at_read = old_echo_input;
4686 expand_aliases = old_expand_aliases;
4688 current_command_line_count = orig_line_count;
4689 shell_input_line_terminator = orig_input_terminator;
4692 parser_state &= ~PST_COMPASSIGN;
4694 if (wl == &parse_string_error)
4696 last_command_exit_value = EXECUTION_FAILURE;
4697 if (interactive_shell == 0 && posixly_correct)
4698 jump_to_top_level (FORCE_EOF);
4700 jump_to_top_level (DISCARD);
4703 return (REVERSE_LIST (wl, WORD_LIST *));
4707 parse_compound_assignment (retlenp)
4711 int tok, orig_line_number, orig_token_size, orig_last_token, assignok;
4712 char *saved_token, *ret;
4714 saved_token = token;
4715 orig_token_size = token_buffer_size;
4716 orig_line_number = line_number;
4717 orig_last_token = last_read_token;
4719 last_read_token = WORD; /* WORD to allow reserved words here */
4721 token = (char *)NULL;
4722 token_buffer_size = 0;
4724 assignok = parser_state&PST_ASSIGNOK; /* XXX */
4726 wl = (WORD_LIST *)NULL; /* ( */
4727 parser_state |= PST_COMPASSIGN;
4729 while ((tok = read_token (READ)) != ')')
4731 if (tok == '\n') /* Allow newlines in compound assignments */
4733 if (SHOULD_PROMPT ())
4737 if (tok != WORD && tok != ASSIGNMENT_WORD)
4739 current_token = tok; /* for error reporting */
4740 if (tok == yacc_EOF) /* ( */
4741 parser_error (orig_line_number, _("unexpected EOF while looking for matching `)'"));
4743 yyerror(NULL); /* does the right thing */
4746 wl = &parse_string_error;
4749 wl = make_word_list (yylval.word, wl);
4753 token = saved_token;
4754 token_buffer_size = orig_token_size;
4756 parser_state &= ~PST_COMPASSIGN;
4758 if (wl == &parse_string_error)
4760 last_command_exit_value = EXECUTION_FAILURE;
4761 last_read_token = '\n'; /* XXX */
4762 if (interactive_shell == 0 && posixly_correct)
4763 jump_to_top_level (FORCE_EOF);
4765 jump_to_top_level (DISCARD);
4768 last_read_token = orig_last_token; /* XXX - was WORD? */
4772 rl = REVERSE_LIST (wl, WORD_LIST *);
4773 ret = string_list (rl);
4780 *retlenp = (ret && *ret) ? strlen (ret) : 0;
4783 parser_state |= PST_ASSIGNOK;
4788 /************************************************
4790 * SAVING AND RESTORING PARTIAL PARSE STATE *
4792 ************************************************/
4795 save_parser_state (ps)
4796 sh_parser_state_t *ps;
4798 #if defined (ARRAY_VARS)
4803 ps = (sh_parser_state_t *)xmalloc (sizeof (sh_parser_state_t));
4805 return ((sh_parser_state_t *)NULL);
4807 ps->parser_state = parser_state;
4808 ps->token_state = save_token_state ();
4810 ps->input_line_terminator = shell_input_line_terminator;
4811 ps->eof_encountered = eof_encountered;
4813 ps->current_command_line_count = current_command_line_count;
4815 #if defined (HISTORY)
4816 ps->remember_on_history = remember_on_history;
4817 # if defined (BANG_HISTORY)
4818 ps->history_expansion_inhibited = history_expansion_inhibited;
4822 ps->last_command_exit_value = last_command_exit_value;
4823 #if defined (ARRAY_VARS)
4824 v = find_variable ("PIPESTATUS");
4825 if (v && array_p (v) && array_cell (v))
4826 ps->pipestatus = array_copy (array_cell (v));
4828 ps->pipestatus = (ARRAY *)NULL;
4831 ps->last_shell_builtin = last_shell_builtin;
4832 ps->this_shell_builtin = this_shell_builtin;
4834 ps->expand_aliases = expand_aliases;
4835 ps->echo_input_at_read = echo_input_at_read;
4841 restore_parser_state (ps)
4842 sh_parser_state_t *ps;
4844 #if defined (ARRAY_VARS)
4851 parser_state = ps->parser_state;
4852 if (ps->token_state)
4854 restore_token_state (ps->token_state);
4855 free (ps->token_state);
4858 shell_input_line_terminator = ps->input_line_terminator;
4859 eof_encountered = ps->eof_encountered;
4861 current_command_line_count = ps->current_command_line_count;
4863 #if defined (HISTORY)
4864 remember_on_history = ps->remember_on_history;
4865 # if defined (BANG_HISTORY)
4866 history_expansion_inhibited = ps->history_expansion_inhibited;
4870 last_command_exit_value = ps->last_command_exit_value;
4871 #if defined (ARRAY_VARS)
4872 v = find_variable ("PIPESTATUS");
4873 if (v && array_p (v) && array_cell (v))
4875 array_dispose (array_cell (v));
4876 var_setarray (v, ps->pipestatus);
4880 last_shell_builtin = ps->last_shell_builtin;
4881 this_shell_builtin = ps->this_shell_builtin;
4883 expand_aliases = ps->expand_aliases;
4884 echo_input_at_read = ps->echo_input_at_read;
4887 /************************************************
4889 * MULTIBYTE CHARACTER HANDLING *
4891 ************************************************/
4893 #if defined (HANDLE_MULTIBYTE)
4897 int i, previ, len, c;
4898 mbstate_t mbs, prevs;
4901 if (shell_input_line == NULL)
4903 len = strlen (shell_input_line); /* XXX - shell_input_line_len ? */
4904 FREE (shell_input_line_property);
4905 shell_input_line_property = (char *)xmalloc (len + 1);
4907 memset (&prevs, '\0', sizeof (mbstate_t));
4908 for (i = previ = 0; i < len; i++)
4912 c = shell_input_line[i];
4916 for (j = i; j < len; j++)
4917 shell_input_line_property[j] = 1;
4921 mbclen = mbrlen (shell_input_line + previ, i - previ + 1, &mbs);
4922 if (mbclen == 1 || mbclen == (size_t)-1)
4927 else if (mbclen == (size_t)-2)
4929 else if (mbclen > 1)
4937 /* XXX - what to do if mbrlen returns 0? (null wide character) */
4939 for (j = i; j < len; j++)
4940 shell_input_line_property[j] = 1;
4944 shell_input_line_property[i] = mbclen;
4947 #endif /* HANDLE_MULTIBYTE */