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