1// Archive/Common/ItemNameUtils.cpp 2 3#include "StdAfx.h" 4 5#include "ItemNameUtils.h" 6 7namespace NArchive { 8namespace NItemName { 9 10static const wchar_t kOsPathSepar = WCHAR_PATH_SEPARATOR; 11 12#if WCHAR_PATH_SEPARATOR != L'/' 13static const wchar_t kUnixPathSepar = L'/'; 14#endif 15 16void ReplaceSlashes_OsToUnix 17#if WCHAR_PATH_SEPARATOR != L'/' 18 (UString &name) 19 { 20 name.Replace(kOsPathSepar, kUnixPathSepar); 21 } 22#else 23 (UString &) {} 24#endif 25 26 27UString GetOsPath(const UString &name) 28{ 29 #if WCHAR_PATH_SEPARATOR != L'/' 30 UString newName = name; 31 newName.Replace(kUnixPathSepar, kOsPathSepar); 32 return newName; 33 #else 34 return name; 35 #endif 36} 37 38 39UString GetOsPath_Remove_TailSlash(const UString &name) 40{ 41 if (name.IsEmpty()) 42 return UString(); 43 UString newName = GetOsPath(name); 44 if (newName.Back() == kOsPathSepar) 45 newName.DeleteBack(); 46 return newName; 47} 48 49 50void ReplaceToOsSlashes_Remove_TailSlash(UString &name, bool 51 #if WCHAR_PATH_SEPARATOR != L'/' 52 useBackslashReplacement 53 #endif 54 ) 55{ 56 if (name.IsEmpty()) 57 return; 58 59 #if WCHAR_PATH_SEPARATOR != L'/' 60 { 61 // name.Replace(kUnixPathSepar, kOsPathSepar); 62 const unsigned len = name.Len(); 63 for (unsigned i = 0; i < len; i++) 64 { 65 wchar_t c = name[i]; 66 if (c == L'/') 67 c = WCHAR_PATH_SEPARATOR; 68 else if (useBackslashReplacement && c == L'\\') 69 c = WCHAR_IN_FILE_NAME_BACKSLASH_REPLACEMENT; // WSL scheme 70 else 71 continue; 72 name.ReplaceOneCharAtPos(i, c); 73 } 74 } 75 #endif 76 77 if (name.Back() == kOsPathSepar) 78 name.DeleteBack(); 79} 80 81 82void NormalizeSlashes_in_FileName_for_OsPath(wchar_t *name, unsigned len) 83{ 84 for (unsigned i = 0; i < len; i++) 85 { 86 wchar_t c = name[i]; 87 if (c == L'/') 88 c = L'_'; 89 #if WCHAR_PATH_SEPARATOR != L'/' 90 else if (c == L'\\') 91 c = WCHAR_IN_FILE_NAME_BACKSLASH_REPLACEMENT; // WSL scheme 92 #endif 93 else 94 continue; 95 name[i] = c; 96 } 97} 98 99void NormalizeSlashes_in_FileName_for_OsPath(UString &name) 100{ 101 NormalizeSlashes_in_FileName_for_OsPath(name.GetBuf(), name.Len()); 102} 103 104 105bool HasTailSlash(const AString &name, UINT 106 #if defined(_WIN32) && !defined(UNDER_CE) 107 codePage 108 #endif 109 ) 110{ 111 if (name.IsEmpty()) 112 return false; 113 char c; 114 #if defined(_WIN32) && !defined(UNDER_CE) 115 if (codePage != CP_UTF8) 116 c = *CharPrevExA((WORD)codePage, name, name.Ptr(name.Len()), 0); 117 else 118 #endif 119 { 120 c = name.Back(); 121 } 122 return (c == '/'); 123} 124 125 126#ifndef _WIN32 127UString WinPathToOsPath(const UString &name) 128{ 129 UString newName = name; 130 newName.Replace(L'\\', WCHAR_PATH_SEPARATOR); 131 return newName; 132} 133#endif 134 135}} 136