Listing 5

inline int vstrprintf(string* pString, const char* pFmt, va_list args)
{
    // prologue
    static const size_t ChunkSize = 1024;
    int retval = 0;
    // get local work buffer
    size_t nBufSize = 0;
    char* pBuf = 0;
    // format up string
    int i = -1;
    for( ; i == -1; )
    {
        // realloc local buffer
        if( pBuf )
            delete pBuf;
        pBuf = new char[nBufSize+=ChunkSize];
        // try to sprintf
        i = _vsnprintf(pBuf,nBufSize,pFmt,args);
    }
    retval = i;
   // epilogue
    pString->assign(pBuf,retval);
    delete pBuf;
    return retval;
};
inline int strprintf(string* pString, const char * pFmt, ...)
{
    va_list args;
    va_start(args, pFmt);
    int retval = vstrprintf(pString, pFmt, args);
    va_end(args);
    return retval;
}