From 946d1d6ccfea5270c33f01404769a8b473fc9020 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Thu, 12 Oct 2017 22:42:44 +0100 Subject: Add AS_VERSION_PARSE_FLAG_USE_BCD when formatting version strings --- libappstream-glib/as-self-test.c | 19 +++++++++++++++++++ libappstream-glib/as-utils.c | 5 +++++ libappstream-glib/as-utils.h | 2 ++ 3 files changed, 26 insertions(+) diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index f97320b..9d399a6 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -4583,6 +4583,19 @@ as_test_utils_version_func (void) { 0xff000100, "255.0.256", AS_VERSION_PARSE_FLAG_USE_TRIPLET }, { 0, NULL } }; + struct { + guint16 val; + const gchar *ver; + AsVersionParseFlag flags; + } version_from_uint16[] = { + { 0x0, "0.0", AS_VERSION_PARSE_FLAG_NONE }, + { 0xff, "0.255", AS_VERSION_PARSE_FLAG_NONE }, + { 0xff01, "255.1", AS_VERSION_PARSE_FLAG_NONE }, + { 0x0, "0.0", AS_VERSION_PARSE_FLAG_USE_BCD }, + { 0x0110, "1.10", AS_VERSION_PARSE_FLAG_USE_BCD }, + { 0x9999, "99.99", AS_VERSION_PARSE_FLAG_USE_BCD }, + { 0, NULL } + }; struct { const gchar *old; const gchar *new; @@ -4606,6 +4619,12 @@ as_test_utils_version_func (void) version_from_uint32[i].flags); g_assert_cmpstr (ver, ==, version_from_uint32[i].ver); } + for (i = 0; version_from_uint16[i].ver != NULL; i++) { + g_autofree gchar *ver = NULL; + ver = as_utils_version_from_uint16 (version_from_uint16[i].val, + version_from_uint16[i].flags); + g_assert_cmpstr (ver, ==, version_from_uint16[i].ver); + } /* check version parsing */ for (i = 0; version_parse[i].old != NULL; i++) { diff --git a/libappstream-glib/as-utils.c b/libappstream-glib/as-utils.c index 682d7d0..f46f1fd 100644 --- a/libappstream-glib/as-utils.c +++ b/libappstream-glib/as-utils.c @@ -1598,6 +1598,11 @@ as_utils_version_from_uint32 (guint32 val, AsVersionParseFlag flags) gchar * as_utils_version_from_uint16 (guint16 val, AsVersionParseFlag flags) { + if (flags & AS_VERSION_PARSE_FLAG_USE_BCD) { + guint maj = ((val >> 12) & 0x0f) * 10 + ((val >> 8) & 0x0f); + guint min = ((val >> 4) & 0x0f) * 10 + (val & 0x0f); + return g_strdup_printf ("%u.%u", maj, min); + } return g_strdup_printf ("%u.%u", (guint) (val >> 8) & 0xff, (guint) val & 0xff); diff --git a/libappstream-glib/as-utils.h b/libappstream-glib/as-utils.h index bf051f6..a8d56a0 100644 --- a/libappstream-glib/as-utils.h +++ b/libappstream-glib/as-utils.h @@ -83,12 +83,14 @@ typedef enum { * AsVersionParseFlag: * @AS_VERSION_PARSE_FLAG_NONE: No flags set * @AS_VERSION_PARSE_FLAG_USE_TRIPLET: Use Microsoft-style version numbers + * @AS_VERSION_PARSE_FLAG_USE_BCD: Use binary coded decimal notation * * The flags used when parsing version numbers. **/ typedef enum { AS_VERSION_PARSE_FLAG_NONE = 0, AS_VERSION_PARSE_FLAG_USE_TRIPLET = 1 << 0, + AS_VERSION_PARSE_FLAG_USE_BCD = 1 << 1, /* Since: 0.7.3 */ /*< private >*/ AS_VERSION_PARSE_FLAG_LAST } AsVersionParseFlag; -- cgit v1.2.1