From e19e1935a33b117e2ee6daf9b2d79c00603333c7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 3 May 2009 02:15:18 +0200 Subject: hush: fix \ handling Signed-off-by: Denys Vlasenko --- shell/hush.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'shell/hush.c') diff --git a/shell/hush.c b/shell/hush.c index 255caef01..c6e940548 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -50,14 +50,9 @@ * * TODOs: * grep for "TODO" and fix (some of them are easy) - * change { and } from special chars to reserved words * $var refs in function do not pick up values set by "var=val func" * builtins: ulimit * follow IFS rules more precisely, including update semantics - * figure out what to do with backslash-newline - * continuation lines, both explicit and implicit - done? - * separate job control from interactiveness - * (testcase: booting with init=/bin/hush does not show prompt (2009-04)) * * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ @@ -5347,10 +5342,12 @@ static int parse_stream_dquoted(o_string *as_string, * $, `, ", \, or . A double quote may be quoted * within double quotes by preceding it with a backslash. */ - if (strchr("$`\"\\", next) != NULL) { + if (strchr("$`\"\\\n", next) != NULL) { ch = i_getch(input); - o_addqchr(dest, ch); - nommu_addchr(as_string, ch); + if (ch != '\n') { + o_addqchr(dest, ch); + nommu_addchr(as_string, ch); + } } else { o_addqchr(dest, '\\'); nommu_addchr(as_string, '\\'); @@ -5677,13 +5674,16 @@ static struct pipe *parse_stream(char **pstring, syntax_error("\\"); xfunc_die(); } - o_addchr(&dest, '\\'); ch = i_getch(input); - nommu_addchr(&ctx.as_string, ch); - o_addchr(&dest, ch); - /* Example: echo Hello \2>file - * we need to know that word 2 is quoted */ - dest.o_quoted = 1; + if (ch != '\n') { + o_addchr(&dest, '\\'); + nommu_addchr(&ctx.as_string, '\\'); + o_addchr(&dest, ch); + nommu_addchr(&ctx.as_string, ch); + /* Example: echo Hello \2>file + * we need to know that word 2 is quoted */ + dest.o_quoted = 1; + } break; case '$': if (handle_dollar(&ctx.as_string, &dest, input) != 0) { -- cgit v1.2.3