-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtree_generate.go
More file actions
99 lines (80 loc) · 2.02 KB
/
tree_generate.go
File metadata and controls
99 lines (80 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//+build ignore
// This one generates types to work with prefix trees.
// Four types are currently generated:
// tree32
// tree64
// tree128
//
// Code in tree.go for tree160 is used as "standard".
package main
import (
"bytes"
"flag"
"fmt"
"go/format"
"go/importer"
"io/ioutil"
"os"
"strings"
)
// Copyright (c) 2016 Alex Sergeyev. All rights reserved. See LICENSE file for terms of use.
var packageHdr = `// *** AUTOGENERATED BY "go generate" ***
package iptrie
import (
"fmt"
"unsafe"
)
`
var flagOut = flag.String("o", "tree_auto.go", "Where to write result")
var genMAXBITS = []string{"32", "64", "128"}
func main() {
flag.Parse()
_, err := importer.Default().Import("github.com/asergeyev/iptrie")
if err != nil {
fmt.Fprintln(os.Stderr, "could not import:", err)
os.Exit(1)
}
f, err := os.Open("tree160.go")
if err != nil {
fmt.Fprintln(os.Stderr, "could not read:", err)
os.Exit(1)
}
content, err := ioutil.ReadAll(f)
if err != nil {
fmt.Fprintln(os.Stderr, "err read:", err)
os.Exit(1)
}
content, err = format.Source(content)
if err != nil {
fmt.Fprintln(os.Stderr, "err fmt:", err)
os.Exit(1)
}
dst := bytes.NewBuffer(nil)
dst.WriteString(packageHdr)
pos := bytes.Index(content, []byte("//go:generate"))
content = content[pos:]
pos = bytes.IndexByte(content, '\n')
content = content[pos:]
for _, maxbits := range genMAXBITS {
src := bytes.NewBuffer(content)
for {
definition, err := src.ReadString('\n')
if err != nil {
break
}
if strings.HasPrefix(definition, "package ") || strings.HasPrefix(definition, "const ") {
continue
}
definition = strings.Replace(definition, "160", maxbits, -1)
definition = strings.Replace(definition, "MAXBITS", maxbits, -1)
definition = strings.Replace(definition, "[5]uint32", "["+maxbits+"/32]uint32", -1)
fmt.Fprint(dst, definition)
}
}
res, err := format.Source(dst.Bytes())
if err != nil {
fmt.Fprintln(os.Stderr, "err final fmt:", err)
os.Exit(1)
}
ioutil.WriteFile(*flagOut, res, 0640)
}