Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / FileManager / SplitUtils.cpp
1 // SplitUtils.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Common/StringToInt.h"\r
6 \r
7 #include "SplitUtils.h"\r
8 #include "StringUtils.h"\r
9 \r
10 bool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values)\r
11 {\r
12   values.Clear();\r
13   UStringVector destStrings;\r
14   SplitString(s, destStrings);\r
15   bool prevIsNumber = false;\r
16   for (int i = 0; i < destStrings.Size(); i++)\r
17   {\r
18     UString subString = destStrings[i];\r
19     subString.MakeUpper();\r
20     if (subString.IsEmpty())\r
21       return false;\r
22     if (subString == L"-")\r
23       return true;\r
24     if (prevIsNumber)\r
25     {\r
26       wchar_t c = subString[0];\r
27       UInt64 &value = values.Back();\r
28       prevIsNumber = false;\r
29       switch(c)\r
30       {\r
31         case L'B':\r
32           continue;\r
33         case L'K':\r
34           value <<= 10;\r
35           continue;\r
36         case L'M':\r
37           value <<= 20;\r
38           continue;\r
39         case L'G':\r
40           value <<= 30;\r
41           continue;\r
42       }\r
43     }\r
44     const wchar_t *start = subString;\r
45     const wchar_t *end;\r
46     UInt64 value = ConvertStringToUInt64(start, &end);\r
47     if (start == end)\r
48       return false;\r
49     if (value == 0)\r
50       return false;\r
51     values.Add(value);\r
52     prevIsNumber = true;\r
53     UString rem = subString.Mid((int)(end - start));\r
54     if (!rem.IsEmpty())\r
55       destStrings.Insert(i + 1, rem);\r
56   }\r
57   return true;\r
58 }\r
59 \r
60 void AddVolumeItems(NWindows::NControl::CComboBox &volumeCombo)\r
61 {\r
62   volumeCombo.AddString(TEXT("10M"));\r
63   volumeCombo.AddString(TEXT("650M - CD"));\r
64   volumeCombo.AddString(TEXT("700M - CD"));\r
65   volumeCombo.AddString(TEXT("4480M - DVD"));\r
66   volumeCombo.AddString(TEXT("1457664 - 3.5\" floppy"));\r
67 }\r
68 \r
69 UInt64 GetNumberOfVolumes(UInt64 size, CRecordVector<UInt64> &volSizes)\r
70 {\r
71   if (size == 0 || volSizes.Size() == 0)\r
72     return 1;\r
73   UInt64 numVolumes = 0;\r
74   for (int i = 0; i < volSizes.Size(); i++)\r
75   {\r
76     UInt64 volSize = volSizes[i];\r
77     numVolumes++;\r
78     if (volSize >= size)\r
79       return numVolumes;\r
80     size -= volSize;\r
81   }\r
82   UInt64 volSize = volSizes.Back();\r
83   if (volSize == 0)\r
84     return (UInt64)(Int64)-1;\r
85   return numVolumes + (size - 1) / volSize + 1;\r
86 }\r