Skip to content

Commit ebd4ebf

Browse files
committed
StringTable cleanup and improvements
cleaned up function interface to avoid referencing the file system in the worker functions. replaced StringTable's operators with functions.. The main reason is that these are far easier to look up when browsing the source. This also fixes a premature translation in SBARINFO that was done in the parsing stage, not the printing stage.
1 parent f4a42da commit ebd4ebf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+245
-246
lines changed

src/am_map.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,19 +216,19 @@ CCMD(am_togglefollow)
216216
am_followplayer = !am_followplayer;
217217
if (primaryLevel && primaryLevel->automap)
218218
primaryLevel->automap->ResetFollowLocation();
219-
Printf("%s\n", GStrings(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF"));
219+
Printf("%s\n", GStrings.GetString(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF"));
220220
}
221221

222222
CCMD(am_togglegrid)
223223
{
224224
am_showgrid = !am_showgrid;
225-
Printf("%s\n", GStrings(am_showgrid ? "AMSTR_GRIDON" : "AMSTR_GRIDOFF"));
225+
Printf("%s\n", GStrings.GetString(am_showgrid ? "AMSTR_GRIDON" : "AMSTR_GRIDOFF"));
226226
}
227227

228228
CCMD(am_toggletexture)
229229
{
230230
am_textured = !am_textured;
231-
Printf("%s\n", GStrings(am_textured ? "AMSTR_TEXON" : "AMSTR_TEXOFF"));
231+
Printf("%s\n", GStrings.GetString(am_textured ? "AMSTR_TEXON" : "AMSTR_TEXOFF"));
232232
}
233233

234234
CCMD(am_setmark)
@@ -238,7 +238,7 @@ CCMD(am_setmark)
238238
int m = primaryLevel->automap->addMark();
239239
if (m >= 0)
240240
{
241-
Printf("%s %d\n", GStrings("AMSTR_MARKEDSPOT"), m);
241+
Printf("%s %d\n", GStrings.GetString("AMSTR_MARKEDSPOT"), m);
242242
}
243243
}
244244
}
@@ -247,7 +247,7 @@ CCMD(am_clearmarks)
247247
{
248248
if (primaryLevel && primaryLevel->automap && primaryLevel->automap->clearMarks())
249249
{
250-
Printf("%s\n", GStrings("AMSTR_MARKSCLEARED"));
250+
Printf("%s\n", GStrings.GetString("AMSTR_MARKSCLEARED"));
251251
}
252252
}
253253

src/bbannouncer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ bool AnnounceKill (AActor *killer, AActor *killee)
261261
playSound |= killer->CheckLocalView();
262262
}
263263

264-
message = GStrings(choice->Message);
264+
message = GStrings.GetString(choice->Message);
265265
if (message != NULL)
266266
{
267267
char assembled[1024];
@@ -293,7 +293,7 @@ bool AnnounceTelefrag (AActor *killer, AActor *killee)
293293

294294
if (cl_bbannounce && multiplayer)
295295
{
296-
const char *message = GStrings("OB_MPTELEFRAG");
296+
const char *message = GStrings.GetString("OB_MPTELEFRAG");
297297
if (message != NULL)
298298
{
299299
char assembled[1024];

src/common/2d/v_drawtext.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ void DrawText(F2DDrawer *drawer, FFont* font, int normalcolor, double x, double
380380
{
381381
return;
382382
}
383-
const char *txt = (parms.localize && string[0] == '$') ? GStrings(&string[1]) : string;
383+
const char *txt = (parms.localize && string[0] == '$') ? GStrings.GetString(&string[1]) : string;
384384
DrawTextCommon(drawer, font, normalcolor, x, y, (const uint8_t*)string, parms);
385385
}
386386

@@ -419,7 +419,7 @@ void DrawText(F2DDrawer *drawer, FFont *font, int normalcolor, double x, double
419419
{
420420
return;
421421
}
422-
const char *txt = (parms.localize && string[0] == '$') ? GStrings(&string[1]) : string.GetChars();
422+
const char *txt = (parms.localize && string[0] == '$') ? GStrings.GetString(&string[1]) : string.GetChars();
423423
DrawTextCommon(drawer, font, normalcolor, x, y, (uint8_t*)txt, parms);
424424
}
425425

src/common/console/c_enginecmds.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ CCMD (print)
8080
Printf ("print <name>: Print a string from the string table\n");
8181
return;
8282
}
83-
const char *str = GStrings[argv[1]];
83+
const char *str = GStrings.CheckString(argv[1]);
8484
if (str == NULL)
8585
{
8686
Printf ("%s unknown\n", argv[1]);
@@ -304,7 +304,7 @@ CCMD(printlocalized)
304304
return;
305305
}
306306
}
307-
Printf("%s\n", GStrings(argv[1]));
307+
Printf("%s\n", GStrings.GetString(argv[1]));
308308
}
309309

