aboutsummaryrefslogtreecommitdiffstats
path: root/skate/schema.go
diff options
context:
space:
mode:
Diffstat (limited to 'skate/schema.go')
-rw-r--r--skate/schema.go34
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()