Fixed vsnprintf compatibility with vc12 and vc14 (#18040)

* Fixed vsnprintf compatibility with vc12 and vc14

see reference: https://github.com/halx99/cocos2d-x/pull/30

* Update CCConsole.cpp

* Add comment.
This commit is contained in:
halx99 2017-07-10 10:30:49 +08:00 committed by minggo
parent 5dd81e758a
commit 18f173e3e6
1 changed files with 28 additions and 15 deletions

View File

@ -128,26 +128,39 @@ namespace {
{
int bufferSize = MAX_LOG_LENGTH;
char* buf = nullptr;
int nret = 0;
do
{
buf = new (std::nothrow) char[bufferSize];
if (buf == nullptr)
return; // not enough memory
int ret = vsnprintf(buf, bufferSize - 3, format, args);
if (ret < 0)
{
bufferSize *= 2;
delete [] buf;
return;
/*
pitfall: The behavior of vsnprintf between VS2013 and VS2015/2017 is different
VS2013 or Unix-Like System will return -1 when buffer not enough, but VS2015/2017 will return the actural needed length for buffer at this station
The _vsnprintf behavior is compatible API which always return -1 when buffer isn't enough at VS2013/2015/2017
Yes, The vsnprintf is more efficient implemented by MSVC 19.0 or later, AND it's also standard-compliant, see reference: http://www.cplusplus.com/reference/cstdio/vsnprintf/
*/
nret = vsnprintf(buf, bufferSize - 3, format, args);
if (nret >= 0)
{ // VS2015/2017
if (nret <= bufferSize - 3)
{// success, so don't need to realloc
break;
}
else
{
bufferSize = nret + 3;
delete[] buf;
}
}
else // < 0
{ // VS2013 or Unix-like System(GCC)
bufferSize *= 2;
delete[] buf;
}
else
break;
} while (true);
strcat(buf, "\n");
buf[nret] = '\n';
buf[++nret] = '\0';
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
__android_log_print(ANDROID_LOG_DEBUG, "cocos2d-x debug info", "%s", buf);
@ -155,7 +168,7 @@ namespace {
#elif CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT
int pos = 0;
int len = strlen(buf);
int len = nret;
char tempBuf[MAX_LOG_LENGTH + 1] = { 0 };
WCHAR wszBuf[MAX_LOG_LENGTH + 1] = { 0 };