]>
git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Disk/UdfDxe/FileName.c
2 Helper functions for mangling file names in UDF/ECMA-167 file systems.
4 Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
12 Trim the leading and trailing spaces for a give Unicode string.
14 @param[in] String The Unicode string to trim.
16 @return A pointer to the trimmed string.
26 for ( ; *String
!= L
'\0' && *String
== L
' '; String
++) {
30 TempString
= String
+ StrLen (String
) - 1;
31 while ((TempString
>= String
) && (*TempString
== L
' ')) {
35 *(TempString
+ 1) = L
'\0';
41 Replace the content of a Unicode string with the content of another Unicode
44 @param[in] Destination A pointer to a Unicode string.
45 @param[in] Source A pointer to a Unicode string.
50 IN CHAR16
*Destination
,
51 IN CONST CHAR16
*Source
54 CONST CHAR16
*EndString
;
56 EndString
= Source
+ StrLen (Source
);
57 while (Source
<= EndString
) {
58 *Destination
++ = *Source
++;
63 Remove one or more consecutive backslashes starting from the second character
64 of a given Unicode string.
66 @param[in] String A pointer to a Unicode string.
68 @return A pointer to the modified string.
72 ExcludeTrailingBackslashes (
78 switch (*(String
+ 1)) {
88 while (*TempString
!= L
'\0' && *TempString
== L
'\\') {
92 if (TempString
- 1 > String
) {
93 ReplaceLeft (String
+ 1, TempString
);
103 Mangle a filename by cutting off trailing whitespaces, "\\", "." and "..".
105 @param[in] FileName Filename.
107 @retval The mangled Filename.
115 CHAR16
*FileNameSavedPointer
;
116 CHAR16
*TempFileName
;
119 if (FileName
== NULL
|| *FileName
== L
'\0') {
124 FileName
= TrimString (FileName
);
125 if (*FileName
== L
'\0') {
129 if ((StrLen (FileName
) > 1) && (FileName
[StrLen (FileName
) - 1] == L
'\\')) {
130 FileName
[StrLen (FileName
) - 1] = L
'\0';
133 FileNameSavedPointer
= FileName
;
135 if (FileName
[0] == L
'.') {
136 if (FileName
[1] == L
'.') {
137 if (FileName
[2] == L
'\0') {
142 } else if (FileName
[1] == L
'\0') {
147 while (*FileName
!= L
'\0') {
148 if (*FileName
== L
'\\') {
149 FileName
= ExcludeTrailingBackslashes (FileName
);
150 } else if (*FileName
== L
'.') {
151 switch (*(FileName
+ 1)) {
156 TempFileName
= FileName
+ 1;
157 TempFileName
= ExcludeTrailingBackslashes (TempFileName
);
158 ReplaceLeft (FileName
, TempFileName
);
161 if ((*(FileName
- 1) != L
'\\') && ((*(FileName
+ 2) != L
'\\') ||
162 (*(FileName
+ 2) != L
'\0'))) {
168 TempFileName
= FileName
- 1;
169 while (TempFileName
>= FileNameSavedPointer
) {
170 if (*TempFileName
== L
'\\') {
171 if (++BackslashesNo
== 2) {
181 if ((*TempFileName
== L
'.') && (*(TempFileName
+ 1) == L
'.')) {
184 if (*(FileName
+ 2) != L
'\0') {
185 ReplaceLeft (TempFileName
, FileName
+ 3);
186 if (*(TempFileName
- 1) == L
'\\') {
187 FileName
= TempFileName
;
188 ExcludeTrailingBackslashes (TempFileName
- 1);
189 TempFileName
= FileName
;
192 *TempFileName
= L
'\0';
195 FileName
= TempFileName
;
207 FileName
= FileNameSavedPointer
;
208 if ((StrLen (FileName
) > 1) && (FileName
[StrLen (FileName
) - 1] == L
'\\')) {
209 FileName
[StrLen (FileName
) - 1] = L
'\0';