FORMAT.CPP

// ----------------------------------------------------------------------------- 
// Format.cpp: Implements functions to format and return CStrings.
//
// Copyright (C) Microsoft Corp. 1986-1996. All Rights Reserved.
//----------------------------------------------------------------------------

#include "edkafx.h"
#include "exadmin.h"
#include "format.h"

const int MAX_RESOURCE_MSG = 500;

//----------------------------------------------------------------------------
// These integers control the size of the buffer we allocate for the
// _vsnprintf() function call. It grows when _vsnprintf() returns an
// error. The effect is that we remember the largest buffer needed for
// string formating and always start off by allocating that size of buffer.
// This provides a safe string formating method.
//----------------------------------------------------------------------------

static int nLargestBuf = 256;
static int nGrowSize = 128;

//----------------------------------------------------------------------------
// Takes arguments just like vprintf(), but returns the result in a CString.
// This performs a safe format with no overwrites.
//----------------------------------------------------------------------------

CString _Format( TCHAR *pFmt, va_list pVArg)
{
CString sFmtBuf;

for( ;;)
{ // Take a shot at formating the string.
TCHAR* pFmtBuf = sFmtBuf.GetBuffer( nLargestBuf);
if( _vsntprintf( pFmtBuf, nLargestBuf, pFmt, pVArg) >= 0)
break; // Format was successful.

// Buffer was not big enough so enlarge it.
nLargestBuf += nGrowSize;
nGrowSize = (int) (nGrowSize * 3 / 2);
}
sFmtBuf.ReleaseBuffer();
return( sFmtBuf);
}

//----------------------------------------------------------------------------
// Takes arguments just like printf(), but returns the result in a CString.
//----------------------------------------------------------------------------

CString Format( TCHAR *pMsgFmt ...)
{
va_list pVArg;
va_start( pVArg, pMsgFmt);
return( _Format( pMsgFmt, pVArg));
}

//----------------------------------------------------------------------------
// Find a format string in the resource and use it to format the CString.
//----------------------------------------------------------------------------

CString _FormatResource( int hResStr, va_list pVArg)
{
TCHAR sMsgFmt[ MAX_RESOURCE_MSG]; // Arbitrary size that should be big enough.

if( CAdminDialog::LoadStringA( hResStr, sMsgFmt, sizeof( sMsgFmt)) == 0)
return( Format( "Unknown error %d m_bOccurred.", hResStr));
else
return( _Format( sMsgFmt, pVArg));
}

//----------------------------------------------------------------------------
// Find a format string in the resource and use it to format the CString.
//----------------------------------------------------------------------------

CString FormatResource( int hResStr ...)
{
va_list pVArg;
va_start( pVArg, hResStr);
return( _FormatResource( hResStr, pVArg));
}

//----------------------------------------------------------------------------