56 lines
1.6 KiB
Go
56 lines
1.6 KiB
Go
// Copyright 2022 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package cpu
|
|
|
|
import "strconv"
|
|
|
|
// parseRelease parses a dot-separated version number from the prefix
|
|
// of rel. It returns ok=true only if at least the major and minor
|
|
// components were successfully parsed; the patch component is
|
|
// best-effort. Trailing vendor or build suffixes such as
|
|
// "-generic", "+", "_hi3535", or "-rc1" are ignored.
|
|
//
|
|
// This is a copy of the Go runtime's parseRelease from
|
|
// https://golang.org/cl/209597, updated in https://golang.org/cl/781800.
|
|
func parseRelease(rel string) (major, minor, patch int, ok bool) {
|
|
// next consumes a run of decimal digits from the front of rel,
|
|
// returning the parsed value. If the digits are followed by a
|
|
// '.', it is consumed and more is set so the caller knows to
|
|
// parse another component; otherwise scanning terminates and
|
|
// the rest of rel is discarded.
|
|
next := func() (n int, more, ok bool) {
|
|
i := 0
|
|
for i < len(rel) && rel[i] >= '0' && rel[i] <= '9' {
|
|
i++
|
|
}
|
|
if i == 0 {
|
|
return 0, false, false
|
|
}
|
|
n, err := strconv.Atoi(rel[:i])
|
|
if err != nil {
|
|
return 0, false, false
|
|
}
|
|
if i < len(rel) && rel[i] == '.' {
|
|
rel = rel[i+1:]
|
|
return n, true, true
|
|
}
|
|
rel = ""
|
|
return n, false, true
|
|
}
|
|
|
|
var more bool
|
|
if major, more, ok = next(); !ok || !more {
|
|
return 0, 0, 0, false
|
|
}
|
|
if minor, more, ok = next(); !ok {
|
|
return 0, 0, 0, false
|
|
}
|
|
if !more {
|
|
return major, minor, 0, true
|
|
}
|
|
patch, _, _ = next()
|
|
return major, minor, patch, true
|
|
}
|