1
0
mirror of https://github.com/hashcat/hashcat.git synced 2024-11-23 00:28:11 +00:00
hashcat/deps/unrar/strlist.cpp
2020-09-08 10:34:21 +02:00

152 lines
2.3 KiB
C++

#include "rar.hpp"
StringList::StringList()
{
Reset();
}
void StringList::Reset()
{
Rewind();
StringData.Reset();
StringsCount=0;
SavePosNumber=0;
}
void StringList::AddStringA(const char *Str)
{
Array<wchar> StrW(strlen(Str));
CharToWide(Str,&StrW[0],StrW.Size());
AddString(&StrW[0]);
}
void StringList::AddString(const wchar *Str)
{
if (Str==NULL)
Str=L"";
size_t PrevSize=StringData.Size();
StringData.Add(wcslen(Str)+1);
wcscpy(&StringData[PrevSize],Str);
StringsCount++;
}
bool StringList::GetStringA(char *Str,size_t MaxLength)
{
Array<wchar> StrW(MaxLength);
if (!GetString(&StrW[0],StrW.Size()))
return false;
WideToChar(&StrW[0],Str,MaxLength);
return true;
}
bool StringList::GetString(wchar *Str,size_t MaxLength)
{
wchar *StrPtr;
if (!GetString(&StrPtr))
return false;
wcsncpyz(Str,StrPtr,MaxLength);
return true;
}
#ifndef SFX_MODULE
bool StringList::GetString(wchar *Str,size_t MaxLength,int StringNum)
{
SavePosition();
Rewind();
bool RetCode=true;
while (StringNum-- >=0)
if (!GetString(Str,MaxLength))
{
RetCode=false;
break;
}
RestorePosition();
return RetCode;
}
#endif
wchar* StringList::GetString()
{
wchar *Str;
GetString(&Str);
return Str;
}
bool StringList::GetString(wchar **Str)
{
if (CurPos>=StringData.Size()) // No more strings left unprocessed.
{
if (Str!=NULL)
*Str=NULL;
return false;
}
wchar *CurStr=&StringData[CurPos];
CurPos+=wcslen(CurStr)+1;
if (Str!=NULL)
*Str=CurStr;
return true;
}
void StringList::Rewind()
{
CurPos=0;
}
#ifndef SFX_MODULE
bool StringList::Search(const wchar *Str,bool CaseSensitive)
{
SavePosition();
Rewind();
bool Found=false;
wchar *CurStr;
while (GetString(&CurStr))
{
if (Str!=NULL && CurStr!=NULL)
if ((CaseSensitive ? wcscmp(Str,CurStr):wcsicomp(Str,CurStr))!=0)
continue;
Found=true;
break;
}
RestorePosition();
return Found;
}
#endif
#ifndef SFX_MODULE
void StringList::SavePosition()
{
if (SavePosNumber<ASIZE(SaveCurPos))
{
SaveCurPos[SavePosNumber]=CurPos;
SavePosNumber++;
}
}
#endif
#ifndef SFX_MODULE
void StringList::RestorePosition()
{
if (SavePosNumber>0)
{
SavePosNumber--;
CurPos=SaveCurPos[SavePosNumber];
}
}
#endif