hush: simplify \<newline> code, part 2

function                                             old     new   delta
parse_stream                                        2787    2780      -7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-10 13:13:10 +02:00
parent 1c57269b5d
commit e8b1bc0481

View File

@ -5364,7 +5364,7 @@ static struct pipe *parse_stream(char **pstring,
case '#': case '#':
/* non-comment #: "echo a#b" etc */ /* non-comment #: "echo a#b" etc */
o_addchr(&ctx.word, ch); o_addchr(&ctx.word, ch);
break; continue; /* get next char */
case '\\': case '\\':
if (next == EOF) { if (next == EOF) {
//TODO: in ". FILE" containing "cmd\" (no newline) bash ignores last "\" //TODO: in ". FILE" containing "cmd\" (no newline) bash ignores last "\"
@ -5380,51 +5380,51 @@ static struct pipe *parse_stream(char **pstring,
/* Example: echo Hello \2>file /* Example: echo Hello \2>file
* we need to know that word 2 is quoted */ * we need to know that word 2 is quoted */
ctx.word.has_quoted_part = 1; ctx.word.has_quoted_part = 1;
break; continue; /* get next char */
case '$': case '$':
if (!parse_dollar(&ctx.as_string, &ctx.word, input, /*quote_mask:*/ 0)) { if (!parse_dollar(&ctx.as_string, &ctx.word, input, /*quote_mask:*/ 0)) {
debug_printf_parse("parse_stream parse error: " debug_printf_parse("parse_stream parse error: "
"parse_dollar returned 0 (error)\n"); "parse_dollar returned 0 (error)\n");
goto parse_error; goto parse_error;
} }
break; continue; /* get next char */
case '\'': case '\'':
ctx.word.has_quoted_part = 1; ctx.word.has_quoted_part = 1;
if (next == '\'' && !ctx.pending_redirect) { if (next == '\'' && !ctx.pending_redirect)
goto insert_empty_quoted_str_marker;
while (1) {
ch = i_getch(input);
if (ch == EOF) {
syntax_error_unterm_ch('\'');
goto parse_error;
}
nommu_addchr(&ctx.as_string, ch);
if (ch == '\'')
break;
if (ch == SPECIAL_VAR_SYMBOL) {
/* Convert raw ^C to corresponding special variable reference */
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
o_addchr(&ctx.word, SPECIAL_VAR_QUOTED_SVS);
}
o_addqchr(&ctx.word, ch);
}
continue; /* get next char */
case '"':
ctx.word.has_quoted_part = 1;
if (next == '"' && !ctx.pending_redirect) {
insert_empty_quoted_str_marker: insert_empty_quoted_str_marker:
nommu_addchr(&ctx.as_string, next); nommu_addchr(&ctx.as_string, next);
i_getch(input); /* eat second ' */ i_getch(input); /* eat second ' */
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
} else { continue; /* get next char */
while (1) {
ch = i_getch(input);
if (ch == EOF) {
syntax_error_unterm_ch('\'');
goto parse_error;
}
nommu_addchr(&ctx.as_string, ch);
if (ch == '\'')
break;
if (ch == SPECIAL_VAR_SYMBOL) {
/* Convert raw ^C to corresponding special variable reference */
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
o_addchr(&ctx.word, SPECIAL_VAR_QUOTED_SVS);
}
o_addqchr(&ctx.word, ch);
}
} }
break;
case '"':
ctx.word.has_quoted_part = 1;
if (next == '"' && !ctx.pending_redirect)
goto insert_empty_quoted_str_marker;
if (ctx.is_assignment == NOT_ASSIGNMENT) if (ctx.is_assignment == NOT_ASSIGNMENT)
ctx.word.o_expflags |= EXP_FLAG_ESC_GLOB_CHARS; ctx.word.o_expflags |= EXP_FLAG_ESC_GLOB_CHARS;
if (!encode_string(&ctx.as_string, &ctx.word, input, '"', /*process_bkslash:*/ 1)) if (!encode_string(&ctx.as_string, &ctx.word, input, '"', /*process_bkslash:*/ 1))
goto parse_error; goto parse_error;
ctx.word.o_expflags &= ~EXP_FLAG_ESC_GLOB_CHARS; ctx.word.o_expflags &= ~EXP_FLAG_ESC_GLOB_CHARS;
break; continue; /* get next char */
#if ENABLE_HUSH_TICK #if ENABLE_HUSH_TICK
case '`': { case '`': {
USE_FOR_NOMMU(unsigned pos;) USE_FOR_NOMMU(unsigned pos;)
@ -5440,7 +5440,7 @@ static struct pipe *parse_stream(char **pstring,
# endif # endif
o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL); o_addchr(&ctx.word, SPECIAL_VAR_SYMBOL);
//debug_printf_subst("SUBST RES3 '%s'\n", ctx.word.data + pos); //debug_printf_subst("SUBST RES3 '%s'\n", ctx.word.data + pos);
break; continue; /* get next char */
} }
#endif #endif
case ';': case ';':
@ -5472,7 +5472,7 @@ static struct pipe *parse_stream(char **pstring,
* with an assignment */ * with an assignment */
ctx.is_assignment = MAYBE_ASSIGNMENT; ctx.is_assignment = MAYBE_ASSIGNMENT;
debug_printf_parse("ctx.is_assignment='%s'\n", assignment_flag[ctx.is_assignment]); debug_printf_parse("ctx.is_assignment='%s'\n", assignment_flag[ctx.is_assignment]);
break; continue; /* get next char */
case '&': case '&':
if (done_word(&ctx)) { if (done_word(&ctx)) {
goto parse_error; goto parse_error;
@ -5512,7 +5512,7 @@ static struct pipe *parse_stream(char **pstring,
&& ctx.word.length == 0 /* not word(... */ && ctx.word.length == 0 /* not word(... */
&& ctx.word.has_quoted_part == 0 /* not ""(... */ && ctx.word.has_quoted_part == 0 /* not ""(... */
) { ) {
continue; continue; /* get next char */
} }
#endif #endif
case '{': case '{':