modem-helpers: new helper to convert binary-coded decimals

This patch adds a mm_bcd_to_string() helper function to convert a byte
array representing a binary-coded decimal (BCD) number to a string
representing the equivalent decimal number.
This commit is contained in:
Ben Chan
2018-10-20 20:20:54 -07:00
parent 025fcb7e92
commit 942bdeaec2
3 changed files with 60 additions and 0 deletions

View File

@@ -496,6 +496,26 @@ mm_filter_supported_capabilities (MMModemCapability all,
/*****************************************************************************/ /*****************************************************************************/
static const gchar bcd_chars[] = "0123456789\0\0\0\0\0\0";
gchar *
mm_bcd_to_string (const guint8 *bcd, gsize bcd_len)
{
GString *str;
gsize i;
g_return_val_if_fail (bcd != NULL, NULL);
str = g_string_sized_new (bcd_len * 2 + 1);
for (i = 0 ; i < bcd_len; i++) {
str = g_string_append_c (str, bcd_chars[bcd[i] & 0xF]);
str = g_string_append_c (str, bcd_chars[(bcd[i] >> 4) & 0xF]);
}
return g_string_free (str, FALSE);
}
/*****************************************************************************/
GRegex * GRegex *
mm_voice_ring_regex_get (void) mm_voice_ring_regex_get (void)
{ {

View File

@@ -88,6 +88,8 @@ GArray *mm_filter_supported_modes (const GArray *all,
GArray *mm_filter_supported_capabilities (MMModemCapability all, GArray *mm_filter_supported_capabilities (MMModemCapability all,
const GArray *supported_combinations); const GArray *supported_combinations);
gchar *mm_bcd_to_string (const guint8 *bcd, gsize bcd_len);
/*****************************************************************************/ /*****************************************************************************/
/* VOICE specific helpers and utilities */ /* VOICE specific helpers and utilities */
/*****************************************************************************/ /*****************************************************************************/

View File

@@ -3815,6 +3815,42 @@ test_parse_uint_list (void)
/*****************************************************************************/ /*****************************************************************************/
typedef struct {
const guint8 bcd[10];
gsize bcd_len;
const gchar *str;
} BcdToStringTest;
static const BcdToStringTest bcd_to_string_tests[] = {
{ { }, 0, "" },
{ { 0x01 }, 1, "10" },
{ { 0x1F }, 1, "" },
{ { 0xE2 }, 1, "2" },
{ { 0xD3 }, 1, "3" },
{ { 0xC4 }, 1, "4" },
{ { 0xB1, 0x23 }, 2, "1" },
{ { 0x01, 0x23, 0x45, 0x67 }, 4, "10325476" },
{ { 0x01, 0x23, 0x45, 0xA7 }, 4, "1032547" },
{ { 0x01, 0x23, 0x45, 0x67 }, 2, "1032" },
};
static void
test_bcd_to_string (void *f, gpointer d)
{
guint i;
for (i = 0; i < G_N_ELEMENTS (bcd_to_string_tests); i++) {
gchar *str;
str = mm_bcd_to_string (bcd_to_string_tests[i].bcd,
bcd_to_string_tests[i].bcd_len);
g_assert_cmpstr (str, ==, bcd_to_string_tests[i].str);
g_free (str);
}
}
/*****************************************************************************/
void void
_mm_log (const char *loc, _mm_log (const char *loc,
const char *func, const char *func,
@@ -4045,6 +4081,8 @@ int main (int argc, char **argv)
g_test_suite_add (suite, TESTCASE (test_parse_uint_list, NULL)); g_test_suite_add (suite, TESTCASE (test_parse_uint_list, NULL));
g_test_suite_add (suite, TESTCASE (test_bcd_to_string, NULL));
result = g_test_run (); result = g_test_run ();
reg_test_data_free (reg_data); reg_test_data_free (reg_data);