cmSystemTools: reimplement verson comparison without sscanf()

This now has the advantage that it works with version strings with any number
of components.
This commit is contained in:
Rolf Eike Beer 2014-10-25 19:27:40 +02:00 committed by Brad King
parent 667560c88a
commit ef09df646a
2 changed files with 23 additions and 13 deletions

View File

@ -2634,29 +2634,37 @@ bool cmSystemTools::ChangeRPath(std::string const& file,
bool cmSystemTools::VersionCompare(cmSystemTools::CompareOp op, bool cmSystemTools::VersionCompare(cmSystemTools::CompareOp op,
const char* lhss, const char* rhss) const char* lhss, const char* rhss)
{ {
// Parse out up to 8 components. const char *endl = lhss;
unsigned int lhs[8] = {0,0,0,0,0,0,0,0}; const char *endr = rhss;
unsigned int rhs[8] = {0,0,0,0,0,0,0,0}; unsigned long lhs, rhs;
sscanf(lhss, "%u.%u.%u.%u.%u.%u.%u.%u",
&lhs[0], &lhs[1], &lhs[2], &lhs[3],
&lhs[4], &lhs[5], &lhs[6], &lhs[7]);
sscanf(rhss, "%u.%u.%u.%u.%u.%u.%u.%u",
&rhs[0], &rhs[1], &rhs[2], &rhs[3],
&rhs[4], &rhs[5], &rhs[6], &rhs[7]);
// Do component-wise comparison. while (((*endl >= '0') && (*endl <= '9')) ||
for(unsigned int i=0; i < 8; ++i) ((*endr >= '0') && (*endr <= '9')))
{ {
if(lhs[i] < rhs[i]) // Do component-wise comparison.
lhs = strtoul(endl, const_cast<char**>(&endl), 10);
rhs = strtoul(endr, const_cast<char**>(&endr), 10);
if(lhs < rhs)
{ {
// lhs < rhs, so true if operation is LESS // lhs < rhs, so true if operation is LESS
return op == cmSystemTools::OP_LESS; return op == cmSystemTools::OP_LESS;
} }
else if(lhs[i] > rhs[i]) else if(lhs > rhs)
{ {
// lhs > rhs, so true if operation is GREATER // lhs > rhs, so true if operation is GREATER
return op == cmSystemTools::OP_GREATER; return op == cmSystemTools::OP_GREATER;
} }
if (*endr == '.')
{
endr++;
}
if (*endl == '.')
{
endl++;
}
} }
// lhs == rhs, so true if operation is EQUAL // lhs == rhs, so true if operation is EQUAL
return op == cmSystemTools::OP_EQUAL; return op == cmSystemTools::OP_EQUAL;

View File

@ -10,7 +10,9 @@ endif()
set(EQUALV "1 1") set(EQUALV "1 1")
list(APPEND EQUALV "1.0 1") list(APPEND EQUALV "1.0 1")
list(APPEND EQUALV "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 1")
list(APPEND EQUALV "1.2.3.4.5.6.7 1.2.3.4.5.6.7") list(APPEND EQUALV "1.2.3.4.5.6.7 1.2.3.4.5.6.7")
list(APPEND EQUALV "1.2.3.4.5.6.7.8.9 1.2.3.4.5.6.7.8.9")
foreach(v IN LISTS EQUALV) foreach(v IN LISTS EQUALV)
string(REGEX MATCH "(.*) (.*)" _dummy "${v}") string(REGEX MATCH "(.*) (.*)" _dummy "${v}")