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