X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/d4efbcd93c940ad522fcf8c601ec1829d2e0b10d..e8293f011ddae012752e35f0cc36e9a12665fbf2:/versioncmp.c diff --git a/versioncmp.c b/versioncmp.c index 1b77ca9..7b67dc2 100644 --- a/versioncmp.c +++ b/versioncmp.c @@ -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)); } }