From 921be97db90d3e909f1f032b78b6faf6bd04e8f1 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 4 Nov 2022 08:03:23 +0000 Subject: [PATCH] Unescape the string for the literal operator (l:) so special characters work. --- usr.bin/tmux/format.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/usr.bin/tmux/format.c b/usr.bin/tmux/format.c index 1e5eaf18f8c..8234fdf9a73 100644 --- a/usr.bin/tmux/format.c +++ b/usr.bin/tmux/format.c @@ -1,4 +1,4 @@ -/* $OpenBSD: format.c,v 1.309 2022/07/19 06:46:57 nicm Exp $ */ +/* $OpenBSD: format.c,v 1.310 2022/11/04 08:03:23 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -3575,7 +3575,32 @@ found: return (found); } -/* Remove escaped characters from string. */ +/* Unescape escaped characters. */ +static char * +format_unescape(const char *s) +{ + char *out, *cp; + int brackets = 0; + + cp = out = xmalloc(strlen(s) + 1); + for (; *s != '\0'; s++) { + if (*s == '#' && s[1] == '{') + brackets++; + if (brackets == 0 && + *s == '#' && + strchr(",#{}:", s[1]) != NULL) { + *cp++ = *++s; + continue; + } + if (*s == '}') + brackets--; + *cp++ = *s; + } + *cp = '\0'; + return (out); +} + +/* Remove escaped characters. */ static char * format_strip(const char *s) { @@ -4338,7 +4363,8 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen, /* Is this a literal string? */ if (modifiers & FORMAT_LITERAL) { - value = xstrdup(copy); + format_log(es, "literal string is '%s'", copy); + value = format_unescape(copy); goto done; } -- 2.20.1