aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2017-10-23 19:00:27 +0100
committerJoão Valverde <j@v6e.pt>2017-10-24 22:00:46 +0000
commite1ef8e5f7555a1608d0cddde6c824c5a897f6e58 (patch)
tree9da653772c2ba7d97ac17385597811bd86aa3f06 /wsutil
parent08a490328387eafb7f9d20293a2a5e97e6cf4268 (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.c42
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: