in internal/language/gen.go [1203:1356]
func (b *builder) writeLikelyData() {
const (
isList = 1 << iota
scriptInFrom
regionInFrom
)
type ( // generated types
likelyScriptRegion struct {
region uint16
script uint8
flags uint8
}
likelyLangScript struct {
lang uint16
script uint8
flags uint8
}
likelyLangRegion struct {
lang uint16
region uint16
}
// likelyTag is used for getting likely tags for group regions, where
// the likely region might be a region contained in the group.
likelyTag struct {
lang uint16
region uint16
script uint8
}
)
var ( // generated variables
likelyRegionGroup = make([]likelyTag, len(b.groups))
likelyLang = make([]likelyScriptRegion, len(b.lang.s))
likelyRegion = make([]likelyLangScript, len(b.region.s))
likelyScript = make([]likelyLangRegion, len(b.script.s))
likelyLangList = []likelyScriptRegion{}
likelyRegionList = []likelyLangScript{}
)
type fromTo struct {
from, to []string
}
langToOther := map[int][]fromTo{}
regionToOther := map[int][]fromTo{}
for _, m := range b.supp.LikelySubtags.LikelySubtag {
from := strings.Split(m.From, "_")
to := strings.Split(m.To, "_")
if len(to) != 3 {
log.Fatalf("invalid number of subtags in %q: found %d, want 3", m.To, len(to))
}
if len(from) > 3 {
log.Fatalf("invalid number of subtags: found %d, want 1-3", len(from))
}
if from[0] != to[0] && from[0] != "und" {
log.Fatalf("unexpected language change in expansion: %s -> %s", from, to)
}
if len(from) == 3 {
if from[2] != to[2] {
log.Fatalf("unexpected region change in expansion: %s -> %s", from, to)
}
if from[0] != "und" {
log.Fatalf("unexpected fully specified from tag: %s -> %s", from, to)
}
}
if len(from) == 1 || from[0] != "und" {
id := 0
if from[0] != "und" {
id = b.lang.index(from[0])
}
langToOther[id] = append(langToOther[id], fromTo{from, to})
} else if len(from) == 2 && len(from[1]) == 4 {
sid := b.script.index(from[1])
likelyScript[sid].lang = uint16(b.langIndex(to[0]))
likelyScript[sid].region = uint16(b.region.index(to[2]))
} else {
r := b.region.index(from[len(from)-1])
if id, ok := b.groups[r]; ok {
if from[0] != "und" {
log.Fatalf("region changed unexpectedly: %s -> %s", from, to)
}
likelyRegionGroup[id].lang = uint16(b.langIndex(to[0]))
likelyRegionGroup[id].script = uint8(b.script.index(to[1]))
likelyRegionGroup[id].region = uint16(b.region.index(to[2]))
} else {
regionToOther[r] = append(regionToOther[r], fromTo{from, to})
}
}
}
b.writeType(likelyLangRegion{})
b.writeSlice("likelyScript", likelyScript)
for id := range b.lang.s {
list := langToOther[id]
if len(list) == 1 {
likelyLang[id].region = uint16(b.region.index(list[0].to[2]))
likelyLang[id].script = uint8(b.script.index(list[0].to[1]))
} else if len(list) > 1 {
likelyLang[id].flags = isList
likelyLang[id].region = uint16(len(likelyLangList))
likelyLang[id].script = uint8(len(list))
for _, x := range list {
flags := uint8(0)
if len(x.from) > 1 {
if x.from[1] == x.to[2] {
flags = regionInFrom
} else {
flags = scriptInFrom
}
}
likelyLangList = append(likelyLangList, likelyScriptRegion{
region: uint16(b.region.index(x.to[2])),
script: uint8(b.script.index(x.to[1])),
flags: flags,
})
}
}
}
// TODO: merge suppressScript data with this table.
b.writeType(likelyScriptRegion{})
b.writeSlice("likelyLang", likelyLang)
b.writeSlice("likelyLangList", likelyLangList)
for id := range b.region.s {
list := regionToOther[id]
if len(list) == 1 {
likelyRegion[id].lang = uint16(b.langIndex(list[0].to[0]))
likelyRegion[id].script = uint8(b.script.index(list[0].to[1]))
if len(list[0].from) > 2 {
likelyRegion[id].flags = scriptInFrom
}
} else if len(list) > 1 {
likelyRegion[id].flags = isList
likelyRegion[id].lang = uint16(len(likelyRegionList))
likelyRegion[id].script = uint8(len(list))
for i, x := range list {
if len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 {
log.Fatalf("unspecified script must be first in list: %v at %d", x.from, i)
}
x := likelyLangScript{
lang: uint16(b.langIndex(x.to[0])),
script: uint8(b.script.index(x.to[1])),
}
if len(list[0].from) > 2 {
x.flags = scriptInFrom
}
likelyRegionList = append(likelyRegionList, x)
}
}
}
b.writeType(likelyLangScript{})
b.writeSlice("likelyRegion", likelyRegion)
b.writeSlice("likelyRegionList", likelyRegionList)
b.writeType(likelyTag{})
b.writeSlice("likelyRegionGroup", likelyRegionGroup)
}