From ba4cdd20ce1ff1fda019de8ebfa20b3a5c5a66b5 Mon Sep 17 00:00:00 2001 From: Oliver Winston Date: Mon, 2 Mar 2009 18:08:43 +0000 Subject: [PATCH] updated cmp_version in versrionsort to handle more cases --- src/tools-source/versionsort.c | 60 +++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/src/tools-source/versionsort.c b/src/tools-source/versionsort.c index 7754643..b41fddb 100644 --- a/src/tools-source/versionsort.c +++ b/src/tools-source/versionsort.c @@ -14,20 +14,62 @@ * --- SDE-COPYRIGHT-NOTE-END --- */ -#define _GNU_SOURCE #include +#include #include #include -static int cmp_version(const void *p1, const void *p2) { - const char **s1=(const char **)p1; - const char **s2=(const char **)p2; - - return strverscmp(*s1, *s2); +typedef int cmp_t(const void *, const void *); + + +static int cmp_version(const char *s0, const char *s1) +{ + const char *p, *q; + unsigned int a, b, ck0 = 1, ck1 = 1; + + + while (ck0 || ck1) { + a = b = 0; + for (p = s0; *p != 0 && !isdigit(*p); p++) ; + for (q = s1; *q != 0 && !isdigit(*q); q++) ; + + if (ck0) { + for (s0 = p; isdigit(*s0); s0++) ; + a = atoi(p); + } + if (ck1) { + for (s1 = q; isdigit(*s1); s1++) ; + b = atoi(q); + } + ck0 = ck0 && (*s0 == '.' || *s0 == '-'); + ck1 = ck1 && (*s1 == '.' || *s1 == '-'); + + if (a != b) + break; + else if (ck0 && ck1 && *s0 != *s1) { + a = ((*s0 == '.') << 1) | (*s0 == '-'); + b = ((*s1 == '.') << 1) | (*s1 == '-'); + break; + } else if (ck0 ^ ck1) { + a = ck0; + b = ck1; + break; + } + s0++; + s1++; + } + + if (a > b) + return 1; + else if (a < b) + return -1; + return 0; } -int main(int argc, char **argv) { + +int main(int argc, char **argv) +{ register unsigned i; if (argc == 1 || strcmp(argv[1],"-?") == 0) { @@ -35,10 +77,12 @@ int main(int argc, char **argv) { return EXIT_FAILURE; } - qsort(&argv[1], argc-1, sizeof(argv[0]), cmp_version); + qsort(&argv[1], argc-1, sizeof(argv[0]), (cmp_t *)cmp_version); for (i=1; i<(unsigned)argc; i++) printf("%s\n", argv[i]); return EXIT_SUCCESS; } + +