Merge pull request #4324 from FernetMenta/wasapi
[vuplus_xbmc] / lib / UnrarXLib / strlist.cpp
1 #include "rar.hpp"
2
3 StringList::StringList()
4 {
5   Reset();
6 }
7
8
9 StringList::~StringList()
10 {
11 }
12
13
14 void StringList::Reset()
15 {
16   Rewind();
17   StringData.Reset();
18   StringDataW.Reset();
19   PosDataW.Reset();
20   StringsCount=0;
21   SavePosNumber=0;
22 }
23
24
25 unsigned int StringList::AddString(const char *Str)
26 {
27   return(AddString(Str,NULL));
28 }
29
30
31 unsigned int StringList::AddString(const char *Str,const wchar *StrW)
32 {
33   int PrevSize=StringData.Size();
34   StringData.Add(strlen(Str)+1);
35   strcpy(&StringData[PrevSize],Str);
36   if (StrW!=NULL && *StrW!=0)
37   {
38     int PrevPos=PosDataW.Size();
39     PosDataW.Add(1);
40     PosDataW[PrevPos]=PrevSize;
41
42     int PrevSizeW=StringDataW.Size();
43     StringDataW.Add(strlenw(StrW)+1);
44     strcpyw(&StringDataW[PrevSizeW],StrW);
45   }
46   StringsCount++;
47   return(PrevSize);
48 }
49
50
51 bool StringList::GetString(char *Str,int MaxLength)
52 {
53   return(GetString(Str,NULL,MaxLength));
54 }
55
56
57 bool StringList::GetString(char *Str,wchar *StrW,int MaxLength)
58 {
59   char *StrPtr;
60   wchar *StrPtrW;
61   if (Str==NULL || !GetString(&StrPtr,&StrPtrW))
62     return(false);
63   strncpy(Str,StrPtr,MaxLength);
64   if (StrW!=NULL)
65     strncpyw(StrW,NullToEmpty(StrPtrW),MaxLength);
66   return(true);
67 }
68
69
70 #ifndef SFX_MODULE
71 bool StringList::GetString(char *Str,wchar *StrW,int MaxLength,int StringNum)
72 {
73   SavePosition();
74   Rewind();
75   bool RetCode=true;
76   while (StringNum-- >=0)
77     if (!GetString(Str,StrW,MaxLength))
78     {
79       RetCode=false;
80       break;
81     }
82   RestorePosition();
83   return(RetCode);
84 }
85 #endif
86
87
88 char* StringList::GetString()
89 {
90   char *Str;
91   GetString(&Str,NULL);
92   return(Str);
93 }
94
95
96
97 bool StringList::GetString(char **Str,wchar **StrW)
98 {
99   if ((int)CurPos>=StringData.Size())
100   {
101     *Str=NULL;
102     return(false);
103   }
104   *Str=&StringData[CurPos];
105   if ((int)PosDataItem<PosDataW.Size() && PosDataW[PosDataItem]==(int)CurPos)
106   {
107     PosDataItem++;
108     if (StrW!=NULL)
109       *StrW=&StringDataW[CurPosW];
110     CurPosW+=strlenw(&StringDataW[CurPosW])+1;
111   }
112   else
113     if (StrW!=NULL)
114       *StrW=NULL;
115   CurPos+=strlen(*Str)+1;
116   return(true);
117 }
118
119
120 char* StringList::GetString(unsigned int StringPos)
121 {
122   if ((int)StringPos>=StringData.Size())
123     return(NULL);
124   return(&StringData[StringPos]);
125 }
126
127
128 void StringList::Rewind()
129 {
130   CurPos=0;
131   CurPosW=0;
132   PosDataItem=0;
133 }
134
135
136 int StringList::GetBufferSize()
137 {
138   return(StringData.Size()+StringDataW.Size());
139 }
140
141
142 #ifndef SFX_MODULE
143 bool StringList::Search(char *Str,wchar *StrW,bool CaseSensitive)
144 {
145   SavePosition();
146   Rewind();
147   bool Found=false;
148   char *CurStr;
149   wchar *CurStrW;
150   while (GetString(&CurStr,&CurStrW))
151   {
152     if ((CaseSensitive ? strcmp(Str,CurStr):stricomp(Str,CurStr))!=0)
153       continue;
154     if (StrW!=NULL && CurStrW!=NULL)
155       if ((CaseSensitive ? strcmpw(StrW,CurStrW):stricmpw(StrW,CurStrW))!=0)
156         continue;
157     Found=true;
158     break;
159   }
160   RestorePosition();
161   return(Found);
162 }
163 #endif
164
165
166 #ifndef SFX_MODULE
167 void StringList::SavePosition()
168 {
169   if (SavePosNumber<sizeof(SaveCurPos)/sizeof(SaveCurPos[0]))
170   {
171     SaveCurPos[SavePosNumber]=CurPos;
172     SaveCurPosW[SavePosNumber]=CurPosW;
173     SavePosDataItem[SavePosNumber]=PosDataItem;
174     SavePosNumber++;
175   }
176 }
177 #endif
178
179
180 #ifndef SFX_MODULE
181 void StringList::RestorePosition()
182 {
183   if (SavePosNumber>0)
184   {
185     SavePosNumber--;
186     CurPos=SaveCurPos[SavePosNumber];
187     CurPosW=SaveCurPosW[SavePosNumber];
188     PosDataItem=SavePosDataItem[SavePosNumber];
189   }
190 }
191 #endif