]>
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 | |
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 |
48 | STATIC\r | |
49 | UINT32\r | |
50 | FatHashShortName (\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 |
69 | FAT_DIRENT **\r | |
70 | FatLongNameHashSearch (\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 |
98 | FAT_DIRENT **\r | |
99 | FatShortNameHashSearch (\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 |
125 | VOID\r |
126 | FatInsertToHashTable (\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 |
158 | VOID\r |
159 | FatDeleteFromHashTable (\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 |