summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-kv/format/util.go
blob: c4c42329e615914f9978495ae0ef7f7927977dcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package format

import (
	"strings"
	"unsafe"
)

// ContainsSpaceOrTab checks if "s" contains space or tabs.
func ContainsSpaceOrTab(s string) bool {
	if i := strings.IndexByte(s, ' '); i != -1 {
		return true // note using indexbyte as it is ASM.
	} else if i := strings.IndexByte(s, '\t'); i != -1 {
		return true
	}
	return false
}

// ContainsDoubleQuote checks if "s" contains a double quote.
func ContainsDoubleQuote(s string) bool {
	return (strings.IndexByte(s, '"') != -1)
}

// AppendEscape will append 's' to 'dst' and escape any double quotes.
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
		}

		// Append char as-is
		dst = append(dst, str[i])
	}
	return dst
}

// isNil will safely check if 'v' is nil without dealing with weird Go interface nil bullshit.
func isNil(i interface{}) bool {
	type eface struct{ _type, data unsafe.Pointer }    //nolint
	return (*(*eface)(unsafe.Pointer(&i))).data == nil //nolint
}

// b2s converts a byteslice to string without allocation.
func b2s(b []byte) string {
	return *(*string)(unsafe.Pointer(&b))
}