diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Src/subst.c | 21 |
2 files changed, 21 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index 7290210b1..c3953ec7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-08-10 Barton E. Schaefer <schaefer@zsh.org> + + * 39019 (cf. PWS 39013): Src/subst.c, Test/D04parameter.ztst: + fix SHWORDSPLIT regression introduced by workers/29313; add + test cases for more join/split combinations. + 2016-08-10 Mikael Magnusson <mikachu@gmail.com> * 39014: Src/zsh_system.h, configure.ac: Use special OpenBSD diff --git a/Src/subst.c b/Src/subst.c index e3af15694..ae3e4c40c 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -3454,13 +3454,22 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, * exception is that ${name:-word} and ${name:+word} will have already * done any requested splitting of the word value with quoting preserved. */ - if (ssub || (spbreak && isarr >= 0) || spsep || sep) { + if (ssub || spbreak || spsep || sep) { + int force_split = !ssub && (spbreak || spsep); if (isarr) { - val = sepjoin(aval, sep, 1); - isarr = 0; - ms_flags = 0; + if (nojoin == 0) { + val = sepjoin(aval, sep, 1); + isarr = 0; + ms_flags = 0; + } else if (force_split && nojoin == 2) { + /* Hack to simulate splitting individual elements: + * first join on what we later use to split + */ + val = sepjoin(aval, spsep, 1); + isarr = 0; + } } - if (!ssub && (spbreak || spsep)) { + if (force_split && !isarr) { aval = sepsplit(val, spsep, 0, 1); if (!aval || !aval[0]) val = dupstring(""); @@ -3527,7 +3536,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, } /* * TODO: It would be really quite nice to abstract the - * isarr and !issarr code into a function which gets + * isarr and !isarr code into a function which gets * passed a pointer to a function with the effect of * the promptexpand bit. Then we could use this for * a lot of stuff and bury val/aval/isarr inside a structure |