Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / Common / FilePathAutoRename.cpp
1 // FilePathAutoRename.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Common/Defs.h"\r
6 #include "Common/IntToString.h"\r
7 \r
8 #include "Windows/FileFind.h"\r
9 \r
10 #include "FilePathAutoRename.h"\r
11 \r
12 using namespace NWindows;\r
13 \r
14 static bool MakeAutoName(const UString &name,\r
15     const UString &extension, unsigned value, UString &path)\r
16 {\r
17   wchar_t number[16];\r
18   ConvertUInt32ToString(value, number);\r
19   path = name;\r
20   path += number;\r
21   path += extension;\r
22   return NFile::NFind::DoesFileOrDirExist(path);\r
23 }\r
24 \r
25 bool AutoRenamePath(UString &fullProcessedPath)\r
26 {\r
27   UString path;\r
28   int dotPos = fullProcessedPath.ReverseFind(L'.');\r
29 \r
30   int slashPos = fullProcessedPath.ReverseFind(L'/');\r
31   #ifdef _WIN32\r
32   int slash1Pos = fullProcessedPath.ReverseFind(L'\\');\r
33   slashPos = MyMax(slashPos, slash1Pos);\r
34   #endif\r
35 \r
36   UString name, extension;\r
37   if (dotPos > slashPos && dotPos > 0)\r
38   {\r
39     name = fullProcessedPath.Left(dotPos);\r
40     extension = fullProcessedPath.Mid(dotPos);\r
41   }\r
42   else\r
43     name = fullProcessedPath;\r
44   name += L'_';\r
45   unsigned left = 1, right = (1 << 30);\r
46   while (left != right)\r
47   {\r
48     unsigned mid = (left + right) / 2;\r
49     if (MakeAutoName(name, extension, mid, path))\r
50       left = mid + 1;\r
51     else\r
52       right = mid;\r
53   }\r
54   return !MakeAutoName(name, extension, right, fullProcessedPath);\r
55 }\r