diff --git a/src/bee_version_compare.c b/src/bee_version_compare.c index 43824b8..6db4ad3 100644 --- a/src/bee_version_compare.c +++ b/src/bee_version_compare.c @@ -28,86 +28,47 @@ #include "bee_version.h" -int compare_version_strings(char *v1, char *v2) { - char *a, *b; - long long i,j; - assert(v1); - assert(v2); - - a = v1; - b = v2; - - while(*a && *b && *a == *b) { - a++; - b++; - - if (*a == *b) +// '2.23.2' > '2.23.0' +//' 2.23.10' > '2.23.8' +// '2.23.001' == '2.23.1' +// '2.23.1001' > '2.23.101' + +int compare_version_strings(char *a, char *b) { + while (1) { + if (*a == '\0' && *b == '\0') + return 0; + if (*a == '\0') + return -1; + if (*b == '\0') + return 1; + + if (isdigit(*a) && isdigit (*b)) { + long i_a = atoll(a); + long i_b = atoll(b); + if (i_a < i_b) + return -1; + if (i_a > i_b) + return 1; + while(isdigit(*a)) + a++; + while(isdigit(*b)) + b++; continue; - - /* skip leading zeros of numbers != 0 */ - if (isdigit(*a) && isdigit(*b)) { - char *c; - - for (c=a; *c == '0'; c++) - ; - if (isdigit(*c)) - a = c; - - for (c=b; *c == '0'; c++) - ; - if (isdigit(*c)) - b = c; } - } - /* strings are equal ; *a==*b==0*/ - if(*a == *b) - return(0); - - if(isdigit(*a)) { - if(isdigit(*b)) { - /* rewind string to first digit */ - /* e.g. to compare 12 vs 100 and not 2 vs 00 */ - while(a > v1 && isdigit(*(a-1)) && - b > v2 && isdigit(*(b-1))) { - a--; - b--; - } - i = atoll(a); - j = atoll(b); - - if(ij) - return(1); - - /* numbers are equal but strings are not? */ - /* yes -> leading zeros: atoll("01") == atoll("1") */ - return(0); - } - /* a > ('.',alpha, 0) */ - return(1); - } - - if(isalpha(*a)) { + if (isdigit(*a)) + return 1; + if (isdigit(*b)) + return -1; - /* alpha < digit */ - if(isdigit(*b)) - return(-1); - - if(isalpha(*b)) { - if(*a < *b) - return(-1); - return(1); - } - return(1); + if (*a < *b) + return -1; + if (*a > *b) + return 1; + a++; + b++; } - - if(! *b) - return(1); - - return(-1); } int compare_beepackage_names(struct beeversion *v1, struct beeversion *v2) {