]>
Commit | Line | Data |
---|---|---|
cae7420b DB |
1 | /** @file\r |
2 | Hash table operations.\r | |
b9ec9330 | 3 | \r |
e76bc43e | 4 | Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>\r |
eb6cb4ce | 5 | SPDX-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 |
20 | STATIC\r |
21 | UINT32\r | |
22 | FatHashLongName (\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 |
49 | STATIC\r | |
50 | UINT32\r | |
51 | FatHashShortName (\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 |
71 | FAT_DIRENT **\r | |
72 | FatLongNameHashSearch (\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 |
102 | FAT_DIRENT **\r | |
103 | FatShortNameHashSearch (\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 |
131 | VOID\r |
132 | FatInsertToHashTable (\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 |
164 | VOID\r |
165 | FatDeleteFromHashTable (\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 |