Files
nmon/internal/simagent/oid.go

58 lines
1.1 KiB
Go

package simagent
import "strings"
// cmpOID compares dotted OIDs arc by arc as unsigned integers. A leading dot
// is ignored.
func cmpOID(a, b string) int {
a, b = strings.TrimPrefix(a, "."), strings.TrimPrefix(b, ".")
for {
if a == "" || b == "" {
switch {
case a == "" && b == "":
return 0
case a == "":
return -1
}
return 1
}
var x, y uint64
i, j := 0, 0
for i < len(a) && a[i] != '.' {
x = x*10 + uint64(a[i]-'0')
i++
}
for j < len(b) && b[j] != '.' {
y = y*10 + uint64(b[j]-'0')
j++
}
if x != y {
if x < y {
return -1
}
return 1
}
a, b = strings.TrimPrefix(a[i:], "."), strings.TrimPrefix(b[j:], ".")
}
}
// hasOIDPrefix reports whether oid is strictly below prefix.
func hasOIDPrefix(oid, prefix string) bool {
return len(oid) > len(prefix) && oid[len(prefix)] == '.' && oid[:len(prefix)] == prefix
}
func validOID(s string) bool {
if s == "" {
return false
}
prev := byte('.')
for i := 0; i < len(s); i++ {
c := s[i]
if c == '.' && prev == '.' || c != '.' && (c < '0' || c > '9') {
return false
}
prev = c
}
return prev != '.'
}