--- /dev/null
+// structlayout-pretty formats the output of structlayout with ASCII
+// art.
+package main
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "log"
+ "os"
+ "strings"
+
+ st "honnef.co/go/tools/structlayout"
+ "honnef.co/go/tools/version"
+)
+
+var (
+ fVerbose bool
+ fVersion bool
+)
+
+func init() {
+ flag.BoolVar(&fVerbose, "v", false, "Do not compact consecutive bytes of fields")
+ flag.BoolVar(&fVersion, "version", false, "Print version and exit")
+}
+
+func main() {
+ log.SetFlags(0)
+ flag.Parse()
+
+ if fVersion {
+ version.Print()
+ os.Exit(0)
+ }
+
+ var fields []st.Field
+ if err := json.NewDecoder(os.Stdin).Decode(&fields); err != nil {
+ log.Fatal(err)
+ }
+ if len(fields) == 0 {
+ return
+ }
+ max := fields[len(fields)-1].End
+ maxLength := len(fmt.Sprintf("%d", max))
+ padding := strings.Repeat(" ", maxLength+2)
+ format := fmt.Sprintf(" %%%dd ", maxLength)
+ pos := int64(0)
+ fmt.Println(padding + "+--------+")
+ for _, field := range fields {
+ name := field.Name + " " + field.Type
+ if field.IsPadding {
+ name = "padding"
+ }
+ fmt.Printf(format+"| | <- %s (size %d, align %d)\n", pos, name, field.Size, field.Align)
+ fmt.Println(padding + "+--------+")
+
+ if fVerbose {
+ for i := int64(0); i < field.Size-1; i++ {
+ fmt.Printf(format+"| |\n", pos+i+1)
+ fmt.Println(padding + "+--------+")
+ }
+ } else {
+ if field.Size > 2 {
+ fmt.Println(padding + "-........-")
+ fmt.Println(padding + "+--------+")
+ fmt.Printf(format+"| |\n", pos+field.Size-1)
+ fmt.Println(padding + "+--------+")
+ }
+ }
+ pos += field.Size
+ }
+}