]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/UdfDxe/FileName.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / UdfDxe / FileName.c
CommitLineData
99c9b949
PA
1/** @file\r
2 Helper functions for mangling file names in UDF/ECMA-167 file systems.\r
3\r
4 Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>\r
5\r
9d510e61 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
99c9b949
PA
7**/\r
8\r
9#include "Udf.h"\r
10\r
077f8c43
HW
11/**\r
12 Trim the leading and trailing spaces for a give Unicode string.\r
13\r
14 @param[in] String The Unicode string to trim.\r
15\r
16 @return A pointer to the trimmed string.\r
17\r
18**/\r
99c9b949
PA
19CHAR16 *\r
20TrimString (\r
21 IN CHAR16 *String\r
22 )\r
23{\r
24 CHAR16 *TempString;\r
25\r
26 for ( ; *String != L'\0' && *String == L' '; String++) {\r
27 ;\r
28 }\r
29\r
30 TempString = String + StrLen (String) - 1;\r
31 while ((TempString >= String) && (*TempString == L' ')) {\r
32 TempString--;\r
33 }\r
34\r
35 *(TempString + 1) = L'\0';\r
36\r
37 return String;\r
38}\r
39\r
077f8c43
HW
40/**\r
41 Replace the content of a Unicode string with the content of another Unicode\r
42 string.\r
43\r
44 @param[in] Destination A pointer to a Unicode string.\r
45 @param[in] Source A pointer to a Unicode string.\r
46\r
47**/\r
99c9b949
PA
48VOID\r
49ReplaceLeft (\r
50 IN CHAR16 *Destination,\r
51 IN CONST CHAR16 *Source\r
52 )\r
53{\r
54 CONST CHAR16 *EndString;\r
55\r
56 EndString = Source + StrLen (Source);\r
57 while (Source <= EndString) {\r
58 *Destination++ = *Source++;\r
59 }\r
60}\r
61\r
077f8c43
HW
62/**\r
63 Remove one or more consecutive backslashes starting from the second character\r
64 of a given Unicode string.\r
65\r
66 @param[in] String A pointer to a Unicode string.\r
67\r
68 @return A pointer to the modified string.\r
69\r
70**/\r
99c9b949
PA
71CHAR16 *\r
72ExcludeTrailingBackslashes (\r
73 IN CHAR16 *String\r
74 )\r
75{\r
76 CHAR16 *TempString;\r
77\r
78 switch (*(String + 1)) {\r
79 case L'\\':\r
80 break;\r
81 case L'\0':\r
82 default:\r
83 String++;\r
84 goto Exit;\r
85 }\r
86\r
87 TempString = String;\r
88 while (*TempString != L'\0' && *TempString == L'\\') {\r
89 TempString++;\r
90 }\r
91\r
92 if (TempString - 1 > String) {\r
93 ReplaceLeft (String + 1, TempString);\r
94 }\r
95\r
96 String++;\r
97\r
98Exit:\r
99 return String;\r
100}\r
101\r
102/**\r
103 Mangle a filename by cutting off trailing whitespaces, "\\", "." and "..".\r
104\r
105 @param[in] FileName Filename.\r
106\r
077f8c43 107 @retval The mangled Filename.\r
99c9b949
PA
108\r
109**/\r
110CHAR16 *\r
111MangleFileName (\r
112 IN CHAR16 *FileName\r
113 )\r
114{\r
115 CHAR16 *FileNameSavedPointer;\r
116 CHAR16 *TempFileName;\r
117 UINTN BackslashesNo;\r
118\r
119 if (FileName == NULL || *FileName == L'\0') {\r
120 FileName = NULL;\r
121 goto Exit;\r
122 }\r
123\r
124 FileName = TrimString (FileName);\r
125 if (*FileName == L'\0') {\r
126 goto Exit;\r
127 }\r
128\r
129 if ((StrLen (FileName) > 1) && (FileName[StrLen (FileName) - 1] == L'\\')) {\r
130 FileName[StrLen (FileName) - 1] = L'\0';\r
131 }\r
132\r
133 FileNameSavedPointer = FileName;\r
134\r
135 if (FileName[0] == L'.') {\r
136 if (FileName[1] == L'.') {\r
137 if (FileName[2] == L'\0') {\r
138 goto Exit;\r
139 } else {\r
140 FileName += 2;\r
141 }\r
142 } else if (FileName[1] == L'\0') {\r
143 goto Exit;\r
144 }\r
145 }\r
146\r
147 while (*FileName != L'\0') {\r
148 if (*FileName == L'\\') {\r
149 FileName = ExcludeTrailingBackslashes (FileName);\r
150 } else if (*FileName == L'.') {\r
151 switch (*(FileName + 1)) {\r
152 case L'\0':\r
153 *FileName = L'\0';\r
154 break;\r
155 case L'\\':\r
156 TempFileName = FileName + 1;\r
157 TempFileName = ExcludeTrailingBackslashes (TempFileName);\r
158 ReplaceLeft (FileName, TempFileName);\r
159 break;\r
160 case '.':\r
161 if ((*(FileName - 1) != L'\\') && ((*(FileName + 2) != L'\\') ||\r
162 (*(FileName + 2) != L'\0'))) {\r
163 FileName++;\r
164 continue;\r
165 }\r
166\r
167 BackslashesNo = 0;\r
168 TempFileName = FileName - 1;\r
169 while (TempFileName >= FileNameSavedPointer) {\r
170 if (*TempFileName == L'\\') {\r
171 if (++BackslashesNo == 2) {\r
172 break;\r
173 }\r
174 }\r
175\r
176 TempFileName--;\r
177 }\r
178\r
179 TempFileName++;\r
180\r
181 if ((*TempFileName == L'.') && (*(TempFileName + 1) == L'.')) {\r
182 FileName += 2;\r
183 } else {\r
184 if (*(FileName + 2) != L'\0') {\r
185 ReplaceLeft (TempFileName, FileName + 3);\r
186 if (*(TempFileName - 1) == L'\\') {\r
187 FileName = TempFileName;\r
188 ExcludeTrailingBackslashes (TempFileName - 1);\r
189 TempFileName = FileName;\r
190 }\r
191 } else {\r
192 *TempFileName = L'\0';\r
193 }\r
194\r
195 FileName = TempFileName;\r
196 }\r
197\r
198 break;\r
199 default:\r
200 FileName++;\r
201 }\r
202 } else {\r
203 FileName++;\r
204 }\r
205 }\r
206\r
207 FileName = FileNameSavedPointer;\r
208 if ((StrLen (FileName) > 1) && (FileName [StrLen (FileName) - 1] == L'\\')) {\r
209 FileName [StrLen (FileName) - 1] = L'\0';\r
210 }\r
211\r
212Exit:\r
213 return FileName;\r
214}\r