version.mx raw
1 package main
2
3 import (
4 "bytes"
5 "unsafe"
6 )
7
8 //export moxie_version_parse
9 func moxie_version_parse(vPtr unsafe.Pointer, vLen int32, outMajor unsafe.Pointer, outMinor unsafe.Pointer, outPatch unsafe.Pointer) int32 {
10 v := unsafe.Slice((*byte)(vPtr), vLen)
11
12 if rest, ok := bytes.CutPrefix(v, "devel "); ok {
13 idx := bytes.IndexByte(rest, ' ')
14 if idx >= 0 {
15 v = rest[:idx]
16 } else {
17 v = rest
18 }
19 }
20
21 if len(v) < 2 {
22 return -1
23 }
24 prefix := v[:2]
25 if prefix != "mx" && prefix != "go" {
26 return -1
27 }
28 v = v[2:]
29
30 parts := bytes.Split(v, ".")
31 if len(parts) < 2 {
32 return -1
33 }
34
35 major := parseDigits(parts[0])
36 minor := parseDigits(parts[1])
37 patch := int32(0)
38 if len(parts) >= 3 {
39 patch = parseDigits(parts[2])
40 }
41
42 if major < 0 || minor < 0 || patch < 0 {
43 return -1
44 }
45
46 *(*int32)(outMajor) = major
47 *(*int32)(outMinor) = minor
48 *(*int32)(outPatch) = patch
49 return 0
50 }
51
52 //export moxie_version_compare
53 func moxie_version_compare(aPtr unsafe.Pointer, aLen int32, bPtr unsafe.Pointer, bLen int32) int32 {
54 var aMaj, aMin, aPat int32
55 var bMaj, bMin, bPat int32
56
57 moxie_version_parse(aPtr, aLen, unsafe.Pointer(&aMaj), unsafe.Pointer(&aMin), unsafe.Pointer(&aPat))
58 moxie_version_parse(bPtr, bLen, unsafe.Pointer(&bMaj), unsafe.Pointer(&bMin), unsafe.Pointer(&bPat))
59
60 if aMaj < bMaj {
61 return -1
62 }
63 if aMaj > bMaj {
64 return 1
65 }
66 if aMin < bMin {
67 return -1
68 }
69 if aMin > bMin {
70 return 1
71 }
72 if aPat < bPat {
73 return -1
74 }
75 if aPat > bPat {
76 return 1
77 }
78 return 0
79 }
80
81 func parseDigits(s string) int32 {
82 n := int32(0)
83 found := false
84 for i := 0; i < len(s); i++ {
85 c := s[i]
86 if c < '0' || c > '9' {
87 break
88 }
89 n = n*10 + int32(c-'0')
90 found = true
91 }
92 if !found {
93 return -1
94 }
95 return n
96 }
97
98 func main() {}
99