My colleague modify the tinyxml2 source code to deal with wchar(tinyxml2.2.0 version),Here is the code bellow,actually the code will only run in liunx,so the windows part should not concern. The code bellow whichi my colleague write,the comment between /**/ is the right way I think.
void XMLPrinter::Print( const wchar_t* format, ... )
{
va_list va;
va_start( va, format );
wchar_t buf[MAX_PATH*30] ={0};
vswprintf( buf,MAX_PATH*30,format,va);
char * pText = NULL;
int iTextLen = wcstombs(NULL, buf , 0);
pText = new char[iTextLen + 1];
if (pText == NULL)
{
return ;
}
memset( ( void* )pText, 0, sizeof( char ) * ( iTextLen + 1 ) );
/*for a safe way ,should be sizeof(pText) instead of sizeof(buf)*/
wcstombs(pText, buf, sizeof(buf));
if ( _fp ) {
/*Here I think should be fwrite( pText , iTextLen , 1 , _fp ); */
fwrite( pText , iTextLen-1 , 1 , _fp );
}
else {
#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
#if defined(WINCE)
int len = 512;
do {
len = len*2;
wchar_t* str = new wchar_t[len]();
len = _vsnprintf(str, len, format, va);
delete[] str;
}while (len < 0);
#else
int len = _vscwprintf( format, va );
#endif
#else
int len = vswprintf( 0, 0, format, va );
#endif
// Close out and re-start the va-args
va_end( va );
va_start( va, format );
TIXMLASSERT( _buffer.Size() > 0 && _buffer[_buffer.Size() - 1] == 0 );
/*Here should be _buffer.PushArr( len ) - sizeof(wchar_t);*/
wchar_t* p = _buffer.PushArr( len ) - 1; // back up over the null terminator.
#if defined(_MSC_VER) && (_MSC_VER >= 1400 )
#if defined(WINCE)
_vsnprintf( p, len+1, format, va );
#else
_vsnwprintf_s( p, len+1, _TRUNCATE, format, va );
#endif
#else
vswprintf( p, len+1, format, va );
#endif
}
delete[] pText;
va_end( va );
}
Review the code and told my colleague,he said it run well.How can I prove it,and the code above has other problem?