diff options
author | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-05-10 19:19:34 +0100 |
---|---|---|
committer | Peter Stephenson <p.w.stephenson@ntlworld.com> | 2015-05-10 19:19:34 +0100 |
commit | 6269db883ad6989a578bac299deab9c4285bb1df (patch) | |
tree | 29639c2221b8b15fc2e9d36ee9f5e03b529dc038 /Src/utils.c | |
parent | bb2362e2c049602b79116aa9570a72dd89711349 (diff) | |
download | zsh-6269db883ad6989a578bac299deab9c4285bb1df.tar.gz zsh-6269db883ad6989a578bac299deab9c4285bb1df.tar.xz zsh-6269db883ad6989a578bac299deab9c4285bb1df.zip |
35067: Add (b) parameter flag for pattern char backslashing.
Doc tweak from Daniel in 35071. Includes test.
Diffstat (limited to 'Src/utils.c')
-rw-r--r-- | Src/utils.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/Src/utils.c b/Src/utils.c index 13d4b83d4..271c800fd 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -3694,6 +3694,8 @@ inittyptab(void) typtab[bangchar] |= ISPECIAL; } else typtab_flags &= ~ZTF_BANGCHAR; + for (s = PATCHARS; *s; s++) + typtab[STOUC(*s)] |= IPATTERN; unqueue_signals(); } @@ -5075,6 +5077,10 @@ quotestring(const char *s, char **e, int instring) alloclen = slen * 7 + 1; break; + case QT_BACKSLASH_PATTERN: + alloclen = slen * 2 + 1; + break; + case QT_SINGLE_OPTIONAL: /* * Here, we may need to add single quotes. @@ -5094,7 +5100,7 @@ quotestring(const char *s, char **e, int instring) quotestart = v = buf = zshcalloc(alloclen); DPUTS(instring < QT_BACKSLASH || instring == QT_BACKTICK || - instring > QT_SINGLE_OPTIONAL, + instring > QT_BACKSLASH_PATTERN, "BUG: bad quote type in quotestring"); u = s; if (instring == QT_DOLLARS) { @@ -5134,9 +5140,18 @@ quotestring(const char *s, char **e, int instring) u = uend; } } - } - else - { + } else if (instring == QT_BACKSLASH_PATTERN) { + while (*u) { + if (e && !sf && *e == u) { + *e = v; + sf = 1; + } + + if (ipattern(*u)) + *v++ = '\\'; + *v++ = *u++; + } + } else { if (shownull) { /* We can't show an empty string with just backslash quoting. */ if (!*u) { |