xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/FileManager/SplitUtils.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1 // SplitUtils.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "../../../Common/StringToInt.h"
6 
7 #include "SplitUtils.h"
8 
ParseVolumeSizes(const UString & s,CRecordVector<UInt64> & values)9 bool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values)
10 {
11   values.Clear();
12   bool prevIsNumber = false;
13   for (unsigned i = 0; i < s.Len();)
14   {
15     wchar_t c = s[i++];
16     if (c == L' ')
17       continue;
18     if (c == L'-')
19       return true;
20     if (prevIsNumber)
21     {
22       prevIsNumber = false;
23       unsigned numBits = 0;
24       switch (MyCharLower_Ascii(c))
25       {
26         case 'b': continue;
27         case 'k': numBits = 10; break;
28         case 'm': numBits = 20; break;
29         case 'g': numBits = 30; break;
30         case 't': numBits = 40; break;
31       }
32       if (numBits != 0)
33       {
34         UInt64 &val = values.Back();
35         if (val >= ((UInt64)1 << (64 - numBits)))
36           return false;
37         val <<= numBits;
38 
39         for (; i < s.Len(); i++)
40           if (s[i] == L' ')
41             break;
42         continue;
43       }
44     }
45     i--;
46     const wchar_t *start = s.Ptr(i);
47     const wchar_t *end;
48     UInt64 val = ConvertStringToUInt64(start, &end);
49     if (start == end)
50       return false;
51     if (val == 0)
52       return false;
53     values.Add(val);
54     prevIsNumber = true;
55     i += (unsigned)(end - start);
56   }
57   return true;
58 }
59 
60 
61 static const char * const k_Sizes[] =
62 {
63     "10M"
64   , "100M"
65   , "1000M"
66   , "650M - CD"
67   , "700M - CD"
68   , "4092M - FAT"
69   , "4480M - DVD"     //  4489 MiB limit
70   , "8128M - DVD DL"  //  8147 MiB limit
71   , "23040M - BD"     // 23866 MiB limit
72   // , "1457664 - 3.5\" floppy"
73 };
74 
AddVolumeItems(NWindows::NControl::CComboBox & combo)75 void AddVolumeItems(NWindows::NControl::CComboBox &combo)
76 {
77   for (unsigned i = 0; i < Z7_ARRAY_SIZE(k_Sizes); i++)
78     combo.AddString(CSysString(k_Sizes[i]));
79 }
80 
GetNumberOfVolumes(UInt64 size,const CRecordVector<UInt64> & volSizes)81 UInt64 GetNumberOfVolumes(UInt64 size, const CRecordVector<UInt64> &volSizes)
82 {
83   if (size == 0 || volSizes.Size() == 0)
84     return 1;
85   FOR_VECTOR (i, volSizes)
86   {
87     UInt64 volSize = volSizes[i];
88     if (volSize >= size)
89       return i + 1;
90     size -= volSize;
91   }
92   UInt64 volSize = volSizes.Back();
93   if (volSize == 0)
94     return (UInt64)(Int64)-1;
95   return volSizes.Size() + (size - 1) / volSize + 1;
96 }
97