1// Copyright 2012 Google, Inc. All rights reserved. 2// 3// Use of this source code is governed by a BSD-style license 4// that can be found in the LICENSE file in the root of the source 5// tree. 6 7// +build ignore 8 9// This binary handles creating string constants and function templates for enums. 10// 11// go run gen.go | gofmt > enums_generated.go 12package main 13 14import ( 15 "fmt" 16 "log" 17 "os" 18 "text/template" 19 "time" 20) 21 22const fmtString = `// Copyright 2012 Google, Inc. All rights reserved. 23 24package layers 25 26// Created by gen2.go, don't edit manually 27// Generated at %s 28 29import ( 30 "fmt" 31 32 "github.com/google/gopacket" 33) 34 35` 36 37var funcsTmpl = template.Must(template.New("foo").Parse(` 38// Decoder calls {{.Name}}Metadata.DecodeWith's decoder. 39func (a {{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error { 40 return {{.Name}}Metadata[a].DecodeWith.Decode(data, p) 41} 42// String returns {{.Name}}Metadata.Name. 43func (a {{.Name}}) String() string { 44 return {{.Name}}Metadata[a].Name 45} 46// LayerType returns {{.Name}}Metadata.LayerType. 47func (a {{.Name}}) LayerType() gopacket.LayerType { 48 return {{.Name}}Metadata[a].LayerType 49} 50 51type errorDecoderFor{{.Name}} int 52func (a *errorDecoderFor{{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error { 53 return a 54} 55func (a *errorDecoderFor{{.Name}}) Error() string { 56 return fmt.Sprintf("Unable to decode {{.Name}} %d", int(*a)) 57} 58 59var errorDecodersFor{{.Name}} [{{.Num}}]errorDecoderFor{{.Name}} 60var {{.Name}}Metadata [{{.Num}}]EnumMetadata 61 62func initUnknownTypesFor{{.Name}}() { 63 for i := 0; i < {{.Num}}; i++ { 64 errorDecodersFor{{.Name}}[i] = errorDecoderFor{{.Name}}(i) 65 {{.Name}}Metadata[i] = EnumMetadata{ 66 DecodeWith: &errorDecodersFor{{.Name}}[i], 67 Name: "Unknown{{.Name}}", 68 } 69 } 70} 71`)) 72 73func main() { 74 fmt.Fprintf(os.Stderr, "Writing results to stdout\n") 75 fmt.Printf(fmtString, time.Now()) 76 types := []struct { 77 Name string 78 Num int 79 }{ 80 {"LinkType", 256}, 81 {"EthernetType", 65536}, 82 {"PPPType", 65536}, 83 {"IPProtocol", 256}, 84 {"SCTPChunkType", 256}, 85 {"PPPoECode", 256}, 86 {"FDDIFrameControl", 256}, 87 {"EAPOLType", 256}, 88 {"ProtocolFamily", 256}, 89 {"Dot11Type", 256}, 90 {"USBTransportType", 256}, 91 } 92 93 fmt.Println("func init() {") 94 for _, t := range types { 95 fmt.Printf("initUnknownTypesFor%s()\n", t.Name) 96 } 97 fmt.Println("initActualTypeData()") 98 fmt.Println("}") 99 for _, t := range types { 100 if err := funcsTmpl.Execute(os.Stdout, t); err != nil { 101 log.Fatalf("Failed to execute template %s: %v", t.Name, err) 102 } 103 } 104} 105