You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.0 KiB
108 lines
3.0 KiB
3 years ago
|
From 6585da1be120d86316e4a9d620e9dfdfb3755822 Mon Sep 17 00:00:00 2001
|
||
|
From: Ashish Kumar Yadav <ashishkumar.yadav@students.iiserpune.ac.in>
|
||
|
Date: Wed, 4 Aug 2021 18:21:01 +0530
|
||
|
Subject: [PATCH] Fixes title parsing
|
||
|
|
||
|
In st, titles get truncated after the first ';' character, this patch
|
||
|
fixes that.
|
||
|
---
|
||
|
st.c | 26 ++++++++++++++------------
|
||
|
1 file changed, 14 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/st.c b/st.c
|
||
|
index 76b7e0d..8c68218 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;
|
||
|
|
||
|
@@ -1846,21 +1848,22 @@ strhandle(void)
|
||
|
int j, narg, par;
|
||
|
|
||
|
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:
|
||
|
case 1:
|
||
|
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();
|
||
|
@@ -1872,10 +1875,10 @@ strhandle(void)
|
||
|
case 4: /* color set */
|
||
|
if (narg < 3)
|
||
|
break;
|
||
|
- p = strescseq.args[2];
|
||
|
+ p = STRESCARGJUST(2);
|
||
|
/* FALLTHROUGH */
|
||
|
case 104: /* color reset, here p = NULL */
|
||
|
- j = (narg > 1) ? atoi(strescseq.args[1]) : -1;
|
||
|
+ j = (narg > 1) ? atoi(STRESCARGJUST(1)) : -1;
|
||
|
if (xsetcolorname(j, p)) {
|
||
|
if (par == 104 && narg <= 1)
|
||
|
return; /* color reset without parameter */
|
||
|
@@ -1892,7 +1895,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 */
|
||
|
@@ -1911,18 +1914,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++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.32.0
|
||
|
|