From 9a763dd9b9b88f9c8cd235fddfda839c6b7971cb Mon Sep 17 00:00:00 2001 From: christos Date: Tue, 8 Mar 2016 15:45:26 +0000 Subject: [PATCH 1/4] PR/526: David Kaspar: Quote backslashes properly so that they can be preserved in `` expansions. --- Fixes | 2 ++ sh.glob.c | 4 +++- sh.lex.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Fixes b/Fixes index 1fe33e8..b182f1a 100644 --- a/Fixes +++ b/Fixes @@ -1,3 +1,5 @@ + 10. PR/526: Quote backslashes properly so they can be preserved in `` + expansions 9. Fix memory leak for paraml 8. Add notempty and ask values for the noclobber setting (Martin Tournoij) 7. more correct $wordchars for vimode (Luke Mewburn) diff --git a/sh.glob.c b/sh.glob.c index dce0217..895a603 100644 --- a/sh.glob.c +++ b/sh.glob.c @@ -878,7 +878,9 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal) if (!quoted && (c == ' ' || c == '\t')) break; cnt++; - Strbuf_append1(word, c | quoted); + if (c == '\\' || quoted) + c |= QUOTE; + Strbuf_append1(word, c); } /* * Unless at end-of-file, we will form a new word here if there were diff --git a/sh.lex.c b/sh.lex.c index 8a6d1b0..eae8a03 100644 --- a/sh.lex.c +++ b/sh.lex.c @@ -386,7 +386,7 @@ loop: */ c |= QUOTE; ungetC(c); - c = '\\'; + c = '\\' | QUOTE; } } } -- 2.5.5 From d52d669405da2fce61bd04bf80915e2e6ac5e842 Mon Sep 17 00:00:00 2001 From: christos Date: Fri, 13 May 2016 15:08:12 +0000 Subject: [PATCH 2/4] PR/526: Now that backslashes are quoted, we don't need to handle them specially here. Fixes echo '\n' displaying echo '\\n'. --- tc.func.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tc.func.c b/tc.func.c index f2b1a97..97eda4e 100644 --- a/tc.func.c +++ b/tc.func.c @@ -120,8 +120,7 @@ expand_lex(const struct wordent *sp0, int from, int to) if ((*s & QUOTE) && (((*s & TRIM) == HIST && HIST != '\0') || (((*s & TRIM) == '\'') && (prev_c != '\\')) || - (((*s & TRIM) == '\"') && (prev_c != '\\')) || - (((*s & TRIM) == '\\') && (prev_c != '\\')))) { + (((*s & TRIM) == '\"') && (prev_c != '\\')))) { Strbuf_append1(&buf, '\\'); } #if INVALID_BYTE != 0 -- 2.5.5 From b1534dd442e5c1c6d662ea73d3324e10708790ff Mon Sep 17 00:00:00 2001 From: christos Date: Fri, 13 May 2016 15:08:54 +0000 Subject: [PATCH 3/4] History expansion fix. --- Fixes | 1 + 1 file changed, 1 insertion(+) diff --git a/Fixes b/Fixes index 8962302..ac899dd 100644 --- a/Fixes +++ b/Fixes @@ -1,3 +1,4 @@ + 12. PR/526: Fix double \\ printing from previous fix in history expansion. 10. PR/526: Quote backslashes properly so they can be preserved in `` expansions 9. Fix memory leak for paraml -- 2.5.5 From 819ab9146f10a3eae77098769210e1751cb7d494 Mon Sep 17 00:00:00 2001 From: christos Date: Tue, 24 May 2016 19:29:19 +0000 Subject: [PATCH 4/4] set myvar=`\echo 1 2 3` and set myvar=`echo 1 2 3` should produce the same result for: $ echo ${myvar[1]} 1 Don't treat the first character of the string specially. If the whole string is quoted, then we are quoted, otherwise not. --- sh.glob.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sh.glob.c b/sh.glob.c index 895a603..8279802 100644 --- a/sh.glob.c +++ b/sh.glob.c @@ -708,7 +708,12 @@ backeval(struct blk_buf *bb, struct Strbuf *word, Char *cp, int literal) hadnl = 0; icnt = 0; - quoted = (literal || (cp[0] & QUOTE)) ? QUOTE : 0; + if (!literal) { + for (ip = cp; (*ip & QUOTE) != 0; ip++) + continue; + quoted = *ip == '\0'; + } else + quoted = literal; faket.t_dtyp = NODE_COMMAND; faket.t_dflg = F_BACKQ; faket.t_dlef = 0; -- 2.5.5