You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.2 KiB
203 lines
4.2 KiB
/**********************************************************************/
|
|
/** Microsoft Windows NT **/
|
|
/** Copyright(c) Microsoft Corp., 1994 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
cbin.cxx
|
|
|
|
This module contains a light weight binary class
|
|
|
|
|
|
FILE HISTORY:
|
|
MichTh 17-May-1996 Created, based on string.cxx
|
|
*/
|
|
|
|
|
|
#include "precomp.hxx"
|
|
|
|
//
|
|
// Private Definations
|
|
//
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CBIN::CBIN
|
|
|
|
SYNOPSIS: Construct a string object
|
|
|
|
ENTRY: Optional object initializer
|
|
|
|
NOTES: If the object is not valid (i.e. !IsValid()) then GetLastError
|
|
should be called.
|
|
|
|
The object is guaranteed to construct successfully if nothing
|
|
or NULL is passed as the initializer.
|
|
|
|
HISTORY:
|
|
Johnl 17-Aug-1994 Created
|
|
|
|
********************************************************************/
|
|
|
|
|
|
CBIN::CBIN( DWORD cbLen, const PVOID pbInit )
|
|
{
|
|
AuxInit(cbLen, pbInit);
|
|
}
|
|
|
|
CBIN::CBIN( const CBIN & cbin )
|
|
{
|
|
AuxInit(cbin.QueryCB(), cbin.QueryPtr());
|
|
}
|
|
|
|
VOID CBIN::AuxInit( DWORD cbLen, PVOID pbInit)
|
|
{
|
|
BOOL fRet;
|
|
|
|
_fValid = TRUE;
|
|
|
|
if ( pbInit )
|
|
{
|
|
fRet = Resize( cbLen );
|
|
|
|
|
|
if ( !fRet )
|
|
{
|
|
_fValid = FALSE;
|
|
return;
|
|
}
|
|
|
|
SetCB(cbLen);
|
|
::memcpy( QueryPtr(), pbInit, cbLen );
|
|
}
|
|
else {
|
|
SetCB(0);
|
|
}
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CBIN::Append
|
|
|
|
SYNOPSIS: Appends the buffer onto this one.
|
|
|
|
ENTRY: Object to append
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Johnl 17-Aug-1994 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL CBIN::Append( DWORD cbLen, const PVOID pbBuf )
|
|
{
|
|
if ( pbBuf )
|
|
{
|
|
|
|
return AuxAppend(pbBuf, cbLen);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CBIN::Append( const CBIN & cbin )
|
|
{
|
|
return Append(cbin.QueryCB(), cbin.QueryPtr());
|
|
}
|
|
|
|
BOOL CBIN::AuxAppend( PVOID pbBuf, UINT cbLen, BOOL )
|
|
{
|
|
DBG_ASSERT( pbBuf != NULL );
|
|
|
|
UINT cbThis = QueryCB();
|
|
|
|
//
|
|
// Only resize when we have to. When we do resize, we tack on
|
|
// some extra space to avoid extra reallocations.
|
|
//
|
|
// Note: QuerySize returns the requested size of the string buffer,
|
|
// *not* the strlen of the buffer
|
|
//
|
|
|
|
if ( QuerySize() < cbThis + cbLen)
|
|
{
|
|
if ( !Resize( cbThis + cbLen) )
|
|
return FALSE;
|
|
}
|
|
|
|
SetCB(cbThis + cbLen);
|
|
memcpy( (BYTE *) QueryPtr() + cbThis,
|
|
pbBuf,
|
|
cbLen);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CBIN::Copy
|
|
|
|
SYNOPSIS: Copies the string into this one.
|
|
|
|
ENTRY: Object to Copy
|
|
|
|
NOTES: A copy is a special case of Append so we just zero terminate
|
|
*this and append the string.
|
|
|
|
HISTORY:
|
|
Johnl 17-Aug-1994 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL CBIN::Copy( DWORD cbLen, const PVOID pbBuf )
|
|
{
|
|
SetCB(0);
|
|
|
|
if ( pbBuf )
|
|
{
|
|
return AuxAppend( pbBuf, cbLen, FALSE );
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CBIN::Copy( const CBIN & cbin )
|
|
{
|
|
if ( cbin.IsEmpty()) {
|
|
// To avoid pathological allocation of small chunk of memory
|
|
SetCB(0);
|
|
return ( TRUE);
|
|
}
|
|
|
|
return Copy( cbin.QueryCB(), cbin.QueryPtr() );
|
|
}
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: CBIN::Resize
|
|
|
|
SYNOPSIS: Resizes or allocates string memory, NULL terminating
|
|
if necessary
|
|
|
|
ENTRY: cbNewRequestedSize - New string size
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Johnl 12-Sep-1994 Created
|
|
|
|
********************************************************************/
|
|
|
|
BOOL CBIN::Resize( UINT cbNewRequestedSize )
|
|
{
|
|
if ( !BUFFER::Resize( cbNewRequestedSize ))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|