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