Upload 2.0.2
[physicsfs] / lzma / CPP / Common / ListFileUtils.cpp
1 // Common/ListFileUtils.cpp
2
3 #include "StdAfx.h"
4
5 #include "../Windows/FileIO.h"
6
7 #include "ListFileUtils.h"
8 #include "StringConvert.h"
9 #include "UTFConvert.h"
10
11 static const char kQuoteChar     = '\"';
12 static void RemoveQuote(UString &s)
13 {
14   if (s.Length() >= 2)
15     if (s[0] == kQuoteChar && s[s.Length() - 1] == kQuoteChar)
16       s = s.Mid(1, s.Length() - 2);
17 }
18
19 bool ReadNamesFromListFile(LPCWSTR fileName, UStringVector &resultStrings, UINT codePage)
20 {
21   NWindows::NFile::NIO::CInFile file;
22   if (!file.Open(fileName))
23     return false;
24   UInt64 length;
25   if (!file.GetLength(length))
26     return false;
27   if (length > ((UInt32)1 << 31))
28     return false;
29   AString s;
30   char *p = s.GetBuffer((int)length + 1);
31   UInt32 processed;
32   if (!file.Read(p, (UInt32)length, processed))
33     return false;
34   p[(UInt32)length] = 0;
35   s.ReleaseBuffer();
36   file.Close();
37
38   UString u;
39   #ifdef CP_UTF8
40   if (codePage == CP_UTF8)
41   {
42     if (!ConvertUTF8ToUnicode(s, u))
43       return false;
44   }
45   else
46   #endif
47     u = MultiByteToUnicodeString(s, codePage);
48   if (!u.IsEmpty())
49   {
50     if (u[0] == 0xFEFF)
51       u.Delete(0);
52   }
53
54   UString t;
55   for(int i = 0; i < u.Length(); i++)
56   {
57     wchar_t c = u[i];
58     if (c == L'\n' || c == 0xD)
59     {
60       t.Trim();
61       RemoveQuote(t);
62       if (!t.IsEmpty())
63         resultStrings.Add(t);
64       t.Empty();
65     }
66     else
67       t += c;
68   }
69   t.Trim();
70   RemoveQuote(t);
71   if (!t.IsEmpty())
72     resultStrings.Add(t);
73   return true;
74 }