chiark / gitweb /
versioncmp: Fix for `~' characters.
[mLib] / versioncmp.c
index 1b77ca9899ab70feb90123030abebaca0fa386bd..7b67dc21446cf6ed916cc1eb6881429172171329 100644 (file)
@@ -125,28 +125,26 @@ static int vcmp(const char *va, const char *val,
 
     pa = vchr(&va, val); pb = vchr(&vb, vbl);
     for (;;) {
-      if (pa == va && pb == vb)
-       break;
-      else if (pa == va)
-       return (-1);
-      else if (pb == vb)
-       return (+1);
-      else if (*pa == *pb) {
-       pa++; pb++;
-       continue;
-      } else if (isalpha((unsigned char)*pa) == isalpha((unsigned char)*pb))
-       return (CMP(*pa, *pb));
-      else if (isalpha((unsigned char)*pa))
-       return (-1);
-      else
-       return (+1);
+      if (pa == va) ia = 1;
+      else if (isalpha((unsigned char)*pa)) ia = 2;
+      else if (*pa == '~') ia = 0;
+      else ia = 3;
+
+      if (pb == vb) ib = 1;
+      else if (isalpha((unsigned char)*pb)) ib = 2;
+      else if (*pb == '~') ib = 0;
+      else ib = 3;
+
+      if (ia != ib) return (CMP(ia, ib));
+      else if (pa == va && pb == vb) break;
+      else if (*pa != *pb) return (CMP(*pa, *pb));
+      pa++; pb++;
     }
 
     /* --- Compare digit portions --- */
 
     ia = vint(&va, val); ib = vint(&vb, vbl);
-    if (ia != ib)
-      return (CMP(ia, ib));
+    if (ia != ib) return (CMP(ia, ib));
   }
 }