hush: straighten out the logic in parse_stream
function old new delta parse_stream 2399 2354 -45 Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
parent
77d4872691
commit
77a7b5519c
27
shell/hush.c
27
shell/hush.c
@ -3833,11 +3833,9 @@ static struct pipe *parse_stream(char **pstring,
|
|||||||
{
|
{
|
||||||
struct parse_context ctx;
|
struct parse_context ctx;
|
||||||
o_string dest = NULL_O_STRING;
|
o_string dest = NULL_O_STRING;
|
||||||
int is_in_dquote;
|
|
||||||
int heredoc_cnt;
|
int heredoc_cnt;
|
||||||
|
|
||||||
/* Double-quote state is handled in the state variable is_in_dquote.
|
/* Single-quote triggers a bypass of the main loop until its mate is
|
||||||
* A single-quote triggers a bypass of the main loop until its mate is
|
|
||||||
* found. When recursing, quote state is passed in via dest->o_expflags.
|
* found. When recursing, quote state is passed in via dest->o_expflags.
|
||||||
*/
|
*/
|
||||||
debug_printf_parse("parse_stream entered, end_trigger='%c'\n",
|
debug_printf_parse("parse_stream entered, end_trigger='%c'\n",
|
||||||
@ -3851,15 +3849,17 @@ static struct pipe *parse_stream(char **pstring,
|
|||||||
|
|
||||||
/* We used to separate words on $IFS here. This was wrong.
|
/* We used to separate words on $IFS here. This was wrong.
|
||||||
* $IFS is used only for word splitting when $var is expanded,
|
* $IFS is used only for word splitting when $var is expanded,
|
||||||
* here we should use blank chars as separators, not $iFS
|
* here we should use blank chars as separators, not $IFS
|
||||||
*/
|
*/
|
||||||
reset:
|
|
||||||
|
reset: /* we come back here only on syntax errors in interactive shell */
|
||||||
|
|
||||||
#if ENABLE_HUSH_INTERACTIVE
|
#if ENABLE_HUSH_INTERACTIVE
|
||||||
input->promptmode = 0; /* PS1 */
|
input->promptmode = 0; /* PS1 */
|
||||||
#endif
|
#endif
|
||||||
/* dest.o_assignment = MAYBE_ASSIGNMENT; - already is */
|
if (MAYBE_ASSIGNMENT != 0)
|
||||||
|
dest.o_assignment = MAYBE_ASSIGNMENT;
|
||||||
initialize_context(&ctx);
|
initialize_context(&ctx);
|
||||||
is_in_dquote = 0;
|
|
||||||
heredoc_cnt = 0;
|
heredoc_cnt = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
const char *is_blank;
|
const char *is_blank;
|
||||||
@ -3869,14 +3869,6 @@ static struct pipe *parse_stream(char **pstring,
|
|||||||
int redir_fd;
|
int redir_fd;
|
||||||
redir_type redir_style;
|
redir_type redir_style;
|
||||||
|
|
||||||
if (is_in_dquote) {
|
|
||||||
/* dest.has_quoted_part = 1; - already is (see below) */
|
|
||||||
if (parse_stream_dquoted(&ctx.as_string, &dest, input, '"')) {
|
|
||||||
goto parse_error;
|
|
||||||
}
|
|
||||||
/* We reached closing '"' */
|
|
||||||
is_in_dquote = 0;
|
|
||||||
}
|
|
||||||
ch = i_getch(input);
|
ch = i_getch(input);
|
||||||
debug_printf_parse(": ch=%c (%d) escape=%d\n",
|
debug_printf_parse(": ch=%c (%d) escape=%d\n",
|
||||||
ch, ch, !!(dest.o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
|
ch, ch, !!(dest.o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
|
||||||
@ -4176,9 +4168,10 @@ static struct pipe *parse_stream(char **pstring,
|
|||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
dest.has_quoted_part = 1;
|
dest.has_quoted_part = 1;
|
||||||
is_in_dquote ^= 1; /* invert */
|
|
||||||
if (dest.o_assignment == NOT_ASSIGNMENT)
|
if (dest.o_assignment == NOT_ASSIGNMENT)
|
||||||
dest.o_expflags ^= EXP_FLAG_ESC_GLOB_CHARS;
|
dest.o_expflags ^= EXP_FLAG_ESC_GLOB_CHARS;
|
||||||
|
if (parse_stream_dquoted(&ctx.as_string, &dest, input, '"'))
|
||||||
|
goto parse_error;
|
||||||
break;
|
break;
|
||||||
#if ENABLE_HUSH_TICK
|
#if ENABLE_HUSH_TICK
|
||||||
case '`': {
|
case '`': {
|
||||||
@ -4558,7 +4551,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
|
|||||||
|
|
||||||
/* Look up the variable in question */
|
/* Look up the variable in question */
|
||||||
if (isdigit(var[0])) {
|
if (isdigit(var[0])) {
|
||||||
/* parse_dollar() should have vetted var for us */
|
/* parse_dollar should have vetted var for us */
|
||||||
int n = xatoi_positive(var);
|
int n = xatoi_positive(var);
|
||||||
if (n < G.global_argc)
|
if (n < G.global_argc)
|
||||||
val = G.global_argv[n];
|
val = G.global_argv[n];
|
||||||
|
Loading…
Reference in New Issue
Block a user