我的同事修改tinyxml2源代码以处理wchar(tinyxml2.2.0版本),这是下面的代码,实际上该代码只能在liunx中运行,因此Windows部分不用担心。 我同事写的代码下面,/ ** /之间的注释是我的正确想法。
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 );
}
检查代码并告诉我的同事,他说它运行良好。如何证明它,上面的代码还有其他问题?