diff options
Diffstat (limited to 'skate/schema.go')
-rw-r--r-- | skate/schema.go | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/skate/schema.go b/skate/schema.go index baead09..dea3509 100644 --- a/skate/schema.go +++ b/skate/schema.go @@ -5,6 +5,7 @@ import ( "regexp" "strconv" "strings" + "sync" "git.archive.org/martin/cgraph/skate/isbn" "git.archive.org/martin/cgraph/skate/set" @@ -14,6 +15,16 @@ var ( isbn10Regex = regexp.MustCompile(`[O0-9xX -]{10,18}`) isbn13Regex = regexp.MustCompile(`9[O0-9xX -]{12,20}`) + rune16pool = sync.Pool{ + New: func() interface{} { + return make([]rune, 0, 16) + }, + } + setPool = sync.Pool{ + New: func() interface{} { + return set.New() + }, + } ) // RefToRelease converts a ref to a release. Set a extra.skate.status flag to @@ -66,27 +77,36 @@ func parseIsbn(s string) []string { var ( candidates10 = isbn10Regex.FindAllString(s, -1) candidates13 = isbn13Regex.FindAllString(s, -1) - valid = set.New() + u []rune + z string ) + valid := setPool.Get().(*set.Set) + valid.Clear() + defer setPool.Put(valid) for _, v := range append(candidates10, candidates13...) { - var u []rune + u = rune16pool.Get().([]rune) + u = u[:0] for _, c := range v { + if c == 'O' { + c = '0' + } if c >= '0' && c <= '9' || c == 'x' || c == 'X' { u = append(u, c) } } - s := string(u) - if !isbn.Validate(s) { + z = string(u) + rune16pool.Put(u) + if !isbn.Validate(z) { continue } - if len(s) < 12 { - w, err := isbn.To13(s) + if len(z) < 12 { + w, err := isbn.To13(z) if err != nil { continue } valid.Add(w) } else { - valid.Add(s) + valid.Add(z) } } return valid.Slice() |