aboutsummaryrefslogtreecommitdiff
path: root/dep/src/g3dlite/format.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dep/src/g3dlite/format.cpp')
-rw-r--r--dep/src/g3dlite/format.cpp46
1 files changed, 0 insertions, 46 deletions
diff --git a/dep/src/g3dlite/format.cpp b/dep/src/g3dlite/format.cpp
index 13f01e26e6b..276bf4dcee1 100644
--- a/dep/src/g3dlite/format.cpp
+++ b/dep/src/g3dlite/format.cpp
@@ -1,16 +1,12 @@
/**
@file format.cpp
-
@author Morgan McGuire, graphics3d.com
-
@created 2000-09-09
@edited 2006-04-30
*/
-
#include "G3D/format.h"
#include "G3D/platform.h"
#include "G3D/System.h"
-
#ifdef G3D_WIN32
#include <math.h>
#define vsnprintf _vsnprintf
@@ -19,27 +15,21 @@
#include <stdarg.h>
#define NEWLINE "\n"
#endif
-
#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 G3D {
-
std::string format(const char* fmt,...) {
va_list argList;
va_start(argList,fmt);
std::string result = vformat(fmt, argList);
va_end(argList);
-
return result;
}
-
#if defined(G3D_WIN32) && (_MSC_VER >= 1300)
// Both MSVC6 and 7 seem to use the non-standard vsnprintf
// so we are using vscprintf to determine buffer size, however
@@ -47,22 +37,16 @@ std::string format(const char* fmt,...) {
std::string vformat(const char *fmt, va_list argPtr) {
// 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 bufSize = 161;
char stackBuffer[bufSize];
-
int actualSize = _vscprintf(fmt, argPtr) + 1;
-
if (actualSize > bufSize) {
-
// Now use the heap.
char* heapBuffer = NULL;
-
if (actualSize < maxSize) {
-
heapBuffer = (char*)System::malloc(maxSize + 1);
vsnprintf(heapBuffer, maxSize, fmt, argPtr);
heapBuffer[maxSize] = '\0';
@@ -70,59 +54,43 @@ std::string vformat(const char *fmt, va_list argPtr) {
heapBuffer = (char*)System::malloc(actualSize);
vsprintf(heapBuffer, fmt, argPtr);
}
-
std::string formattedString(heapBuffer);
System::free(heapBuffer);
return formattedString;
} else {
-
vsprintf(stackBuffer, fmt, argPtr);
return std::string(stackBuffer);
}
}
-
#elif defined(G3D_WIN32) && (_MSC_VER < 1300)
-
std::string vformat(const char *fmt, va_list argPtr) {
// 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 bufSize = 161;
char stackBuffer[bufSize];
-
int actualWritten = vsnprintf(stackBuffer, bufSize, fmt, argPtr);
-
// Not a big enough buffer, bufSize characters written
if (actualWritten == -1) {
-
int heapSize = 512;
double powSize = 1.0;
char* heapBuffer = (char*)System::malloc(heapSize);
-
while ((vsnprintf(heapBuffer, heapSize, fmt, argPtr) == -1) &&
(heapSize < maxSize)) {
-
heapSize = iCeil(heapSize * ::pow((double)2.0, powSize++));
heapBuffer = (char*)System::realloc(heapBuffer, heapSize);
}
-
heapBuffer[heapSize-1] = '\0';
-
std::string heapString(heapBuffer);
System::free(heapBuffer);
-
return heapString;
} else {
-
return std::string(stackBuffer);
}
}
-
#else
-
// glibc 2.1 has been updated to the C99 standard
std::string vformat(const char* fmt, va_list argPtr) {
// If the string is less than 161 characters,
@@ -132,41 +100,27 @@ std::string vformat(const char* fmt, va_list argPtr) {
// console (plus the null terminator).
const int bufSize = 161;
char stackBuffer[bufSize];
-
int numChars = vsnprintf(stackBuffer, bufSize, fmt, argPtr);
-
if (numChars >= bufSize) {
// We didn't allocate a big enough string.
char* heapBuffer = (char*)System::malloc((numChars + 1) * sizeof(char));
-
assert(heapBuffer);
int numChars2 = vsnprintf(heapBuffer, numChars + 1, fmt, argPtr);
assert(numChars2 == numChars);
-
std::string result(heapBuffer);
-
System::free(heapBuffer);
-
return result;
-
} else {
-
return std::string(stackBuffer);
-
}
}
-
#endif
-
} // namespace
-
#ifdef G3D_WIN32
# undef vsnprintf
#endif
-
#ifdef _MSC_VER
# pragma warning (pop)
#endif
-
#undef NEWLINE