about summary refs log tree commit diff
path: root/Src/utils.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-09-25 02:54:15 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-09-25 02:54:15 +0000
commit9b85146a0884c3d5025392bae4911efff391731e (patch)
treec99fdaf820703db8f76c6eda9d60f0c5a8a7147a /Src/utils.c
parent0b6eb901634da245dbbf4c2e072d24a06ee08f33 (diff)
downloadzsh-9b85146a0884c3d5025392bae4911efff391731e.tar.gz
zsh-9b85146a0884c3d5025392bae4911efff391731e.tar.xz
zsh-9b85146a0884c3d5025392bae4911efff391731e.zip
zsh-workers/8042
Diffstat (limited to 'Src/utils.c')
-rw-r--r--Src/utils.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/Src/utils.c b/Src/utils.c
index 5f9e89882..7494837cf 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -2984,7 +2984,64 @@ bslashquote(const char *s, char **e, int instring)
     for (; *u; u++) {
 	if (e && *e == u)
 	    *e = v, sf = 1;
-	if (ispecial(*u) &&
+	if (instring == 3) {
+	  int c = *u;
+	  if (c == Meta) {
+	    c = *++u ^ 32;
+	  }
+	  c &= 0xff;
+	  if(isprint(c)) {
+	    switch (c) {
+	    case '\\':
+	    case '\'':
+	      *v++ = '\\';
+	      *v++ = c;
+	      break;
+
+	    default:
+	      if(imeta(c)) {
+		*v++ = Meta;
+		*v++ = c ^ 32;
+	      }
+	      else {
+		if (isset(BANGHIST) && c == bangchar) {
+		  *v++ = '\\';
+		}
+		*v++ = c;
+	      }
+	      break;
+	    }
+	  }
+	  else {
+	    switch (c) {
+	    case '\0':
+	      *v++ = '\\';
+	      *v++ = '0';
+	      if ('0' <= u[1] && u[1] <= '7') {
+		*v++ = '0';
+		*v++ = '0';
+	      }
+	      break;
+
+	    case '\007': *v++ = '\\'; *v++ = 'a'; break;
+	    case '\b': *v++ = '\\'; *v++ = 'b'; break;
+	    case '\f': *v++ = '\\'; *v++ = 'f'; break;
+	    case '\n': *v++ = '\\'; *v++ = 'n'; break;
+	    case '\r': *v++ = '\\'; *v++ = 'r'; break;
+	    case '\t': *v++ = '\\'; *v++ = 't'; break;
+	    case '\v': *v++ = '\\'; *v++ = 'v'; break;
+
+	    default:
+	      *v++ = '\\';
+	      *v++ = '0' + ((c >> 6) & 7);
+	      *v++ = '0' + ((c >> 3) & 7);
+	      *v++ = '0' + (c & 7);
+	      break;
+	    }
+	  }
+	  continue;
+	}
+	else if (ispecial(*u) &&
 	    (!instring ||
 	     (isset(BANGHIST) && *u == (char)bangchar) ||
 	     (instring == 2 &&