1 #include "rar.hpp"
2 
StringList()3 StringList::StringList() :
4     StringData(), CurPos(), StringDataW(), CurPosW(), StringsCount(),
5     SavePosNumber()
6 {
7   Reset();
8 }
9 
10 
Reset()11 void StringList::Reset()
12 {
13   Rewind();
14   StringData.Reset();
15   StringDataW.Reset();
16   StringsCount=0;
17   SavePosNumber=0;
18 }
19 
20 
AddString(const char * Str)21 void StringList::AddString(const char *Str)
22 {
23   AddString(Str,NULL);
24 }
25 
26 
AddString(const wchar * Str)27 void StringList::AddString(const wchar *Str)
28 {
29   AddString(NULL,Str);
30 }
31 
32 
33 
34 
AddString(const char * Str,const wchar * StrW)35 void StringList::AddString(const char *Str,const wchar *StrW)
36 {
37   if (Str==NULL)
38     Str="";
39   if (StrW==NULL)
40     StrW=L"";
41 
42   size_t PrevSize=StringData.Size();
43   StringData.Add(strlen(Str)+1);
44   strcpy(&StringData[PrevSize],Str);
45 
46   size_t PrevSizeW=StringDataW.Size();
47   StringDataW.Add(wcslen(StrW)+1);
48   wcscpy(&StringDataW[PrevSizeW],StrW);
49 
50   StringsCount++;
51 }
52 
53 
GetString(char * Str,size_t MaxLength)54 bool StringList::GetString(char *Str,size_t MaxLength)
55 {
56   return(GetString(Str,NULL,MaxLength));
57 }
58 
59 
GetString(wchar * Str,size_t MaxLength)60 bool StringList::GetString(wchar *Str,size_t MaxLength)
61 {
62   return(GetString(NULL,Str,MaxLength));
63 }
64 
65 
GetString(char * Str,wchar * StrW,size_t MaxLength)66 bool StringList::GetString(char *Str,wchar *StrW,size_t MaxLength)
67 {
68   char *StrPtr;
69   wchar *StrPtrW;
70   if (!GetString(&StrPtr,&StrPtrW))
71     return(false);
72   if (Str!=NULL)
73     strncpy(Str,StrPtr,MaxLength);
74   if (StrW!=NULL)
75     wcsncpy(StrW,StrPtrW,MaxLength);
76   return(true);
77 }
78 
79 
80 #ifndef SFX_MODULE
GetString(char * Str,wchar * StrW,size_t MaxLength,int StringNum)81 bool StringList::GetString(char *Str,wchar *StrW,size_t MaxLength,int StringNum)
82 {
83   SavePosition();
84   Rewind();
85   bool RetCode=true;
86   while (StringNum-- >=0)
87     if (!GetString(Str,StrW,MaxLength))
88     {
89       RetCode=false;
90       break;
91     }
92   RestorePosition();
93   return(RetCode);
94 }
95 #endif
96 
97 
GetString()98 char* StringList::GetString()
99 {
100   char *Str;
101   GetString(&Str,NULL);
102   return(Str);
103 }
104 
105 
GetStringW()106 wchar* StringList::GetStringW()
107 {
108   wchar *StrW;
109   GetString(NULL,&StrW);
110   return(StrW);
111 }
112 
113 
GetString(char ** Str,wchar ** StrW)114 bool StringList::GetString(char **Str,wchar **StrW)
115 {
116   // First check would be enough, because both buffers grow synchronously,
117   // but we check both for extra fail proof.
118   if (CurPos>=StringData.Size() || CurPosW>=StringDataW.Size())
119   {
120     // No more strings left unprocessed.
121     if (Str!=NULL)
122       *Str=NULL;
123     if (StrW!=NULL)
124       *StrW=NULL;
125     return(false);
126   }
127 
128   // We move ASCII and Unicode buffer pointers synchronously.
129 
130   char *CurStr=&StringData[CurPos];
131   CurPos+=strlen(CurStr)+1;
132   if (Str!=NULL)
133     *Str=CurStr;
134 
135   wchar *CurStrW=&StringDataW[CurPosW];
136   CurPosW+=wcslen(CurStrW)+1;
137   if (StrW!=NULL)
138     *StrW=CurStrW;
139 
140   return(true);
141 }
142 
143 
Rewind()144 void StringList::Rewind()
145 {
146   CurPos=0;
147   CurPosW=0;
148 }
149 
150 
151 // Return the total size of usual and Unicode characters stored in the list.
GetCharCount()152 size_t StringList::GetCharCount()
153 {
154   return(StringData.Size()+StringDataW.Size());
155 }
156 
157 
158 #ifndef SFX_MODULE
Search(char * Str,wchar * StrW,bool CaseSensitive)159 bool StringList::Search(char *Str,wchar *StrW,bool CaseSensitive)
160 {
161   SavePosition();
162   Rewind();
163   bool Found=false;
164   char *CurStr;
165   wchar *CurStrW;
166   while (GetString(&CurStr,&CurStrW))
167   {
168     if (Str!=NULL && CurStr!=NULL)
169       if ((CaseSensitive ? strcmp(Str,CurStr):stricomp(Str,CurStr))!=0)
170         continue;
171     if (StrW!=NULL && CurStrW!=NULL)
172       if ((CaseSensitive ? wcscmp(StrW,CurStrW):wcsicomp(StrW,CurStrW))!=0)
173         continue;
174     Found=true;
175     break;
176   }
177   RestorePosition();
178   return(Found);
179 }
180 #endif
181 
182 
183 #ifndef SFX_MODULE
SavePosition()184 void StringList::SavePosition()
185 {
186   if (SavePosNumber<ASIZE(SaveCurPos))
187   {
188     SaveCurPos[SavePosNumber]=CurPos;
189     SaveCurPosW[SavePosNumber]=CurPosW;
190     SavePosNumber++;
191   }
192 }
193 #endif
194 
195 
196 #ifndef SFX_MODULE
RestorePosition()197 void StringList::RestorePosition()
198 {
199   if (SavePosNumber>0)
200   {
201     SavePosNumber--;
202     CurPos=SaveCurPos[SavePosNumber];
203     CurPosW=SaveCurPosW[SavePosNumber];
204   }
205 }
206 #endif
207