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