#include "rar.hpp" StringList::StringList() { Reset(); } void StringList::Reset() { Rewind(); StringData.Reset(); StringsCount=0; SavePosNumber=0; } void StringList::AddStringA(const char *Str) { Array 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 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 (SavePosNumber0) { SavePosNumber--; CurPos=SaveCurPos[SavePosNumber]; } } #endif