tinyxml2 для поддержки функции wchar , rewrite Печать - PullRequest
0 голосов
/ 22 января 2019

Мой коллега изменил исходный код 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 );
}

Просмотрите код и сказали моему коллеге, что он работает хорошо. Как я могу доказать это?, а у кода выше есть другая проблема?

...