fix the safe function behavior
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 9e92ae2..72c2dac 100644
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -24,7 +24,6 @@
#include "tinyxml2.h"
#if 1
- #include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <new>
@@ -998,7 +997,7 @@
void XMLAttribute::SetAttribute( int v )
{
char buf[BUF_SIZE];
- TIXML_SNPRINTF( buf, BUF_SIZE-1, "%d", v );
+ TIXML_SNPRINTF( buf, BUF_SIZE, "%d", v );
value.SetStr( buf );
}
@@ -1534,10 +1533,10 @@
int len = -1;
int expand = 1000;
while ( len < 0 ) {
- len = vsnprintf_s( accumulator.Mem(), accumulator.Capacity(), accumulator.Capacity()-1, format, va );
+ len = vsnprintf_s( accumulator.Mem(), accumulator.Capacity(), _TRUNCATE, format, va );
if ( len < 0 ) {
- accumulator.PushArr( expand );
expand *= 3/2;
+ accumulator.PushArr( expand );
}
}
char* p = buffer.PushArr( len ) - 1;
diff --git a/tinyxml2.h b/tinyxml2.h
index bf00964..f9348ab 100644
--- a/tinyxml2.h
+++ b/tinyxml2.h
@@ -29,6 +29,7 @@
#include <climits>
#include <cstdio>
#include <cstring>
+ #include <cstdarg>
#else
// Not completely sure all the interesting systems
// can handle the new headers; can switch this if
@@ -70,27 +71,30 @@
#endif
-// Deprecated library function hell. Compilers want to use the
-// new safe versions. This probably doesn't fully address the problem,
-// but it gets closer. There are too many compilers for me to fully
-// test. If you get compilation troubles, undefine TIXML_SAFE
-
#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
// Microsoft visual studio, version 2005 and higher.
- #define TIXML_SNPRINTF _snprintf_s
+ /*int _snprintf_s(
+ char *buffer,
+ size_t sizeOfBuffer,
+ size_t count,
+ const char *format [,
+ argument] ...
+ );*/
+ inline int TIXML_SNPRINTF( char* buffer, size_t size, const char* format, ... ) {
+ va_list va;
+ va_start( va, format );
+ int result = vsnprintf_s( buffer, size, _TRUNCATE, format, va );
+ va_end( va );
+ return result;
+ }
#define TIXML_SSCANF sscanf_s
-#elif defined(_MSC_VER) && (_MSC_VER >= 1200 )
- // Microsoft visual studio, version 6 and higher.
- //#pragma message( "Using _sn* functions." )
- #define TIXML_SNPRINTF _snprintf
- #define TIXML_SSCANF sscanf
#elif defined(__GNUC__) && (__GNUC__ >= 3 )
// GCC version 3 and higher
//#warning( "Using sn* functions." )
#define TIXML_SNPRINTF snprintf
#define TIXML_SSCANF sscanf
#else
- #define TIXML_SNPRINTF snprintf
+ #define TIXML_SNPRINTF snprintf( buf, size, x ) snprintf( buf, size, x )
#define TIXML_SSCANF sscanf
#endif