1 /** @file 2 Defines file-path manipulation functions. 3 4 Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php. 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 **/ 13 #include <Uefi/UefiBaseType.h> 14 #include <Library/BaseMemoryLib.h> 15 #include <Library/BaseLib.h> 16 #include <Protocol/SimpleTextIn.h> 17 18 /** 19 Removes the last directory or file entry in a path by changing the last 20 L'\' to a CHAR_NULL. 21 22 @param[in,out] Path A pointer to the path to modify. 23 24 @retval FALSE Nothing was found to remove. 25 @retval TRUE A directory or file was removed. 26 **/ 27 BOOLEAN 28 EFIAPI 29 PathRemoveLastItem( 30 IN OUT CHAR16 *Path 31 ) 32 { 33 CHAR16 *Walker; 34 CHAR16 *LastSlash; 35 // 36 // get directory name from path... ('chop' off extra) 37 // 38 for ( Walker = Path, LastSlash = NULL 39 ; Walker != NULL && *Walker != CHAR_NULL 40 ; Walker++ 41 ){ 42 if (*Walker == L'\\' && *(Walker + 1) != CHAR_NULL) { 43 LastSlash = Walker+1; 44 } 45 } 46 if (LastSlash != NULL) { 47 *LastSlash = CHAR_NULL; 48 return (TRUE); 49 } 50 return (FALSE); 51 } 52 53 /** 54 Function to clean up paths. 55 56 - Single periods in the path are removed. 57 - Double periods in the path are removed along with a single parent directory. 58 - Forward slashes L'/' are converted to backward slashes L'\'. 59 60 This will be done inline and the existing buffer may be larger than required 61 upon completion. 62 63 @param[in] Path The pointer to the string containing the path. 64 65 @return Returns Path, otherwise returns NULL to indicate that an error has occured. 66 **/ 67 CHAR16* 68 EFIAPI 69 PathCleanUpDirectories( 70 IN CHAR16 *Path 71 ) 72 { 73 CHAR16 *TempString; 74 UINTN TempSize; 75 76 if (Path==NULL) { 77 return(NULL); 78 } 79 // 80 // Fix up the '/' vs '\' 81 // 82 for (TempString = Path ; TempString != NULL && *TempString != CHAR_NULL ; TempString++) { 83 if (*TempString == L'/') { 84 *TempString = L'\\'; 85 } 86 } 87 // 88 // Fix up the .. 89 // 90 while ((TempString = StrStr(Path, L"\\..\\")) != NULL) { 91 *TempString = CHAR_NULL; 92 TempString += 4; 93 PathRemoveLastItem(Path); 94 TempSize = StrSize(TempString); 95 CopyMem(Path+StrLen(Path), TempString, TempSize); 96 } 97 if ((TempString = StrStr(Path, L"\\..")) != NULL && *(TempString + 3) == CHAR_NULL) { 98 *TempString = CHAR_NULL; 99 PathRemoveLastItem(Path); 100 } 101 // 102 // Fix up the . 103 // 104 while ((TempString = StrStr(Path, L"\\.\\")) != NULL) { 105 *TempString = CHAR_NULL; 106 TempString += 2; 107 TempSize = StrSize(TempString); 108 CopyMem(Path+StrLen(Path), TempString, TempSize); 109 } 110 if ((TempString = StrStr(Path, L"\\.")) != NULL && *(TempString + 2) == CHAR_NULL) { 111 *(TempString + 1) = CHAR_NULL; 112 } 113 114 while ((TempString = StrStr(Path, L"\\\\")) != NULL) { 115 *TempString = CHAR_NULL; 116 TempString += 1; 117 TempSize = StrSize(TempString); 118 CopyMem(Path+StrLen(Path), TempString, TempSize); 119 } 120 if ((TempString = StrStr(Path, L"\\\\")) != NULL && *(TempString + 1) == CHAR_NULL) { 121 *(TempString) = CHAR_NULL; 122 } 123 124 return (Path); 125 } 126 127