aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--strutil.go31
-rw-r--r--strutil_test.go36
2 files changed, 53 insertions, 14 deletions
diff --git a/strutil.go b/strutil.go
index a9344d6..3d9f16d 100644
--- a/strutil.go
+++ b/strutil.go
@@ -10,21 +10,26 @@ import (
var strinit sync.Once
var spacesRe *regexp.Regexp
-func initStrutil() {
- var err error
- spacesRe, err = regexp.Compile(`\s+`)
- if err != nil {
- panic(err)
- }
-}
-
func splitSpaces(s string) []string {
- strinit.Do(initStrutil)
- s = strings.TrimSpace(s)
- if s == "" {
- return nil
+ var r []string
+ tokStart := -1
+ for i, ch := range s {
+ if ch == ' ' || ch == '\t' {
+ if tokStart >= 0 {
+ r = append(r, s[tokStart:i])
+ tokStart = -1
+ }
+ } else {
+ if tokStart < 0 {
+ tokStart = i
+ }
+ }
+ }
+ if tokStart >= 0 {
+ r = append(r, s[tokStart:])
}
- return spacesRe.Split(s, -1)
+ Log("splitSpace(%q)=%q", s, r)
+ return r
}
func matchPattern(pat, str string) bool {
diff --git a/strutil_test.go b/strutil_test.go
index fdcdcd5..0bf7174 100644
--- a/strutil_test.go
+++ b/strutil_test.go
@@ -1,16 +1,50 @@
package main
import (
+ "reflect"
"testing"
)
+func TestSplitSpaces(t *testing.T) {
+ for _, tc := range []struct {
+ in string
+ want []string
+ }{
+ {
+ in: "foo",
+ want: []string{"foo"},
+ },
+ {
+ in: " ",
+ want: nil,
+ },
+ {
+ in: " foo bar ",
+ want: []string{"foo", "bar"},
+ },
+ {
+ in: " foo bar",
+ want: []string{"foo", "bar"},
+ },
+ {
+ in: "foo bar ",
+ want: []string{"foo", "bar"},
+ },
+ } {
+ got := splitSpaces(tc.in)
+ if !reflect.DeepEqual(got, tc.want) {
+ t.Errorf(`splitSpaces(%q)=%q, want %q`, tc.in, got, tc.want)
+ }
+ }
+}
+
func TestSubstPattern(t *testing.T) {
for _, tc := range []struct {
pat string
repl string
in string
want string
- } {
+ }{
{
pat: "%.c",
repl: "%.o",