0

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?

J.Doe
  • 319
  • 1
  • 8
  • 1
    For ***working*** code that you want a review on, then post on [the Code Review Stack Exchange site](https://codereview.stackexchange.com/tour). If you're not sure it's working then please do that first. And please read [the help pages](http://stackoverflow.com/help), take [the SO tour](http://stackoverflow.com/tour), read about [how to ask good questions](http://stackoverflow.com/help/how-to-ask), as well as [this question checklist](https://codeblog.jonskeet.uk/2012/11/24/stack-overflow-question-checklist/). – Some programmer dude Jan 22 '19 at 06:32
  • 1
    As for your second part, when doing pointer arithmetics every increment or decrement changes the pointer based on the data type. So -1 is not decrementing the pointer by one but by `sizeof *variable`, which in this case is `sizeof wchar_t`. – Sami Kuhmonen Jan 22 '19 at 06:43
  • @SamiKuhmonen thanks,just not familar with the wchar_t, I don't know why his code runs well with -1 – J.Doe Jan 22 '19 at 06:48
  • @Someprogrammerdude thanks for point that,I will not post code review problem in SO.What should I do?Delete this question? – J.Doe Jan 22 '19 at 06:49
  • I think this question still suits here. I would suggest just editing it and making the questions more clear in text, not inside the code. That way it’s easier to see the exact questions, for example “why does this work when written like X instead of Y?” Then it’s not a code review, it’s about a specific thing in the code. – Sami Kuhmonen Jan 22 '19 at 07:14
  • @SamiKuhmonen thanks for your advice,I will rewrite the question to make it clear. – J.Doe Jan 22 '19 at 07:41

0 Answers0