aboutsummaryrefslogtreecommitdiff
path: root/format.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2018-08-26 11:02:38 +0100
committerThomas Adam <thomas@xteddy.org>2018-08-26 11:02:38 +0100
commitd64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c (patch)
tree390c229cc661bc6c9a201dfa0cc4fbd267339bfa /format.c
parent7fbd2f5498f30383d145653fe5d1e542fbd6ad43 (diff)
parent1b4402c82369aa0bb93217979a8fd260a3f269cd (diff)
downloadrtmux-d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c.tar.gz
rtmux-d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c.tar.bz2
rtmux-d64daf874f8ff2366d3e2d4dd91b58fd5f80ae6c.zip
Merge branch 'obsd-master'
Diffstat (limited to 'format.c')
-rw-r--r--format.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/format.c b/format.c
index fcb0d801..bb324d56 100644
--- a/format.c
+++ b/format.c
@@ -94,6 +94,7 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2)
#define FORMAT_BASENAME 0x2
#define FORMAT_DIRNAME 0x4
#define FORMAT_SUBSTITUTE 0x8
+#define FORMAT_QUOTE 0x10
/* Entry in format tree. */
struct format_entry {
@@ -770,6 +771,23 @@ format_add_cb(struct format_tree *ft, const char *key, format_cb cb)
fe->value = NULL;
}
+/* Quote special characters in string. */
+static char *
+format_quote(const char *s)
+{
+ const char *cp;
+ char *out, *at;
+
+ at = out = xmalloc(strlen(s) * 2 + 1);
+ for (cp = s; *cp != '\0'; cp++) {
+ if (strchr("|&;<>()$`\\\"'*?[# =%", *cp) != NULL)
+ *at++ = '\\';
+ *at++ = *cp;
+ }
+ *at = '\0';
+ return (out);
+}
+
/* Find a format entry. */
static char *
format_find(struct format_tree *ft, const char *key, int modifiers)
@@ -852,6 +870,11 @@ found:
copy = xstrdup(dirname(saved));
free(saved);
}
+ if (modifiers & FORMAT_QUOTE) {
+ saved = copy;
+ copy = xstrdup(format_quote(saved));
+ free(saved);
+ }
return (copy);
}
@@ -992,6 +1015,12 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
modifiers |= FORMAT_TIMESTRING;
copy += 2;
break;
+ case 'q':
+ if (copy[1] != ':')
+ break;
+ modifiers |= FORMAT_QUOTE;
+ copy += 2;
+ break;
case 's':
sep = copy[1];
if (sep == ':' || !ispunct((u_char)sep))