tinyxml2支持wchar,重写功能打印

时间:2019-01-22 06:24:13

标签: c tinyxml2

我的同事修改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 );
}

检查代码并告诉我的同事,他说它运行良好。如何证明它,上面的代码还有其他问题?

0 个答案:

没有答案