]>
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
++) {
29 TempString
= String
+ StrLen (String
) - 1;
30 while ((TempString
>= String
) && (*TempString
== L
' ')) {
34 *(TempString
+ 1) = L
'\0';
40 Replace the content of a Unicode string with the content of another Unicode
43 @param[in] Destination A pointer to a Unicode string.
44 @param[in] Source A pointer to a Unicode string.
49 IN CHAR16
*Destination
,
50 IN CONST CHAR16
*Source
53 CONST CHAR16
*EndString
;
55 EndString
= Source
+ StrLen (Source
);
56 while (Source
<= EndString
) {
57 *Destination
++ = *Source
++;
62 Remove one or more consecutive backslashes starting from the second character
63 of a given Unicode string.
65 @param[in] String A pointer to a Unicode string.
67 @return A pointer to the modified string.
71 ExcludeTrailingBackslashes (
77 switch (*(String
+ 1)) {
87 while (*TempString
!= L
'\0' && *TempString
== L
'\\') {
91 if (TempString
- 1 > String
) {
92 ReplaceLeft (String
+ 1, TempString
);
102 Mangle a filename by cutting off trailing whitespaces, "\\", "." and "..".
104 @param[in] FileName Filename.
106 @retval The mangled Filename.
114 CHAR16
*FileNameSavedPointer
;
115 CHAR16
*TempFileName
;
118 if ((FileName
== NULL
) || (*FileName
== L
'\0')) {
123 FileName
= TrimString (FileName
);
124 if (*FileName
== L
'\0') {
128 if ((StrLen (FileName
) > 1) && (FileName
[StrLen (FileName
) - 1] == L
'\\')) {
129 FileName
[StrLen (FileName
) - 1] = L
'\0';
132 FileNameSavedPointer
= FileName
;
134 if (FileName
[0] == L
'.') {
135 if (FileName
[1] == L
'.') {
136 if (FileName
[2] == L
'\0') {
141 } else if (FileName
[1] == L
'\0') {
146 while (*FileName
!= L
'\0') {
147 if (*FileName
== L
'\\') {
148 FileName
= ExcludeTrailingBackslashes (FileName
);
149 } else if (*FileName
== L
'.') {
150 switch (*(FileName
+ 1)) {
155 TempFileName
= FileName
+ 1;
156 TempFileName
= ExcludeTrailingBackslashes (TempFileName
);
157 ReplaceLeft (FileName
, TempFileName
);
160 if ((*(FileName
- 1) != L
'\\') && ((*(FileName
+ 2) != L
'\\') ||
161 (*(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';