Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/kornelski/7z.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/7zip/UI/FileManager/SplitUtils.cpp')
-rw-r--r--[-rwxr-xr-x]CPP/7zip/UI/FileManager/SplitUtils.cpp87
1 files changed, 44 insertions, 43 deletions
diff --git a/CPP/7zip/UI/FileManager/SplitUtils.cpp b/CPP/7zip/UI/FileManager/SplitUtils.cpp
index 8bae0573..b0172a9f 100755..100644
--- a/CPP/7zip/UI/FileManager/SplitUtils.cpp
+++ b/CPP/7zip/UI/FileManager/SplitUtils.cpp
@@ -2,85 +2,86 @@
#include "StdAfx.h"
-#include "Common/StringToInt.h"
+#include "../../../Common/StringToInt.h"
#include "SplitUtils.h"
-#include "StringUtils.h"
bool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values)
{
values.Clear();
- UStringVector destStrings;
- SplitString(s, destStrings);
bool prevIsNumber = false;
- for (int i = 0; i < destStrings.Size(); i++)
+ for (unsigned i = 0; i < s.Len();)
{
- UString subString = destStrings[i];
- subString.MakeUpper();
- if (subString.IsEmpty())
- return false;
- if (subString == L"-")
+ wchar_t c = s[i++];
+ if (c == L' ')
+ continue;
+ if (c == L'-')
return true;
if (prevIsNumber)
{
- wchar_t c = subString[0];
- UInt64 &value = values.Back();
prevIsNumber = false;
- switch(c)
+ unsigned numBits = 0;
+ switch (MyCharLower_Ascii(c))
+ {
+ case 'b': continue;
+ case 'k': numBits = 10; break;
+ case 'm': numBits = 20; break;
+ case 'g': numBits = 30; break;
+ case 't': numBits = 40; break;
+ }
+ if (numBits != 0)
{
- case L'B':
- continue;
- case L'K':
- value <<= 10;
- continue;
- case L'M':
- value <<= 20;
- continue;
- case L'G':
- value <<= 30;
- continue;
+ UInt64 &val = values.Back();
+ if (val >= ((UInt64)1 << (64 - numBits)))
+ return false;
+ val <<= numBits;
+
+ for (; i < s.Len(); i++)
+ if (s[i] == L' ')
+ break;
+ continue;
}
}
- const wchar_t *start = subString;
+ i--;
+ const wchar_t *start = s.Ptr(i);
const wchar_t *end;
- UInt64 value = ConvertStringToUInt64(start, &end);
+ UInt64 val = ConvertStringToUInt64(start, &end);
if (start == end)
return false;
- if (value == 0)
+ if (val == 0)
return false;
- values.Add(value);
+ values.Add(val);
prevIsNumber = true;
- UString rem = subString.Mid((int)(end - start));
- if (!rem.IsEmpty())
- destStrings.Insert(i + 1, rem);
+ i += (unsigned)(end - start);
}
return true;
}
-void AddVolumeItems(NWindows::NControl::CComboBox &volumeCombo)
+void AddVolumeItems(NWindows::NControl::CComboBox &combo)
{
- volumeCombo.AddString(TEXT("10M"));
- volumeCombo.AddString(TEXT("650M - CD"));
- volumeCombo.AddString(TEXT("700M - CD"));
- volumeCombo.AddString(TEXT("4480M - DVD"));
- volumeCombo.AddString(TEXT("1457664 - 3.5\" floppy"));
+ combo.AddString(TEXT("10M"));
+ combo.AddString(TEXT("650M - CD"));
+ combo.AddString(TEXT("700M - CD"));
+ combo.AddString(TEXT("4092M - FAT"));
+ combo.AddString(TEXT("4480M - DVD")); // 4489 MiB limit
+ combo.AddString(TEXT("8128M - DVD DL")); // 8147 MiB limit
+ combo.AddString(TEXT("23040M - BD")); // 23866 MiB limit
+ combo.AddString(TEXT("1457664 - 3.5\" floppy"));
}
-UInt64 GetNumberOfVolumes(UInt64 size, CRecordVector<UInt64> &volSizes)
+UInt64 GetNumberOfVolumes(UInt64 size, const CRecordVector<UInt64> &volSizes)
{
if (size == 0 || volSizes.Size() == 0)
return 1;
- UInt64 numVolumes = 0;
- for (int i = 0; i < volSizes.Size(); i++)
+ FOR_VECTOR (i, volSizes)
{
UInt64 volSize = volSizes[i];
- numVolumes++;
if (volSize >= size)
- return numVolumes;
+ return i + 1;
size -= volSize;
}
UInt64 volSize = volSizes.Back();
if (volSize == 0)
return (UInt64)(Int64)-1;
- return numVolumes + (size - 1) / volSize + 1;
+ return volSizes.Size() + (size - 1) / volSize + 1;
}