From 855409c57d160e03ccd9e6a663884362a777b076 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 18 Sep 2015 15:27:50 +0200 Subject: [PATCH] Use C99 standard PRI*64 for printing 64 bit integers Use the standard C99 PRI*64 macros instead of checking for specific GNU libc version. We also specifically check for windows which does not have proper C99 support. This fixes printing of int64 on non-GNU 32 bit systems (like musl libc). Bug: https://bugs.freedesktop.org/show_bug.cgi?id=92043 --- configure.ac | 39 -------------------------------------- dbus/dbus-marshal-basic.c | 8 +++++--- dbus/dbus-marshal-recursive-util.c | 8 +++++--- tools/dbus-print-message.c | 21 ++++++++++---------- 4 files changed, 21 insertions(+), 55 deletions(-) diff --git a/configure.ac b/configure.ac index 529e960..4c1fe5b 100644 --- a/configure.ac +++ b/configure.ac @@ -337,31 +337,6 @@ if test x$enable_compiler_coverage = xyes; then AC_DEFINE_UNQUOTED(DBUS_GCOV_ENABLED, 1, [Defined if gcov is enabled to force a rebuild due to config.h changing]) fi -# glibc21.m4 serial 3 -dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -# Test for the GNU C Library, version 2.1 or newer. -# From Bruno Haible. - -AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, - ac_cv_gnu_library_2_1, - [AC_EGREP_CPP([Lucky GNU user], - [ -#include -#ifdef __GNU_LIBRARY__ - #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) - Lucky GNU user - #endif -#endif - ], - ac_cv_gnu_library_2_1=yes, - ac_cv_gnu_library_2_1=no) - ] -) - #### Integer sizes AC_CHECK_SIZEOF(char) @@ -380,32 +355,21 @@ $ac_cv_sizeof_int) dbusint64=int dbusint64_constant='(val)' dbusuint64_constant='(val)' - dbusint64_printf_modifier='""' ;; $ac_cv_sizeof_long) dbusint64=long dbusint64_constant='(val##L)' dbusuint64_constant='(val##UL)' - dbusint64_printf_modifier='"l"' ;; $ac_cv_sizeof_long_long) dbusint64='long long' dbusint64_constant='(val##LL)' dbusuint64_constant='(val##ULL)' - # Ideally we discover what the format is, but this is - # only used in verbose mode, so eh... - if test x"$ac_cv_gnu_library_2_1" = xyes; then - dbusint64_printf_modifier='"ll"' - fi ;; $ac_cv_sizeof___int64) dbusint64=__int64 dbusint64_constant='(val##i64)' dbusuint64_constant='(val##ui64)' - # See above case - if test x"$ac_cv_gnu_library_2_1" = xyes; then - dbusint64_printf_modifier='"ll"' - fi ;; esac @@ -423,9 +387,6 @@ Please report a bug here with details of your platform and compiler: DBUS_INT64_TYPE="$dbusint64" DBUS_INT64_CONSTANT="$dbusint64_constant" DBUS_UINT64_CONSTANT="$dbusuint64_constant" - if test x"$dbusint64_printf_modifier" != x; then - AC_DEFINE_UNQUOTED(DBUS_INT64_PRINTF_MODIFIER, [$dbusint64_printf_modifier], [Define to printf modifier for 64 bit integer type]) - fi AC_MSG_RESULT($DBUS_INT64_TYPE) ]) diff --git a/dbus/dbus-marshal-basic.c b/dbus/dbus-marshal-basic.c index 74fe3f9..9315b6e 100644 --- a/dbus/dbus-marshal-basic.c +++ b/dbus/dbus-marshal-basic.c @@ -29,6 +29,10 @@ #include +#if !defined(PRIx64) && defined(DBUS_WIN) +#define PRIx64 "%I64x" +#endif + #if defined(__GNUC__) && (__GNUC__ >= 4) # define _DBUS_ASSERT_ALIGNMENT(type, op, val) \ _DBUS_STATIC_ASSERT (__extension__ __alignof__ (type) op val) @@ -1334,10 +1338,8 @@ _dbus_verbose_bytes (const unsigned char *data, if (i > 7 && _DBUS_ALIGN_ADDRESS (&data[i], 8) == &data[i]) { -#ifdef DBUS_INT64_PRINTF_MODIFIER - _dbus_verbose (" u64: 0x%" DBUS_INT64_PRINTF_MODIFIER "x", + _dbus_verbose (" u64: 0x%" PRIx64, *(dbus_uint64_t*)&data[i-8]); -#endif _dbus_verbose (" dbl: %g", *(double*)&data[i-8]); } diff --git a/dbus/dbus-marshal-recursive-util.c b/dbus/dbus-marshal-recursive-util.c index 3bc26a8..4d57f49 100644 --- a/dbus/dbus-marshal-recursive-util.c +++ b/dbus/dbus-marshal-recursive-util.c @@ -31,6 +31,10 @@ #include "dbus-internals.h" #include +#if !defined(PRIx64) && defined(DBUS_WIN) +#define PRIx64 "%I64x" +#endif + static void basic_value_zero (DBusBasicValue *value) { @@ -2644,12 +2648,10 @@ double_read_value (TestTypeNode *node, if (!_DBUS_DOUBLES_BITWISE_EQUAL (v, expected)) { -#ifdef DBUS_INT64_PRINTF_MODIFIER - _dbus_warn ("Expected double %g got %g\n bits = 0x%" DBUS_INT64_PRINTF_MODIFIER "x vs.\n bits = 0x%" DBUS_INT64_PRINTF_MODIFIER "x)\n", + _dbus_warn ("Expected double %g got %g\n bits = 0x%" PRIx64 " vs.\n bits = 0x%" PRIx64 ")\n", expected, v, *(dbus_uint64_t*)(char*)&expected, *(dbus_uint64_t*)(char*)&v); -#endif _dbus_assert_not_reached ("test failed"); } diff --git a/tools/dbus-print-message.c b/tools/dbus-print-message.c index 80c9698..04b817e 100644 --- a/tools/dbus-print-message.c +++ b/tools/dbus-print-message.c @@ -39,6 +39,15 @@ #include "tool-common.h" +#if defined(DBUS_WIN) +#if !defined(PRId64) +#define PRId64 "%I64d" +#endif +#if !defined(PRIu64) +#define PRIu64 "%I64u" +#endif +#endif + static const char* type_to_name (int message_type) { @@ -384,11 +393,7 @@ print_iter (DBusMessageIter *iter, dbus_bool_t literal, int depth) { dbus_int64_t val; dbus_message_iter_get_basic (iter, &val); -#ifdef DBUS_INT64_PRINTF_MODIFIER - printf ("int64 %" DBUS_INT64_PRINTF_MODIFIER "d\n", val); -#else - printf ("int64 (omitted)\n"); -#endif + printf ("int64 %" PRId64 "\n", val); break; } @@ -396,11 +401,7 @@ print_iter (DBusMessageIter *iter, dbus_bool_t literal, int depth) { dbus_uint64_t val; dbus_message_iter_get_basic (iter, &val); -#ifdef DBUS_INT64_PRINTF_MODIFIER - printf ("uint64 %" DBUS_INT64_PRINTF_MODIFIER "u\n", val); -#else - printf ("uint64 (omitted)\n"); -#endif + printf ("uint64 %" PRIu64 "\n", val); break; } -- 2.5.3