]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/UdfDxe/FileName.c
MdeModulePkg: Initial UDF/ECMA-167 file system support
[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
6 This program and the accompanying materials are licensed and made available\r
7 under the terms and conditions of the BSD License which accompanies this\r
8 distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
12 WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13**/\r
14\r
15#include "Udf.h"\r
16\r
17CHAR16 *\r
18TrimString (\r
19 IN CHAR16 *String\r
20 )\r
21{\r
22 CHAR16 *TempString;\r
23\r
24 for ( ; *String != L'\0' && *String == L' '; String++) {\r
25 ;\r
26 }\r
27\r
28 TempString = String + StrLen (String) - 1;\r
29 while ((TempString >= String) && (*TempString == L' ')) {\r
30 TempString--;\r
31 }\r
32\r
33 *(TempString + 1) = L'\0';\r
34\r
35 return String;\r
36}\r
37\r
38VOID\r
39ReplaceLeft (\r
40 IN CHAR16 *Destination,\r
41 IN CONST CHAR16 *Source\r
42 )\r
43{\r
44 CONST CHAR16 *EndString;\r
45\r
46 EndString = Source + StrLen (Source);\r
47 while (Source <= EndString) {\r
48 *Destination++ = *Source++;\r
49 }\r
50}\r
51\r
52CHAR16 *\r
53ExcludeTrailingBackslashes (\r
54 IN CHAR16 *String\r
55 )\r
56{\r
57 CHAR16 *TempString;\r
58\r
59 switch (*(String + 1)) {\r
60 case L'\\':\r
61 break;\r
62 case L'\0':\r
63 default:\r
64 String++;\r
65 goto Exit;\r
66 }\r
67\r
68 TempString = String;\r
69 while (*TempString != L'\0' && *TempString == L'\\') {\r
70 TempString++;\r
71 }\r
72\r
73 if (TempString - 1 > String) {\r
74 ReplaceLeft (String + 1, TempString);\r
75 }\r
76\r
77 String++;\r
78\r
79Exit:\r
80 return String;\r
81}\r
82\r
83/**\r
84 Mangle a filename by cutting off trailing whitespaces, "\\", "." and "..".\r
85\r
86 @param[in] FileName Filename.\r
87\r
88 @retval @p FileName Filename mangled.\r
89\r
90**/\r
91CHAR16 *\r
92MangleFileName (\r
93 IN CHAR16 *FileName\r
94 )\r
95{\r
96 CHAR16 *FileNameSavedPointer;\r
97 CHAR16 *TempFileName;\r
98 UINTN BackslashesNo;\r
99\r
100 if (FileName == NULL || *FileName == L'\0') {\r
101 FileName = NULL;\r
102 goto Exit;\r
103 }\r
104\r
105 FileName = TrimString (FileName);\r
106 if (*FileName == L'\0') {\r
107 goto Exit;\r
108 }\r
109\r
110 if ((StrLen (FileName) > 1) && (FileName[StrLen (FileName) - 1] == L'\\')) {\r
111 FileName[StrLen (FileName) - 1] = L'\0';\r
112 }\r
113\r
114 FileNameSavedPointer = FileName;\r
115\r
116 if (FileName[0] == L'.') {\r
117 if (FileName[1] == L'.') {\r
118 if (FileName[2] == L'\0') {\r
119 goto Exit;\r
120 } else {\r
121 FileName += 2;\r
122 }\r
123 } else if (FileName[1] == L'\0') {\r
124 goto Exit;\r
125 }\r
126 }\r
127\r
128 while (*FileName != L'\0') {\r
129 if (*FileName == L'\\') {\r
130 FileName = ExcludeTrailingBackslashes (FileName);\r
131 } else if (*FileName == L'.') {\r
132 switch (*(FileName + 1)) {\r
133 case L'\0':\r
134 *FileName = L'\0';\r
135 break;\r
136 case L'\\':\r
137 TempFileName = FileName + 1;\r
138 TempFileName = ExcludeTrailingBackslashes (TempFileName);\r
139 ReplaceLeft (FileName, TempFileName);\r
140 break;\r
141 case '.':\r
142 if ((*(FileName - 1) != L'\\') && ((*(FileName + 2) != L'\\') ||\r
143 (*(FileName + 2) != L'\0'))) {\r
144 FileName++;\r
145 continue;\r
146 }\r
147\r
148 BackslashesNo = 0;\r
149 TempFileName = FileName - 1;\r
150 while (TempFileName >= FileNameSavedPointer) {\r
151 if (*TempFileName == L'\\') {\r
152 if (++BackslashesNo == 2) {\r
153 break;\r
154 }\r
155 }\r
156\r
157 TempFileName--;\r
158 }\r
159\r
160 TempFileName++;\r
161\r
162 if ((*TempFileName == L'.') && (*(TempFileName + 1) == L'.')) {\r
163 FileName += 2;\r
164 } else {\r
165 if (*(FileName + 2) != L'\0') {\r
166 ReplaceLeft (TempFileName, FileName + 3);\r
167 if (*(TempFileName - 1) == L'\\') {\r
168 FileName = TempFileName;\r
169 ExcludeTrailingBackslashes (TempFileName - 1);\r
170 TempFileName = FileName;\r
171 }\r
172 } else {\r
173 *TempFileName = L'\0';\r
174 }\r
175\r
176 FileName = TempFileName;\r
177 }\r
178\r
179 break;\r
180 default:\r
181 FileName++;\r
182 }\r
183 } else {\r
184 FileName++;\r
185 }\r
186 }\r
187\r
188 FileName = FileNameSavedPointer;\r
189 if ((StrLen (FileName) > 1) && (FileName [StrLen (FileName) - 1] == L'\\')) {\r
190 FileName [StrLen (FileName) - 1] = L'\0';\r
191 }\r
192\r
193Exit:\r
194 return FileName;\r
195}\r