]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Hash.c
BaseTools: Library hashing fix and optimization for --hash feature
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Hash.c
CommitLineData
cae7420b
DB
1/** @file\r
2 Hash table operations.\r
b9ec9330 3\r
e76bc43e 4Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>\r
eb6cb4ce 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
b9ec9330 6\r
cae7420b 7**/\r
b9ec9330 8\r
cae7420b 9#include "Fat.h"\r
b9ec9330 10\r
cae7420b 11/**\r
b9ec9330 12\r
cae7420b 13 Get hash value for long name.\r
b9ec9330 14\r
cae7420b 15 @param LongNameString - The long name string to be hashed.\r
b9ec9330 16\r
cae7420b 17 @return HashValue.\r
b9ec9330 18\r
cae7420b 19**/\r
b9ec9330
QH
20STATIC\r
21UINT32\r
22FatHashLongName (\r
23 IN CHAR16 *LongNameString\r
24 )\r
b9ec9330
QH
25{\r
26 UINT32 HashValue;\r
27 CHAR16 UpCasedLongFileName[EFI_PATH_STRING_LENGTH];\r
e76bc43e
HW
28 StrnCpyS (\r
29 UpCasedLongFileName,\r
0cdc10bd 30 ARRAY_SIZE (UpCasedLongFileName),\r
e76bc43e 31 LongNameString,\r
0cdc10bd 32 ARRAY_SIZE (UpCasedLongFileName) - 1\r
e76bc43e 33 );\r
b9ec9330
QH
34 FatStrUpr (UpCasedLongFileName);\r
35 gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue);\r
36 return (HashValue & HASH_TABLE_MASK);\r
37}\r
38\r
cae7420b 39/**\r
b9ec9330
QH
40\r
41 Get hash value for short name.\r
42\r
cae7420b 43 @param ShortNameString - The short name string to be hashed.\r
b9ec9330 44\r
cae7420b 45 @return HashValue\r
b9ec9330 46\r
cae7420b
DB
47**/\r
48STATIC\r
49UINT32\r
50FatHashShortName (\r
51 IN CHAR8 *ShortNameString\r
52 )\r
b9ec9330
QH
53{\r
54 UINT32 HashValue;\r
55 gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue);\r
56 return (HashValue & HASH_TABLE_MASK);\r
57}\r
58\r
cae7420b 59/**\r
b9ec9330
QH
60\r
61 Search the long name hash table for the directory entry.\r
62\r
cae7420b
DB
63 @param ODir - The directory to be searched.\r
64 @param LongNameString - The long name string to search.\r
b9ec9330 65\r
cae7420b 66 @return The previous long name hash node of the directory entry.\r
b9ec9330 67\r
cae7420b
DB
68**/\r
69FAT_DIRENT **\r
70FatLongNameHashSearch (\r
71 IN FAT_ODIR *ODir,\r
72 IN CHAR16 *LongNameString\r
73 )\r
b9ec9330
QH
74{\r
75 FAT_DIRENT **PreviousHashNode;\r
76 for (PreviousHashNode = &ODir->LongNameHashTable[FatHashLongName (LongNameString)];\r
77 *PreviousHashNode != NULL;\r
78 PreviousHashNode = &(*PreviousHashNode)->LongNameForwardLink\r
79 ) {\r
80 if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) {\r
81 break;\r
82 }\r
83 }\r
84\r
85 return PreviousHashNode;\r
86}\r
87\r
cae7420b 88/**\r
b9ec9330
QH
89\r
90 Search the short name hash table for the directory entry.\r
91\r
cae7420b
DB
92 @param ODir - The directory to be searched.\r
93 @param ShortNameString - The short name string to search.\r
b9ec9330 94\r
cae7420b 95 @return The previous short name hash node of the directory entry.\r
b9ec9330 96\r
cae7420b
DB
97**/\r
98FAT_DIRENT **\r
99FatShortNameHashSearch (\r
100 IN FAT_ODIR *ODir,\r
101 IN CHAR8 *ShortNameString\r
102 )\r
b9ec9330
QH
103{\r
104 FAT_DIRENT **PreviousHashNode;\r
105 for (PreviousHashNode = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)];\r
106 *PreviousHashNode != NULL;\r
107 PreviousHashNode = &(*PreviousHashNode)->ShortNameForwardLink\r
108 ) {\r
109 if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) {\r
110 break;\r
111 }\r
112 }\r
113\r
114 return PreviousHashNode;\r
115}\r
116\r
cae7420b
DB
117/**\r
118\r
119 Insert directory entry to hash table.\r
120\r
121 @param ODir - The parent directory.\r
122 @param DirEnt - The directory entry node.\r
123\r
124**/\r
b9ec9330
QH
125VOID\r
126FatInsertToHashTable (\r
127 IN FAT_ODIR *ODir,\r
128 IN FAT_DIRENT *DirEnt\r
129 )\r
b9ec9330
QH
130{\r
131 FAT_DIRENT **HashTable;\r
132 UINT32 HashTableIndex;\r
133\r
134 //\r
135 // Insert hash table index for short name\r
136 //\r
137 HashTableIndex = FatHashShortName (DirEnt->Entry.FileName);\r
138 HashTable = ODir->ShortNameHashTable;\r
139 DirEnt->ShortNameForwardLink = HashTable[HashTableIndex];\r
140 HashTable[HashTableIndex] = DirEnt;\r
141 //\r
142 // Insert hash table index for long name\r
143 //\r
144 HashTableIndex = FatHashLongName (DirEnt->FileString);\r
145 HashTable = ODir->LongNameHashTable;\r
146 DirEnt->LongNameForwardLink = HashTable[HashTableIndex];\r
147 HashTable[HashTableIndex] = DirEnt;\r
148}\r
149\r
cae7420b
DB
150/**\r
151\r
152 Delete directory entry from hash table.\r
153\r
154 @param ODir - The parent directory.\r
155 @param DirEnt - The directory entry node.\r
156\r
157**/\r
b9ec9330
QH
158VOID\r
159FatDeleteFromHashTable (\r
160 IN FAT_ODIR *ODir,\r
161 IN FAT_DIRENT *DirEnt\r
162 )\r
b9ec9330
QH
163{\r
164 *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink;\r
165 *FatLongNameHashSearch (ODir, DirEnt->FileString) = DirEnt->LongNameForwardLink;\r
166}\r