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 StringsCount=0;
14 SavePosNumber=0;
15 }
16
17
AddStringA(const char * Str)18 void StringList::AddStringA(const char *Str)
19 {
20 Array<wchar> StrW(strlen(Str));
21 CharToWide(Str,&StrW[0],StrW.Size());
22 AddString(&StrW[0]);
23 }
24
25
AddString(const wchar * Str)26 void StringList::AddString(const wchar *Str)
27 {
28 if (Str==NULL)
29 Str=L"";
30
31 size_t PrevSize=StringData.Size();
32 StringData.Add(wcslen(Str)+1);
33 wcscpy(&StringData[PrevSize],Str);
34
35 StringsCount++;
36 }
37
38
GetStringA(char * Str,size_t MaxLength)39 bool StringList::GetStringA(char *Str,size_t MaxLength)
40 {
41 Array<wchar> StrW(MaxLength);
42 if (!GetString(&StrW[0],StrW.Size()))
43 return false;
44 WideToChar(&StrW[0],Str,MaxLength);
45 return true;
46 }
47
48
GetString(wchar * Str,size_t MaxLength)49 bool StringList::GetString(wchar *Str,size_t MaxLength)
50 {
51 wchar *StrPtr;
52 if (!GetString(&StrPtr))
53 return false;
54 wcsncpyz(Str,StrPtr,MaxLength);
55 return true;
56 }
57
58
59 #ifndef SFX_MODULE
GetString(wchar * Str,size_t MaxLength,int StringNum)60 bool StringList::GetString(wchar *Str,size_t MaxLength,int StringNum)
61 {
62 SavePosition();
63 Rewind();
64 bool RetCode=true;
65 while (StringNum-- >=0)
66 if (!GetString(Str,MaxLength))
67 {
68 RetCode=false;
69 break;
70 }
71 RestorePosition();
72 return RetCode;
73 }
74 #endif
75
76
GetString()77 wchar* StringList::GetString()
78 {
79 wchar *Str;
80 GetString(&Str);
81 return Str;
82 }
83
84
GetString(wchar ** Str)85 bool StringList::GetString(wchar **Str)
86 {
87 if (CurPos>=StringData.Size()) // No more strings left unprocessed.
88 {
89 if (Str!=NULL)
90 *Str=NULL;
91 return false;
92 }
93
94 wchar *CurStr=&StringData[CurPos];
95 CurPos+=wcslen(CurStr)+1;
96 if (Str!=NULL)
97 *Str=CurStr;
98
99 return true;
100 }
101
102
Rewind()103 void StringList::Rewind()
104 {
105 CurPos=0;
106 }
107
108
109 #ifndef SFX_MODULE
Search(const wchar * Str,bool CaseSensitive)110 bool StringList::Search(const wchar *Str,bool CaseSensitive)
111 {
112 SavePosition();
113 Rewind();
114 bool Found=false;
115 wchar *CurStr;
116 while (GetString(&CurStr))
117 {
118 if (Str!=NULL && CurStr!=NULL)
119 if ((CaseSensitive ? wcscmp(Str,CurStr):wcsicomp(Str,CurStr))!=0)
120 continue;
121 Found=true;
122 break;
123 }
124 RestorePosition();
125 return Found;
126 }
127 #endif
128
129
130 #ifndef SFX_MODULE
SavePosition()131 void StringList::SavePosition()
132 {
133 if (SavePosNumber<ASIZE(SaveCurPos))
134 {
135 SaveCurPos[SavePosNumber]=CurPos;
136 SavePosNumber++;
137 }
138 }
139 #endif
140
141
142 #ifndef SFX_MODULE
RestorePosition()143 void StringList::RestorePosition()
144 {
145 if (SavePosNumber>0)
146 {
147 SavePosNumber--;
148 CurPos=SaveCurPos[SavePosNumber];
149 }
150 }
151 #endif
152