fix CString always being ~2k after ssprintf, even for ssprintf("%i", 1)

This commit is contained in:
Glenn Maynard
2004-07-23 05:51:14 +00:00
parent 6564a39a9e
commit d4dd1b2a82
+24 -10
View File
@@ -939,24 +939,38 @@ public:
void FormatV(const CT* szFormat, va_list argList) void FormatV(const CT* szFormat, va_list argList)
{ {
#ifdef SS_ANSI #ifdef SS_ANSI
static bool bExactSizeSupported;
static bool bInitialized = false;
if( !bInitialized )
{
/* Some systems return the actual size required when snprintf
* doesn't have enough space. This lets us avoid wasting time
* iterating, and wasting memory. */
bInitialized = true;
char ignore;
bExactSizeSupported = ( snprintf( &ignore, 0, "Hello World" ) == 11 );
}
if( bExactSizeSupported )
{
char ignore;
int iNeeded = ssvsprintf( &ignore, 0, szFormat, argList );
char *buf = GetBuffer( iNeeded+1 );
ssvsprintf( buf, iNeeded+1, szFormat, argList );
ReleaseBuffer( iNeeded );
return;
}
int nChars = FMT_BLOCK_SIZE; int nChars = FMT_BLOCK_SIZE;
int nTry = 1; int nTry = 1;
do do
{ {
// Grow more than linearly (e.g. 512, 1536, 3072, etc) // Grow more than linearly (e.g. 512, 1536, 3072, etc)
char *buf = GetBuffer(nChars); char *buf = GetBuffer(nChars);
int nUsed = ssvsprintf(buf, nChars-1, szFormat, argList); int nUsed = ssvsprintf(buf, nChars-1, szFormat, argList);
/* -1 means "not enough, try harder"; > nChars is telling us how if(nUsed == -1)
* much. */ {
if(nUsed > nChars) {
nChars = nUsed + 1;
ReleaseBuffer();
continue;
}
if(nUsed == -1) {
nChars += ((nTry+1) * FMT_BLOCK_SIZE); nChars += ((nTry+1) * FMT_BLOCK_SIZE);
ReleaseBuffer(); ReleaseBuffer();
continue; continue;