diff options
author | João Valverde <joao.valverde@tecnico.ulisboa.pt> | 2017-10-23 19:00:27 +0100 |
---|---|---|
committer | João Valverde <j@v6e.pt> | 2017-10-24 22:00:46 +0000 |
commit | e1ef8e5f7555a1608d0cddde6c824c5a897f6e58 (patch) | |
tree | 9da653772c2ba7d97ac17385597811bd86aa3f06 /wsutil | |
parent | 08a490328387eafb7f9d20293a2a5e97e6cf4268 (diff) |
Test g_printf() thousands grouping flag at runtime
This tests the runtime environment so avoid hard-coding it during the build.
For now we avoid messing with locales for the test, unless it turns out to
be necessary (ISO C printf behaviour with invalid conversion specifier is
undefined).
Change-Id: I341c2ab5e716973689cf9002f13435404a41369f
Reviewed-on: https://code.wireshark.org/review/24038
Petri-Dish: João Valverde <j@v6e.pt>
Tested-by: Petri Dish Buildbot
Reviewed-by: João Valverde <j@v6e.pt>
Diffstat (limited to 'wsutil')
-rw-r--r-- | wsutil/str_util.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/wsutil/str_util.c b/wsutil/str_util.c index 8763666f9a..e0e8531d9d 100644 --- a/wsutil/str_util.c +++ b/wsutil/str_util.c @@ -113,11 +113,21 @@ isdigit_string(guchar *str) #define FORMAT_SIZE_UNIT_MASK 0x00ff #define FORMAT_SIZE_PFX_MASK 0xff00 -#ifdef HAVE_GLIB_PRINTF_GROUPING -#define GROUP_FLAG "'" -#else -#define GROUP_FLAG "" -#endif +static const char *thousands_grouping_fmt = NULL; + +DIAG_OFF(format) +static void test_printf_thousands_grouping(void) { + /* test whether g_printf works with "'" flag character */ + gchar *str = g_strdup_printf("%'d", 22); + if (g_strcmp0(str, "22") == 0) { + thousands_grouping_fmt = "%'"G_GINT64_MODIFIER"d"; + } else { + /* Don't use */ + thousands_grouping_fmt = "%"G_GINT64_MODIFIER"d"; + } + g_free(str); +} +DIAG_ON(format) /* Given a size, return its value in a human-readable format */ /* This doesn't handle fractional values. We might want to make size a double. */ @@ -128,28 +138,34 @@ format_size(gint64 size, format_size_flags_e flags) int power = 1000; int pfx_off = 0; gboolean is_small = FALSE; - static const gchar *prefix[] = {"T", "G", "M", "k", "Ti", "Gi", "Mi", "Ki"}; + static const gchar *prefix[] = {" T", " G", " M", " k", " Ti", " Gi", " Mi", " Ki"}; gchar *ret_val; + if (thousands_grouping_fmt == NULL) + test_printf_thousands_grouping(); + if ((flags & FORMAT_SIZE_PFX_MASK) == format_size_prefix_iec) { pfx_off = 4; power = 1024; } -DIAG_OFF(format) if (size / power / power / power / power >= 10) { - g_string_printf(human_str, "%" GROUP_FLAG G_GINT64_MODIFIER "d %s", size / power / power / power / power, prefix[pfx_off]); + g_string_printf(human_str, thousands_grouping_fmt, size / power / power / power / power); + g_string_append(human_str, prefix[pfx_off]); } else if (size / power / power / power >= 10) { - g_string_printf(human_str, "%" GROUP_FLAG G_GINT64_MODIFIER "d %s", size / power / power / power, prefix[pfx_off+1]); + g_string_printf(human_str, thousands_grouping_fmt, size / power / power / power); + g_string_append(human_str, prefix[pfx_off+1]); } else if (size / power / power >= 10) { - g_string_printf(human_str, "%" GROUP_FLAG G_GINT64_MODIFIER "d %s", size / power / power, prefix[pfx_off+2]); + g_string_printf(human_str, thousands_grouping_fmt, size / power / power); + g_string_append(human_str, prefix[pfx_off+2]); } else if (size / power >= 10) { - g_string_printf(human_str, "%" GROUP_FLAG G_GINT64_MODIFIER "d %s", size / power, prefix[pfx_off+3]); + g_string_printf(human_str, thousands_grouping_fmt, size / power); + g_string_append(human_str, prefix[pfx_off+3]); } else { - g_string_printf(human_str, "%" GROUP_FLAG G_GINT64_MODIFIER "d", size); + g_string_printf(human_str, thousands_grouping_fmt, size); is_small = TRUE; } -DIAG_ON(format) + switch (flags & FORMAT_SIZE_UNIT_MASK) { case format_size_unit_none: |