310310
}

src/common/engine/stringtable.cpp

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,29 @@
4747
//
4848
//==========================================================================
4949

50-
void FStringTable::LoadStrings (FileSys::FileSystem& fileSystem_, const char *language)
50+
void FStringTable::LoadStrings (FileSys::FileSystem& fileSystem, const char *language)
5151
{
5252
int lastlump, lump;
5353

54-
fileSystem = &fileSystem_;
5554
allStrings.Clear();
5655
lastlump = 0;
57-
while ((lump = fileSystem->FindLump("LMACROS", &lastlump)) != -1)
56+
while ((lump = fileSystem.FindLump("LMACROS", &lastlump)) != -1)
5857
{
59-
readMacros(lump);
58+
auto lumpdata = fileSystem.ReadFile(lump);
59+
readMacros(lumpdata.string(), lumpdata.size());
6060
}
6161

6262
lastlump = 0;
63-
while ((lump = fileSystem->FindLump ("LANGUAGE", &lastlump)) != -1)
63+
while ((lump = fileSystem.FindLump ("LANGUAGE", &lastlump)) != -1)
6464
{
65-
auto lumpdata = fileSystem->ReadFile(lump);
65+
auto lumpdata = fileSystem.ReadFile(lump);
66+
auto filenum = fileSystem.GetFileContainer(lump);
6667

67-
if (!ParseLanguageCSV(lump, lumpdata.string(), lumpdata.size()))
68-
LoadLanguage (lump, lumpdata.string(), lumpdata.size());
68+
if (!ParseLanguageCSV(filenum, lumpdata.string(), lumpdata.size()))
69+
LoadLanguage (filenum, lumpdata.string(), lumpdata.size());
6970
}
7071
UpdateLanguage(language);
7172
allMacros.Clear();
72-
fileSystem = nullptr;
7373
}
7474

7575

@@ -159,13 +159,12 @@ TArray<TArray<FString>> FStringTable::parseCSV(const char* buffer, size_t size)
159159
//
160160
//==========================================================================
161161

