github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/strutil/chrorder/main.go (about)

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