mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-04 20:57:49 +00:00
GEEKING
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
#include "RbxFormat.h"
|
||||
#include "RbxPlatform.h"
|
||||
#include "FastLog.h"
|
||||
|
||||
#include <math.h>
|
||||
#include "boost/scoped_array.hpp"
|
||||
|
||||
#define NEWLINE "\r\n"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// disable: "C++ exception handler used"
|
||||
# pragma warning (push)
|
||||
# pragma warning (disable : 4530)
|
||||
#endif // _MSC_VER
|
||||
|
||||
// If your platform does not have vsnprintf, you can find a
|
||||
// implementation at http://www.ijs.si/software/snprintf/
|
||||
|
||||
namespace RBX {
|
||||
|
||||
std::runtime_error runtime_error(const char* fmt,...) {
|
||||
va_list argList;
|
||||
va_start(argList,fmt);
|
||||
std::string result = vformat(fmt, argList);
|
||||
va_end(argList);
|
||||
|
||||
return std::runtime_error(result);
|
||||
}
|
||||
|
||||
std::string format(const char* fmt,...) {
|
||||
va_list argList;
|
||||
va_start(argList,fmt);
|
||||
std::string result = vformat(fmt, argList);
|
||||
va_end(argList);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::string vformat(const char *fmt, va_list argPtr) {
|
||||
|
||||
if (!fmt)
|
||||
return "";
|
||||
|
||||
// We draw the line at a 1MB string.
|
||||
const int maxSize = 1000000;
|
||||
|
||||
// If the string is less than 161 characters,
|
||||
// allocate it on the stack because this saves
|
||||
// the malloc/free time.
|
||||
const int stackBufferSize = 161;
|
||||
|
||||
#ifdef _WIN32
|
||||
int actualSize = _vscprintf(fmt, argPtr);
|
||||
if (actualSize < stackBufferSize) {
|
||||
char stackBuffer[stackBufferSize];
|
||||
vsnprintf_s(stackBuffer, stackBufferSize, stackBufferSize, fmt, argPtr);
|
||||
return std::string(stackBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use the heap.
|
||||
boost::scoped_array<char> heapBuffer;
|
||||
|
||||
if (actualSize > maxSize)
|
||||
actualSize = maxSize;
|
||||
|
||||
heapBuffer.reset(new char[actualSize+1]);
|
||||
vsnprintf_s(heapBuffer.get(), actualSize+1, actualSize, fmt, argPtr);
|
||||
|
||||
std::string result(heapBuffer.get());
|
||||
return result;
|
||||
}
|
||||
#else
|
||||
char stackBuffer[stackBufferSize];
|
||||
int actualSize = vsnprintf(stackBuffer, stackBufferSize, fmt, argPtr);
|
||||
if (actualSize < stackBufferSize)
|
||||
return stackBuffer;
|
||||
|
||||
// Use the heap.
|
||||
if (actualSize > maxSize)
|
||||
actualSize = maxSize;
|
||||
|
||||
boost::scoped_array<char> heapBuffer(new char[actualSize + 1]);
|
||||
vsnprintf(heapBuffer.get(), actualSize + 1, fmt, argPtr);
|
||||
heapBuffer[actualSize] = '\0';
|
||||
|
||||
std::string result(heapBuffer.get());
|
||||
return result;
|
||||
#endif
|
||||
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# pragma warning (pop)
|
||||
#endif
|
||||
|
||||
#undef NEWLINE
|
||||
Reference in New Issue
Block a user