From 942009eb9f6451915f23d921c0f49d3102dbd26c Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 29 Aug 2000 20:27:47 +0000 Subject: 12719: quoting arrays in vared with real backslashes --- Src/Zle/zle_main.c | 9 ++++++--- Src/utils.c | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) (limited to 'Src') diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index f02b2b75d..e02ea14b8 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -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++; } diff --git a/Src/utils.c b/Src/utils.c index 689680f1c..ab5fbbeb4 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -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 '\' 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++; -- cgit 1.4.1