diff options
author | Jilles Tjoelker <jilles@FreeBSD.org> | 2010-12-06 23:49:27 +0000 |
---|---|---|
committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2010-12-06 23:49:27 +0000 |
commit | c67712a0897b25a111a9838b99a815ce36de896b (patch) | |
tree | ded47fbaa17813874ddfe92aa7aaf4d6ce740789 /bin/sh/jobs.c | |
parent | 21866e59c26f4cb2004893a5d83a7e871df409b6 (diff) | |
download | src-c67712a0897b25a111a9838b99a815ce36de896b.tar.gz src-c67712a0897b25a111a9838b99a815ce36de896b.zip |
Notes
Diffstat (limited to 'bin/sh/jobs.c')
-rw-r--r-- | bin/sh/jobs.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index a761f2896b11..de813c25acd7 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -1314,13 +1314,46 @@ cmdputs(const char *s) if (--cmdnleft > 0) *q++ = '{'; subtype = *p++; + if ((subtype & VSTYPE) == VSLENGTH && --cmdnleft > 0) + *q++ = '#'; } else if (c == '=' && subtype != 0) { - *q++ = "}-+?="[(subtype & VSTYPE) - VSNORMAL]; + *q = "}-+?=##%%\0X"[(subtype & VSTYPE) - VSNORMAL]; + if (*q) + q++; + else + cmdnleft++; + if (((subtype & VSTYPE) == VSTRIMLEFTMAX || + (subtype & VSTYPE) == VSTRIMRIGHTMAX) && + --cmdnleft > 0) + *q = q[-1], q++; subtype = 0; } else if (c == CTLENDVAR) { *q++ = '}'; - } else if (c == CTLBACKQ || c == CTLBACKQ+CTLQUOTE) - cmdnleft++; /* ignore it */ + } else if (c == CTLBACKQ || c == CTLBACKQ+CTLQUOTE) { + cmdnleft -= 5; + if (cmdnleft > 0) { + *q++ = '$'; + *q++ = '('; + *q++ = '.'; + *q++ = '.'; + *q++ = '.'; + *q++ = ')'; + } + } else if (c == CTLARI) { + cmdnleft -= 2; + if (cmdnleft > 0) { + *q++ = '$'; + *q++ = '('; + *q++ = '('; + } + p++; + } else if (c == CTLENDARI) { + if (--cmdnleft > 0) { + *q++ = ')'; + *q++ = ')'; + } + } else if (c == CTLQUOTEMARK || c == CTLQUOTEEND) + cmdnleft++; /* ignore */ else *q++ = c; if (--cmdnleft <= 0) { |