Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / honnef.co / go / tools@v0.0.1-2020.1.5 / cmd / structlayout-pretty / main.go
1 // structlayout-pretty formats the output of structlayout with ASCII
2 // art.
3 package main
4
5 import (
6         "encoding/json"
7         "flag"
8         "fmt"
9         "log"
10         "os"
11         "strings"
12
13         st "honnef.co/go/tools/structlayout"
14         "honnef.co/go/tools/version"
15 )
16
17 var (
18         fVerbose bool
19         fVersion bool
20 )
21
22 func init() {
23         flag.BoolVar(&fVerbose, "v", false, "Do not compact consecutive bytes of fields")
24         flag.BoolVar(&fVersion, "version", false, "Print version and exit")
25 }
26
27 func main() {
28         log.SetFlags(0)
29         flag.Parse()
30
31         if fVersion {
32                 version.Print()
33                 os.Exit(0)
34         }
35
36         var fields []st.Field
37         if err := json.NewDecoder(os.Stdin).Decode(&fields); err != nil {
38                 log.Fatal(err)
39         }
40         if len(fields) == 0 {
41                 return
42         }
43         max := fields[len(fields)-1].End
44         maxLength := len(fmt.Sprintf("%d", max))
45         padding := strings.Repeat(" ", maxLength+2)
46         format := fmt.Sprintf(" %%%dd ", maxLength)
47         pos := int64(0)
48         fmt.Println(padding + "+--------+")
49         for _, field := range fields {
50                 name := field.Name + " " + field.Type
51                 if field.IsPadding {
52                         name = "padding"
53                 }
54                 fmt.Printf(format+"|        | <- %s (size %d, align %d)\n", pos, name, field.Size, field.Align)
55                 fmt.Println(padding + "+--------+")
56
57                 if fVerbose {
58                         for i := int64(0); i < field.Size-1; i++ {
59                                 fmt.Printf(format+"|        |\n", pos+i+1)
60                                 fmt.Println(padding + "+--------+")
61                         }
62                 } else {
63                         if field.Size > 2 {
64                                 fmt.Println(padding + "-........-")
65                                 fmt.Println(padding + "+--------+")
66                                 fmt.Printf(format+"|        |\n", pos+field.Size-1)
67                                 fmt.Println(padding + "+--------+")
68                         }
69                 }
70                 pos += field.Size
71         }
72 }