From 2a65c24f74c9cd74d7564fadc470e37cbbaedbec Mon Sep 17 00:00:00 2001 From: David Capello Date: Sat, 3 Jul 2010 13:30:06 -0300 Subject: [PATCH] Added Vaca::format_string() for std::string. --- third_party/vaca/include/Vaca/String.h | 3 +- third_party/vaca/src/String.cpp | 41 +++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/third_party/vaca/include/Vaca/String.h b/third_party/vaca/include/Vaca/String.h index 614ca0938..b1433d175 100644 --- a/third_party/vaca/include/Vaca/String.h +++ b/third_party/vaca/include/Vaca/String.h @@ -46,7 +46,8 @@ namespace Vaca { // UTILITARY // ============================================================ - VACA_DLL String format_string(const Char* fmt, ...); + VACA_DLL std::string format_string(const char* fmt, ...); + VACA_DLL std::wstring format_string(const wchar_t* fmt, ...); VACA_DLL String trim_string(const String& str); VACA_DLL String trim_string(const Char* str); diff --git a/third_party/vaca/src/String.cpp b/third_party/vaca/src/String.cpp index 6215226ab..0d496ad70 100644 --- a/third_party/vaca/src/String.cpp +++ b/third_party/vaca/src/String.cpp @@ -44,13 +44,46 @@ using namespace Vaca; -String Vaca::format_string(const Char* fmt, ...) +std::string Vaca::format_string(const char* fmt, ...) { - std::auto_ptr buf; + std::auto_ptr buf; int size = 512; while (true) { - buf = std::auto_ptr(new Char[size <<= 1]); + buf = std::auto_ptr(new char[size <<= 1]); + + va_list ap; + va_start(ap, fmt); + #if defined(VACA_ON_WINDOWS) + int written = _vsnprintf(buf.get(), size, fmt, ap); + #elif defined(VACA_ON_UNIXLIKE) + int written = vsprintf(buf.get(), size, fmt, ap); + #else + #error Implement this in your platform + #endif + va_end(ap); + + if (written == size) { + if (buf.get()[size] == 0) + break; + } + else if (written >= 0 && written < size) { + assert(buf.get()[written] == 0); + break; + } + // else continue growing the buffer... + } + + return std::string(buf.get()); +} + +std::wstring Vaca::format_string(const wchar_t* fmt, ...) +{ + std::auto_ptr buf; + int size = 512; + + while (true) { + buf = std::auto_ptr(new wchar_t[size <<= 1]); va_list ap; va_start(ap, fmt); @@ -74,7 +107,7 @@ String Vaca::format_string(const Char* fmt, ...) // else continue growing the buffer... } - return String(buf.get()); + return std::wstring(buf.get()); } String Vaca::trim_string(const String& str)