-
Notifications
You must be signed in to change notification settings - Fork 33
/
main.go
74 lines (64 loc) · 1.35 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"flag"
"fmt"
"os"
"regexp"
)
var (
matchDigit = regexp.MustCompile("[0-9]").Match
matchAlpha = regexp.MustCompile("[a-zA-Z]").Match
)
func chOrder(ch uint8) int {
// "~" is lower than everything else
if ch == '~' {
return -10
}
// empty is higher than "~" but lower than everything else
if ch == 0 {
return -5
}
if matchAlpha([]byte{ch}) {
return int(ch)
}
// can only happen if cmpString sets '0' because there is no fragment
if matchDigit([]byte{ch}) {
return 0
}
return int(ch) + 256
}
func main() {
var outFile string
var pkgName string
flag.StringVar(&outFile, "output", "-", "output file")
flag.StringVar(&pkgName, "package", "foo", "package name")
flag.Parse()
out := os.Stdout
if outFile != "" && outFile != "-" {
var err error
out, err = os.Create(outFile)
if err != nil {
fmt.Fprintf(os.Stderr, "error: %v", err)
os.Exit(1)
}
defer out.Close()
}
if pkgName == "" {
pkgName = "foo"
}
fmt.Fprintln(out, "// auto-generated, DO NOT EDIT!")
fmt.Fprintf(out, "package %v\n", pkgName)
fmt.Fprintf(out, "\n")
fmt.Fprintln(out, "var chOrder = [...]int{")
for i := 0; i < 16; i++ {
fmt.Fprintf(out, "\t")
for j := 0; j < 16; j++ {
if j != 0 {
fmt.Fprintf(out, " ")
}
fmt.Fprintf(out, "%d,", chOrder(uint8(i*16+j)))
}
fmt.Fprintf(out, "\n")
}
fmt.Fprintln(out, "}")
}