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