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