main.mx raw

   1  package main
   2  
   3  import (
   4  	"os"
   5  	"unicode"
   6  )
   7  
   8  func writeFile(path string, data []byte) {
   9  	os.WriteFile(path, data, 0644)
  10  }
  11  
  12  func le16(v uint16) []byte {
  13  	return []byte{byte(v), byte(v >> 8)}
  14  }
  15  
  16  func le32(v uint32) []byte {
  17  	return []byte{byte(v), byte(v >> 8), byte(v >> 16), byte(v >> 24)}
  18  }
  19  
  20  func encodeR16(ranges []unicode.Range16) []byte {
  21  	out := []byte{:0:len(ranges) * 6}
  22  	for _, r := range ranges {
  23  		out = append(out, le16(r.Lo)...)
  24  		out = append(out, le16(r.Hi)...)
  25  		out = append(out, le16(r.Stride)...)
  26  	}
  27  	return out
  28  }
  29  
  30  func encodeR32(ranges []unicode.Range32) []byte {
  31  	out := []byte{:0:len(ranges) * 12}
  32  	for _, r := range ranges {
  33  		out = append(out, le32(r.Lo)...)
  34  		out = append(out, le32(r.Hi)...)
  35  		out = append(out, le32(r.Stride)...)
  36  	}
  37  	return out
  38  }
  39  
  40  func writeTable(dir, name string, t *unicode.RangeTable) {
  41  	if t == nil {
  42  		return
  43  	}
  44  	writeFile(dir | "/" | name | "_r16.bin", encodeR16(t.R16))
  45  	writeFile(dir | "/" | name | "_r32.bin", encodeR32(t.R32))
  46  	println("  " | name)
  47  }
  48  
  49  func main() {
  50  	catDir := "src/unicode/data/cat"
  51  	os.MkdirAll(catDir, 0755)
  52  
  53  	println("categories:")
  54  	writeTable(catDir, "C", unicode.C())
  55  	writeTable(catDir, "Cc", unicode.Cc())
  56  	writeTable(catDir, "Cf", unicode.Cf())
  57  	writeTable(catDir, "Cn", unicode.Cn())
  58  	writeTable(catDir, "Co", unicode.Co())
  59  	writeTable(catDir, "Cs", unicode.Cs())
  60  	writeTable(catDir, "L", unicode.L())
  61  	writeTable(catDir, "LC", unicode.LC())
  62  	writeTable(catDir, "Ll", unicode.Ll())
  63  	writeTable(catDir, "Lm", unicode.Lm())
  64  	writeTable(catDir, "Lo", unicode.Lo())
  65  	writeTable(catDir, "Lt", unicode.Lt())
  66  	writeTable(catDir, "Lu", unicode.Lu())
  67  	writeTable(catDir, "M", unicode.M())
  68  	writeTable(catDir, "Mc", unicode.Mc())
  69  	writeTable(catDir, "Me", unicode.Me())
  70  	writeTable(catDir, "Mn", unicode.Mn())
  71  	writeTable(catDir, "N", unicode.N())
  72  	writeTable(catDir, "Nd", unicode.Nd())
  73  	writeTable(catDir, "Nl", unicode.Nl())
  74  	writeTable(catDir, "No", unicode.No())
  75  	writeTable(catDir, "P", unicode.P())
  76  	writeTable(catDir, "Pc", unicode.Pc())
  77  	writeTable(catDir, "Pd", unicode.Pd())
  78  	writeTable(catDir, "Pe", unicode.Pe())
  79  	writeTable(catDir, "Pf", unicode.Pf())
  80  	writeTable(catDir, "Pi", unicode.Pi())
  81  	writeTable(catDir, "Po", unicode.Po())
  82  	writeTable(catDir, "Ps", unicode.Ps())
  83  	writeTable(catDir, "S", unicode.S())
  84  	writeTable(catDir, "Sc", unicode.Sc())
  85  	writeTable(catDir, "Sk", unicode.Sk())
  86  	writeTable(catDir, "Sm", unicode.Sm())
  87  	writeTable(catDir, "So", unicode.So())
  88  	writeTable(catDir, "Z", unicode.Z())
  89  	writeTable(catDir, "Zl", unicode.Zl())
  90  	writeTable(catDir, "Zp", unicode.Zp())
  91  	writeTable(catDir, "Zs", unicode.Zs())
  92  	writeTable(catDir, "White_Space", unicode.Space())
  93  
  94  	println("done")
  95  }
  96