| // 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 | |
| } |