// Common/ListFileUtils.cpp | |
#include "StdAfx.h" | |
#include "MyWindows.h" | |
#include "../Windows/FileIO.h" | |
#include "ListFileUtils.h" | |
#include "StringConvert.h" | |
#include "UTFConvert.h" | |
static const char kQuoteChar = '\"'; | |
static void RemoveQuote(UString &s) | |
{ | |
if (s.Length() >= 2) | |
if (s[0] == kQuoteChar && s[s.Length() - 1] == kQuoteChar) | |
s = s.Mid(1, s.Length() - 2); | |
} | |
bool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &resultStrings, UINT codePage) | |
{ | |
NWindows::NFile::NIO::CInFile file; | |
if (!file.Open(fileName)) | |
return false; | |
UInt64 length; | |
if (!file.GetLength(length)) | |
return false; | |
if (length > ((UInt32)1 << 31)) | |
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 (!ConvertUTF8ToUnicode(s, u)) | |
return false; | |
} | |
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) | |
{ | |
t.Trim(); | |
RemoveQuote(t); | |
if (!t.IsEmpty()) | |
resultStrings.Add(t); | |
t.Empty(); | |
} | |
else | |
t += c; | |
} | |
t.Trim(); | |
RemoveQuote(t); | |
if (!t.IsEmpty()) | |
resultStrings.Add(t); | |
return true; | |
} |