31 template<
size_t iBufferSize>
32 static bool GetRelativePath(
const char *strPath,
const char *strRelativeTo,
char(&strBuffer)[iBufferSize])
39 return szCpy != strPath;
47 PackGroupLocation[0] = 0;
90 if (pPack->
Open(strPackFilename))
103 for (
int iPack = 0; (pPack = Packs.
GetGroup(iPack)); iPack++)
121 PackDirectory.
Close();
166 if (szScenarioRelativePath != strRelativePath)
169 size_t iRestPathLen =
SLen(szScenarioRelativePath);
176 SAppend(szScenarioRelativePath, strTargetLocation);
184 for (
int iPack = 0; (pPack = Packs.
GetGroup(iPack)) && (pPackGroup = PackGroups.
GetGroup(iPack)); iPack++)
188 GetRelativePath(pPackGroup->
GetFullName().
getData(), strPackPath, strPackGroupLocation);
191 if (
SEqualNoCase(strPackGroupLocation, strTargetLocation))
195 while ( strPackGroupLocation[0]
196 && !GetRelativePath(strTargetLocation, strPackGroupLocation, strAdvance)
200 GetRelativePath(pPackGroup->
GetFullName().
getData(), strPackPath, strPackGroupLocation);
204 if (strPackGroupLocation[0] && GetRelativePath(strTargetLocation, strPackGroupLocation, strAdvance))
235 if (!host)
return false;
237 return host->
Load(hGroups, szFilename, szLanguage);
240 void C4Language::InitInfos()
251 for (
int iPack = 0; (pPack = Packs.
GetGroup(iPack)); iPack++)
262 std::string GetResStr(
const char *
id,
const char *stringtbl)
268 static std::regex line_pattern(
"(?:\n|^)([^=]+)=(.*?)\r?(?=\n|$)",
static_cast<std::regex::flag_type
>(std::regex_constants::optimize | std::regex_constants::ECMAScript));
273 return std::string();
277 const char *begin = stringtbl;
278 const char *end = begin + std::char_traits<char>::length(begin);
280 for (
auto it = std::cregex_iterator(begin, end, line_pattern); it != std::cregex_iterator(); ++it)
282 assert(it->size() == 3);
286 std::string key = (*it)[1];
290 std::string val = (*it)[2];
300 void CopyResStr(
const char *
id,
const char *stringtbl,
char (&dest)[N])
302 std::string value = GetResStr(
id, stringtbl);
303 std::strncpy(dest, value.c_str(), N);
308 void C4Language::LoadInfos(
C4Group &hGroup)
320 if (hGroup.
LoadEntry(strEntry, &strTable,
nullptr, 1))
328 CopyResStr(
"IDS_LANG_NAME", strTable, pInfo->
Name);
329 CopyResStr(
"IDS_LANG_INFO", strTable, pInfo->
Info);
330 CopyResStr(
"IDS_LANG_FALLBACK", strTable, pInfo->
Fallback);
366 char strLanguageCode[2 + 1];
367 for (
int i = 0;
SCopySegment(strLanguages, i, strLanguageCode,
',', 2,
true); i++)
368 if (InitStringTable(strLanguageCode))
371 if (InitStringTable(
"US"))
374 Log(
"Error loading language string table.");
378 bool C4Language::InitStringTable(
const char *strCode)
386 for (
int iPack = 0; (pPack = Packs.
GetGroup(iPack)); iPack++)
390 if (LoadStringTable(hGroup, strCode))
391 { hGroup.
Close();
return true; }
398 bool C4Language::LoadStringTable(
C4Group &hGroup,
const char *strCode)
402 sprintf(strEntry,
"Language%s.txt", strCode);
422 for (
int iPack = 0; (pPack = Packs.
GetGroup(iPack)); iPack++)
C4Application Application
bool C4Group_UnpackDirectory(const char *filename)
#define C4GSCnt_Component
bool Log(const char *szMessage)
void SReplaceChar(char *str, char fc, char tc)
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
void SAppendChar(char cChar, char *szStr)
void SCapitalize(char *str)
void SAppend(const char *szSource, char *szTarget, int iMaxL)
size_t SLen(const char *sptr)
const char * GetRelativePathS(const char *strPath, const char *strRelativeTo)
bool DirectoryExists(const char *szFilename)
char * GetExtension(char *szFilename)
const char * GetFilenameOnly(const char *strFilename)
bool ItemIdentical(const char *szFilename1, const char *szFilename2)
bool ItemExists(const char *szItemName)
bool Load(C4Group &hGroup, const char *szFilename, const char *szLanguage=nullptr)
const char * AtRelativePath(const char *filename)
char ScenarioFilename[_MAX_PATH_LEN]
bool FindNextEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr, bool start_at_filename=false)
StdStrBuf GetFullName() 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 OpenChild(const char *entry_name)
void ResetSearch(bool reload_contents=false)
bool Open(const char *group_name, bool do_create=false)
bool UnregisterGroup(int32_t iIndex)
bool RegisterGroup(C4Group &rGroup, bool fOwnGrp, int32_t Priority, int32_t Contents, bool fCheckContent=true)
C4Group * GetGroup(int32_t iIndex)
bool RegisterGroups(const C4GroupSet &rCopy, int32_t Contents, const char *szFilename=nullptr, int32_t iMaxSkipID=0)
static C4LangStringTable & GetSystemStringTable()
C4LanguageInfo * FindInfo(const char *strCode)
C4GroupSet GetPackGroups(C4Group &)
bool CloseGroup(const char *strPath)
static bool LoadComponentHost(C4ComponentHost *host, C4Group &hGroup, const char *szFilename, const char *szLanguage)
C4LanguageInfo * GetInfo(int iIndex)
bool LoadLanguage(const char *strLanguages)
char Name[C4MaxLanguageInfo+1]
char Fallback[C4MaxLanguageInfo+1]
char Info[C4MaxLanguageInfo+1]
bool Open(C4Group &group, const char *filename) const
const char * getData() const