m/fzf
1
0
mirror of https://github.com/junegunn/fzf.git synced 2025-11-16 23:33:39 -05:00

Support ANSI sequences with mixed ; and : delimiters (#4169)

`make bench` shows no loss of performance.
This commit is contained in:
Junegunn Choi
2025-01-10 17:43:13 +09:00
parent cc1d9f124e
commit 14ef8e8051
2 changed files with 10 additions and 16 deletions

View File

@@ -310,20 +310,15 @@ func extractColor(str string, state *ansiState, proc func(string, *ansiState) bo
return trimmed, nil, state return trimmed, nil, state
} }
func parseAnsiCode(s string, delimiter byte) (int, byte, string) { func parseAnsiCode(s string) (int, string) {
var remaining string var remaining string
var i int var i int
if delimiter == 0 { // Faster than strings.IndexAny(";:")
// Faster than strings.IndexAny(";:") i = strings.IndexByte(s, ';')
i = strings.IndexByte(s, ';') if i < 0 {
if i < 0 { i = strings.IndexByte(s, ':')
i = strings.IndexByte(s, ':')
}
} else {
i = strings.IndexByte(s, delimiter)
} }
if i >= 0 { if i >= 0 {
delimiter = s[i]
remaining = s[i+1:] remaining = s[i+1:]
s = s[:i] s = s[:i]
} }
@@ -335,14 +330,14 @@ func parseAnsiCode(s string, delimiter byte) (int, byte, string) {
for _, ch := range stringBytes(s) { for _, ch := range stringBytes(s) {
ch -= '0' ch -= '0'
if ch > 9 { if ch > 9 {
return -1, delimiter, remaining return -1, remaining
} }
code = code*10 + int(ch) code = code*10 + int(ch)
} }
return code, delimiter, remaining return code, remaining
} }
return -1, delimiter, remaining return -1, remaining
} }
func interpretCode(ansiCode string, prevState *ansiState) ansiState { func interpretCode(ansiCode string, prevState *ansiState) ansiState {
@@ -378,11 +373,10 @@ func interpretCode(ansiCode string, prevState *ansiState) ansiState {
state256 := 0 state256 := 0
ptr := &state.fg ptr := &state.fg
var delimiter byte
count := 0 count := 0
for len(ansiCode) != 0 { for len(ansiCode) != 0 {
var num int var num int
if num, delimiter, ansiCode = parseAnsiCode(ansiCode, delimiter); num != -1 { if num, ansiCode = parseAnsiCode(ansiCode); num != -1 {
count++ count++
switch state256 { switch state256 {
case 0: case 0:

View File

@@ -381,7 +381,7 @@ func TestParseAnsiCode(t *testing.T) {
{"-2", "", -1}, {"-2", "", -1},
} }
for _, x := range tests { for _, x := range tests {
n, _, s := parseAnsiCode(x.In, 0) n, s := parseAnsiCode(x.In)
if n != x.N || s != x.Exp { if n != x.N || s != x.Exp {
t.Fatalf("%q: got: (%d %q) want: (%d %q)", x.In, n, s, x.N, x.Exp) t.Fatalf("%q: got: (%d %q) want: (%d %q)", x.In, n, s, x.N, x.Exp)
} }