package main import ( "os" "unicode" ) func writeFile(path string, data []byte) { os.WriteFile(path, data, 0644) } func le16(v uint16) []byte { return []byte{byte(v), byte(v >> 8)} } func le32(v uint32) []byte { return []byte{byte(v), byte(v >> 8), byte(v >> 16), byte(v >> 24)} } func encodeR16(ranges []unicode.Range16) []byte { out := []byte{:0:len(ranges) * 6} for _, r := range ranges { out = append(out, le16(r.Lo)...) out = append(out, le16(r.Hi)...) out = append(out, le16(r.Stride)...) } return out } func encodeR32(ranges []unicode.Range32) []byte { out := []byte{:0:len(ranges) * 12} for _, r := range ranges { out = append(out, le32(r.Lo)...) out = append(out, le32(r.Hi)...) out = append(out, le32(r.Stride)...) } return out } func writeTable(dir, name string, t *unicode.RangeTable) { if t == nil { return } writeFile(dir | "/" | name | "_r16.bin", encodeR16(t.R16)) writeFile(dir | "/" | name | "_r32.bin", encodeR32(t.R32)) println(" " | name) } func main() { catDir := "src/unicode/data/cat" os.MkdirAll(catDir, 0755) println("categories:") writeTable(catDir, "C", unicode.C()) writeTable(catDir, "Cc", unicode.Cc()) writeTable(catDir, "Cf", unicode.Cf()) writeTable(catDir, "Cn", unicode.Cn()) writeTable(catDir, "Co", unicode.Co()) writeTable(catDir, "Cs", unicode.Cs()) writeTable(catDir, "L", unicode.L()) writeTable(catDir, "LC", unicode.LC()) writeTable(catDir, "Ll", unicode.Ll()) writeTable(catDir, "Lm", unicode.Lm()) writeTable(catDir, "Lo", unicode.Lo()) writeTable(catDir, "Lt", unicode.Lt()) writeTable(catDir, "Lu", unicode.Lu()) writeTable(catDir, "M", unicode.M()) writeTable(catDir, "Mc", unicode.Mc()) writeTable(catDir, "Me", unicode.Me()) writeTable(catDir, "Mn", unicode.Mn()) writeTable(catDir, "N", unicode.N()) writeTable(catDir, "Nd", unicode.Nd()) writeTable(catDir, "Nl", unicode.Nl()) writeTable(catDir, "No", unicode.No()) writeTable(catDir, "P", unicode.P()) writeTable(catDir, "Pc", unicode.Pc()) writeTable(catDir, "Pd", unicode.Pd()) writeTable(catDir, "Pe", unicode.Pe()) writeTable(catDir, "Pf", unicode.Pf()) writeTable(catDir, "Pi", unicode.Pi()) writeTable(catDir, "Po", unicode.Po()) writeTable(catDir, "Ps", unicode.Ps()) writeTable(catDir, "S", unicode.S()) writeTable(catDir, "Sc", unicode.Sc()) writeTable(catDir, "Sk", unicode.Sk()) writeTable(catDir, "Sm", unicode.Sm()) writeTable(catDir, "So", unicode.So()) writeTable(catDir, "Z", unicode.Z()) writeTable(catDir, "Zl", unicode.Zl()) writeTable(catDir, "Zp", unicode.Zp()) writeTable(catDir, "Zs", unicode.Zs()) writeTable(catDir, "White_Space", unicode.Space()) println("done") }