162-
bool FStringTable::readMacros(int lumpnum)
162+
bool FStringTable::readMacros(const char* buffer, size_t size)
163163
{
164-
auto lumpdata = fileSystem->ReadFile(lumpnum);
165-
auto data = parseCSV(lumpdata.string(), lumpdata.size());
164+
auto data = parseCSV(buffer, size);
166165

167166
allMacros.Clear();
168-
for (unsigned i = 1; i < data.Size(); i++)
167+
for (unsigned i = 1; i < size; i++)
169168
{
170169
auto macroname = data[i][0];
171170
FName name = macroname.GetChars();
@@ -187,7 +186,7 @@ bool FStringTable::readMacros(int lumpnum)
187186
//
188187
//==========================================================================
189188

190-
bool FStringTable::ParseLanguageCSV(int lumpnum, const char* buffer, size_t size)
189+
bool FStringTable::ParseLanguageCSV(int filenum, const char* buffer, size_t size)
191190
{
192191
if (size < 11) return false;
193192
if (strnicmp(buffer, "default,", 8) && strnicmp(buffer, "identifier,", 11 )) return false;
@@ -258,14 +257,14 @@ bool FStringTable::ParseLanguageCSV(int lumpnum, const char* buffer, size_t size
258257
FName strName = row[labelcol].GetChars();
259258
if (hasDefaultEntry)
260259
{
261-
DeleteForLabel(lumpnum, strName);
260+
DeleteForLabel(filenum, strName);
262261
}
263262
for (auto &langentry : langrows)
264263
{
265264
auto str = row[langentry.first];
266265
if (str.Len() > 0)
267266
{
268-
InsertString(lumpnum, langentry.second, strName, str);
267+
InsertString(filenum, langentry.second, strName, str);
269268
}
270269
else
271270
{
@@ -409,11 +408,10 @@ void FStringTable::DeleteString(int langid, FName label)
409408
//
410409
//==========================================================================
411410

412-
void FStringTable::DeleteForLabel(int lumpnum, FName label)
411+
void FStringTable::DeleteForLabel(int filenum, FName label)
413412
{
414413
decltype(allStrings)::Iterator it(allStrings);
415414
decltype(allStrings)::Pair *pair;
416-
auto filenum = fileSystem->GetFileContainer(lumpnum);
417415

418416
while (it.NextPair(pair))
419417
{
@@ -432,10 +430,10 @@ void FStringTable::DeleteForLabel(int lumpnum, FName label)
432430
//
433431
//==========================================================================
434432

435-
void FStringTable::InsertString(int lumpnum, int langid, FName label, const FString &string)
433+
void FStringTable::InsertString(int filenum, int langid, FName label, const FString &string)
436434
{
437435
const char *strlangid = (const char *)&langid;
438-
TableElement te = { fileSystem->GetFileContainer(lumpnum), { string, string, string, string } };
436+
TableElement te = { filenum, { string, string, string, string } };
439437
ptrdiff_t index;
440438
while ((index = te.strings[0].IndexOf("@[")) >= 0)
441439
{
@@ -579,7 +577,7 @@ bool FStringTable::exists(const char *name)
579577
//
580578
//==========================================================================
581579

582-
const char *FStringTable::GetString(const char *name, uint32_t *langtable, int gender) const
580+
const char *FStringTable::CheckString(const char *name, uint32_t *langtable, int gender) const
583581
{
584582
if (name == nullptr || *name == 0)
585583
{
@@ -590,15 +588,22 @@ const char *FStringTable::GetString(const char *name, uint32_t *langtable, int g
590588
FName nm(name, true);
591589
if (nm != NAME_None)
592590
{
591+
TableElement* bestItem = nullptr;
593592
for (auto map : currentLanguageSet)
594593
{
595594
auto item = map.second->CheckKey(nm);
596595
if (item)
597596
{
597+
if (bestItem && bestItem->filenum > item->filenum)
598+
{
599+
// prioritize content from later files, even if the language doesn't fully match.
600+
// This is mainly for Dehacked content.
601+
continue;
602+
}
598603
if (langtable) *langtable = map.first;
599604
auto c = item->strings[gender].GetChars();
600605
if (c && *c == '$' && c[1] == '$')
601-
return GetString(c + 2, langtable, gender);
606+
c = CheckString(c + 2, langtable, gender);
602607
return c;
603608
}
604609
}
@@ -608,7 +613,7 @@ const char *FStringTable::GetString(const char *name, uint32_t *langtable, int g
608613

609614
//==========================================================================
610615
//
611-
// Finds a string by name in a given language
616+
// Finds a string by name in a given language without attempting any substitution
612617
//
613618
//==========================================================================
614619

@@ -655,9 +660,9 @@ bool FStringTable::MatchDefaultString(const char *name, const char *content) con
655660
//
656661
//==========================================================================
657662

658-
const char *FStringTable::operator() (const char *name) const
663+
const char *FStringTable::GetString(const char *name) const
659664
{
660-
const char *str = operator[] (name);
665+
const char *str = CheckString(name, nullptr);
661666
return str ? str : name;
662667
}
663668

src/common/engine/stringtable.h

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,32 +95,27 @@ class FStringTable
9595

9696
const char *GetLanguageString(const char *name, uint32_t langtable, int gender = -1) const;
9797
bool MatchDefaultString(const char *name, const char *content) const;
98-
const char *GetString(const char *name, uint32_t *langtable, int gender = -1) const;
99-
const char *operator() (const char *name) const; // Never returns NULL
100-
const char* operator() (const FString& name) const { return operator()(name.GetChars()); }
101-
const char *operator[] (const char *name) const
102-
{
103-
return GetString(name, nullptr);
104-
}
98+
const char *CheckString(const char *name, uint32_t *langtable = nullptr, int gender = -1) const;
99+
const char* GetString(const char* name) const;
100+
const char* GetString(const FString& name) const { return GetString(name.GetChars()); }
105101
bool exists(const char *name);
106102

107-
void InsertString(int lumpnum, int langid, FName label, const FString& string);
103+
void InsertString(int filenum, int langid, FName label, const FString& string);
108104

109105
private:
110106

111-
FileSys::FileSystem* fileSystem;
112107
FString activeLanguage;
113108
StringMacroMap allMacros;
114109
LangMap allStrings;
115110
TArray<std::pair<uint32_t, StringMap*>> currentLanguageSet;
116111

117112
void LoadLanguage (int lumpnum, const char* buffer, size_t size);
118113
TArray<TArray<FString>> parseCSV(const char* buffer, size_t size);
119-
bool ParseLanguageCSV(int lumpnum, const char* buffer, size_t size);
114+
bool ParseLanguageCSV(int filenum, const char* buffer, size_t size);
120115

121-
bool readMacros(int lumpnum);
116+
bool readMacros(const char* buffer, size_t size);
122117
void DeleteString(int langid, FName label);
123-
void DeleteForLabel(int lumpnum, FName label);
118+
void DeleteForLabel(int filenum, FName label);
124119

125120
static size_t ProcessEscapes (char *str);
126121
public:
@@ -138,7 +133,7 @@ class FStringTable
138133

139134
const char* localize(const char* str)
140135
{
141-
return *str == '$' ? operator()(str + 1) : str;
136+
return *str == '$' ? GetString(str + 1) : str;
142137
}
143138
};
144139

src/common/fonts/v_text.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,12 +271,12 @@ bool CheckFontComplete(FFont* font)
271271
{
272272
// Also check if the SmallFont contains all characters this language needs.
273273
// If not, switch back to the original one.
274-
return font->CanPrint(GStrings["REQUIRED_CHARACTERS"]);
274+
return font->CanPrint(GStrings.CheckString("REQUIRED_CHARACTERS"));
275275
}
276276

277277
void UpdateGenericUI(bool cvar)
278278
{
279-
auto switchstr = GStrings["USE_GENERIC_FONT"];
279+
auto switchstr = GStrings.CheckString("USE_GENERIC_FONT");
280280
generic_ui = (cvar || (switchstr && strtoll(switchstr, nullptr, 0)));
281281
if (!generic_ui)
282282
{
@@ -311,7 +311,7 @@ void UpdateGenericUI(bool cvar)
311311
}
312312
}
313313
// Turkish i crap. What a mess, just to save two code points... :(
314-
switchstr = GStrings["REQUIRED_CHARACTERS"];
314+
switchstr = GStrings.CheckString("REQUIRED_CHARACTERS");
315315
special_i = switchstr && strstr(switchstr, "\xc4\xb0") != nullptr; // capital dotted i (İ).
316316
if (special_i)
317317
{

src/common/menu/savegamemanager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ DEFINE_ACTION_FUNCTION(FSavegameManager, GetSavegame)
470470

471471
void FSavegameManagerBase::InsertNewSaveNode()
472472
{
473-
NewSaveNode.SaveTitle = GStrings("NEWSAVE");
473+
NewSaveNode.SaveTitle = GStrings.GetString("NEWSAVE");
474474
NewSaveNode.bNoDelete = true;
475475
SaveGames.Insert(0, &NewSaveNode);
476476
}

src/common/scripting/interface/stringformat.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,9 @@ DEFINE_ACTION_FUNCTION(FStringStruct, DeleteLastCharacter)
282282

283283
static void LocalizeString(const FString &label, bool prefixed, FString *result)
284284
{
285-
if (!prefixed) *result = GStrings(label);
285+
if (!prefixed) *result = GStrings.GetString(label);
286286
else if (label[0] != '$') *result = label;
287-
else *result = GStrings(&label[1]);
287+
else *result = GStrings.GetString(&label[1]);
288288
}
289289

290290
DEFINE_ACTION_FUNCTION_NATIVE(FStringTable, Localize, LocalizeString)

src/common/scripting/interface/vmnatives.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetBottomAlignOffset, GetBottomAlignOffset)
670670

671671
static int StringWidth(FFont *font, const FString &str, int localize)
672672
{
673-
const char *txt = (localize && str[0] == '$') ? GStrings(&str[1]) : str.GetChars();
673+
const char *txt = (localize && str[0] == '$') ? GStrings.GetString(&str[1]) : str.GetChars();
674674
return font->StringWidth(txt);
675675
}
676676

@@ -684,7 +684,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, StringWidth, StringWidth)
684684

685685
static int GetMaxAscender(FFont* font, const FString& str, int localize)
686686
{
687-
const char* txt = (localize && str[0] == '$') ? GStrings(&str[1]) : str.GetChars();
687+
const char* txt = (localize && str[0] == '$') ? GStrings.GetString(&str[1]) : str.GetChars();
688688
return font->GetMaxAscender(txt);
689689
}
690690

@@ -698,7 +698,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetMaxAscender, GetMaxAscender)
698698

699699
static int CanPrint(FFont *font, const FString &str, int localize)
700700
{
701-
const char *txt = (localize && str[0] == '$') ? GStrings(&str[1]) : str.GetChars();
701+
const char *txt = (localize && str[0] == '$') ? GStrings.GetString(&str[1]) : str.GetChars();
702702
return font->CanPrint(txt);
703703
}
704704

src/common/startscreen/endoom.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ FEndoomScreen::FEndoomScreen(int loading_lump)
111111
StartupBitmap.Create(80 * 8, 26 * 16); // line 26 is for our own 'press any key to quit' message.
112112
DrawTextScreen(StartupBitmap, endoom_screen);
113113
ClearBlock(StartupBitmap, {0, 0, 0, 255}, 0, 25*16, 640, 16);
114-
DrawString(StartupBitmap, 0, 25, GStrings("TXT_QUITENDOOM"), { 128, 128, 128 ,255}, { 0, 0, 0, 255});
114+
DrawString(StartupBitmap, 0, 25, GStrings.GetString("TXT_QUITENDOOM"), { 128, 128, 128 ,255}, { 0, 0, 0, 255});
115115
lastUpdateTime = I_msTime();
116116

117117
// Does this screen need blinking?

src/common/startscreen/startscreen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ bool FStartScreen::NetInit(const char* message, int numplayers)
607607
{
608608
NetMaxPos = numplayers;
609609
NetCurPos = 0;
610-
NetMessageString.Format("%s %s", message, GStrings("TXT_NET_PRESSESC"));
610+
NetMessageString.Format("%s %s", message, GStrings.GetString("TXT_NET_PRESSESC"));
611611
NetProgress(1); // You always know about yourself
612612
return true;
613613
}

0 commit comments

Comments
 (0)