]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Hash.c
ArmPlatformPkg/NorFlashDxe: Remove unused debug print specifier
[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
bcdcc416 23 IN CHAR16 *LongNameString\r
b9ec9330 24 )\r
b9ec9330
QH
25{\r
26 UINT32 HashValue;\r
27 CHAR16 UpCasedLongFileName[EFI_PATH_STRING_LENGTH];\r
bcdcc416 28\r
e76bc43e
HW
29 StrnCpyS (\r
30 UpCasedLongFileName,\r
0cdc10bd 31 ARRAY_SIZE (UpCasedLongFileName),\r
e76bc43e 32 LongNameString,\r
0cdc10bd 33 ARRAY_SIZE (UpCasedLongFileName) - 1\r
e76bc43e 34 );\r
b9ec9330
QH
35 FatStrUpr (UpCasedLongFileName);\r
36 gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue);\r
37 return (HashValue & HASH_TABLE_MASK);\r
38}\r
39\r
cae7420b 40/**\r
b9ec9330
QH
41\r
42 Get hash value for short name.\r
43\r
cae7420b 44 @param ShortNameString - The short name string to be hashed.\r
b9ec9330 45\r
cae7420b 46 @return HashValue\r
b9ec9330 47\r
cae7420b
DB
48**/\r
49STATIC\r
50UINT32\r
51FatHashShortName (\r
bcdcc416 52 IN CHAR8 *ShortNameString\r
cae7420b 53 )\r
b9ec9330
QH
54{\r
55 UINT32 HashValue;\r
bcdcc416 56\r
b9ec9330
QH
57 gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue);\r
58 return (HashValue & HASH_TABLE_MASK);\r
59}\r
60\r
cae7420b 61/**\r
b9ec9330
QH
62\r
63 Search the long name hash table for the directory entry.\r
64\r
cae7420b
DB
65 @param ODir - The directory to be searched.\r
66 @param LongNameString - The long name string to search.\r
b9ec9330 67\r
cae7420b 68 @return The previous long name hash node of the directory entry.\r
b9ec9330 69\r
cae7420b
DB
70**/\r
71FAT_DIRENT **\r
72FatLongNameHashSearch (\r
bcdcc416
MK
73 IN FAT_ODIR *ODir,\r
74 IN CHAR16 *LongNameString\r
cae7420b 75 )\r
b9ec9330
QH
76{\r
77 FAT_DIRENT **PreviousHashNode;\r
bcdcc416 78\r
b9ec9330
QH
79 for (PreviousHashNode = &ODir->LongNameHashTable[FatHashLongName (LongNameString)];\r
80 *PreviousHashNode != NULL;\r
81 PreviousHashNode = &(*PreviousHashNode)->LongNameForwardLink\r
bcdcc416
MK
82 )\r
83 {\r
b9ec9330
QH
84 if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) {\r
85 break;\r
86 }\r
87 }\r
88\r
89 return PreviousHashNode;\r
90}\r
91\r
cae7420b 92/**\r
b9ec9330
QH
93\r
94 Search the short name hash table for the directory entry.\r
95\r
cae7420b
DB
96 @param ODir - The directory to be searched.\r
97 @param ShortNameString - The short name string to search.\r
b9ec9330 98\r
cae7420b 99 @return The previous short name hash node of the directory entry.\r
b9ec9330 100\r
cae7420b
DB
101**/\r
102FAT_DIRENT **\r
103FatShortNameHashSearch (\r
bcdcc416
MK
104 IN FAT_ODIR *ODir,\r
105 IN CHAR8 *ShortNameString\r
cae7420b 106 )\r
b9ec9330
QH
107{\r
108 FAT_DIRENT **PreviousHashNode;\r
bcdcc416 109\r
b9ec9330
QH
110 for (PreviousHashNode = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)];\r
111 *PreviousHashNode != NULL;\r
112 PreviousHashNode = &(*PreviousHashNode)->ShortNameForwardLink\r
bcdcc416
MK
113 )\r
114 {\r
b9ec9330
QH
115 if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) {\r
116 break;\r
117 }\r
118 }\r
119\r
120 return PreviousHashNode;\r
121}\r
122\r
cae7420b
DB
123/**\r
124\r
125 Insert directory entry to hash table.\r
126\r
127 @param ODir - The parent directory.\r
128 @param DirEnt - The directory entry node.\r
129\r
130**/\r
b9ec9330
QH
131VOID\r
132FatInsertToHashTable (\r
bcdcc416
MK
133 IN FAT_ODIR *ODir,\r
134 IN FAT_DIRENT *DirEnt\r
b9ec9330 135 )\r
b9ec9330
QH
136{\r
137 FAT_DIRENT **HashTable;\r
138 UINT32 HashTableIndex;\r
139\r
140 //\r
141 // Insert hash table index for short name\r
142 //\r
bcdcc416
MK
143 HashTableIndex = FatHashShortName (DirEnt->Entry.FileName);\r
144 HashTable = ODir->ShortNameHashTable;\r
145 DirEnt->ShortNameForwardLink = HashTable[HashTableIndex];\r
146 HashTable[HashTableIndex] = DirEnt;\r
b9ec9330
QH
147 //\r
148 // Insert hash table index for long name\r
149 //\r
bcdcc416
MK
150 HashTableIndex = FatHashLongName (DirEnt->FileString);\r
151 HashTable = ODir->LongNameHashTable;\r
152 DirEnt->LongNameForwardLink = HashTable[HashTableIndex];\r
153 HashTable[HashTableIndex] = DirEnt;\r
b9ec9330
QH
154}\r
155\r
cae7420b
DB
156/**\r
157\r
158 Delete directory entry from hash table.\r
159\r
160 @param ODir - The parent directory.\r
161 @param DirEnt - The directory entry node.\r
162\r
163**/\r
b9ec9330
QH
164VOID\r
165FatDeleteFromHashTable (\r
bcdcc416
MK
166 IN FAT_ODIR *ODir,\r
167 IN FAT_DIRENT *DirEnt\r
b9ec9330 168 )\r
b9ec9330
QH
169{\r
170 *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink;\r
171 *FatLongNameHashSearch (ODir, DirEnt->FileString) = DirEnt->LongNameForwardLink;\r
172}\r