- when altering the default string table, make sure that all existing text for the given label is removed that comes from an older resource file.

If this isn't done there can be a mix of content from different sources, depending on the language. It's better to have correct English text than unfitting localized versions.
This commit is contained in:
Christoph Oelckers 2019-04-13 14:43:49 +02:00
parent 5f2d41884c
commit 4668fa95e3
3 changed files with 58 additions and 15 deletions

View file

@ -282,6 +282,7 @@ static int PatchSize;
static char *Line1, *Line2; static char *Line1, *Line2;
static int dversion, pversion; static int dversion, pversion;
static bool including, includenotext; static bool including, includenotext;
static int LumpFileNum;
static const char *unknown_str = "Unknown key %s encountered in %s %d.\n"; static const char *unknown_str = "Unknown key %s encountered in %s %d.\n";
@ -2169,7 +2170,7 @@ static int PatchMusic (int dummy)
keystring << "MUSIC_" << Line1; keystring << "MUSIC_" << Line1;
TableElement te = { newname, newname, newname, newname }; TableElement te = { LumpFileNum, { newname, newname, newname, newname } };
DehStrings.Insert(keystring, te); DehStrings.Insert(keystring, te);
DPrintf (DMSG_SPAMMY, "Music %s set to:\n%s\n", keystring.GetChars(), newname.GetChars()); DPrintf (DMSG_SPAMMY, "Music %s set to:\n%s\n", keystring.GetChars(), newname.GetChars());
} }
@ -2285,7 +2286,7 @@ static int PatchText (int oldSize)
if (str != NULL) if (str != NULL)
{ {
FString newname = newStr; FString newname = newStr;
TableElement te = { newname, newname, newname, newname }; TableElement te = { LumpFileNum, { newname, newname, newname, newname } };
DehStrings.Insert(str, te); DehStrings.Insert(str, te);
EnglishStrings.Remove(str); // remove entry so that it won't get found again by the next iteration or by another replacement later EnglishStrings.Remove(str); // remove entry so that it won't get found again by the next iteration or by another replacement later
good = true; good = true;
@ -2340,7 +2341,7 @@ static int PatchStrings (int dummy)
// Account for a discrepancy between Boom's and ZDoom's name for the red skull key pickup message // Account for a discrepancy between Boom's and ZDoom's name for the red skull key pickup message
const char *ll = Line1; const char *ll = Line1;
if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL"; if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL";
TableElement te = { holdstring, holdstring, holdstring, holdstring }; TableElement te = { LumpFileNum, { holdstring, holdstring, holdstring, holdstring } };
DehStrings.Insert(ll, te); DehStrings.Insert(ll, te);
DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars()); DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars());
} }
@ -2496,13 +2497,19 @@ int D_LoadDehLumps(DehLumpSource source)
bool D_LoadDehLump(int lumpnum) bool D_LoadDehLump(int lumpnum)
{ {
auto ls = LumpFileNum;
LumpFileNum = Wads.GetLumpFile(lumpnum);
PatchSize = Wads.LumpLength(lumpnum); PatchSize = Wads.LumpLength(lumpnum);
PatchName = copystring(Wads.GetLumpFullPath(lumpnum)); PatchName = copystring(Wads.GetLumpFullPath(lumpnum));
PatchFile = new char[PatchSize + 1]; PatchFile = new char[PatchSize + 1];
Wads.ReadLump(lumpnum, PatchFile); Wads.ReadLump(lumpnum, PatchFile);
PatchFile[PatchSize] = '\0'; // terminate with a '\0' character PatchFile[PatchSize] = '\0'; // terminate with a '\0' character
return DoDehPatch(); auto res = DoDehPatch();
LumpFileNum = ls;
return res;
} }
bool D_LoadDehFile(const char *patchfile) bool D_LoadDehFile(const char *patchfile)

View file

