1 | # Computes the relationship between two version strings. A version |
---|
2 | # string is a number delineated by '.'s such as 1.3.2 and 0.99.9.1. |
---|
3 | # You can feed version strings with different number of dot versions, |
---|
4 | # and the shorter version number will be padded with zeros: 9.2 < |
---|
5 | # 9.2.1 will actually compare 9.2.0 < 9.2.1. |
---|
6 | # |
---|
7 | # Input: a_in - value, not variable |
---|
8 | # b_in - value, not variable |
---|
9 | # result_out - variable with value: |
---|
10 | # -1 : a_in < b_in |
---|
11 | # 0 : a_in == b_in |
---|
12 | # 1 : a_in > b_in |
---|
13 | # optional argument - TRUE or default FALSE: |
---|
14 | # When passing 1.2.3 and 1.2 and this switch is on |
---|
15 | # the function will actually compare 1.2 < 1.2 |
---|
16 | # Caution: Only the first string is adjusted! |
---|
17 | # |
---|
18 | # Written by James Bigler. |
---|
19 | # Extended with an optional argument by Reto Grieder |
---|
20 | |
---|
21 | FUNCTION(COMPARE_VERSION_STRINGS a_in b_in result_out) |
---|
22 | # Additional argument can be a switch to change compare behaviour |
---|
23 | SET(cut_first ${ARGN}) |
---|
24 | |
---|
25 | # Replace '.' with ';' to allow easy tokenization of the string. |
---|
26 | STRING(REPLACE "." ";" a ${a_in}) |
---|
27 | STRING(REPLACE "." ";" b ${b_in}) |
---|
28 | |
---|
29 | # Check the size of each list to see if they are equal. |
---|
30 | LIST(LENGTH a a_length) |
---|
31 | LIST(LENGTH b b_length) |
---|
32 | |
---|
33 | # Pad the shorter list with zeros. |
---|
34 | |
---|
35 | IF(a_length LESS b_length) |
---|
36 | # a is shorter |
---|
37 | SET(shorter a) |
---|
38 | MATH(EXPR pad_range "${b_length} - ${a_length} - 1") |
---|
39 | ELSE(a_length LESS b_length) |
---|
40 | # b is shorter |
---|
41 | SET(shorter b) |
---|
42 | SET(first_longer a) |
---|
43 | MATH(EXPR pad_range "${a_length} - ${b_length} - 1") |
---|
44 | ENDIF(a_length LESS b_length) |
---|
45 | |
---|
46 | # PAD out if we need to |
---|
47 | IF(NOT pad_range LESS 0) |
---|
48 | FOREACH(pad RANGE ${pad_range}) |
---|
49 | # Since shorter is an alias for b, we need to get to it by dereferencing shorter. |
---|
50 | IF(cut_first AND first_longer) |
---|
51 | LIST(REMOVE_AT a -1) # remove last element |
---|
52 | ELSE(cut_first AND first_longer) |
---|
53 | LIST(APPEND ${shorter} 0) |
---|
54 | ENDIF(cut_first AND first_longer) |
---|
55 | ENDFOREACH(pad) |
---|
56 | ENDIF(NOT pad_range LESS 0) |
---|
57 | |
---|
58 | SET(result 0) |
---|
59 | SET(index 0) |
---|
60 | FOREACH(a_version ${a}) |
---|
61 | IF(result EQUAL 0) |
---|
62 | # Only continue to compare things as long as they are equal |
---|
63 | LIST(GET b ${index} b_version) |
---|
64 | # LESS |
---|
65 | IF(a_version LESS b_version) |
---|
66 | SET(result -1) |
---|
67 | ENDIF(a_version LESS b_version) |
---|
68 | # GREATER |
---|
69 | IF(a_version GREATER b_version) |
---|
70 | SET(result 1) |
---|
71 | ENDIF(a_version GREATER b_version) |
---|
72 | ENDIF(result EQUAL 0) |
---|
73 | MATH(EXPR index "${index} + 1") |
---|
74 | ENDFOREACH(a_version) |
---|
75 | |
---|
76 | # Copy out the return result |
---|
77 | SET(${result_out} ${result} PARENT_SCOPE) |
---|
78 | ENDFUNCTION(COMPARE_VERSION_STRINGS) |
---|