; docformat = 'rst'
;+
; Compares two version numbers for the more updated number. Returns `0` for
; equal versions, `1` if `version1` is later than `version2`, and -1 if
; `version1` is earlier than `version2`. Strings such as 'alpha' and 'beta'
; may be tacked on to the end of a version, but are compared alphabetically.
;
;
; :Examples:
; For example, 1.2 is later than 1.1.2::
;
; IDL> print, mg_cmp_version('1.2', '1.1.2')
; 1
;
; And 1.2 is earlier than 1.3::
;
; IDL> print, mg_cmp_version('1.2', '1.3')
; -1
;
; And 1.2 is equivalent to itself::
;
; IDL> print, mg_cmp_version('1.2', '1.2')
; 0
;
; Also, try the main-level example program at the end of this file::
;
; IDL> .run mg_cmp_version
; 1.2 1.1.2 1.1 1.1alpha 1.1beta
; 1.2 > 0 1 1 1 1
; 1.1.2 > -1 0 1 1 1
; 1.1 > -1 -1 0 1 1
; 1.1alpha > -1 -1 -1 0 -1
; 1.1beta > -1 -1 -1 1 0
;
; :Returns:
; -1, 0, or 1
;
; :Params:
; version1 : in, required, type=string
; first version number
; version2 : in, required, type=string
; second version number
;-
function mg_cmp_version, version1, version2
compile_opt strictarr
v1parts = strsplit(version1, '.', /extract, count=v1len)
v2parts = strsplit(version2, '.', /extract, count=v2len)
nparts = v1len > v2len
v1partsValues = lonarr(nparts)
v2partsValues = lonarr(nparts)
v1partsValues[0] = long(v1parts)
v2partsValues[0] = long(v2parts)
for i = 0L, nparts - 1L do begin
if (v1partsValues[i] gt v2partsValues[i]) then return, 1
if (v1partsValues[i] lt v2partsValues[i]) then return, -1
if (i eq nparts - 1L) then begin
nondigitpos1 = i lt v1len ? stregex(v1parts[i], '[^[:digit:].]') : -1
nondigitpos2 = i lt v2len ? stregex(v2parts[i], '[^[:digit:].]') : -1
if (nondigitpos1 eq -1L && nondigitpos2 eq -1L) then return, 0
if (nondigitpos1 eq -1L) then return, 1
if (nondigitpos2 eq -1L) then return, -1
case 1 of
v1parts[i] lt v2parts[i]: return, -1
v1parts[i] gt v2parts[i]: return, 1
else : return, 0
endcase
endif
endfor
return, 0
end
; main-level example
v = ['1.2', '1.1.2', '1.1', '1.1alpha', '1.1beta']
colwidth = max(strlen(v)) + 2
print, '', format='(A13, $)'
print, v, format='(5A10)'
for v1 = 0L, n_elements(v) - 1L do begin
print, v[v1] + ' > ', format='(A13, $)'
for v2 = 0L, n_elements(v) - 1L do begin
print, mg_cmp_version(v[v1], v[v2]), $
format='(I10, $)'
endfor
print
endfor
end