Merge pull request #4324 from FernetMenta/wasapi
[vuplus_xbmc] / lib / UnrarXLib / filestr.cpp
1 #include "rar.hpp"
2
3 static bool IsUnicode(byte *Data,int Size);
4
5 bool ReadTextFile(char *Name,StringList *List,bool Config,bool AbortOnError,
6                   bool ConvertToAnsi,bool Unquote,bool SkipComments)
7 {
8   char FileName[NM];
9   if (Config)
10     GetConfigName(Name,FileName,true);
11   else
12     strcpy(FileName,Name);
13
14   File SrcFile;
15   if (*FileName)
16   {
17     bool OpenCode=AbortOnError ? SrcFile.WOpen(FileName):SrcFile.Open(FileName);
18
19     if (!OpenCode)
20     {
21       if (AbortOnError)
22         ErrHandler.Exit(OPEN_ERROR);
23       return(false);
24     }
25   }
26   else
27     SrcFile.SetHandleType(FILE_HANDLESTD);
28
29   unsigned int DataSize=0,ReadSize;
30   const int ReadBlock=1024;
31   Array<char> Data(ReadBlock+5);
32   while ((ReadSize=SrcFile.Read(&Data[DataSize],ReadBlock))!=0)
33   {
34     DataSize+=ReadSize;
35     Data.Add(ReadSize);
36   }
37
38   memset(&Data[DataSize],0,5);
39
40   if (IsUnicode((byte *)&Data[0],DataSize))
41   {
42     wchar *CurStr=(wchar *)&Data[2];
43     Array<char> AnsiName;
44
45     while (*CurStr!=0)
46     {
47       wchar *NextStr=CurStr,*CmtPtr=NULL;
48       while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0)
49       {
50         if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/')
51         {
52           *NextStr=0;
53           CmtPtr=NextStr;
54         }
55         NextStr++;
56       }
57       *NextStr=0;
58       for (wchar *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--)
59       {
60         if (*SpacePtr!=' ' && *SpacePtr!='\t')
61           break;
62         *SpacePtr=0;
63       }
64       if (*CurStr)
65       {
66         int Length=strlenw(CurStr);
67         int AddSize=Length-AnsiName.Size()+1;
68         if (AddSize>0)
69           AnsiName.Add(AddSize);
70         if (Unquote && *CurStr=='\"' && CurStr[Length-1]=='\"')
71         {
72           CurStr[Length-1]=0;
73           CurStr++;
74         }
75         WideToChar(CurStr,&AnsiName[0]);
76         List->AddString(&AnsiName[0],CurStr);
77       }
78       CurStr=NextStr+1;
79       while (*CurStr=='\r' || *CurStr=='\n')
80         CurStr++;
81     }
82   }
83   else
84   {
85     char *CurStr=&Data[0];
86     while (*CurStr!=0)
87     {
88       char *NextStr=CurStr,*CmtPtr=NULL;
89       while (*NextStr!='\r' && *NextStr!='\n' && *NextStr!=0)
90       {
91         if (SkipComments && NextStr[0]=='/' && NextStr[1]=='/')
92         {
93           *NextStr=0;
94           CmtPtr=NextStr;
95         }
96         NextStr++;
97       }
98       *NextStr=0;
99       for (char *SpacePtr=(CmtPtr ? CmtPtr:NextStr)-1;SpacePtr>=CurStr;SpacePtr--)
100       {
101         if (*SpacePtr!=' ' && *SpacePtr!='\t')
102           break;
103         *SpacePtr=0;
104       }
105       if (*CurStr)
106       {
107         if (Unquote && *CurStr=='\"')
108         {
109           int Length=strlen(CurStr);
110           if (CurStr[Length-1]=='\"')
111           {
112             CurStr[Length-1]=0;
113             CurStr++;
114           }
115         }
116 #if defined(_WIN_32) && !defined(TARGET_POSIX)
117         if (ConvertToAnsi)
118           OemToChar(CurStr,CurStr);
119 #endif
120         List->AddString(CurStr);
121       }
122       CurStr=NextStr+1;
123       while (*CurStr=='\r' || *CurStr=='\n')
124         CurStr++;
125     }
126   }
127   return(true);
128 }
129
130
131 bool IsUnicode(byte *Data,int Size)
132 {
133   if (Size<4 || Data[0]!=0xff || Data[1]!=0xfe)
134     return(false);
135   for (int I=2;I<Size;I++)
136     if (Data[I]<32)
137       return(true);
138   return(false);
139 }