diff --git a/common/string.go b/common/string.go index ccfa0cd3..fac1be6c 100644 --- a/common/string.go +++ b/common/string.go @@ -72,3 +72,18 @@ func IsASCIIText(s string) bool { } return true } + +// NOTE: Assumes that s is ASCII as per IsASCIIText(), otherwise panics. +func ASCIITrim(s string) string { + r := make([]byte, 0, len(s)) + for _, b := range []byte(s) { + if b == 32 { + continue // skip space + } else if 32 < b && b <= 126 { + r = append(r, b) + } else { + panic(fmt.Sprintf("non-ASCII (non-tab) char 0x%X", b)) + } + } + return string(r) +} diff --git a/common/string_test.go b/common/string_test.go index fecf1dab..5d1b68fe 100644 --- a/common/string_test.go +++ b/common/string_test.go @@ -64,3 +64,11 @@ func TestIsASCIIText(t *testing.T) { assert.True(t, IsASCIIText(v), "%q is ascii-text", v) } } + +func TestASCIITrim(t *testing.T) { + assert.Equal(t, ASCIITrim(" "), "") + assert.Equal(t, ASCIITrim(" a"), "a") + assert.Equal(t, ASCIITrim("a "), "a") + assert.Equal(t, ASCIITrim(" a "), "a") + assert.Panics(t, func() { ASCIITrim("\xC2\xA2") }) +}