mirror of
https://github.com/tmux/tmux.git
synced 2024-12-13 01:48:47 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
d64daf874f
29
format.c
29
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))
|
||||
|
Loading…
Reference in New Issue
Block a user