Last active
June 13, 2016 13:04
-
-
Save pmalek/c1f3fc29f281e1455333e6f37635a695 to your computer and use it in GitHub Desktop.
compare version c string like "1.2.10"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <string.h> | |
#include <assert.h> | |
/* | |
* Function used to compare version c strings like: "1.2.3" or "12.9.1314214" | |
*/ | |
int compare_versions(char* first, char* second) | |
{ | |
size_t first_last_dot1 = 0; | |
size_t first_last_dot2 = strcspn(first, "."); | |
size_t second_last_dot1 = 0; | |
size_t second_last_dot2 = strcspn(second, "."); | |
char* first_c = (char*)calloc(first_last_dot2 + 1, sizeof(char)); | |
char* second_c = (char*)calloc(second_last_dot2 + 1, sizeof(char)); | |
int first_max = first_last_dot2; | |
int second_max = second_last_dot2; | |
while(first_last_dot2 || second_last_dot2) | |
{ | |
// first longer than second ( different only by last segment ) | |
if(first_last_dot2 && !second_last_dot2) { | |
free(first_c); | |
free(second_c); | |
return 1; | |
} | |
// second longer than first ( different only by last segment ) | |
if(!first_last_dot2 && second_last_dot2) { | |
free(first_c); | |
free(second_c); | |
return -1; | |
} | |
if(first_last_dot2 > first_max) { | |
first_max = first_last_dot2; | |
first_c = (char*)realloc(first_c, first_last_dot2 + 1); | |
} | |
memset(first_c, 0, first_last_dot2); | |
strncat(first_c, first + first_last_dot1, first_last_dot2); | |
int first_n = atoi(first_c); | |
first_last_dot1 += first_last_dot2 + 1; | |
first_last_dot2 = strcspn(first + first_last_dot1, "."); | |
if(second_last_dot2 > second_max) { | |
second_max = second_last_dot2; | |
second_c = (char*)realloc(second_c, second_last_dot2 + 1); | |
} | |
memset(second_c, 0, second_last_dot2); | |
strncat(second_c, second + second_last_dot1, second_last_dot2); | |
int second_n = atoi(second_c); | |
second_last_dot1 += second_last_dot2 + 1; | |
second_last_dot2 = strcspn(second + second_last_dot1, "."); | |
if (first_n != second_n) | |
{ | |
free(first_c); | |
free(second_c); | |
if(first_n < second_n) return -1; | |
return 1; | |
} | |
} | |
free(first_c); | |
free(second_c); | |
return 0; | |
} | |
int main() | |
{ | |
assert(0 == compare_versions("1.12345678.2", "1.12345678.2")); | |
assert(-1 == compare_versions("1", "1.0")); | |
assert(0 == compare_versions("1", "1")); | |
assert(0 == compare_versions("1.11.2", "1.11.2")); | |
assert(1 == compare_versions("1.3", "1.2")); | |
assert(-1 == compare_versions("4.1", "4.88")); | |
assert(1 == compare_versions("44.9.1", "44.8.2")); | |
assert(0 == compare_versions("1.11.24.5.123.12314214", "1.11.24.5.123.12314214")); | |
assert(-1 == compare_versions("1.11.24.5.123.12314214", "1.11.24.5.123.12314215")); | |
assert(1 == compare_versions("1.11.24.5.123.123142199", "1.11.24.5.123.12314215")); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment