//+--------------------------------------------------------------------------- // // 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; }