undercurl: support semicolons in SGR character attributes ref. #148

Back in May 2024 support for colons in SGR character attributes was
added to allow both colons and semicolons to be used to separate the
subparameters in SGR escape codes.

The undercurl patch only read colons to separate parameters. This
commit allows for semicolons to be used as well when using escape
codes for undercurl.

https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
https://git.suckless.org/st/commit/5dbcca49263be094fc38159c297458ae323ef647.html
https://st.suckless.org/patches/undercurl/
This commit is contained in:
Bakkeby 2024-08-21 09:33:57 +02:00
parent fe065cc366
commit 398aeb1cd6

19
st.c
View File

@ -170,7 +170,7 @@ static void csihandle(void);
static void dcshandle(void);
#endif // SIXEL_PATCH
#if UNDERCURL_PATCH
static void readcolonargs(char **, int, int[][CAR_PER_ARG]);
static void readcolonargs(char **, int, int[][CAR_PER_ARG], int sep);
#endif // UNDERCURL_PATCH
static void csiparse(void);
static void csireset(void);
@ -1483,20 +1483,21 @@ tnewline(int first_col)
#if UNDERCURL_PATCH
void
readcolonargs(char **p, int cursor, int params[][CAR_PER_ARG])
readcolonargs(char **p, int cursor, int params[][CAR_PER_ARG], int sep)
{
int i = 0;
for (; i < CAR_PER_ARG; i++)
params[cursor][i] = -1;
if (**p != ':')
if (**p != sep)
return;
char *np = NULL;
i = 0;
while (**p == ':' && i < CAR_PER_ARG) {
while (**p == ':')
while (**p == sep && i < CAR_PER_ARG) {
while (**p == sep)
(*p)++;
params[cursor][i] = strtol(*p, &np, 10);
*p = np;
@ -1528,11 +1529,13 @@ csiparse(void)
v = -1;
csiescseq.arg[csiescseq.narg++] = v;
p = np;
#if UNDERCURL_PATCH
readcolonargs(&p, csiescseq.narg-1, csiescseq.carg);
#endif // UNDERCURL_PATCH
if (sep == ';' && *p == ':')
sep = ':'; /* allow override to colon once */
#if UNDERCURL_PATCH
if (v == 4 || v == 58)
readcolonargs(&p, csiescseq.narg-1, csiescseq.carg, sep);
#endif // UNDERCURL_PATCH
if (*p != sep || csiescseq.narg == ESC_ARG_SIZ)
break;
p++;