| /** @file | |
| Hash table operations. | |
| Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include "Fat.h" | |
| /** | |
| Get hash value for long name. | |
| @param LongNameString - The long name string to be hashed. | |
| @return HashValue. | |
| **/ | |
| STATIC | |
| UINT32 | |
| FatHashLongName ( | |
| IN CHAR16 *LongNameString | |
| ) | |
| { | |
| UINT32 HashValue; | |
| CHAR16 UpCasedLongFileName[EFI_PATH_STRING_LENGTH]; | |
| StrnCpyS ( | |
| UpCasedLongFileName, | |
| ARRAY_SIZE (UpCasedLongFileName), | |
| LongNameString, | |
| ARRAY_SIZE (UpCasedLongFileName) - 1 | |
| ); | |
| FatStrUpr (UpCasedLongFileName); | |
| gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue); | |
| return (HashValue & HASH_TABLE_MASK); | |
| } | |
| /** | |
| Get hash value for short name. | |
| @param ShortNameString - The short name string to be hashed. | |
| @return HashValue | |
| **/ | |
| STATIC | |
| UINT32 | |
| FatHashShortName ( | |
| IN CHAR8 *ShortNameString | |
| ) | |
| { | |
| UINT32 HashValue; | |
| gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue); | |
| return (HashValue & HASH_TABLE_MASK); | |
| } | |
| /** | |
| Search the long name hash table for the directory entry. | |
| @param ODir - The directory to be searched. | |
| @param LongNameString - The long name string to search. | |
| @return The previous long name hash node of the directory entry. | |
| **/ | |
| FAT_DIRENT ** | |
| FatLongNameHashSearch ( | |
| IN FAT_ODIR *ODir, | |
| IN CHAR16 *LongNameString | |
| ) | |
| { | |
| FAT_DIRENT **PreviousHashNode; | |
| for (PreviousHashNode = &ODir->LongNameHashTable[FatHashLongName (LongNameString)]; | |
| *PreviousHashNode != NULL; | |
| PreviousHashNode = &(*PreviousHashNode)->LongNameForwardLink | |
| ) | |
| { | |
| if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) { | |
| break; | |
| } | |
| } | |
| return PreviousHashNode; | |
| } | |
| /** | |
| Search the short name hash table for the directory entry. | |
| @param ODir - The directory to be searched. | |
| @param ShortNameString - The short name string to search. | |
| @return The previous short name hash node of the directory entry. | |
| **/ | |
| FAT_DIRENT ** | |
| FatShortNameHashSearch ( | |
| IN FAT_ODIR *ODir, | |
| IN CHAR8 *ShortNameString | |
| ) | |
| { | |
| FAT_DIRENT **PreviousHashNode; | |
| for (PreviousHashNode = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)]; | |
| *PreviousHashNode != NULL; | |
| PreviousHashNode = &(*PreviousHashNode)->ShortNameForwardLink | |
| ) | |
| { | |
| if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) { | |
| break; | |
| } | |
| } | |
| return PreviousHashNode; | |
| } | |
| /** | |
| Insert directory entry to hash table. | |
| @param ODir - The parent directory. | |
| @param DirEnt - The directory entry node. | |
| **/ | |
| VOID | |
| FatInsertToHashTable ( | |
| IN FAT_ODIR *ODir, | |
| IN FAT_DIRENT *DirEnt | |
| ) | |
| { | |
| FAT_DIRENT **HashTable; | |
| UINT32 HashTableIndex; | |
| // | |
| // Insert hash table index for short name | |
| // | |
| HashTableIndex = FatHashShortName (DirEnt->Entry.FileName); | |
| HashTable = ODir->ShortNameHashTable; | |
| DirEnt->ShortNameForwardLink = HashTable[HashTableIndex]; | |
| HashTable[HashTableIndex] = DirEnt; | |
| // | |
| // Insert hash table index for long name | |
| // | |
| HashTableIndex = FatHashLongName (DirEnt->FileString); | |
| HashTable = ODir->LongNameHashTable; | |
| DirEnt->LongNameForwardLink = HashTable[HashTableIndex]; | |
| HashTable[HashTableIndex] = DirEnt; | |
| } | |
| /** | |
| Delete directory entry from hash table. | |
| @param ODir - The parent directory. | |
| @param DirEnt - The directory entry node. | |
| **/ | |
| VOID | |
| FatDeleteFromHashTable ( | |
| IN FAT_ODIR *ODir, | |
| IN FAT_DIRENT *DirEnt | |
| ) | |
| { | |
| *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink; | |
| *FatLongNameHashSearch (ODir, DirEnt->FileString) = DirEnt->LongNameForwardLink; | |
| } |