diff options
author | Tanaka Akira <akr@users.sourceforge.net> | 1999-09-25 02:54:15 +0000 |
---|---|---|
committer | Tanaka Akira <akr@users.sourceforge.net> | 1999-09-25 02:54:15 +0000 |
commit | 9b85146a0884c3d5025392bae4911efff391731e (patch) | |
tree | c99fdaf820703db8f76c6eda9d60f0c5a8a7147a /Src/utils.c | |
parent | 0b6eb901634da245dbbf4c2e072d24a06ee08f33 (diff) | |
download | zsh-9b85146a0884c3d5025392bae4911efff391731e.tar.gz zsh-9b85146a0884c3d5025392bae4911efff391731e.tar.xz zsh-9b85146a0884c3d5025392bae4911efff391731e.zip |
zsh-workers/8042
Diffstat (limited to 'Src/utils.c')
-rw-r--r-- | Src/utils.c | 59 |
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 && |