From 35d89bc918b8299fd8c4b66ba5926bdb36e1fcba Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Wed, 1 Feb 2012 09:33:37 +0000 Subject: StringUtils: SplitString() fix git-svn-id: http://mc-server.googlecode.com/svn/trunk@212 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/StringUtils.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'source/StringUtils.cpp') diff --git a/source/StringUtils.cpp b/source/StringUtils.cpp index 7a9350ca8..94b4d3c0f 100644 --- a/source/StringUtils.cpp +++ b/source/StringUtils.cpp @@ -15,27 +15,46 @@ AString & AppendVPrintf(AString & str, const char *format, va_list args) char buffer[2048]; size_t len; + #ifdef _MSC_VER + // MS CRT provides secure printf that doesn't behave like in the C99 standard if ((len = _vsnprintf_s(buffer, ARRAYCOUNT(buffer), _TRUNCATE, format, args)) != -1) + #else // _MSC_VER + if ((len = vsnprintf(buffer, ARRAYCOUNT(buffer), format, args)) < ARRAYCOUNT(buffer)) + #endif // else _MSC_VER { + // The result did fit into the static buffer str.append(buffer, len); return str; } + + // The result did not fit into the static buffer + #ifdef _MSC_VER + // for MS CRT, we need to calculate the result length len = _vscprintf(format, args); if (len == -1) { return str; } + #endif // _MSC_VER + + // Allocate a buffer and printf into it: std::auto_ptr tmp(new char[len + 1]); ASSERT(tmp.get() != NULL); // Why not alloced? Is the length reasonable? if (tmp.get() == NULL) { throw std::bad_alloc(); } + #ifdef _MSC_VER if ((len = vsprintf_s(tmp.get(), len + 1, format, args)) != -1) { str.append(tmp.get(), len); } ASSERT(len != -1); + #else // _MSC_VER + vsnprintf(tmp.get(), len + 1, format, args); + str.append(tmp.get(), len); + #endif // else _MSC_VER + return str; } @@ -79,7 +98,7 @@ AStringVector StringSplit(const AString & str, const AString & delim) { if (cutAt > 0) { - results.push_back(str.substr(0, cutAt)); + results.push_back(str.substr(Prev, cutAt - Prev)); } Prev = cutAt + delim.length(); } @@ -114,7 +133,7 @@ int NoCaseCompare(const AString & s1, const AString & s2) { #ifdef _MSC_VER // MSVC has stricmp that compares case-insensitive: - return stricmp(s1.c_str(), s2.c_str()); + return _stricmp(s1.c_str(), s2.c_str()); #else // Do it the hard way: AString s1Copy(s1); -- cgit v1.2.3