mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-07 20:06:59 -06:00
9.34
This commit is contained in:
committed by
Kornel Lesiński
parent
83f8ddcc5b
commit
f08f4dcc3c
127
CPP/Common/ListFileUtils.cpp
Executable file → Normal file
127
CPP/Common/ListFileUtils.cpp
Executable file → Normal file
@@ -2,75 +2,116 @@
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include "MyWindows.h"
|
||||
#include "../../C/CpuArch.h"
|
||||
|
||||
#include "../Windows/FileIO.h"
|
||||
|
||||
#include "ListFileUtils.h"
|
||||
#include "MyBuffer.h"
|
||||
#include "StringConvert.h"
|
||||
#include "UTFConvert.h"
|
||||
|
||||
static const char kQuoteChar = '\"';
|
||||
|
||||
static void RemoveQuote(UString &s)
|
||||
static void AddName(UStringVector &strings, UString &s)
|
||||
{
|
||||
if (s.Length() >= 2)
|
||||
if (s[0] == kQuoteChar && s.Back() == kQuoteChar)
|
||||
s = s.Mid(1, s.Length() - 2);
|
||||
s.Trim();
|
||||
if (s.Len() >= 2 && s[0] == kQuoteChar && s.Back() == kQuoteChar)
|
||||
{
|
||||
s.DeleteBack();
|
||||
s.Delete(0);
|
||||
}
|
||||
if (!s.IsEmpty())
|
||||
strings.Add(s);
|
||||
}
|
||||
|
||||
bool ReadNamesFromListFile(CFSTR fileName, UStringVector &resultStrings, UINT codePage)
|
||||
bool ReadNamesFromListFile(CFSTR fileName, UStringVector &strings, UINT codePage)
|
||||
{
|
||||
NWindows::NFile::NIO::CInFile file;
|
||||
if (!file.Open(fileName))
|
||||
return false;
|
||||
UInt64 length;
|
||||
if (!file.GetLength(length))
|
||||
UInt64 fileSize;
|
||||
if (!file.GetLength(fileSize))
|
||||
return false;
|
||||
if (length > ((UInt32)1 << 31))
|
||||
if (fileSize >= ((UInt32)1 << 31) - 32)
|
||||
return false;
|
||||
AString s;
|
||||
char *p = s.GetBuffer((int)length + 1);
|
||||
UInt32 processed;
|
||||
if (!file.Read(p, (UInt32)length, processed))
|
||||
return false;
|
||||
p[(UInt32)length] = 0;
|
||||
s.ReleaseBuffer();
|
||||
file.Close();
|
||||
|
||||
UString u;
|
||||
#ifdef CP_UTF8
|
||||
if (codePage == CP_UTF8)
|
||||
if (codePage == MY__CP_UTF16 || codePage == MY__CP_UTF16BE)
|
||||
{
|
||||
if (!ConvertUTF8ToUnicode(s, u))
|
||||
if ((fileSize & 1) != 0)
|
||||
return false;
|
||||
CByteArr buf((size_t)fileSize);
|
||||
UInt32 processed;
|
||||
if (!file.Read(buf, (UInt32)fileSize, processed))
|
||||
return false;
|
||||
if (processed != fileSize)
|
||||
return false;
|
||||
file.Close();
|
||||
unsigned num = (unsigned)fileSize / 2;
|
||||
wchar_t *p = u.GetBuffer(num);
|
||||
if (codePage == MY__CP_UTF16)
|
||||
for (unsigned i = 0; i < num; i++)
|
||||
{
|
||||
wchar_t c = GetUi16(buf + i * 2);
|
||||
if (c == 0)
|
||||
return false;
|
||||
p[i] = c;
|
||||
}
|
||||
else
|
||||
for (unsigned i = 0; i < num; i++)
|
||||
{
|
||||
wchar_t c = (wchar_t)GetBe16(buf + i * 2);
|
||||
if (c == 0)
|
||||
return false;
|
||||
p[i] = c;
|
||||
}
|
||||
u.ReleaseBuffer(num);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
u = MultiByteToUnicodeString(s, codePage);
|
||||
if (!u.IsEmpty())
|
||||
{
|
||||
if (u[0] == 0xFEFF)
|
||||
u.Delete(0);
|
||||
}
|
||||
|
||||
UString t;
|
||||
for (int i = 0; i < u.Length(); i++)
|
||||
{
|
||||
wchar_t c = u[i];
|
||||
if (c == L'\n' || c == 0xD)
|
||||
AString s;
|
||||
char *p = s.GetBuffer((unsigned)fileSize);
|
||||
UInt32 processed;
|
||||
if (!file.Read(p, (UInt32)fileSize, processed))
|
||||
return false;
|
||||
if (processed != fileSize)
|
||||
return false;
|
||||
file.Close();
|
||||
p[processed] = 0;
|
||||
s.ReleaseBuffer();
|
||||
if (s.Len() != processed)
|
||||
return false;
|
||||
|
||||
// #ifdef CP_UTF8
|
||||
if (codePage == CP_UTF8)
|
||||
{
|
||||
t.Trim();
|
||||
RemoveQuote(t);
|
||||
if (!t.IsEmpty())
|
||||
resultStrings.Add(t);
|
||||
t.Empty();
|
||||
if (!ConvertUTF8ToUnicode(s, u))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
t += c;
|
||||
// #endif
|
||||
MultiByteToUnicodeString2(u, s, codePage);
|
||||
}
|
||||
t.Trim();
|
||||
RemoveQuote(t);
|
||||
if (!t.IsEmpty())
|
||||
resultStrings.Add(t);
|
||||
|
||||
const wchar_t kGoodBOM = 0xFEFF;
|
||||
const wchar_t kBadBOM = 0xFFFE;
|
||||
|
||||
UString s;
|
||||
unsigned i = 0;
|
||||
for (; i < u.Len() && u[i] == kGoodBOM; i++);
|
||||
for (; i < u.Len(); i++)
|
||||
{
|
||||
wchar_t c = u[i];
|
||||
if (c == kGoodBOM || c == kBadBOM)
|
||||
return false;
|
||||
if (c == L'\n' || c == 0xD)
|
||||
{
|
||||
AddName(strings, s);
|
||||
s.Empty();
|
||||
}
|
||||
else
|
||||
s += c;
|
||||
}
|
||||
AddName(strings, s);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user