diff options
Diffstat (limited to 'libappstream-glib/as-utils.c')
-rw-r--r-- | libappstream-glib/as-utils.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/libappstream-glib/as-utils.c b/libappstream-glib/as-utils.c index c605cd1..83af4a4 100644 --- a/libappstream-glib/as-utils.c +++ b/libappstream-glib/as-utils.c @@ -1353,6 +1353,30 @@ as_utils_search_tokenize (const gchar *search) return values; } +static gint8 +as_utils_vercmp_char (gchar chr1, gchar chr2) +{ + if (chr1 == chr2) + return 0; + if (chr1 == '~') + return -127; + if (chr2 == '~') + return 127; + return chr1 - chr2; +} + +static gint +as_utils_vercmp_chunk (const gchar *str1, const gchar *str2) +{ + guint i; + for (i = 0; str1[i] != '\0' && str2[i] != '\0'; i++) { + gint rc = as_utils_vercmp_char (str1[i], str2[i]); + if (rc != 0) + return rc; + } + return as_utils_vercmp_char (str1[i], str2[i]); +} + /** * as_utils_vercmp: * @version_a: the release version, e.g. 1.2.3 @@ -1411,7 +1435,7 @@ as_utils_vercmp (const gchar *version_a, const gchar *version_b) /* compare strings */ if ((endptr_a != NULL && endptr_a[0] != '\0') || (endptr_b != NULL && endptr_b[0] != '\0')) { - gint rc = g_strcmp0 (endptr_a, endptr_b); + gint rc = as_utils_vercmp_chunk (endptr_a, endptr_b); if (rc < 0) return -1; if (rc > 0) |