=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/format.c,v retrieving revision 1.266 retrieving revision 1.267 diff -u -r1.266 -r1.267 --- src/usr.bin/tmux/format.c 2020/11/09 09:10:10 1.266 +++ src/usr.bin/tmux/format.c 2020/12/01 08:12:58 1.267 @@ -1,4 +1,4 @@ -/* $OpenBSD: format.c,v 1.266 2020/11/09 09:10:10 nicm Exp $ */ +/* $OpenBSD: format.c,v 1.267 2020/12/01 08:12:58 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott @@ -99,6 +99,7 @@ #define FORMAT_PRETTY 0x400 #define FORMAT_LENGTH 0x800 #define FORMAT_WIDTH 0x1000 +#define FORMAT_ESCAPE 0x2000 /* Limit on recursion. */ #define FORMAT_LOOP_LIMIT 10 @@ -1394,6 +1395,23 @@ return (out); } +/* Escape #s in string. */ +static char * +format_escape(const char *s) +{ + const char *cp; + char *out, *at; + + at = out = xmalloc(strlen(s) * 2 + 1); + for (cp = s; *cp != '\0'; cp++) { + if (*cp == '#') + *at++ = '#'; + *at++ = *cp; + } + *at = '\0'; + return (out); +} + /* Make a prettier time. */ static char * format_pretty_time(time_t t) @@ -1539,6 +1557,11 @@ found = xstrdup(format_quote(saved)); free(saved); } + if (modifiers & FORMAT_ESCAPE) { + saved = found; + found = xstrdup(format_escape(saved)); + free(saved); + } return (found); } @@ -1689,7 +1712,7 @@ cp++; /* Check single character modifiers with no arguments. */ - if (strchr("lbdnqwETSWP<>", cp[0]) != NULL && + if (strchr("lbdnwETSWP<>", cp[0]) != NULL && format_is_end(cp[1])) { format_add_modifier(&list, count, cp, 1, NULL, 0); cp++; @@ -1710,7 +1733,7 @@ } /* Now try single character with arguments. */ - if (strchr("mCst=pe", cp[0]) == NULL) + if (strchr("mCst=peq", cp[0]) == NULL) break; c = cp[0]; @@ -2216,7 +2239,10 @@ time_format = format_strip(fm->argv[1]); break; case 'q': - modifiers |= FORMAT_QUOTE; + if (fm->argc < 1) + modifiers |= FORMAT_QUOTE; + else if (strchr(fm->argv[0], 'e') != NULL) + modifiers |= FORMAT_ESCAPE; break; case 'E': modifiers |= FORMAT_EXPAND;