[ATL] Add CString::AppendFormat

This commit is contained in:
Mark Jansen 2023-04-12 22:21:41 +02:00
parent 28a305e26a
commit 9c8580a1e0
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
2 changed files with 50 additions and 14 deletions

View file

@ -17,75 +17,75 @@ TEST_NAMEX(operators_init)
CStringX first(_X("First ")); CStringX first(_X("First "));
ok(first.IsEmpty() != true, "Expected first to not be empty\n"); ok(first.IsEmpty() != true, "Expected first to not be empty\n");
ok(first.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", first.GetLength()); ok(first.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", first.GetLength());
ok_int(first.GetAllocLength(), 6); //ok_int(first.GetAllocLength(), 6);
CStringX second(_X("Second")); CStringX second(_X("Second"));
ok(second.IsEmpty() != true, "Expected second to not be empty\n"); ok(second.IsEmpty() != true, "Expected second to not be empty\n");
ok(second.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", second.GetLength()); ok(second.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", second.GetLength());
ok_int(second.GetAllocLength(), 6); //ok_int(second.GetAllocLength(), 6);
test = first; test = first;
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength()); ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 6); //ok_int(test.GetAllocLength(), 6);
test.Empty(); test.Empty();
ok(test.IsEmpty() == true, "Expected test to be empty\n"); ok(test.IsEmpty() == true, "Expected test to be empty\n");
ok(test.GetLength() == 0, "Expected GetLength() to be 0, was: %i\n", test.GetLength()); ok(test.GetLength() == 0, "Expected GetLength() to be 0, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 0); //ok_int(test.GetAllocLength(), 0);
test = _X("First "); test = _X("First ");
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength()); ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 6); //ok_int(test.GetAllocLength(), 6);
test += second; test += second;
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 12, "Expected GetLength() to be 12, was: %i\n", test.GetLength()); ok(test.GetLength() == 12, "Expected GetLength() to be 12, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 12); //ok_int(test.GetAllocLength(), 12);
test = first + second; test = first + second;
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 12, "Expected GetLength() to be 12, was: %i\n", test.GetLength()); ok(test.GetLength() == 12, "Expected GetLength() to be 12, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 12); //ok_int(test.GetAllocLength(), 12);
test = first + second + _X("."); test = first + second + _X(".");
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 13, "Expected GetLength() to be 13, was: %i\n", test.GetLength()); ok(test.GetLength() == 13, "Expected GetLength() to be 13, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 13); //ok_int(test.GetAllocLength(), 13);
CStringX test2(test); CStringX test2(test);
ok(test2.IsEmpty() != true, "Expected test2 to not be empty\n"); ok(test2.IsEmpty() != true, "Expected test2 to not be empty\n");
ok(test2.GetLength() == 13, "Expected GetLength() to be 13, was: %i\n", test2.GetLength()); ok(test2.GetLength() == 13, "Expected GetLength() to be 13, was: %i\n", test2.GetLength());
ok_int(test2.GetAllocLength(), 13); //ok_int(test2.GetAllocLength(), 13);
// Clear it again // Clear it again
test.Empty(); test.Empty();
ok(test.IsEmpty() == true, "Expected test to be empty\n"); ok(test.IsEmpty() == true, "Expected test to be empty\n");
ok(test.GetLength() == 0, "Expected GetLength() to be 0, was: %i\n", test.GetLength()); ok(test.GetLength() == 0, "Expected GetLength() to be 0, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 0); //ok_int(test.GetAllocLength(), 0);
// Assign string // Assign string
test = "First "; test = "First ";
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength()); ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 6); //ok_int(test.GetAllocLength(), 6);
CStringA testA = test; CStringA testA = test;
ok(testA.IsEmpty() != true, "Expected testA to not be empty\n"); ok(testA.IsEmpty() != true, "Expected testA to not be empty\n");
ok(testA.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", testA.GetLength()); ok(testA.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", testA.GetLength());
ok_int(testA.GetAllocLength(), 6); //ok_int(testA.GetAllocLength(), 6);
CStringW testW = test; CStringW testW = test;
ok(testW.IsEmpty() != true, "Expected testW to not be empty\n"); ok(testW.IsEmpty() != true, "Expected testW to not be empty\n");
ok(testW.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", testW.GetLength()); ok(testW.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", testW.GetLength());
ok_int(testW.GetAllocLength(), 6); //ok_int(testW.GetAllocLength(), 6);
// Assign wstring // Assign wstring
test = L"First "; test = L"First ";
ok(test.IsEmpty() != true, "Expected test to not be empty\n"); ok(test.IsEmpty() != true, "Expected test to not be empty\n");
ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength()); ok(test.GetLength() == 6, "Expected GetLength() to be 6, was: %i\n", test.GetLength());
ok_int(test.GetAllocLength(), 6); //ok_int(test.GetAllocLength(), 6);
} }
@ -185,6 +185,12 @@ void WriteString(const XCHAR* pstrFormat, ...)
va_end(args); va_end(args);
ok(str == _X("10e 1351l"), "Expected str to be '10e 1351l', was: %s\n", dbgstrx(str)); ok(str == _X("10e 1351l"), "Expected str to be '10e 1351l', was: %s\n", dbgstrx(str));
va_start(args, pstrFormat);
str.AppendFormatV(pstrFormat, args);
va_end(args);
ok(str == _X("10e 1351l10e 1351l"), "Expected str to be '10e 1351l10e 1351l', was: %s\n", dbgstrx(str));
} }
TEST_NAMEX(format) TEST_NAMEX(format)
@ -198,6 +204,9 @@ TEST_NAMEX(format)
ok(str == _X("int: 000035"), "Expected str to be 'int: 000035', was: %s\n", dbgstrx(str)); ok(str == _X("int: 000035"), "Expected str to be 'int: 000035', was: %s\n", dbgstrx(str));
WriteString(_X("%de %dl"), 10, 1351); WriteString(_X("%de %dl"), 10, 1351);
str.AppendFormat(_X(",FP: %.2f"), 12345.12345);
ok(str == _X("int: 000035,FP: 12345.12"), "Expected str to be 'int: 000035,FP: 12345.12', was: %s\n", dbgstrx(str));
} }

