summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <p.w.stephenson@ntlworld.com>2017-08-08 19:04:49 +0100
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2017-08-08 19:04:49 +0100
commita9b579a9d3921c4d843be7a52faeb8a3f3f6c35e (patch)
tree49101e5c9c5d4b94839338ee9b41aa99954d9149
parent2fba415a71dca55158900569b85bc4fabd3c1595 (diff)
downloadzsh-a9b579a9d3921c4d843be7a52faeb8a3f3f6c35e.tar.gz
zsh-a9b579a9d3921c4d843be7a52faeb8a3f3f6c35e.zip
Revert "41499 (with one further tweak): POSIX_STRINGS behaviour."
This reverts commit 2eacbef91913fe967335812900d43cf2edfa54d9. Conflicts: ChangeLog
-rw-r--r--ChangeLog5
-rw-r--r--Doc/Zsh/options.yo30
-rw-r--r--Src/utils.c20
-rw-r--r--Test/E01options.ztst41
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