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