//
// CvWStringBuffer
//
void CvWStringBuffer::append(const char *s)
{
if (s) {
int len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s, -1, NULL, 0);
if (len > 1) /*include null*/
{
ensureCapacity(m_iLength + len);
//append wchar data
len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, s, -1, m_pBuffer + m_iLength, len);
if(len > 1) {
m_iLength += len - 1;
}
}
}
}
bool CvWStringBuffer::appendfmt(const wchar * fmt, ...)
{
int len = 0;
if(fmt != NULL) {
va_list args;
va_start(args, fmt);
len = _vscwprintf(fmt, args);
if(len > 0) {
ensureCapacity(m_iLength + len + 1/*null*/);
len = _vsnwprintf(m_pBuffer + m_iLength, len + 1/*null*/, fmt, args);
if( len > 0 ) {
m_iLength += len;
m_pBuffer[m_iLength] = 0; // confirm null terminate
}
}
va_end(args);
}
return (len >= 0);
}
//
// CvWString
//
bool CvWString::formatv(CvWString& out, const wchar * fmt, va_list args)
{
int len = 0;
if(fmt != NULL) {
len = _vscwprintf(fmt, args);
if(len > 0) {
out.reserve(len);
len = _vsnwprintf(const_cast<wchar *>( out.c_str() ), len, fmt, args);
if( len > 0 )
out._Eos(len);
}
}
if( len <= 0 ) out.clear();
return (len >= 0);
}
class CvWString::format : public CvWString
{
public:
format(const wchar* fmt, ...) : CvWString()
{
va_list args;
va_start(args, fmt);
formatv(*this, fmt, args);
va_end(args);
}
~format() { };
private:
format() { };
};
// From (original)
szHelpText.append( CvWString::format(L"<link=literal>%s</link> (%d)", GC.getCivicInfo(eTargetCivic).getDescription(), iAttitudeChange ));
// To (improved)
szHelpText.appendfmt( L"<link=literal>%s</link> (%d)", GC.getCivicInfo(eTargetCivic).getDescription(), iAttitudeChange );