package main import ( "bytes" "unsafe" ) //export moxie_version_parse func moxie_version_parse(vPtr unsafe.Pointer, vLen int32, outMajor unsafe.Pointer, outMinor unsafe.Pointer, outPatch unsafe.Pointer) int32 { v := unsafe.Slice((*byte)(vPtr), vLen) if rest, ok := bytes.CutPrefix(v, "devel "); ok { idx := bytes.IndexByte(rest, ' ') if idx >= 0 { v = rest[:idx] } else { v = rest } } if len(v) < 2 { return -1 } prefix := v[:2] if prefix != "mx" && prefix != "go" { return -1 } v = v[2:] parts := bytes.Split(v, ".") if len(parts) < 2 { return -1 } major := parseDigits(parts[0]) minor := parseDigits(parts[1]) patch := int32(0) if len(parts) >= 3 { patch = parseDigits(parts[2]) } if major < 0 || minor < 0 || patch < 0 { return -1 } *(*int32)(outMajor) = major *(*int32)(outMinor) = minor *(*int32)(outPatch) = patch return 0 } //export moxie_version_compare func moxie_version_compare(aPtr unsafe.Pointer, aLen int32, bPtr unsafe.Pointer, bLen int32) int32 { var aMaj, aMin, aPat int32 var bMaj, bMin, bPat int32 moxie_version_parse(aPtr, aLen, unsafe.Pointer(&aMaj), unsafe.Pointer(&aMin), unsafe.Pointer(&aPat)) moxie_version_parse(bPtr, bLen, unsafe.Pointer(&bMaj), unsafe.Pointer(&bMin), unsafe.Pointer(&bPat)) if aMaj < bMaj { return -1 } if aMaj > bMaj { return 1 } if aMin < bMin { return -1 } if aMin > bMin { return 1 } if aPat < bPat { return -1 } if aPat > bPat { return 1 } return 0 } func parseDigits(s string) int32 { n := int32(0) found := false for i := 0; i < len(s); i++ { c := s[i] if c < '0' || c > '9' { break } n = n*10 + int32(c-'0') found = true } if !found { return -1 } return n } func main() {}