From 2e7bb36b4a9138e63de885ca28a45ee753150889 Mon Sep 17 00:00:00 2001 From: syrell Date: Tue, 27 Jun 2023 21:11:34 +0200 Subject: [PATCH] Added title-parsing-fix v0.8.5 patch --- st.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/st.c b/st.c index 134e724..0d1105f 100644 --- a/st.c +++ b/st.c @@ -42,6 +42,8 @@ #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) #define ISDELIM(u) (u && wcschr(worddelimiters, u)) +#define STRESCARGREST(n) ((n) == 0 ? strescseq.buf : strescseq.argp[(n)-1] + 1) +#define STRESCARGJUST(n) (*(strescseq.argp[n]) = '\0', STRESCARGREST(n)) enum term_mode { MODE_WRAP = 1 << 0, @@ -148,7 +150,7 @@ typedef struct { char *buf; /* allocated raw string */ size_t siz; /* allocation size */ size_t len; /* raw string length */ - char *args[STR_ARG_SIZ]; + char *argp[STR_ARG_SIZ]; /* pointers to the end of nth argument */ int narg; /* nb of args */ } STREscape; @@ -1879,29 +1881,30 @@ strhandle(void) }; term.esc &= ~(ESC_STR_END|ESC_STR); - strparse(); - par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0; + strescseq.buf[strescseq.len] = '\0'; switch (strescseq.type) { case ']': /* OSC -- Operating System Command */ + strparse(); + par = (narg = strescseq.narg) ? atoi(STRESCARGJUST(0)) : 0; switch (par) { case 0: if (narg > 1) { - xsettitle(strescseq.args[1]); - xseticontitle(strescseq.args[1]); + xsettitle(STRESCARGREST(1)); + xseticontitle(STRESCARGREST(1)); } return; case 1: if (narg > 1) - xseticontitle(strescseq.args[1]); + xseticontitle(STRESCARGREST(1)); return; case 2: if (narg > 1) - xsettitle(strescseq.args[1]); + xsettitle(STRESCARGREST(1)); return; case 52: if (narg > 2 && allowwindowops) { - dec = base64dec(strescseq.args[2]); + dec = base64dec(STRESCARGJUST(2)); if (dec) { xsetsel(dec); xclipcopy(); @@ -1915,7 +1918,7 @@ strhandle(void) case 12: if (narg < 2) break; - p = strescseq.args[1]; + p = STRESCARGREST(1); if ((j = par - 10) < 0 || j >= LEN(osc_table)) break; /* shouldn't be possible */ @@ -1931,10 +1934,10 @@ strhandle(void) case 4: /* color set */ if (narg < 3) break; - p = strescseq.args[2]; + p = STRESCARGJUST(2); /* FALLTHROUGH */ case 104: /* color reset */ - j = (narg > 1) ? atoi(strescseq.args[1]) : -1; + j = (narg > 1) ? atoi(STRESCARGJUST(1)) : -1; if (p && !strcmp(p, "?")) { osc_color_response(j, 0, 1); @@ -1956,7 +1959,7 @@ strhandle(void) } break; case 'k': /* old title set compatibility */ - xsettitle(strescseq.args[0]); + xsettitle(strescseq.buf); return; case 'P': /* DCS -- Device Control String */ case '_': /* APC -- Application Program Command */ @@ -1975,18 +1978,17 @@ strparse(void) char *p = strescseq.buf; strescseq.narg = 0; - strescseq.buf[strescseq.len] = '\0'; if (*p == '\0') return; while (strescseq.narg < STR_ARG_SIZ) { - strescseq.args[strescseq.narg++] = p; while ((c = *p) != ';' && c != '\0') - ++p; + p++; + strescseq.argp[strescseq.narg++] = p; if (c == '\0') return; - *p++ = '\0'; + p++; } }