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