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:
parent
1c57269b5d
commit
e8b1bc0481
60
shell/hush.c
60
shell/hush.c
@ -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 '{':
|
||||||
|
Loading…
Reference in New Issue
Block a user