aboutsummaryrefslogtreecommitdiff
path: root/arguments.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-01-18 12:01:11 +0000
committerThomas Adam <thomas@xteddy.org>2017-01-18 12:01:11 +0000
commit044999ce6d852e91d172a45f671be357bd9057f7 (patch)
tree354e7eace1cdac724361967fa2c379240ff84b19 /arguments.c
parent6d37984f4f55817a199bd0c2238eb5279f065ee9 (diff)
parentfaa05703091de29e5af06777513acd7a562433ba (diff)
downloadrtmux-044999ce6d852e91d172a45f671be357bd9057f7.tar.gz
rtmux-044999ce6d852e91d172a45f671be357bd9057f7.tar.bz2
rtmux-044999ce6d852e91d172a45f671be357bd9057f7.zip
Merge branch 'obsd-master'
Diffstat (limited to 'arguments.c')
-rw-r--r--arguments.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/arguments.c b/arguments.c
index 5a2ea41b..37028648 100644
--- a/arguments.c
+++ b/arguments.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <vis.h>
#include "tmux.h"
@@ -129,9 +130,10 @@ char *
args_print(struct args *args)
{
size_t len;
- char *buf;
- int i;
+ char *buf, *escaped;
+ int i, flags;
struct args_entry *entry;
+ static const char quoted[] = " #\"';$";
len = 1;
buf = xcalloc(1, len);
@@ -155,20 +157,32 @@ args_print(struct args *args)
args_print_add(&buf, &len, " -%c ", entry->flag);
else
args_print_add(&buf, &len, "-%c ", entry->flag);
- if (strchr(entry->value, ' ') != NULL)
- args_print_add(&buf, &len, "\"%s\"", entry->value);
+
+ flags = VIS_OCTAL|VIS_TAB|VIS_NL;
+ if (entry->value[strcspn(entry->value, quoted)] != '\0')
+ flags |= VIS_DQ;
+ utf8_stravis(&escaped, entry->value, flags);
+ if (flags & VIS_DQ)
+ args_print_add(&buf, &len, "\"%s\"", escaped);
else
- args_print_add(&buf, &len, "%s", entry->value);
+ args_print_add(&buf, &len, "%s", escaped);
+ free(escaped);
}
/* And finally the argument vector. */
for (i = 0; i < args->argc; i++) {
if (*buf != '\0')
args_print_add(&buf, &len, " ");
- if (strchr(args->argv[i], ' ') != NULL)
- args_print_add(&buf, &len, "\"%s\"", args->argv[i]);
+
+ flags = VIS_OCTAL|VIS_TAB|VIS_NL;
+ if (args->argv[i][strcspn(args->argv[i], quoted)] != '\0')
+ flags |= VIS_DQ;
+ utf8_stravis(&escaped, args->argv[i], flags);
+ if (flags & VIS_DQ)
+ args_print_add(&buf, &len, "\"%s\"", escaped);
else
- args_print_add(&buf, &len, "%s", args->argv[i]);
+ args_print_add(&buf, &len, "%s", escaped);
+ free(escaped);
}
return (buf);