Skip to content

Commit 5ce4361

Browse files
committed
Merge pull request #3244 from laanwj/2013_11_mingw_c99_printf
Use C99 printf statements in mingw
2 parents 194aa6c + c82788e commit 5ce4361

File tree

4 files changed

+36
-26
lines changed

4 files changed

+36
-26
lines changed

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ case $host in
221221
AC_MSG_ERROR("windres not found")
222222
fi
223223

224-
CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB"
224+
CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -D__USE_MINGW_ANSI_STDIO"
225225
LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE"
226226
CXXFLAGS="$CXXFLAGS -w"
227227
;;

src/test/util_tests.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,31 @@ BOOST_AUTO_TEST_CASE(util_TimingResistantEqual)
303303
BOOST_CHECK(!TimingResistantEqual(std::string("abc"), std::string("aba")));
304304
}
305305

306+
/* Test strprintf formatting directives.
307+
* Put a string before and after to ensure sanity of element sizes on stack. */
308+
#define B "check_prefix"
309+
#define E "check_postfix"
310+
BOOST_AUTO_TEST_CASE(strprintf_numbers)
311+
{
312+
int64_t s64t = -9223372036854775807LL; /* signed 64 bit test value */
313+
uint64_t u64t = 18446744073709551615ULL; /* unsigned 64 bit test value */
314+
BOOST_CHECK(strprintf("%s %"PRId64" %s", B, s64t, E) == B" -9223372036854775807 "E);
315+
BOOST_CHECK(strprintf("%s %"PRIu64" %s", B, u64t, E) == B" 18446744073709551615 "E);
316+
BOOST_CHECK(strprintf("%s %"PRIx64" %s", B, u64t, E) == B" ffffffffffffffff "E);
317+
318+
size_t st = 12345678; /* unsigned size_t test value */
319+
ssize_t sst = -12345678; /* signed size_t test value */
320+
BOOST_CHECK(strprintf("%s %"PRIszd" %s", B, sst, E) == B" -12345678 "E);
321+
BOOST_CHECK(strprintf("%s %"PRIszu" %s", B, st, E) == B" 12345678 "E);
322+
BOOST_CHECK(strprintf("%s %"PRIszx" %s", B, st, E) == B" bc614e "E);
323+
324+
ptrdiff_t pt = 87654321; /* positive ptrdiff_t test value */
325+
ptrdiff_t spt = -87654321; /* negative ptrdiff_t test value */
326+
BOOST_CHECK(strprintf("%s %"PRIpdd" %s", B, spt, E) == B" -87654321 "E);
327+
BOOST_CHECK(strprintf("%s %"PRIpdu" %s", B, pt, E) == B" 87654321 "E);
328+
BOOST_CHECK(strprintf("%s %"PRIpdx" %s", B, pt, E) == B" 5397fb1 "E);
329+
}
330+
#undef B
331+
#undef E
332+
306333
BOOST_AUTO_TEST_SUITE_END()

src/util.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,11 +336,7 @@ string vstrprintf(const char *format, va_list ap)
336336
{
337337
va_list arg_ptr;
338338
va_copy(arg_ptr, ap);
339-
#ifdef WIN32
340-
ret = _vsnprintf(p, limit, format, arg_ptr);
341-
#else
342339
ret = vsnprintf(p, limit, format, arg_ptr);
343-
#endif
344340
va_end(arg_ptr);
345341
if (ret >= 0 && ret < limit)
346342
break;

src/util.h

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,13 @@ static const int64_t CENT = 1000000;
4444
#define UEND(a) ((unsigned char*)&((&(a))[1]))
4545
#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0]))
4646

47-
/* Format characters for (s)size_t and ptrdiff_t */
48-
#if defined(_MSC_VER) || defined(__MSVCRT__)
49-
/* (s)size_t and ptrdiff_t have the same size specifier in MSVC:
50-
http://msdn.microsoft.com/en-us/library/tcxf1dw6%28v=vs.100%29.aspx
51-
*/
52-
#define PRIszx "Ix"
53-
#define PRIszu "Iu"
54-
#define PRIszd "Id"
55-
#define PRIpdx "Ix"
56-
#define PRIpdu "Iu"
57-
#define PRIpdd "Id"
58-
#else /* C99 standard */
59-
#define PRIszx "zx"
60-
#define PRIszu "zu"
61-
#define PRIszd "zd"
62-
#define PRIpdx "tx"
63-
#define PRIpdu "tu"
64-
#define PRIpdd "td"
65-
#endif
66-
47+
/* Format characters for (s)size_t and ptrdiff_t (C99 standard) */
48+
#define PRIszx "zx"
49+
#define PRIszu "zu"
50+
#define PRIszd "zd"
51+
#define PRIpdx "tx"
52+
#define PRIpdu "tu"
53+
#define PRIpdd "td"
6754

6855
// This is needed because the foreach macro can't get over the comma in pair<t1, t2>
6956
#define PAIRTYPE(t1, t2) std::pair<t1, t2>
@@ -117,7 +104,7 @@ inline void MilliSleep(int64_t n)
117104
* Parameters count from 1.
118105
*/
119106
#ifdef __GNUC__
120-
#define ATTR_WARN_PRINTF(X,Y) __attribute__((format(printf,X,Y)))
107+
#define ATTR_WARN_PRINTF(X,Y) __attribute__((format(gnu_printf,X,Y)))
121108
#else
122109
#define ATTR_WARN_PRINTF(X,Y)
123110
#endif

0 commit comments

Comments
 (0)