105 lines
2.5 KiB
Go
105 lines
2.5 KiB
Go
// Copyright 2012 Google, Inc. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style license
|
|
// that can be found in the LICENSE file in the root of the source
|
|
// tree.
|
|
|
|
// +build ignore
|
|
|
|
// This binary handles creating string constants and function templates for enums.
|
|
//
|
|
// go run gen.go | gofmt > enums_generated.go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"text/template"
|
|
"time"
|
|
)
|
|
|
|
const fmtString = `// Copyright 2012 Google, Inc. All rights reserved.
|
|
|
|
package layers
|
|
|
|
// Created by gen2.go, don't edit manually
|
|
// Generated at %s
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/google/gopacket"
|
|
)
|
|
|
|
`
|
|
|
|
var funcsTmpl = template.Must(template.New("foo").Parse(`
|
|
// Decoder calls {{.Name}}Metadata.DecodeWith's decoder.
|
|
func (a {{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error {
|
|
return {{.Name}}Metadata[a].DecodeWith.Decode(data, p)
|
|
}
|
|
// String returns {{.Name}}Metadata.Name.
|
|
func (a {{.Name}}) String() string {
|
|
return {{.Name}}Metadata[a].Name
|
|
}
|
|
// LayerType returns {{.Name}}Metadata.LayerType.
|
|
func (a {{.Name}}) LayerType() gopacket.LayerType {
|
|
return {{.Name}}Metadata[a].LayerType
|
|
}
|
|
|
|
type errorDecoderFor{{.Name}} int
|
|
func (a *errorDecoderFor{{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error {
|
|
return a
|
|
}
|
|
func (a *errorDecoderFor{{.Name}}) Error() string {
|
|
return fmt.Sprintf("Unable to decode {{.Name}} %d", int(*a))
|
|
}
|
|
|
|
var errorDecodersFor{{.Name}} [{{.Num}}]errorDecoderFor{{.Name}}
|
|
var {{.Name}}Metadata [{{.Num}}]EnumMetadata
|
|
|
|
func initUnknownTypesFor{{.Name}}() {
|
|
for i := 0; i < {{.Num}}; i++ {
|
|
errorDecodersFor{{.Name}}[i] = errorDecoderFor{{.Name}}(i)
|
|
{{.Name}}Metadata[i] = EnumMetadata{
|
|
DecodeWith: &errorDecodersFor{{.Name}}[i],
|
|
Name: "Unknown{{.Name}}",
|
|
}
|
|
}
|
|
}
|
|
`))
|
|
|
|
func main() {
|
|
fmt.Fprintf(os.Stderr, "Writing results to stdout\n")
|
|
fmt.Printf(fmtString, time.Now())
|
|
types := []struct {
|
|
Name string
|
|
Num int
|
|
}{
|
|
{"LinkType", 256},
|
|
{"EthernetType", 65536},
|
|
{"PPPType", 65536},
|
|
{"IPProtocol", 256},
|
|
{"SCTPChunkType", 256},
|
|
{"PPPoECode", 256},
|
|
{"FDDIFrameControl", 256},
|
|
{"EAPOLType", 256},
|
|
{"ProtocolFamily", 256},
|
|
{"Dot11Type", 256},
|
|
{"USBTransportType", 256},
|
|
}
|
|
|
|
fmt.Println("func init() {")
|
|
for _, t := range types {
|
|
fmt.Printf("initUnknownTypesFor%s()\n", t.Name)
|
|
}
|
|
fmt.Println("initActualTypeData()")
|
|
fmt.Println("}")
|
|
for _, t := range types {
|
|
if err := funcsTmpl.Execute(os.Stdout, t); err != nil {
|
|
log.Fatalf("Failed to execute template %s: %v", t.Name, err)
|
|
}
|
|
}
|
|
}
|