windows-nt/Source/XPSP1/NT/com/ole32/olethunk/olethk32/alias.cxx
2020-09-26 16:20:57 +08:00

406 lines
8.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: alias.cxx
//
// Contents: Alias implementations
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
#include "headers.cxx"
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Member: CAliasBlock::CAliasBlock, public
//
// Synopsis: Constructor
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
CAliasBlock::CAliasBlock(ALIAS aliasBase,
CAliasBlock *pabNext)
{
_aliasBase = aliasBase;
_iFilled = 0;
_pabNext = pabNext;
// Since INVALID_VALUE is a DWORD we can't directly memset it,
// but we'd like to use memset so assert that it's a known value
// and go ahead
thkAssert(INVALID_VALUE == 0);
memset(_dwValues, 0, sizeof(_dwValues));
}
//+---------------------------------------------------------------------------
//
// Member: CAliasBlock::ValueAlias, public
//
// Synopsis: Find the alias for a value
//
// Arguments: [dwValue] - Value
//
// Returns: Alias or INVALID_ALIAS
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
ALIAS CAliasBlock::ValueAlias(DWORD dwValue)
{
int i;
DWORD *pdw;
thkAssert(dwValue != INVALID_VALUE);
#if DBG == 1
CheckFree();
#endif
if (_iFilled == 0)
{
return INVALID_ALIAS;
}
pdw = _dwValues;
for (i = 0; i < ALIAS_BLOCK_SIZE; i++)
{
if (*pdw == dwValue)
{
return IndexAlias(i);
}
pdw++;
}
return INVALID_ALIAS;
}
//+---------------------------------------------------------------------------
//
// Member: CAliasBlock::AddValue, public
//
// Synopsis: Adds a new value
//
// Arguments: [dwValue] - New value
//
// Returns: Alias for block or INVALID_ALIAS
//
// History: 26-May-94 DrewB Created
//
// Notes: Duplicates are not allowed
//
//----------------------------------------------------------------------------
ALIAS CAliasBlock::AddValue(DWORD dwValue)
{
int i;
DWORD *pdw;
thkAssert(dwValue != INVALID_VALUE);
#if DBG == 1
CheckFree();
#endif
if (_iFilled == ALIAS_BLOCK_SIZE)
{
return INVALID_ALIAS;
}
// Check for duplicates
thkAssert(ValueAlias(dwValue) == INVALID_ALIAS);
pdw = _dwValues;
for (i = 0; i < ALIAS_BLOCK_SIZE; i++)
{
if (*pdw == INVALID_VALUE)
{
break;
}
pdw++;
}
thkAssert(i < ALIAS_BLOCK_SIZE);
_iFilled++;
_dwValues[i] = dwValue;
return IndexAlias(i);
}
//+---------------------------------------------------------------------------
//
// Member: CAliasBlock::CheckFree, public debug
//
// Synopsis: Checks to make sure that _iFilled is correct
//
// History: 30-May-94 DrewB Created
//
//----------------------------------------------------------------------------
#if DBG == 1
void CAliasBlock::CheckFree(void)
{
int i, iFilled;
DWORD *pdw;
iFilled = 0;
pdw = _dwValues;
for (i = 0; i < ALIAS_BLOCK_SIZE; i++)
{
if (*pdw != INVALID_VALUE)
{
iFilled++;
}
pdw++;
}
thkAssert(iFilled == _iFilled);
}
#endif
//+---------------------------------------------------------------------------
//
// Function: CAliases::~CAliases, public
//
// Synopsis: Destructor
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
CAliases::~CAliases(void)
{
CAliasBlock *pab;
while (_pabAliases)
{
pab = _pabAliases->GetNext();
//
// The first alias block added to the list is a static one. We
// cannot call the heap to deallocate it.
//
if (_pabAliases != &_abStatic)
{
delete _pabAliases;
}
_pabAliases = pab;
}
}
//+---------------------------------------------------------------------------
//
// Member: CAliases::AliasValue, public
//
// Synopsis: Returns the value for an alias
//
// Arguments: [alias] - Alias
//
// Returns: Value
//
// History: 26-May-94 DrewB Created
//
// Notes: Alias must be valid
//
//----------------------------------------------------------------------------
DWORD CAliases::AliasValue(ALIAS alias)
{
CAliasBlock *pab;
for (pab = _pabAliases; pab; pab = pab->GetNext())
{
if (pab->ContainsAlias(alias))
{
return pab->AliasValue(alias);
}
}
thkAssert(!"Invalid alias in CAliases::AliasValue");
return 0xffffffff;
}
//+---------------------------------------------------------------------------
//
// Function: CAliases::ValueAlias, public
//
// Synopsis: Returns the alias for a value
//
// Arguments: [dwValue] - Value
//
// Returns: Alias
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
ALIAS CAliases::ValueAlias(DWORD dwValue)
{
CAliasBlock *pab;
ALIAS alias;
for (pab = _pabAliases; pab; pab = pab->GetNext())
{
alias = pab->ValueAlias(dwValue);
if (alias != INVALID_ALIAS)
{
return alias;
}
}
return INVALID_ALIAS;
}
//+---------------------------------------------------------------------------
//
// Function: CAliases::AddValue, public
//
// Synopsis: Adds a value and returns its alias
//
// Arguments: [dwValue] - Value
//
// Returns: Alias or INVALID_ALIAS
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
ALIAS CAliases::AddValue(DWORD dwValue)
{
CAliasBlock *pab;
ALIAS alias;
for (pab = _pabAliases; pab; pab = pab->GetNext())
{
alias = pab->AddValue(dwValue);
if (alias != INVALID_ALIAS)
{
return alias;
}
}
if ((long)_aliasBase+ALIAS_BLOCK_SIZE >= INVALID_ALIAS)
{
return INVALID_ALIAS;
}
pab = new CAliasBlock(_aliasBase+ALIAS_BLOCK_SIZE, _pabAliases);
if (pab == NULL)
{
return INVALID_ALIAS;
}
_aliasBase += ALIAS_BLOCK_SIZE;
_pabAliases = pab;
alias = pab->AddValue(dwValue);
thkAssert(alias != INVALID_ALIAS);
return alias;
}
//+---------------------------------------------------------------------------
//
// Function: CAliases::RemoveAlias, public
//
// Synopsis: Removes an alias
//
// Arguments: [alias] - Alias
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
void CAliases::RemoveAlias(ALIAS alias)
{
CAliasBlock *pab, *pabPrev;
pabPrev = NULL;
for (pab = _pabAliases; pab; pabPrev = pab, pab = pab->GetNext())
{
if (pab->ContainsAlias(alias))
{
pab->RemoveAlias(alias);
if (pab->AliasesFilled() == 0)
{
DeleteBlock(pab, pabPrev);
}
return;
}
}
thkAssert(!"Invalid alias in CAliases::RemoveAlias");
}
//+---------------------------------------------------------------------------
//
// Function: CAliases::SetValue, public
//
// Synopsis: Sets the value for an alias
//
// Arguments: [alias] - Alias
// [dwValue] - Value
//
// History: 26-May-94 DrewB Created
//
//----------------------------------------------------------------------------
void CAliases::SetValue(ALIAS alias, DWORD dwValue)
{
CAliasBlock *pab;
for (pab = _pabAliases; pab; pab = pab->GetNext())
{
if (pab->ContainsAlias(alias))
{
pab->SetValue(alias, dwValue);
}
}
}
//+---------------------------------------------------------------------------
//
// Member: CAliases::DeleteBlock, private
//
// Synopsis: Deletes an alias block if it's not the static block
//
// Arguments: [pab] - Alias block
// [pabPrev] - Previous alias block
//
// History: 27-May-94 DrewB Created
//
//----------------------------------------------------------------------------
void CAliases::DeleteBlock(CAliasBlock *pab, CAliasBlock *pabPrev)
{
if (pab == &_abStatic)
{
return;
}
if (pabPrev)
{
pabPrev->SetNext(pab->GetNext());
}
else
{
_pabAliases = pab->GetNext();
}
delete pab;
}