[bugfix] bump go-kv version with logfmt quote fix (#2108)

This commit is contained in:
kim 2023-08-13 14:27:29 +01:00 committed by GitHub
commit 8ea7f551a0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 49 additions and 26 deletions

View file

@ -2,4 +2,3 @@ String formatting package using Rust-style formatting directives, geared specifc
Generally more visually friendly than `"fmt"` and performance is much improved.
![benchmarks](https://codeberg.org/gruf/go-kv/raw/main/format/benchmark.png)

View file

@ -316,7 +316,9 @@ func (f format) AppendStringSafe(s string) {
f.Buffer.B = strconv.AppendQuote(f.Buffer.B, s)
} else if ContainsDoubleQuote(s) {
// Contains double quotes, needs escaping
f.Buffer.B = append(f.Buffer.B, '"')
f.Buffer.B = AppendEscape(f.Buffer.B, s)
f.Buffer.B = append(f.Buffer.B, '"')
} else if len(s) == 0 || ContainsSpaceOrTab(s) {
// Contains space / empty, needs quotes
f.Buffer.B = append(f.Buffer.B, '"')

View file

@ -29,7 +29,7 @@ func IsSafeASCII(str string) bool {
return true
}
// ContainsSpaceOrTab checks if "s" contains space or tabs.
// ContainsSpaceOrTab checks if "s" contains space or tabs. EXPECTS ASCII.
func ContainsSpaceOrTab(s string) bool {
if i := strings.IndexByte(s, ' '); i >= 0 {
return true // note using indexbyte as it is ASM.
@ -39,31 +39,26 @@ func ContainsSpaceOrTab(s string) bool {
return false
}
// ContainsDoubleQuote checks if "s" contains a double quote.
// ContainsDoubleQuote checks if "s" contains a double quote. EXPECTS ASCII.
func ContainsDoubleQuote(s string) bool {
return (strings.IndexByte(s, '"') >= 0)
}
// AppendEscape will append 's' to 'dst' and escape any double quotes.
// AppendEscape will append 's' to 'dst' and escape any double quotes. EXPECTS ASCII.
func AppendEscape(dst []byte, str string) []byte {
var delim bool
for i := range str {
if str[i] == '\\' && !delim {
// Set delim flag
delim = true
continue
} else if str[i] == '"' && !delim {
// Append escaped double quote
dst = append(dst, `\"`...)
continue
} else if delim {
// Append skipped slash
dst = append(dst, `\`...)
delim = false
}
switch str[i] {
case '\\':
// Append delimited '\'
dst = append(dst, '\\', '\\')
// Append char as-is
dst = append(dst, str[i])
case '"':
// Append delimited '"'
dst = append(dst, '\\', '"')
default:
// Append char as-is
dst = append(dst, str[i])
}
}
return dst
}