406 lines
8.4 KiB
C++
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;
|
|
}
|