From 786cff8db9dd64ec8143a492c63051582ee41288 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 27 Jun 2022 09:14:49 +0000 Subject: [PATCH] Do not expand single character format aliases inside #[] since they interfere with colours. GitHub issue 3239 from Magnus Gross. --- format.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/format.c b/format.c index 69d8ef34..e10f324f 100644 --- a/format.c +++ b/format.c @@ -4606,7 +4606,7 @@ format_expand1(struct format_expand_state *es, const char *fmt) { struct format_tree *ft = es->ft; char *buf, *out, *name; - const char *ptr, *s; + const char *ptr, *s, *style_end = NULL; size_t off, len, n, outlen; int ch, brackets; char expanded[8192]; @@ -4701,13 +4701,14 @@ format_expand1(struct format_expand_state *es, const char *fmt) break; fmt += n + 1; continue; + case '[': case '#': /* * If ##[ (with two or more #s), then it is a style and * can be left for format_draw to handle. */ - ptr = fmt; - n = 2; + ptr = fmt - (ch == '['); + n = 2 - (ch == '['); while (*ptr == '#') { ptr++; n++; @@ -4721,6 +4722,7 @@ format_expand1(struct format_expand_state *es, const char *fmt) memcpy(buf + off, fmt - 2, n + 1); off += n + 1; fmt = ptr + 1; + style_end = format_skip(fmt - 2, "]"); continue; } /* FALLTHROUGH */ @@ -4735,10 +4737,12 @@ format_expand1(struct format_expand_state *es, const char *fmt) continue; default: s = NULL; - if (ch >= 'A' && ch <= 'Z') - s = format_upper[ch - 'A']; - else if (ch >= 'a' && ch <= 'z') - s = format_lower[ch - 'a']; + if (fmt > style_end) { /* skip inside #[] */ + if (ch >= 'A' && ch <= 'Z') + s = format_upper[ch - 'A']; + else if (ch >= 'a' && ch <= 'z') + s = format_lower[ch - 'a']; + } if (s == NULL) { while (len - off < 3) { buf = xreallocarray(buf, 2, len);