]> git.mxchange.org Git - simgear.git/commitdiff
Add another helper to strutils, to compare version strings.
authorJames Turner <zakalawe@mac.com>
Mon, 17 Oct 2011 08:50:21 +0000 (09:50 +0100)
committerJames Turner <zakalawe@mac.com>
Mon, 17 Oct 2011 08:50:21 +0000 (09:50 +0100)
simgear/misc/strutils.cxx
simgear/misc/strutils.hxx
simgear/misc/strutils_test.cxx

index 8bd33b7f507686233140ce7e68ab8a17cf52767b..5a669a6b0f51655e14cde98925f5d8636b984700 100644 (file)
@@ -259,6 +259,26 @@ namespace simgear {
         return result;
     }
     
+    int compare_versions(const string& v1, const string& v2)
+    {
+        vector<string> v1parts(split(v1, "."));
+        vector<string> v2parts(split(v2, "."));
+
+        int lastPart = std::min(v1parts.size(), v2parts.size());
+        for (int part=0; part < lastPart; ++part) {
+            int part1 = to_int(v1parts[part]);
+            int part2 = to_int(v2parts[part]);
+
+            if (part1 != part2) {
+                return part1 - part2;
+            }
+        } // of parts iteration
+
+        // reached end - longer wins
+        return v1parts.size() - v2parts.size();
+    }
+    
+    
     } // end namespace strutils
     
 } // end namespace simgear
index 1a0859d591be0656fa71a50772c5badc92cc7eee..091ba8239393231a96cd95e8462683e1ffa53530 100644 (file)
@@ -127,6 +127,14 @@ namespace simgear {
      * convert a string representing a decimal number, to an int
      */
     int to_int(const std::string& s, int base = 10);
+    
+    /**
+     * Like strcmp(), but for dotted versions strings NN.NN.NN
+     * any number of terms are support.
+     * @return 0 if versions match, -ve number if v1 is lower, +ve if v1
+     * is greater
+     */
+    int compare_versions(const std::string& v1, const std::string& v2);
   } // end namespace strutils
 } // end namespace simgear
 
index f6e08e081a1481185d693c73233755761b6e5512..8369f4ea76be36442cdc9d298d4f870a6f7a07e9 100644 (file)
@@ -53,6 +53,16 @@ int main (int ac, char ** av)
     COMPARE(to_int("0000000"), 0);
     COMPARE(to_int("-10000"), -10000);
     
+    VERIFY(compare_versions("1.0.12", "1.1") < 0);
+    VERIFY(compare_versions("1.1", "1.0.12") > 0);
+    VERIFY(compare_versions("10.6.7", "10.6.7") == 0);
+    VERIFY(compare_versions("2.0", "2.0.99") < 0);
+    VERIFY(compare_versions("99", "99") == 0);
+    VERIFY(compare_versions("99", "98") > 0);
+    
+// since we compare numerically, leasing zeros shouldn't matter
+    VERIFY(compare_versions("0.06.7", "0.6.07") == 0);
+    
     cout << "all tests passed successfully!" << endl;
     return 0;
 }