-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathnormalize.go
More file actions
84 lines (72 loc) · 1.35 KB
/
normalize.go
File metadata and controls
84 lines (72 loc) · 1.35 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
package main
import (
"sort"
)
func NormalizeNETs(nets []NETv4) {
for i := range nets {
nets[i].Normalize()
}
}
func PackNETs(nets []NETv4) []NETv4 {
removeCount := 0
for i := range nets {
if nets[i].Prefix == RemoveMask {
removeCount++
}
}
r := make([]NETv4, 0, len(nets)-removeCount)
for i := range nets {
if nets[i].Prefix != RemoveMask {
r = append(r, nets[i])
}
}
return r
}
func EliminateNETs(nets NETv4s) {
for i := 0; i < len(nets); {
j := i + 1
for j < len(nets) && nets[i].Contains(nets[j]) {
nets[j].Prefix = RemoveMask
j++
}
i = j
}
}
func GroupUpNETs(nets NETv4s) {
for i := nets.First(); i < len(nets); {
next := nets.Next(i)
if !nets[i].FirstInGroup() || next >= len(nets) {
i = next
continue
}
if nets[i].GroupPair() == nets[next] {
nets[i].Prefix--
nets[next].Prefix = RemoveMask
if nets[i].LastInGroup() {
prev := nets.Prev(i)
if prev >= 0 {
i = prev
} else {
i = nets.Next(next)
}
}
} else {
i = next
}
}
}
func NormalizeIPs(nets []NETv4) []NETv4 {
NormalizeNETs(nets)
less := func(i, j int) bool {
iv := int64(nets[i].IP) << 8
iv |= int64(nets[i].Prefix)
jv := int64(nets[j].IP) << 8
jv |= int64(nets[j].Prefix)
return iv < jv
}
sort.Slice(nets, less)
EliminateNETs(nets)
GroupUpNETs(nets)
nets = PackNETs(nets)
return nets
}