mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 21:44:11 +01:00
12719: quoting arrays in vared with real backslashes
This commit is contained in:
parent
f4f38507e5
commit
942009eb9f
@ -1,3 +1,9 @@
|
||||
2000-08-29 Peter Stephenson <pws@pwstephenson.fsnet.co.uk>
|
||||
|
||||
* 12719: Doc/Zsh/mod_zle.yo, Src/utils.c, Src/Zle/zle_main.c:
|
||||
handle quoting of separators in arrays when there might also be
|
||||
real backslashes around.
|
||||
|
||||
2000-08-29 Sven Wischnowsky <wischnow@zsh.org>
|
||||
|
||||
* 12717: Src/Zle/zle_tricky.c: fix for unbalanced calls to
|
||||
|
@ -162,10 +162,11 @@ If the type of an existing parameter does not match the type to be
|
||||
created, the parameter is unset and recreated.
|
||||
|
||||
If an array or array slice is being edited, separator characters as defined
|
||||
in tt($IFS) will be shown quoted with a backslash. Conversely, when the
|
||||
edited text is split into an array, a backslash quotes an immediately
|
||||
following separator character; no other special handling of backslashes, or
|
||||
any handling of quotes, is performed.
|
||||
in tt($IFS) will be shown quoted with a backslash, as will backslashes
|
||||
themselves. Conversely, when the edited text is split into an array, a
|
||||
backslash quotes an immediately following separator character or backslash;
|
||||
no other special handling of backslashes, or any handling of quotes, is
|
||||
performed.
|
||||
|
||||
Individual elements of existing array or associative array parameters
|
||||
may be edited by using subscript syntax on var(name). New elements are
|
||||
|
@ -839,13 +839,16 @@ bin_vared(char *name, char **args, char *ops, int func)
|
||||
tptr = tmparr = (char **)zhalloc(sizeof(char *)*(arrlen(arr)+1));
|
||||
for (aptr = arr; *aptr; aptr++) {
|
||||
int sepcount = 0;
|
||||
/* See if this word contains a separator character */
|
||||
/*
|
||||
* See if this word contains a separator character
|
||||
* or backslash
|
||||
*/
|
||||
for (t = *aptr; *t; t++) {
|
||||
if (*t == Meta) {
|
||||
if (isep(t[1] ^ 32))
|
||||
sepcount++;
|
||||
t++;
|
||||
} else if (isep(*t))
|
||||
} else if (isep(*t) || *t == '\\')
|
||||
sepcount++;
|
||||
}
|
||||
if (sepcount) {
|
||||
@ -858,7 +861,7 @@ bin_vared(char *name, char **args, char *ops, int func)
|
||||
if (isep(t[1] ^ 32))
|
||||
*nptr++ = '\\';
|
||||
*nptr++ = *t++;
|
||||
} else if (isep(*t))
|
||||
} else if (isep(*t) || *t == '\\')
|
||||
*nptr++ = '\\';
|
||||
*nptr++ = *t++;
|
||||
}
|
||||
|
@ -1829,6 +1829,8 @@ skipwsep(char **s)
|
||||
return i;
|
||||
}
|
||||
|
||||
/* see findsep() below for handling of `quote' argument */
|
||||
|
||||
/**/
|
||||
mod_export char **
|
||||
spacesplit(char *s, int allownull, int heap, int quote)
|
||||
@ -1854,7 +1856,7 @@ spacesplit(char *s, int allownull, int heap, int quote)
|
||||
else if (!allownull && t != s)
|
||||
*ptr++ = dup("");
|
||||
while (*s) {
|
||||
if (isep(*s == Meta ? s[1] ^ 32 : *s)) {
|
||||
if (isep(*s == Meta ? s[1] ^ 32 : *s) || (quote && *s == '\\')) {
|
||||
if (*s == Meta)
|
||||
s++;
|
||||
s++;
|
||||
@ -1891,7 +1893,8 @@ findsep(char **s, char *sep, int quote)
|
||||
* quote is a flag that '\<sep>' should not be treated as a separator.
|
||||
* in this case we need to be able to strip the backslash directly
|
||||
* in the string, so the calling function must have sent us something
|
||||
* modifiable. currently this only works for sep == NULL.
|
||||
* modifiable. currently this only works for sep == NULL. also in
|
||||
* in this case only, we need to turn \\ into \.
|
||||
*/
|
||||
int i;
|
||||
char *t, *tt;
|
||||
@ -1899,7 +1902,7 @@ findsep(char **s, char *sep, int quote)
|
||||
if (!sep) {
|
||||
for (t = *s; *t; t++) {
|
||||
if (quote && *t == '\\' &&
|
||||
isep(t[1] == Meta ? (t[2] ^ 32) : t[1])) {
|
||||
(isep(t[1] == Meta ? (t[2] ^ 32) : t[1]) || t[1] == '\\')) {
|
||||
chuck(t);
|
||||
if (*t == Meta)
|
||||
t++;
|
||||
|
Loading…
Reference in New Issue
Block a user