summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2017-10-12 22:42:44 +0100
committerRichard Hughes <richard@hughsie.com>2017-10-12 22:42:44 +0100
commit946d1d6ccfea5270c33f01404769a8b473fc9020 (patch)
tree95dfe813adb1a621dfd90b8e1efb0a6129cd14c0
parent65591d8b5f16dcb399f69d33b1f30f4e564aec2f (diff)
downloadappstream-glib-946d1d6ccfea5270c33f01404769a8b473fc9020.tar.gz
Add AS_VERSION_PARSE_FLAG_USE_BCD when formatting version strings
-rw-r--r--libappstream-glib/as-self-test.c19
-rw-r--r--libappstream-glib/as-utils.c5
-rw-r--r--libappstream-glib/as-utils.h2
3 files changed, 26 insertions, 0 deletions
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
@@ -4584,6 +4584,19 @@ as_test_utils_version_func (void)
{ 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;
} version_parse[] = {
@@ -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;