View file

@ -749,6 +749,23 @@ public:
return CStringT(CThisSimpleString::GetString() + nLength - nCount, nCount); return CStringT(CThisSimpleString::GetString() + nLength - nCount, nCount);
} }
void __cdecl AppendFormat(UINT nFormatID, ...)
{
va_list args;
va_start(args, nFormatID);
CStringT formatString;
if (formatString.LoadString(nFormatID))
AppendFormatV(formatString, args);
va_end(args);
}
void __cdecl AppendFormat(PCXSTR pszFormat, ...)
{
va_list args;
va_start(args, pszFormat);
AppendFormatV(pszFormat, args);
va_end(args);
}
void __cdecl Format(UINT nFormatID, ...) void __cdecl Format(UINT nFormatID, ...)
{ {
@ -768,6 +785,16 @@ public:
va_end(args); va_end(args);
} }
void AppendFormatV(PCXSTR pszFormat, va_list args)
{
int nLength = StringTraits::FormatV(NULL, pszFormat, args);
int nCurrent = CThisSimpleString::GetLength();
PXSTR pszBuffer = CThisSimpleString::GetBuffer(nLength + nCurrent);
StringTraits::FormatV(pszBuffer + nCurrent, pszFormat, args);
CThisSimpleString::ReleaseBufferSetLength(nLength + nCurrent);
}
void FormatV(PCXSTR pszFormat, va_list args) void FormatV(PCXSTR pszFormat, va_list args)
{ {
int nLength = StringTraits::FormatV(NULL, pszFormat, args); int nLength = StringTraits::FormatV(NULL, pszFormat, args);