Skip to content

Commit 0ea77d2

Browse files
krobeluszyv
authored andcommitted
Ticket #4597: fix CSI parser
fish shell 4.0 wants to send sequences like "\x1b[=5u", so strip them from the output as well. See https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_(Control_Sequence_Introducer)_sequences In future we should probably pass through some sequences like bracketed paste. Signed-off-by: Yury V. Zaytsev <[email protected]>
1 parent 9e4e7e8 commit 0ea77d2

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

lib/util.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,10 @@ skip_numbers (const char *s)
736736
* "control sequence", in a sort of pidgin BNF, as follows:
737737
*
738738
* control-seq = Esc non-'['
739-
* | Esc '[' (0 or more digits or ';' or ':' or '?') (any other char)
739+
* | Esc '[' (parameter-byte)* (intermediate-byte)* final-byte
740+
* parameter-byte = [\x30-\x3F] # one of "0-9;:<=>?"
741+
* intermediate-byte = [\x20–\x2F] # one of " !\"#$%&'()*+,-./"
742+
* final-byte = [\x40-\x7e] # one of "@A–Z[\]^_`a–z{|}~"
740743
*
741744
* The 256-color and true-color escape sequences should allow either ';' or ':' inside as separator,
742745
* actually, ':' is the more correct according to ECMA-48.
@@ -763,8 +766,10 @@ strip_ctrl_codes (char *s)
763766
if (*(++r) == '[' || *r == '(')
764767
{
765768
/* strchr() matches trailing binary 0 */
766-
while (*(++r) != '\0' && strchr ("0123456789;:?", *r) != NULL)
769+
while (*(++r) != '\0' && strchr ("0123456789;:<=>?", *r) != NULL)
767770
;
771+
while (*r != '\0' && (*r < 0x40 || *r > 0x7E))
772+
++r;
768773
}
769774
else if (*r == ']')
770775
{

0 commit comments

Comments
 (0)