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