summaryrefslogtreecommitdiff
path: root/libappstream-glib/as-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libappstream-glib/as-utils.c')
-rw-r--r--libappstream-glib/as-utils.c26
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)