@ -67,8 +67,8 @@ void FStringTable::LoadStrings ()
{ {
auto lumpdata = Wads.ReadLumpIntoArray(lump); auto lumpdata = Wads.ReadLumpIntoArray(lump);
if (!ParseLanguageCSV(lumpdata)) if (!ParseLanguageCSV(lump, lumpdata))
LoadLanguage (lumpdata); LoadLanguage (lump, lumpdata);
} }
UpdateLanguage(); UpdateLanguage();
allMacros.Clear(); allMacros.Clear();
@ -191,7 +191,7 @@ bool FStringTable::readMacros(int lumpnum)
// //
//========================================================================== //==========================================================================
bool FStringTable::ParseLanguageCSV(const TArray<uint8_t> &buffer) bool FStringTable::ParseLanguageCSV(int lumpnum, const TArray<uint8_t> &buffer)
{ {
if (memcmp(buffer.Data(), "default,", 8)) return false; if (memcmp(buffer.Data(), "default,", 8)) return false;
auto data = parseCSV(buffer); auto data = parseCSV(buffer);
@ -199,6 +199,7 @@ bool FStringTable::ParseLanguageCSV(const TArray<uint8_t> &buffer)
int labelcol = -1; int labelcol = -1;
int filtercol = -1; int filtercol = -1;
TArray<std::pair<int, unsigned>> langrows; TArray<std::pair<int, unsigned>> langrows;
bool hasDefaultEntry = false;
if (data.Size() > 0) if (data.Size() > 0)
{ {
@ -221,6 +222,7 @@ bool FStringTable::ParseLanguageCSV(const TArray<uint8_t> &buffer)
if (lang.CompareNoCase("default") == 0) if (lang.CompareNoCase("default") == 0)
{ {
langrows.Push(std::make_pair(column, default_table)); langrows.Push(std::make_pair(column, default_table));
hasDefaultEntry = true;
} }
else if (lang.Len() < 4) else if (lang.Len() < 4)
{ {
@ -243,12 +245,16 @@ bool FStringTable::ParseLanguageCSV(const TArray<uint8_t> &buffer)
} }
FName strName = row[labelcol]; FName strName = row[labelcol];
if (hasDefaultEntry)
{
DeleteForLabel(lumpnum, strName);
}
for (auto &langentry : langrows) for (auto &langentry : langrows)
{ {
auto str = row[langentry.first]; auto str = row[langentry.first];
if (str.Len() > 0) if (str.Len() > 0)
{ {
InsertString(langentry.second, strName, str); InsertString(lumpnum, langentry.second, strName, str);
} }
else else
{ {
@ -266,7 +272,7 @@ bool FStringTable::ParseLanguageCSV(const TArray<uint8_t> &buffer)
// //
//========================================================================== //==========================================================================
void FStringTable::LoadLanguage (const TArray<uint8_t> &buffer) void FStringTable::LoadLanguage (int lumpnum, const TArray<uint8_t> &buffer)
{ {
bool errordone = false; bool errordone = false;
TArray<uint32_t> activeMaps; TArray<uint32_t> activeMaps;
@ -363,10 +369,14 @@ void FStringTable::LoadLanguage (const TArray<uint8_t> &buffer)
} }
if (!skip) if (!skip)
{ {
if (activeMaps[0] == default_table)
{
DeleteForLabel(lumpnum, strName);
}
// Insert the string into all relevant tables. // Insert the string into all relevant tables.
for (auto map : activeMaps) for (auto map : activeMaps)
{ {
InsertString(map, strName, strText); InsertString(lumpnum, map, strName, strText);
} }
} }
} }
@ -384,16 +394,40 @@ void FStringTable::DeleteString(int langid, FName label)
allStrings[langid].Remove(label); allStrings[langid].Remove(label);
} }
//==========================================================================
//
// This deletes all older entries for a given label. This gets called
// when a string in the default table gets updated.
//
//==========================================================================
void FStringTable::DeleteForLabel(int lumpnum, FName label)
{
decltype(allStrings)::Iterator it(allStrings);
decltype(allStrings)::Pair *pair;
auto filenum = Wads.GetLumpFile(lumpnum);
while (it.NextPair(pair))
{
auto entry = pair->Value.CheckKey(label);
if (entry && entry->filenum < filenum)
{
pair->Value.Remove(label);
}
}
}
//========================================================================== //==========================================================================
// //
// //
// //
//========================================================================== //==========================================================================
void FStringTable::InsertString(int langid, FName label, const FString &string) void FStringTable::InsertString(int lumpnum, int langid, FName label, const FString &string)
{ {
const char *strlangid = (const char *)&langid; const char *strlangid = (const char *)&langid;
TableElement te = { string, string, string, string }; TableElement te = { lumpnum, { string, string, string, string } };
long index; long index;
while ((index = te.strings[0].IndexOf("@[")) >= 0) while ((index = te.strings[0].IndexOf("@[")) >= 0)
{ {

View file

@ -49,6 +49,7 @@
struct TableElement struct TableElement
{ {
int filenum;
FString strings[4]; FString strings[4];
}; };
@ -104,14 +105,15 @@ private:
LangMap allStrings; LangMap allStrings;
TArray<std::pair<uint32_t, StringMap*>> currentLanguageSet; TArray<std::pair<uint32_t, StringMap*>> currentLanguageSet;
void LoadLanguage (const TArray<uint8_t> &buffer); void LoadLanguage (int lumpnum, const TArray<uint8_t> &buffer);
TArray<TArray<FString>> parseCSV(const TArray<uint8_t> &buffer); TArray<TArray<FString>> parseCSV(const TArray<uint8_t> &buffer);
bool ParseLanguageCSV(const TArray<uint8_t> &buffer); bool ParseLanguageCSV(int lumpnum, const TArray<uint8_t> &buffer);
bool LoadLanguageFromSpreadsheet(int lumpnum, const TArray<uint8_t> &buffer); bool LoadLanguageFromSpreadsheet(int lumpnum, const TArray<uint8_t> &buffer);
bool readMacros(int lumpnum); bool readMacros(int lumpnum);
void InsertString(int langid, FName label, const FString &string); void InsertString(int lumpnum, int langid, FName label, const FString &string);
void DeleteString(int langid, FName label); void DeleteString(int langid, FName label);
void DeleteForLabel(int lumpnum, FName label);
static size_t ProcessEscapes (char *str); static size_t ProcessEscapes (char *str);
}; };