aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2009-06-19 22:09:55 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2009-06-19 22:09:55 +0000
commite68165a6bb73c754455474a9b3a316836b703f56 (patch)
tree71969d5c4fcd6d3c7f130909631c731d8065fd94 /bin
parent5b204a113c89e1e881a115db9ecbe0ac9f9b460c (diff)
downloadsrc-e68165a6bb73c754455474a9b3a316836b703f56.tar.gz
src-e68165a6bb73c754455474a9b3a316836b703f56.zip
Fix some issues with quoted output and shorten it in some cases.
Output quoted suitable for re-input to the shell occurs in various cases such as 'set', 'trap'. Bugfix: *, ? and [ must be quoted (except sole [) Bugfix: ~ and # must be quoted (really only sometimes, but keep it simple) Bugfix: space, tab and newline must always be quoted Shortening: other IFS characters do not need quoting Bugfix: send to correct output file, not hard-coded stdout Shortening: avoid unnecessary '' with \' Approved by: ed (mentor)
Notes
Notes: svn path=/head/; revision=194516
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/output.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/bin/sh/output.c b/bin/sh/output.c
index b59e11e0e870..0d55fdfcb28e 100644
--- a/bin/sh/output.c
+++ b/bin/sh/output.c
@@ -133,32 +133,38 @@ void
outqstr(const char *p, struct output *file)
{
char ch;
+ int inquotes;
if (p[0] == '\0') {
outstr("''", file);
return;
}
- if (p[strcspn(p, "|&;<>()$`\\\"'")] == '\0' && (!ifsset() ||
- p[strcspn(p, ifsval())] == '\0')) {
+ /* Caller will handle '=' if necessary */
+ if (p[strcspn(p, "|&;<>()$`\\\"' \t\n*?[~#")] == '\0' ||
+ strcmp(p, "[") == 0) {
outstr(p, file);
return;
}
- out1c('\'');
+ inquotes = 0;
while ((ch = *p++) != '\0') {
switch (ch) {
case '\'':
- /*
- * Can't quote single quotes inside single quotes;
- * close them, write escaped single quote, open again.
- */
- outstr("'\\''", file);
+ /* Can't quote single quotes inside single quotes. */
+ if (inquotes)
+ outc('\'', file);
+ inquotes = 0;
+ outstr("\\'", file);
break;
default:
+ if (!inquotes)
+ outc('\'', file);
+ inquotes = 1;
outc(ch, file);
}
}
- out1c('\'');
+ if (inquotes)
+ outc('\'', file);
}
STATIC char out_junk[16];