1
0

StringUtils: SplitString() fix

git-svn-id: http://mc-server.googlecode.com/svn/trunk@212 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com 2012-02-01 09:33:37 +00:00
parent ced8e6f470
commit 35d89bc918

View File

@ -15,27 +15,46 @@ AString & AppendVPrintf(AString & str, const char *format, va_list args)
char buffer[2048]; char buffer[2048];
size_t len; 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) 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); str.append(buffer, len);
return str; 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); len = _vscprintf(format, args);
if (len == -1) if (len == -1)
{ {
return str; return str;
} }
#endif // _MSC_VER
// Allocate a buffer and printf into it:
std::auto_ptr<char> tmp(new char[len + 1]); std::auto_ptr<char> tmp(new char[len + 1]);
ASSERT(tmp.get() != NULL); // Why not alloced? Is the length reasonable? ASSERT(tmp.get() != NULL); // Why not alloced? Is the length reasonable?
if (tmp.get() == NULL) if (tmp.get() == NULL)
{ {
throw std::bad_alloc(); throw std::bad_alloc();
} }
#ifdef _MSC_VER
if ((len = vsprintf_s(tmp.get(), len + 1, format, args)) != -1) if ((len = vsprintf_s(tmp.get(), len + 1, format, args)) != -1)
{ {
str.append(tmp.get(), len); str.append(tmp.get(), len);
} }
ASSERT(len != -1); ASSERT(len != -1);
#else // _MSC_VER
vsnprintf(tmp.get(), len + 1, format, args);
str.append(tmp.get(), len);
#endif // else _MSC_VER
return str; return str;
} }
@ -79,7 +98,7 @@ AStringVector StringSplit(const AString & str, const AString & delim)
{ {
if (cutAt > 0) if (cutAt > 0)
{ {
results.push_back(str.substr(0, cutAt)); results.push_back(str.substr(Prev, cutAt - Prev));
} }
Prev = cutAt + delim.length(); Prev = cutAt + delim.length();
} }
@ -114,7 +133,7 @@ int NoCaseCompare(const AString & s1, const AString & s2)
{ {
#ifdef _MSC_VER #ifdef _MSC_VER
// MSVC has stricmp that compares case-insensitive: // MSVC has stricmp that compares case-insensitive:
return stricmp(s1.c_str(), s2.c_str()); return _stricmp(s1.c_str(), s2.c_str());
#else #else
// Do it the hard way: // Do it the hard way:
AString s1Copy(s1); AString s1Copy(s1);