/*++ Copyright (c) 1998 Microsoft Corporation Module Name: routing\monitor2\shell\alias.c Abstract: Alias table manipulation functions to add/delete/read aliases. The aliases are stored using a hash table (chaining). Revision History: Anand Mahalingam 7/6/98 Created --*/ #include "precomp.h" // // The Alias Table // PLIST_ENTRY AliasTable[ALIAS_TABLE_SIZE]; // // Functions to manipulate the Alias Table // DWORD ATHashAlias( IN LPCWSTR pwszAliasName, OUT PWORD pwHashValue ) /*++ Routine Description: Computes the hash value for the given string. Arguments: pwszAliasName - Alias Name pwHashValue - Hash value for Alias Return Value: NO_ERROR --*/ { LPCWSTR p; WORD h = 0,g; for (p = pwszAliasName; *p != L'\0'; p++) { h = (h<<4) + (*p); if(g = h&0xf0000000) { h = h ^ (g >> 24); h = h ^ g; } } *pwHashValue = h % ALIAS_TABLE_SIZE; return NO_ERROR; } DWORD ATInitTable( VOID ) /*++ Routine Description: Initializes the Alias Table to NULL. Arguments: Return Value: --*/ { DWORD i; PLIST_ENTRY ple; for (i = 0; i < ALIAS_TABLE_SIZE; i++) { ple = HeapAlloc(GetProcessHeap(), 0, sizeof(LIST_ENTRY)); if (ple is NULL) { PrintMessageFromModule(g_hModule, MSG_NOT_ENOUGH_MEMORY); break; } InitializeListHead(ple); AliasTable[i] = ple; } if (i isnot ALIAS_TABLE_SIZE) { // // malloc error // for (; i < ALIAS_TABLE_SIZE; AliasTable[i++] = NULL); FreeAliasTable(); return ERROR_NOT_ENOUGH_MEMORY; } return NO_ERROR; } VOID ATCleanupTable( VOID ) /*++ Routine Description: Frees memory allocated for the alias table Arguments: Return Value: --*/ { DWORD i; for (i = 0; i < ALIAS_TABLE_SIZE; i++) { HeapFree(GetProcessHeap(), 0, AliasTable[i]); } return; } DWORD ATAddAlias( IN LPCWSTR pwszAliasName, IN LPCWSTR pwszAliasString ) /*++ Routine Description: Adds a new entry in the Alias Table. If alias already exists, then set it to the new string. Arguments: pwszAliasName - Alias Name pwszAliasString - Equivalent string Return Value: NO_ERROR, ERROR_NOT_ENOUGH_MEMORY --*/ { WORD wHashValue; PALIAS_TABLE_ENTRY pateATEntry; PLIST_ENTRY ple; // // Compute hash value for the alias // ATHashAlias(pwszAliasName,&wHashValue); // // Check if alias is already present // ple = AliasTable[wHashValue]->Flink; while (ple != AliasTable[wHashValue]) { pateATEntry = CONTAINING_RECORD(ple,ALIAS_TABLE_ENTRY, le); if (wcscmp(pwszAliasName,pateATEntry->pszAlias) == 0) { // // Alias already exists. Free memory allocated for // previous string. Allocate memory for this string. // HeapFree(GetProcessHeap(), 0 , pateATEntry->pszString); pateATEntry->pszString = HeapAlloc(GetProcessHeap(), 0 , (wcslen(pwszAliasString) + 1) * sizeof(WCHAR)); if (pateATEntry->pszString is NULL) { PrintMessageFromModule(g_hModule, MSG_NOT_ENOUGH_MEMORY); return ERROR_NOT_ENOUGH_MEMORY; } wcscpy(pateATEntry->pszString,pwszAliasString); return NO_ERROR; } ple = ple->Flink; } // // Create new Entry and add to beginning of list // pateATEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(ALIAS_TABLE_ENTRY)); if (pateATEntry is NULL) { PrintMessageFromModule(g_hModule, MSG_NOT_ENOUGH_MEMORY); return ERROR_NOT_ENOUGH_MEMORY; } pateATEntry->pszAlias = HeapAlloc(GetProcessHeap(), 0 , (wcslen(pwszAliasName) + 1) * sizeof(WCHAR)); if (pateATEntry->pszAlias is NULL) { HeapFree(GetProcessHeap(), 0 , pateATEntry); PrintMessageFromModule(g_hModule, MSG_NOT_ENOUGH_MEMORY); return ERROR_NOT_ENOUGH_MEMORY; } pateATEntry->pszString = HeapAlloc(GetProcessHeap(), 0 , (wcslen(pwszAliasString) + 1) * sizeof(WCHAR)); if (pateATEntry->pszString is NULL) { HeapFree(GetProcessHeap(), 0 , pateATEntry->pszAlias); HeapFree(GetProcessHeap(), 0 , pateATEntry); PrintMessageFromModule(g_hModule, MSG_NOT_ENOUGH_MEMORY); return ERROR_NOT_ENOUGH_MEMORY; } wcscpy(pateATEntry->pszAlias, pwszAliasName); wcscpy(pateATEntry->pszString, pwszAliasString); InsertHeadList(AliasTable[wHashValue],&(pateATEntry->le)); return NO_ERROR; } DWORD ATDeleteAlias( IN LPCWSTR pwszAliasName ) /*++ Routine Description: Deletes an alias in the Alias Table. Arguments: pwszAliasName - Alias Name Return Value: NO_ERROR, ERROR_ALIAS_NOT_FOUND --*/ { WORD wHashValue; PALIAS_TABLE_ENTRY pateATEntry; PLIST_ENTRY ple; // // Compute hash value of alias // ATHashAlias(pwszAliasName,&wHashValue); // // Try to find the alias // ple = AliasTable[wHashValue]; if (IsListEmpty(AliasTable[wHashValue])) { return ERROR_ALIAS_NOT_FOUND; } ple = AliasTable[wHashValue]->Flink; while (ple != AliasTable[wHashValue]) { pateATEntry = CONTAINING_RECORD(ple, ALIAS_TABLE_ENTRY, le); if (!wcscmp(pwszAliasName,pateATEntry->pszAlias)) { // // Found it. // RemoveEntryList(ple); HeapFree(GetProcessHeap(), 0 , pateATEntry->pszAlias); HeapFree(GetProcessHeap(), 0 , pateATEntry->pszString); HeapFree(GetProcessHeap(), 0, pateATEntry); return NO_ERROR; } ple = ple->Flink; } return ERROR_ALIAS_NOT_FOUND; } DWORD ATLookupAliasTable( IN LPCWSTR pwszAliasName, OUT LPWSTR *ppwszAliasString ) /*++ Routine Description: Looks up an alias in the Alias Table. Arguments: pwszAliasName - Alias name ppwszAliasString - Equivalent string Return Value: NO_ERROR --*/ { WORD wHashValue; PALIAS_TABLE_ENTRY pateATEntry; PLIST_ENTRY ple; // // Compute hash value for alias // ATHashAlias(pwszAliasName,&wHashValue); if (IsListEmpty(AliasTable[wHashValue])) { *ppwszAliasString = NULL; return NO_ERROR; } ple = AliasTable[wHashValue]->Flink; while (ple != AliasTable[wHashValue]) { pateATEntry = CONTAINING_RECORD(ple, ALIAS_TABLE_ENTRY, le); if (wcscmp(pateATEntry->pszAlias,pwszAliasName) == 0) { // // Found Alias // *ppwszAliasString = pateATEntry->pszString; return NO_ERROR; } ple = ple->Flink; } // // Alias not found // *ppwszAliasString = NULL; return NO_ERROR; } DWORD PrintAliasTable( VOID ) /*++ Routine Description: Prints the aliases in the alias table Arguments: Return Value: NO_ERROR --*/ { DWORD k; PALIAS_TABLE_ENTRY pateATEntry; PLIST_ENTRY ple; for ( k = 0; k < ALIAS_TABLE_SIZE ; k++) { ple = AliasTable[k]->Flink; while ( ple != AliasTable[k]) { pateATEntry = CONTAINING_RECORD(ple, ALIAS_TABLE_ENTRY, le); PrintMessage(L"%1!s!\t%2!s!\n", pateATEntry->pszAlias, pateATEntry->pszString); ple = ple->Flink; } } return NO_ERROR; } DWORD FreeAliasTable( VOID ) /*++ Routine Description: Prints the aliases in the alias table Arguments: Return Value: NO_ERROR --*/ { DWORD k; PALIAS_TABLE_ENTRY pateATEntry; PLIST_ENTRY pleHead; for ( k = 0; k < ALIAS_TABLE_SIZE ; k++) { pleHead = AliasTable[k]; if (pleHead is NULL) continue; while ( !IsListEmpty(pleHead) ) { pateATEntry = CONTAINING_RECORD(pleHead->Flink, ALIAS_TABLE_ENTRY, le); RemoveHeadList(pleHead); HeapFree(GetProcessHeap(), 0, pateATEntry); } HeapFree(GetProcessHeap(), 0, pleHead); } return NO_ERROR; }