Skip to content

Instantly share code, notes, and snippets.

@mjs
Created November 13, 2017 22:47
Show Gist options
  • Save mjs/bc3219a79d4e4a1d7848c5aaa12b3c40 to your computer and use it in GitHub Desktop.
Save mjs/bc3219a79d4e4a1d7848c5aaa12b3c40 to your computer and use it in GitHub Desktop.
package b
import (
"bytes"
"testing"
)
var needsEscape = []byte(`foo\ bar\"sne`)
func BenchmarkOrig(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = Unescape(needsEscape)
}
}
func BenchmarkNew(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = UnescapeNew(needsEscape)
}
}
func Unescape(in []byte) []byte {
if len(in) == 0 {
return nil
}
if bytes.IndexByte(in, '\\') == -1 {
return in
}
i := 0
inLen := len(in)
var out []byte
for {
if i >= inLen {
break
}
if in[i] == '\\' && i+1 < inLen {
switch in[i+1] {
case ',':
out = append(out, ',')
i += 2
continue
case '"':
out = append(out, '"')
i += 2
continue
case ' ':
out = append(out, ' ')
i += 2
continue
case '=':
out = append(out, '=')
i += 2
continue
}
}
out = append(out, in[i])
i += 1
}
return out
}
func UnescapeNew(in []byte) []byte {
if len(in) == 0 {
return nil
}
if bytes.IndexByte(in, '\\') == -1 {
return in
}
i := 0
inLen := len(in)
out := make([]byte, 0, inLen)
for {
if i >= inLen {
break
}
if in[i] == '\\' && i+1 < inLen {
switch in[i+1] {
case ',':
out = append(out, ',')
i += 2
continue
case '"':
out = append(out, '"')
i += 2
continue
case ' ':
out = append(out, ' ')
i += 2
continue
case '=':
out = append(out, '=')
i += 2
continue
}
}
out = append(out, in[i])
i += 1
}
return out
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment