From 6269db883ad6989a578bac299deab9c4285bb1df Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Sun, 10 May 2015 19:19:34 +0100
Subject: 35067: Add (b) parameter flag for pattern char backslashing.
Doc tweak from Daniel in 35071.
Includes test.
---
Src/utils.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
(limited to 'Src/utils.c')
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) {
--
cgit 1.4.1