]> git.ipfire.org Git - thirdparty/dracut-ng.git/commitdiff
dracut-functions: fun. vercmp optimized; credits go to Victor Lowther
authorAmadeusz Żołnowski <aidecoe@aidecoe.name>
Wed, 9 Jun 2010 15:29:36 +0000 (17:29 +0200)
committerHarald Hoyer <harald@redhat.com>
Wed, 9 Jun 2010 15:36:02 +0000 (17:36 +0200)
dracut-functions

index fbac28298039742f0ce7607155ebc0eab42f4c3f..500e3aedd63355057a3dbd3e3eb915e16ddb2b12 100755 (executable)
@@ -27,19 +27,20 @@ strstr() { [[ $1 =~ $2 ]]; }
 # Version comparision function.  Returns result similar to C strcmp,
 # but instead of -1 is 2.  Function assumes version scheme like does
 # Linux kernel.
+# $1 < $2 -> 2
+# $1 = $2 -> 0
+# $1 > $2 -> 1
+# To remember it easy, ask the question: Which argument is greater? ;-)
 vercmp() {
-    local n1 n2 i=1
-
-    while true
-    do
-        n1=$(echo $1 | cut -d'.' -f$i)
-        n2=$(echo $2 | cut -d'.' -f$i)
-
-        [[ ! $n1 && ! $n2 ]] && return 0
-        [[ $n1 -lt $n2 ]] && return 2
-        [[ $n1 -gt $n2 ]] && return 1
-
-        ((i++))
+    local i n1=(${1//./ }) n2=(${2//./ })
+
+    for ((i=0; ; i++))
+    do 
+        [[ ${n1[i]} && ! ${n2[i]} ]] && return 1
+        [[ ! ${n1[i]} && ${n2[i]} ]] && return 2
+        [[ ${n1[i]} && ${n2[i]} ]] || return 0
+        ((${n1[i]} > ${n2[i]})) && return 1
+        ((${n1[i]} < ${n2[i]})) && return 2
     done
 }