| [2606] | 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) | 
|---|