123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #include "rar.hpp"
- StringList::StringList()
- {
- Reset();
- }
- void StringList::Reset()
- {
- Rewind();
- StringData.Reset();
- StringDataW.Reset();
- StringsCount=0;
- SavePosNumber=0;
- }
- void StringList::AddString(const char *Str)
- {
- AddString(Str,NULL);
- }
- void StringList::AddString(const wchar *Str)
- {
- AddString(NULL,Str);
- }
- void StringList::AddString(const char *Str,const wchar *StrW)
- {
- if (Str==NULL)
- Str="";
- if (StrW==NULL)
- StrW=L"";
- size_t PrevSize=StringData.Size();
- StringData.Add(strlen(Str)+1);
- strcpy(&StringData[PrevSize],Str);
- size_t PrevSizeW=StringDataW.Size();
- StringDataW.Add(wcslen(StrW)+1);
- wcscpy(&StringDataW[PrevSizeW],StrW);
- StringsCount++;
- }
- bool StringList::GetString(char *Str,size_t MaxLength)
- {
- return(GetString(Str,NULL,MaxLength));
- }
- bool StringList::GetString(wchar *Str,size_t MaxLength)
- {
- return(GetString(NULL,Str,MaxLength));
- }
- bool StringList::GetString(char *Str,wchar *StrW,size_t MaxLength)
- {
- char *StrPtr;
- wchar *StrPtrW;
- if (!GetString(&StrPtr,&StrPtrW))
- return(false);
- if (Str!=NULL)
- strncpy(Str,StrPtr,MaxLength);
- if (StrW!=NULL)
- wcsncpy(StrW,StrPtrW,MaxLength);
- return(true);
- }
- #ifndef SFX_MODULE
- bool StringList::GetString(char *Str,wchar *StrW,size_t MaxLength,int StringNum)
- {
- SavePosition();
- Rewind();
- bool RetCode=true;
- while (StringNum-- >=0)
- if (!GetString(Str,StrW,MaxLength))
- {
- RetCode=false;
- break;
- }
- RestorePosition();
- return(RetCode);
- }
- #endif
- char* StringList::GetString()
- {
- char *Str;
- GetString(&Str,NULL);
- return(Str);
- }
- wchar* StringList::GetStringW()
- {
- wchar *StrW;
- GetString(NULL,&StrW);
- return(StrW);
- }
- bool StringList::GetString(char **Str,wchar **StrW)
- {
- // First check would be enough, because both buffers grow synchronously,
- // but we check both for extra fail proof.
- if (CurPos>=StringData.Size() || CurPosW>=StringDataW.Size())
- {
- // No more strings left unprocessed.
- if (Str!=NULL)
- *Str=NULL;
- if (StrW!=NULL)
- *StrW=NULL;
- return(false);
- }
- // We move ASCII and Unicode buffer pointers synchronously.
-
- char *CurStr=&StringData[CurPos];
- CurPos+=strlen(CurStr)+1;
- if (Str!=NULL)
- *Str=CurStr;
- wchar *CurStrW=&StringDataW[CurPosW];
- CurPosW+=wcslen(CurStrW)+1;
- if (StrW!=NULL)
- *StrW=CurStrW;
- return(true);
- }
- void StringList::Rewind()
- {
- CurPos=0;
- CurPosW=0;
- }
- // Return the total size of usual and Unicode characters stored in the list.
- size_t StringList::GetCharCount()
- {
- return(StringData.Size()+StringDataW.Size());
- }
- #ifndef SFX_MODULE
- bool StringList::Search(char *Str,wchar *StrW,bool CaseSensitive)
- {
- SavePosition();
- Rewind();
- bool Found=false;
- char *CurStr;
- wchar *CurStrW;
- while (GetString(&CurStr,&CurStrW))
- {
- if (Str!=NULL && CurStr!=NULL)
- if ((CaseSensitive ? strcmp(Str,CurStr):stricomp(Str,CurStr))!=0)
- continue;
- if (StrW!=NULL && CurStrW!=NULL)
- if ((CaseSensitive ? wcscmp(StrW,CurStrW):wcsicomp(StrW,CurStrW))!=0)
- continue;
- Found=true;
- break;
- }
- RestorePosition();
- return(Found);
- }
- #endif
- #ifndef SFX_MODULE
- void StringList::SavePosition()
- {
- if (SavePosNumber<ASIZE(SaveCurPos))
- {
- SaveCurPos[SavePosNumber]=CurPos;
- SaveCurPosW[SavePosNumber]=CurPosW;
- SavePosNumber++;
- }
- }
- #endif
- #ifndef SFX_MODULE
- void StringList::RestorePosition()
- {
- if (SavePosNumber>0)
- {
- SavePosNumber--;
- CurPos=SaveCurPos[SavePosNumber];
- CurPosW=SaveCurPosW[SavePosNumber];
- }
- }
- #endif
|