diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-04-09 18:12:06 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-04-09 18:12:06 +0900 |
commit | 248e754456015170241fc4c02aa0e444a6d861a7 (patch) | |
tree | 9793df60214027f3cebe8fffb667beb0609ed96e | |
parent | cc919ae39aaab456fad2fe89e17abb71d4964747 (diff) | |
download | kati-248e754456015170241fc4c02aa0e444a6d861a7.tar.gz |
Rewrite spliceSpaces without regexp
30 secs => 18 secs
-rw-r--r-- | strutil.go | 31 | ||||
-rw-r--r-- | strutil_test.go | 36 |
2 files changed, 53 insertions, 14 deletions
@@ -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", |