From c65b715e3ae9ad34b5684b03fa62e5d6e9b17f0c Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Tue, 22 Jan 2013 00:48:46 +0000 Subject: [PATCH] core: implement String::Printf() for va_list arguments. --- src/base/string.cpp | 31 ++++++++++++++++++++++++------- src/lol/base/string.h | 2 ++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/base/string.cpp b/src/base/string.cpp index 0e1c4aed..151bb7ad 100644 --- a/src/base/string.cpp +++ b/src/base/string.cpp @@ -27,27 +27,44 @@ namespace lol { String String::Printf(char const *format, ...) +{ + String ret; + + va_list ap; + va_start(ap, format); + ret = String::Printf(format, ap); + va_end(ap); + + return ret; +} + +String String::Printf(char const *format, va_list ap) { #if defined __CELLOS_LV2__ using std::vsnprintf; #endif String ret; - va_list ap; + + /* Visual Studio 2010 does not support it va_copy. */ +#if defined _MSC_VER +# undef va_copy +# define va_copy(dst, src) (dst = src) +#endif + va_list ap2; + va_copy(ap2, ap); +#if defined _MSC_VER +# undef va_copy +#endif /* vsnprintf() tells us how many character we need, and we need to * add one for the terminating null byte. */ - va_start(ap, format); - size_t needed = vsnprintf(NULL, 0, format, ap) + 1; - va_end(ap); + size_t needed = vsnprintf(NULL, 0, format, ap2) + 1; ((Super &)ret).Reserve(needed); ret.m_count = needed; - /* We don’t use va_copy because Visual Studio 2010 does not support it. */ - va_start(ap, format); vsnprintf(&ret[0], needed, format, ap); - va_end(ap); return ret; } diff --git a/src/lol/base/string.h b/src/lol/base/string.h index d879047f..0cc06346 100644 --- a/src/lol/base/string.h +++ b/src/lol/base/string.h @@ -20,6 +20,7 @@ #include #include +#include namespace lol { @@ -140,6 +141,7 @@ public: #endif static String Printf(char const *format, ...) LOL_FMT_ATTR(1, 2); #undef LOL_FMT_ATTR + static String Printf(char const *format, va_list ap); }; } /* namespace lol */