summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp
blob: 8caf1d141b1e282fcc81506cf0ed183b11dbd867 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Archive/Common/ItemNameUtils.cpp

#include "StdAfx.h"

#include "ItemNameUtils.h"

namespace NArchive {
namespace NItemName {

static const wchar_t kOsPathSepar = WCHAR_PATH_SEPARATOR;

#if WCHAR_PATH_SEPARATOR != L'/'
static const wchar_t kUnixPathSepar = L'/';
#endif

void ReplaceSlashes_OsToUnix
#if WCHAR_PATH_SEPARATOR != L'/'
  (UString &name)
  {
    name.Replace(kOsPathSepar, kUnixPathSepar);
  }
#else
  (UString &) {}
#endif


UString GetOsPath(const UString &name)
{
  #if WCHAR_PATH_SEPARATOR != L'/'
    UString newName = name;
    newName.Replace(kUnixPathSepar, kOsPathSepar);
    return newName;
  #else
    return name;
  #endif
}


UString GetOsPath_Remove_TailSlash(const UString &name)
{
  if (name.IsEmpty())
    return UString();
  UString newName = GetOsPath(name);
  if (newName.Back() == kOsPathSepar)
    newName.DeleteBack();
  return newName;
}


void ReplaceToOsSlashes_Remove_TailSlash(UString &name, bool
    #if WCHAR_PATH_SEPARATOR != L'/'
      useBackslashReplacement
    #endif
    )
{
  if (name.IsEmpty())
    return;

  #if WCHAR_PATH_SEPARATOR != L'/'
  {
    // name.Replace(kUnixPathSepar, kOsPathSepar);
    const unsigned len = name.Len();
    for (unsigned i = 0; i < len; i++)
    {
      wchar_t c = name[i];
      if (c == L'/')
        c = WCHAR_PATH_SEPARATOR;
      else if (useBackslashReplacement && c == L'\\')
        c = WCHAR_IN_FILE_NAME_BACKSLASH_REPLACEMENT; // WSL scheme
      else
        continue;
      name.ReplaceOneCharAtPos(i, c);
    }
  }
  #endif
    
  if (name.Back() == kOsPathSepar)
    name.DeleteBack();
}


void NormalizeSlashes_in_FileName_for_OsPath(wchar_t *name, unsigned len)
{
  for (unsigned i = 0; i < len; i++)
  {
    wchar_t c = name[i];
    if (c == L'/')
      c = L'_';
   #if WCHAR_PATH_SEPARATOR != L'/'
    else if (c == L'\\')
      c = WCHAR_IN_FILE_NAME_BACKSLASH_REPLACEMENT; // WSL scheme
   #endif
    else
      continue;
    name[i] = c;
  }
}

void NormalizeSlashes_in_FileName_for_OsPath(UString &name)
{
  NormalizeSlashes_in_FileName_for_OsPath(name.GetBuf(), name.Len());
}


bool HasTailSlash(const AString &name, UINT
  #if defined(_WIN32) && !defined(UNDER_CE)
    codePage
  #endif
  )
{
  if (name.IsEmpty())
    return false;
  char c;
    #if defined(_WIN32) && !defined(UNDER_CE)
    if (codePage != CP_UTF8)
      c = *CharPrevExA((WORD)codePage, name, name.Ptr(name.Len()), 0);
    else
    #endif
    {
      c = name.Back();
    }
  return (c == '/');
}


#ifndef _WIN32
UString WinPathToOsPath(const UString &name)
{
  UString newName = name;
  newName.Replace(L'\\', WCHAR_PATH_SEPARATOR);
  return newName;
}
#endif

}}