xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/FilePathAutoRename.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // FilePathAutoRename.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 "../../Windows/FileFind.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "FilePathAutoRename.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
10*f6dc9357SAndroid Build Coastguard Worker 
MakeAutoName(const FString & name,const FString & extension,UInt32 value,FString & path)11*f6dc9357SAndroid Build Coastguard Worker static bool MakeAutoName(const FString &name,
12*f6dc9357SAndroid Build Coastguard Worker     const FString &extension, UInt32 value, FString &path)
13*f6dc9357SAndroid Build Coastguard Worker {
14*f6dc9357SAndroid Build Coastguard Worker   path = name;
15*f6dc9357SAndroid Build Coastguard Worker   path.Add_UInt32(value);
16*f6dc9357SAndroid Build Coastguard Worker   path += extension;
17*f6dc9357SAndroid Build Coastguard Worker   return NFile::NFind::DoesFileOrDirExist(path);
18*f6dc9357SAndroid Build Coastguard Worker }
19*f6dc9357SAndroid Build Coastguard Worker 
AutoRenamePath(FString & path)20*f6dc9357SAndroid Build Coastguard Worker bool AutoRenamePath(FString &path)
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker   const int dotPos = path.ReverseFind_Dot();
23*f6dc9357SAndroid Build Coastguard Worker   const int slashPos = path.ReverseFind_PathSepar();
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker   FString name = path;
26*f6dc9357SAndroid Build Coastguard Worker   FString extension;
27*f6dc9357SAndroid Build Coastguard Worker   if (dotPos > slashPos + 1)
28*f6dc9357SAndroid Build Coastguard Worker   {
29*f6dc9357SAndroid Build Coastguard Worker     name.DeleteFrom((unsigned)dotPos);
30*f6dc9357SAndroid Build Coastguard Worker     extension = path.Ptr((unsigned)dotPos);
31*f6dc9357SAndroid Build Coastguard Worker   }
32*f6dc9357SAndroid Build Coastguard Worker   name.Add_Char('_');
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker   FString temp;
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker   UInt32 left = 1, right = (UInt32)1 << 30;
37*f6dc9357SAndroid Build Coastguard Worker   while (left != right)
38*f6dc9357SAndroid Build Coastguard Worker   {
39*f6dc9357SAndroid Build Coastguard Worker     const UInt32 mid = (left + right) / 2;
40*f6dc9357SAndroid Build Coastguard Worker     if (MakeAutoName(name, extension, mid, temp))
41*f6dc9357SAndroid Build Coastguard Worker       left = mid + 1;
42*f6dc9357SAndroid Build Coastguard Worker     else
43*f6dc9357SAndroid Build Coastguard Worker       right = mid;
44*f6dc9357SAndroid Build Coastguard Worker   }
45*f6dc9357SAndroid Build Coastguard Worker   return !MakeAutoName(name, extension, right, path);
46*f6dc9357SAndroid Build Coastguard Worker }
47