summaryrefslogtreecommitdiff
path: root/Src/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/exec.c')
-rw-r--r--Src/exec.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/Src/exec.c b/Src/exec.c
index 9ec49e11a..fd6f45f93 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1609,6 +1609,66 @@ untokenize(char *s)
}
}
+
+/*
+ * Given a tokenized string, output it to standard output in
+ * such a way that it's clear which tokens are active.
+ * Hence Star becomes an unquoted "*", while a "*" becomes "\*".
+ *
+ * The code here is a kind of amalgamation of the tests in
+ * zshtokenize() and untokenize() with some outputting.
+ */
+
+/**/
+void
+quote_tokenized_output(char *str, FILE *file)
+{
+ char *s = str;
+
+ for (; *s; s++) {
+ switch (*s) {
+ case Meta:
+ putc(*++s ^ 32, file);
+ continue;
+
+ case Nularg:
+ /* Do nothing. I think. */
+ continue;
+
+ case '\\':
+ case '<':
+ case '>':
+ case '(':
+ case '|':
+ case ')':
+ case '^':
+ case '#':
+ case '~':
+ case '[':
+ case ']':
+ case '*':
+ case '?':
+ case '$':
+ putc('\\', file);
+ break;
+
+ case '=':
+ if (s == str)
+ putc('\\', file);
+ break;
+
+ default:
+ if (itok(*s)) {
+ putc(ztokens[*s - Pound], file);
+ continue;
+ }
+ break;
+ }
+
+ putc(*s, file);
+ }
+}
+
/* Check that we can use a parameter for allocating a file descriptor. */
static int