-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathkernel_args.go
More file actions
42 lines (36 loc) · 947 Bytes
/
kernel_args.go
File metadata and controls
42 lines (36 loc) · 947 Bytes
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
package guestmemory
import "strings"
// MergeKernelArgs merges kernel args deterministically.
// Duplicate keys are de-duplicated with "last write wins" semantics.
func MergeKernelArgs(base string, extras ...string) string {
tokens := strings.Fields(base)
order := make([]string, 0, len(tokens))
values := make(map[string]string, len(tokens))
for _, tok := range tokens {
k := argKey(tok)
if _, ok := values[k]; !ok {
order = append(order, k)
}
values[k] = tok
}
for _, extra := range extras {
for _, tok := range strings.Fields(extra) {
k := argKey(tok)
if _, ok := values[k]; !ok {
order = append(order, k)
}
values[k] = tok
}
}
merged := make([]string, 0, len(order))
for _, k := range order {
merged = append(merged, values[k])
}
return strings.Join(merged, " ")
}
func argKey(token string) string {
if idx := strings.IndexByte(token, '='); idx >= 0 {
return token[:idx]
}
return token
}