94 if (pNode->
Priority > Priority)
break;
133 if ((Contents2 = pNode->Contents & Contents))
134 if (pNode->id > iMaxSkipID)
138 RegisterGroup(*pNode->pGroup,
false, pNode->Priority, Contents2,
false);
143 if (!pGroup->
OpenAsChild(pNode->pGroup, szFilename))
144 {
delete pGroup;
continue; }
147 if (!
RegisterGroup(*pGroup,
true, pNode->Priority, Contents2,
false))
158 int32_t iPriority=-1;
163 if (!pAfter && (pNode->Contents & Contents))
165 if (iPriority==-1 || iPriority==pNode->Priority)
167 return pNode->pGroup;
169 if (pNode->pGroup == pAfter) { pAfter=
nullptr;
if (fSamePrio) iPriority=pNode->Priority; }
179 if (pNode->pGroup->FindEntry(szWildcard))
182 if (pPriority) *pPriority=pNode->Priority;
183 if (pID) *pID=pNode->id;
185 return pNode->pGroup;
199 SCopy(szName, FileName);
200 for (
int i = 0; extensions[i]; ++i)
203 pGrp2=
FindEntry(FileName, &iPrio2, &GroupID);
204 if ((!pGrp || iPrio2 >= iPrio) && pGrp2)
206 if (pID) *pID = GroupID;
208 SCopy(FileName, szFileName);
220 return pGroup->
LoadEntry(szEntryName, lpbpBuf, ipSize, iAppendZeros);
267 return pNode->pGroup;
297 C4Group *pParentGroup=
nullptr;
bool fParentC4F;
312 int32_t iOriginalLen=
SLen(szParentfolder);
313 for (int32_t i=0; i<iOriginalLen; ++i)
if (szParentfolder[i]==
DirectorySeparator || szParentfolder[i]==
'/') szParentfolder[i]=0;
315 int32_t iPos=iOriginalLen-1;
319 while (iPos && !szParentfolder[iPos]) --iPos;
323 while (iPos && szParentfolder[iPos]) --iPos;
336 int32_t iGroupIndex=0;
337 while (iPos<iOriginalLen)
340 while (iPos<iOriginalLen && !szParentfolder[iPos]) ++iPos;
342 if (iPos>=iOriginalLen)
break;
347 if (!pGroup->
OpenAsChild(pParentGroup, szParentfolder+iPos))
350 delete pGroup;
return nullptr;
353 else if (!
Reloc.
Open(*pGroup, szParentfolder+iPos))
356 delete pGroup;
return nullptr;
361 int32_t iContentsMask;
367 {
delete pParentGroup;
LogFatal (
"RegGrp: internal error");
return nullptr; }
369 iPos+=
SLen(szParentfolder+iPos);
381 if (pNode->pGroup) result += pNode->pGroup->PreCacheEntries(szEntryMask);
#define C4CFN_FolderFiles
#define C4GSPrio_Scenario
#define C4GSCnt_Definitions
#define C4GSCnt_Directory
const char * LoadResStr(const char *id)
bool LogFatal(const char *szMessage)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
size_t SLen(const char *sptr)
StdStrBuf FormatString(const char *szFmt,...)
char * GetExtension(char *szFilename)
bool GetParentPath(const char *szFilename, char *szBuffer)
bool WildcardMatch(const char *szWildcard, const char *szString)
void EnforceExtension(char *szFilename, const char *szExtension)
const char * GetName() const
bool LoadEntry(const char *entry_name, char **buffer, size_t *size_info=nullptr, int zeros_to_append=0)
bool OpenAsChild(C4Group *mother, const char *entry_name, bool is_exclusive=false, bool do_create=false)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
bool UnregisterGroup(int32_t iIndex)
bool RegisterGroup(C4Group &rGroup, bool fOwnGrp, int32_t Priority, int32_t Contents, bool fCheckContent=true)
bool LoadEntryString(const char *szEntryName, StdStrBuf *rBuf)
C4Group * GetGroup(int32_t iIndex)
C4Group * RegisterParentFolders(const char *szScenFilename)
static int32_t CheckGroupContents(C4Group &rGroup, int32_t Contents)
bool LoadEntry(const char *szEntryName, char **lpbpBuf, size_t *ipSize=nullptr, int32_t iAppendZeros=0)
friend class C4GroupSetNode
int32_t PreCacheEntries(const char *szEntryMask)
C4Group * FindGroup(int32_t Contents, C4Group *pAfter=nullptr, bool fSamePrio=false)
C4Group * FindSuitableFile(const char *szName, const char *const extensions[], char *szFileName, int32_t *pID=nullptr)
C4Group * FindEntry(const char *szWildcard, int32_t *pPriority=nullptr, int32_t *pID=nullptr)
bool RegisterGroups(const C4GroupSet &rCopy, int32_t Contents, const char *szFilename=nullptr, int32_t iMaxSkipID=0)
C4GroupSetNode(class C4GroupSet &rParent, C4GroupSetNode *pPrev, C4Group &rGroup, bool fGrpOwned, int32_t id)
class C4GroupSet * pParent
bool Open(C4Group &group, const char *filename) const