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:
Denys Vlasenko 2010-09-09 12:40:03 +02:00
parent 77d4872691
commit 77a7b5519c

View File

@ -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];