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