]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Hash.c
FatPkg: INF/DEC file updates to EDK II packages
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Hash.c
CommitLineData
b9ec9330
QH
1/*++\r
2\r
ee3e5604 3Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>\r
6163cc98 4This program and the accompanying materials are licensed and made available\r
b9ec9330
QH
5under the terms and conditions of the BSD License which accompanies this\r
6distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12\r
13Module Name:\r
14\r
15 Hash.c\r
16\r
17Abstract:\r
18\r
19 Hash table operations\r
20\r
21Revision History\r
22\r
23--*/\r
24\r
25#include "Fat.h"\r
26\r
27STATIC\r
28UINT32\r
29FatHashLongName (\r
30 IN CHAR16 *LongNameString\r
31 )\r
32/*++\r
33\r
34Routine Description:\r
35\r
36 Get hash value for long name.\r
37\r
38Arguments:\r
39\r
40 LongNameString - The long name string to be hashed.\r
41\r
42Returns:\r
43\r
44 HashValue.\r
45\r
46--*/\r
47{\r
48 UINT32 HashValue;\r
49 CHAR16 UpCasedLongFileName[EFI_PATH_STRING_LENGTH];\r
ee3e5604
RN
50 StrnCpy (UpCasedLongFileName, LongNameString, EFI_PATH_STRING_LENGTH - 1);\r
51 UpCasedLongFileName[EFI_PATH_STRING_LENGTH - 1] = L'\0';\r
b9ec9330
QH
52 FatStrUpr (UpCasedLongFileName);\r
53 gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue);\r
54 return (HashValue & HASH_TABLE_MASK);\r
55}\r
56\r
57STATIC\r
58UINT32\r
59FatHashShortName (\r
60 IN CHAR8 *ShortNameString\r
61 )\r
62/*++\r
63\r
64Routine Description:\r
65\r
66 Get hash value for short name.\r
67\r
68Arguments:\r
69\r
70 ShortNameString - The short name string to be hashed.\r
71\r
72Returns:\r
73\r
74 HashValue\r
75\r
76--*/\r
77{\r
78 UINT32 HashValue;\r
79 gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue);\r
80 return (HashValue & HASH_TABLE_MASK);\r
81}\r
82\r
83FAT_DIRENT **\r
84FatLongNameHashSearch (\r
85 IN FAT_ODIR *ODir,\r
86 IN CHAR16 *LongNameString\r
87 )\r
88/*++\r
89\r
90Routine Description:\r
91\r
92 Search the long name hash table for the directory entry.\r
93\r
94Arguments:\r
95\r
96 ODir - The directory to be searched.\r
97 LongNameString - The long name string to search.\r
98\r
99Returns:\r
100\r
101 The previous long name hash node of the directory entry.\r
102\r
103--*/\r
104{\r
105 FAT_DIRENT **PreviousHashNode;\r
106 for (PreviousHashNode = &ODir->LongNameHashTable[FatHashLongName (LongNameString)];\r
107 *PreviousHashNode != NULL;\r
108 PreviousHashNode = &(*PreviousHashNode)->LongNameForwardLink\r
109 ) {\r
110 if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) {\r
111 break;\r
112 }\r
113 }\r
114\r
115 return PreviousHashNode;\r
116}\r
117\r
118FAT_DIRENT **\r
119FatShortNameHashSearch (\r
120 IN FAT_ODIR *ODir,\r
121 IN CHAR8 *ShortNameString\r
122 )\r
123/*++\r
124\r
125Routine Description:\r
126\r
127 Search the short name hash table for the directory entry.\r
128\r
129Arguments:\r
130\r
131 ODir - The directory to be searched.\r
132 ShortNameString - The short name string to search.\r
133\r
134Returns:\r
135\r
136 The previous short name hash node of the directory entry.\r
137\r
138--*/\r
139{\r
140 FAT_DIRENT **PreviousHashNode;\r
141 for (PreviousHashNode = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)];\r
142 *PreviousHashNode != NULL;\r
143 PreviousHashNode = &(*PreviousHashNode)->ShortNameForwardLink\r
144 ) {\r
145 if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) {\r
146 break;\r
147 }\r
148 }\r
149\r
150 return PreviousHashNode;\r
151}\r
152\r
153VOID\r
154FatInsertToHashTable (\r
155 IN FAT_ODIR *ODir,\r
156 IN FAT_DIRENT *DirEnt\r
157 )\r
158/*++\r
159\r
160Routine Description:\r
161\r
162 Insert directory entry to hash table.\r
163\r
164Arguments:\r
165\r
166 ODir - The parent directory.\r
167 DirEnt - The directory entry node.\r
168\r
169Returns:\r
170\r
171 None.\r
172\r
173--*/\r
174{\r
175 FAT_DIRENT **HashTable;\r
176 UINT32 HashTableIndex;\r
177\r
178 //\r
179 // Insert hash table index for short name\r
180 //\r
181 HashTableIndex = FatHashShortName (DirEnt->Entry.FileName);\r
182 HashTable = ODir->ShortNameHashTable;\r
183 DirEnt->ShortNameForwardLink = HashTable[HashTableIndex];\r
184 HashTable[HashTableIndex] = DirEnt;\r
185 //\r
186 // Insert hash table index for long name\r
187 //\r
188 HashTableIndex = FatHashLongName (DirEnt->FileString);\r
189 HashTable = ODir->LongNameHashTable;\r
190 DirEnt->LongNameForwardLink = HashTable[HashTableIndex];\r
191 HashTable[HashTableIndex] = DirEnt;\r
192}\r
193\r
194VOID\r
195FatDeleteFromHashTable (\r
196 IN FAT_ODIR *ODir,\r
197 IN FAT_DIRENT *DirEnt\r
198 )\r
199/*++\r
200\r
201Routine Description:\r
202\r
203 Delete directory entry from hash table.\r
204\r
205Arguments:\r
206\r
207 ODir - The parent directory.\r
208 DirEnt - The directory entry node.\r
209\r
210Returns:\r
211\r
212 None.\r
213\r
214--*/\r
215{\r
216 *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink;\r
217 *FatLongNameHashSearch (ODir, DirEnt->FileString) = DirEnt->LongNameForwardLink;\r
218}\r