xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Rar/RarVol.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // RarVol.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_RAR_VOL_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_RAR_VOL_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "RarHeader.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
11*f6dc9357SAndroid Build Coastguard Worker namespace NRar {
12*f6dc9357SAndroid Build Coastguard Worker 
IsDigit(wchar_t c)13*f6dc9357SAndroid Build Coastguard Worker inline bool IsDigit(wchar_t c)
14*f6dc9357SAndroid Build Coastguard Worker {
15*f6dc9357SAndroid Build Coastguard Worker   return c >= L'0' && c <= L'9';
16*f6dc9357SAndroid Build Coastguard Worker }
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker class CVolumeName
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker   bool _needChangeForNext;
21*f6dc9357SAndroid Build Coastguard Worker   UString _before;
22*f6dc9357SAndroid Build Coastguard Worker   UString _changed;
23*f6dc9357SAndroid Build Coastguard Worker   UString _after;
24*f6dc9357SAndroid Build Coastguard Worker public:
CVolumeName()25*f6dc9357SAndroid Build Coastguard Worker   CVolumeName(): _needChangeForNext(true) {}
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker   bool InitName(const UString &name, bool newStyle = true)
28*f6dc9357SAndroid Build Coastguard Worker   {
29*f6dc9357SAndroid Build Coastguard Worker     _needChangeForNext = true;
30*f6dc9357SAndroid Build Coastguard Worker     _after.Empty();
31*f6dc9357SAndroid Build Coastguard Worker     UString base (name);
32*f6dc9357SAndroid Build Coastguard Worker     const int dotPos = name.ReverseFind_Dot();
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker     if (dotPos >= 0)
35*f6dc9357SAndroid Build Coastguard Worker     {
36*f6dc9357SAndroid Build Coastguard Worker       const UString ext (name.Ptr(dotPos + 1));
37*f6dc9357SAndroid Build Coastguard Worker       if (ext.IsEqualTo_Ascii_NoCase("rar"))
38*f6dc9357SAndroid Build Coastguard Worker       {
39*f6dc9357SAndroid Build Coastguard Worker         _after = name.Ptr(dotPos);
40*f6dc9357SAndroid Build Coastguard Worker         base.DeleteFrom(dotPos);
41*f6dc9357SAndroid Build Coastguard Worker       }
42*f6dc9357SAndroid Build Coastguard Worker       else if (ext.IsEqualTo_Ascii_NoCase("exe"))
43*f6dc9357SAndroid Build Coastguard Worker       {
44*f6dc9357SAndroid Build Coastguard Worker         _after = ".rar";
45*f6dc9357SAndroid Build Coastguard Worker         base.DeleteFrom(dotPos);
46*f6dc9357SAndroid Build Coastguard Worker       }
47*f6dc9357SAndroid Build Coastguard Worker       else if (!newStyle)
48*f6dc9357SAndroid Build Coastguard Worker       {
49*f6dc9357SAndroid Build Coastguard Worker         if (ext.IsEqualTo_Ascii_NoCase("000") ||
50*f6dc9357SAndroid Build Coastguard Worker             ext.IsEqualTo_Ascii_NoCase("001") ||
51*f6dc9357SAndroid Build Coastguard Worker             ext.IsEqualTo_Ascii_NoCase("r00") ||
52*f6dc9357SAndroid Build Coastguard Worker             ext.IsEqualTo_Ascii_NoCase("r01"))
53*f6dc9357SAndroid Build Coastguard Worker         {
54*f6dc9357SAndroid Build Coastguard Worker           _changed = ext;
55*f6dc9357SAndroid Build Coastguard Worker           _before.SetFrom(name.Ptr(), (unsigned)dotPos + 1);
56*f6dc9357SAndroid Build Coastguard Worker           return true;
57*f6dc9357SAndroid Build Coastguard Worker         }
58*f6dc9357SAndroid Build Coastguard Worker       }
59*f6dc9357SAndroid Build Coastguard Worker     }
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker     if (newStyle)
62*f6dc9357SAndroid Build Coastguard Worker     {
63*f6dc9357SAndroid Build Coastguard Worker       unsigned k = base.Len();
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker       for (; k != 0; k--)
66*f6dc9357SAndroid Build Coastguard Worker         if (IsDigit(base[k - 1]))
67*f6dc9357SAndroid Build Coastguard Worker           break;
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker       unsigned i = k;
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker       for (; i != 0; i--)
72*f6dc9357SAndroid Build Coastguard Worker         if (!IsDigit(base[i - 1]))
73*f6dc9357SAndroid Build Coastguard Worker           break;
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker       if (i != k)
76*f6dc9357SAndroid Build Coastguard Worker       {
77*f6dc9357SAndroid Build Coastguard Worker         _before.SetFrom(base.Ptr(), i);
78*f6dc9357SAndroid Build Coastguard Worker         _changed.SetFrom(base.Ptr(i), k - i);
79*f6dc9357SAndroid Build Coastguard Worker         _after.Insert(0, base.Ptr(k));
80*f6dc9357SAndroid Build Coastguard Worker         return true;
81*f6dc9357SAndroid Build Coastguard Worker       }
82*f6dc9357SAndroid Build Coastguard Worker     }
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker     _after.Empty();
85*f6dc9357SAndroid Build Coastguard Worker     _before = base;
86*f6dc9357SAndroid Build Coastguard Worker     _before.Add_Dot();
87*f6dc9357SAndroid Build Coastguard Worker     _changed = "r00";
88*f6dc9357SAndroid Build Coastguard Worker     _needChangeForNext = false;
89*f6dc9357SAndroid Build Coastguard Worker     return true;
90*f6dc9357SAndroid Build Coastguard Worker   }
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker   /*
93*f6dc9357SAndroid Build Coastguard Worker   void MakeBeforeFirstName()
94*f6dc9357SAndroid Build Coastguard Worker   {
95*f6dc9357SAndroid Build Coastguard Worker     unsigned len = _changed.Len();
96*f6dc9357SAndroid Build Coastguard Worker     _changed.Empty();
97*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < len; i++)
98*f6dc9357SAndroid Build Coastguard Worker       _changed += L'0';
99*f6dc9357SAndroid Build Coastguard Worker   }
100*f6dc9357SAndroid Build Coastguard Worker   */
101*f6dc9357SAndroid Build Coastguard Worker 
GetNextName()102*f6dc9357SAndroid Build Coastguard Worker   UString GetNextName()
103*f6dc9357SAndroid Build Coastguard Worker   {
104*f6dc9357SAndroid Build Coastguard Worker     if (_needChangeForNext)
105*f6dc9357SAndroid Build Coastguard Worker     {
106*f6dc9357SAndroid Build Coastguard Worker       unsigned i = _changed.Len();
107*f6dc9357SAndroid Build Coastguard Worker       if (i == 0)
108*f6dc9357SAndroid Build Coastguard Worker         return UString();
109*f6dc9357SAndroid Build Coastguard Worker       for (;;)
110*f6dc9357SAndroid Build Coastguard Worker       {
111*f6dc9357SAndroid Build Coastguard Worker         wchar_t c = _changed[--i];
112*f6dc9357SAndroid Build Coastguard Worker         if (c == L'9')
113*f6dc9357SAndroid Build Coastguard Worker         {
114*f6dc9357SAndroid Build Coastguard Worker           c = L'0';
115*f6dc9357SAndroid Build Coastguard Worker           _changed.ReplaceOneCharAtPos(i, c);
116*f6dc9357SAndroid Build Coastguard Worker           if (i == 0)
117*f6dc9357SAndroid Build Coastguard Worker           {
118*f6dc9357SAndroid Build Coastguard Worker             _changed.InsertAtFront(L'1');
119*f6dc9357SAndroid Build Coastguard Worker             break;
120*f6dc9357SAndroid Build Coastguard Worker           }
121*f6dc9357SAndroid Build Coastguard Worker           continue;
122*f6dc9357SAndroid Build Coastguard Worker         }
123*f6dc9357SAndroid Build Coastguard Worker         c++;
124*f6dc9357SAndroid Build Coastguard Worker         _changed.ReplaceOneCharAtPos(i, c);
125*f6dc9357SAndroid Build Coastguard Worker         break;
126*f6dc9357SAndroid Build Coastguard Worker       }
127*f6dc9357SAndroid Build Coastguard Worker     }
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker     _needChangeForNext = true;
130*f6dc9357SAndroid Build Coastguard Worker     return _before + _changed + _after;
131*f6dc9357SAndroid Build Coastguard Worker   }
132*f6dc9357SAndroid Build Coastguard Worker };
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker }}
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker #endif
137