diff options
author | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2017-08-08 19:04:49 +0100 |
---|---|---|
committer | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2017-08-08 19:04:49 +0100 |
commit | a9b579a9d3921c4d843be7a52faeb8a3f3f6c35e (patch) | |
tree | 49101e5c9c5d4b94839338ee9b41aa99954d9149 | |
parent | 2fba415a71dca55158900569b85bc4fabd3c1595 (diff) | |
download | zsh-a9b579a9d3921c4d843be7a52faeb8a3f3f6c35e.tar.gz zsh-a9b579a9d3921c4d843be7a52faeb8a3f3f6c35e.tar.xz zsh-a9b579a9d3921c4d843be7a52faeb8a3f3f6c35e.zip |
Revert "41499 (with one further tweak): POSIX_STRINGS behaviour."
This reverts commit 2eacbef91913fe967335812900d43cf2edfa54d9. Conflicts: ChangeLog
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Doc/Zsh/options.yo | 30 | ||||
-rw-r--r-- | Src/utils.c | 20 | ||||
-rw-r--r-- | Test/E01options.ztst | 41 |
4 files changed, 16 insertions, 80 deletions
diff --git a/ChangeLog b/ChangeLog index 34087fb8f..43e6b4ceb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-08-08 Peter Stephenson <p.w.stephenson@ntlworld.com> + + * unposted: back off 41499 as it has side effects which, while + perfectly logical, are not what POSIX expects. + 2017-08-08 Peter Stephenson <p.stephenson@samsung.com> * 41510: Doc/Zsh/params.yo: update doc for $ZSH_PATCHLEVEL. diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo index 36bd939ad..70092d681 100644 --- a/Doc/Zsh/options.yo +++ b/Doc/Zsh/options.yo @@ -2193,16 +2193,16 @@ cindex(discarding embedded nulls in $'...') cindex(embedded nulls, in $'...') cindex(nulls, embedded in $'...') item(tt(POSIX_STRINGS) <K> <S>)( -This option affects processing of quoted strings, and also -splitting of strngs. +This option affects processing of quoted strings. Currently it only +affects the behaviour of null characters, i.e. character 0 in the +portable character set corresponding to US ASCII. -When this option is not set, null characters (character 0 in the -portable character set coresponding to US ASCII) that are embedded -within strings of the form tt($')var(...)tt(') are treated as ordinary -characters. The entire string is maintained within the shell and output -to files where necessary, although owing to restrictions of the library -interface the string is truncated at the null character in file names, -environment variables, or in arguments to external programs. +When this option is not set, null characters embedded within strings +of the form tt($')var(...)tt(') are treated as ordinary characters. The +entire string is maintained within the shell and output to files where +necessary, although owing to restrictions of the library interface +the string is truncated at the null character in file names, environment +variables, or in arguments to external programs. When this option is set, the tt($')var(...)tt(') expression is truncated at the null character. Note that remaining parts of the same string @@ -2211,18 +2211,6 @@ beyond the termination of the quotes are not truncated. For example, the command line argument tt(a$'b\0c'd) is treated with the option off as the characters tt(a), tt(b), null, tt(c), tt(d), and with the option on as the characters tt(a), tt(b), tt(d). - -Furthermore, when the option is set, a trailing separator followed by an -empty strings does not cause extra fields to be produced when the string -is split. For example, - -example(var="foo bar " -print -l "${=var}") - -outputs a blank line at the end if tt(POSIXSTRINGS) is not set, but -no blank line if the option is set. Note that empty elements would in -any case be removed if quotation marks were not used. If the separator -is not white space, only the final separator is ignored in this fashion. ) pindex(POSIX_TRAPS) pindex(NO_POSIX_TRAPS) diff --git a/Src/utils.c b/Src/utils.c index d30a7b47e..5055d69fe 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -3500,12 +3500,12 @@ skipwsep(char **s) mod_export char ** spacesplit(char *s, int allownull, int heap, int quote) { - char *t, **ret, **ptr, **eptr; + char *t, **ret, **ptr; int l = sizeof(*ret) * (wordcount(s, NULL, -!allownull) + 1); char *(*dup)(const char *) = (heap ? dupstring : ztrdup); /* ### TODO: s/calloc/alloc/ */ - eptr = ptr = ret = (char **) (heap ? hcalloc(l) : zshcalloc(l)); + ptr = ret = (char **) (heap ? hcalloc(l) : zshcalloc(l)); if (quote) { /* @@ -3537,7 +3537,6 @@ spacesplit(char *s, int allownull, int heap, int quote) if (s > t || allownull) { *ptr = (char *) (heap ? zhalloc((s - t) + 1) : zalloc((s - t) + 1)); - eptr = ptr; ztrncpy(*ptr++, t, s - t); } else *ptr++ = dup(nulstring); @@ -3546,21 +3545,6 @@ spacesplit(char *s, int allownull, int heap, int quote) } if (!allownull && t != s) *ptr++ = dup(""); - if (isset(POSIXSTRINGS) && ptr > eptr + 1) { - /* - * Trailing separators do not generate extra fields in POSIX. - * Note this is only the final separator --- if the - * immediately preceding field was null it is still counted. - * So just back up one. - */ - --ptr; - if (!heap) { - char **ret2 = realloc(ret, sizeof(*ret) * (ptr+1-ret)); - ptr -= ret-ret2; - free(ret); - ret = ret2; - } - } *ptr = NULL; return ret; } diff --git a/Test/E01options.ztst b/Test/E01options.ztst index b394e7cf4..f01d83567 100644 --- a/Test/E01options.ztst +++ b/Test/E01options.ztst @@ -1339,44 +1339,3 @@ ?(anon):4: `break' active at end of function scope ?(anon):4: `break' active at end of function scope ?(anon):4: `break' active at end of function scope - - for opt in POSIX_STRINGS NO_POSIX_STRINGS; do - var="foo bar " - (setopt $opt; print -l X "${=var}" Y) - var="foo2::bar2:" - (setopt $opt; IFS=:; print -l X "${=var}" Y) - var="foo3:bar3::" - (setopt $opt; IFS=:; print -l X "${=var}" Y) - done -0:POSIX_STRINGS effect on final delimiters ->X ->foo ->bar ->Y ->X ->foo2 -> ->bar2 ->Y ->X ->foo3 ->bar3 -> ->Y ->X ->foo ->bar -> ->Y ->X ->foo2 -> ->bar2 -> ->Y ->X ->foo3 ->bar3 -> -> ->Y |