mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-05-19 14:36:04 +02:00
Revert "41499 (with one further tweak): POSIX_STRINGS behaviour."
This reverts commit 2eacbef919
.
Conflicts:
ChangeLog
This commit is contained in:
parent
2fba415a71
commit
a9b579a9d3
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
20
Src/utils.c
20
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue