OpenTTD Source 15.0-beta2
strgen.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10#ifndef STRGEN_H
11#define STRGEN_H
12
13#include "../language.h"
14#include "../3rdparty/fmt/format.h"
15
16#include <unordered_map>
17#include <array>
18
20struct Case {
21 uint8_t caseidx;
22 std::string string;
23
24 Case(uint8_t caseidx, const std::string &string);
25};
26
28struct LangString {
29 std::string name;
30 std::string english;
31 std::string translated;
32 size_t index;
33 size_t line;
34 std::vector<Case> translated_cases;
35
36 LangString(const std::string &name, const std::string &english, size_t index, size_t line);
37 void FreeTranslation();
38};
39
41struct StringData {
42 std::vector<std::shared_ptr<LangString>> strings;
43 std::unordered_map<std::string, std::shared_ptr<LangString>> name_to_string;
44 size_t tabs;
45 size_t max_strings;
47
48 StringData(size_t tabs);
49 void FreeTranslation();
50 void Add(std::shared_ptr<LangString> ls);
51 LangString *Find(const std::string &s);
52 uint32_t Version() const;
53 size_t CountInUse(size_t tab) const;
54};
55
59 const std::string file;
60 bool master;
62
63 StringReader(StringData &data, const std::string &file, bool master, bool translation);
64 virtual ~StringReader() = default;
65 void HandleString(char *str);
66
71 virtual std::optional<std::string> ReadLine() = 0;
72
77 virtual void HandlePragma(char *str, LanguagePackHeader &lang);
78
82 virtual void ParseFile();
83};
84
92 virtual void WriteStringID(const std::string &name, size_t stringid) = 0;
93
98 virtual void Finalise(const StringData &data) = 0;
99
101 virtual ~HeaderWriter() = default;
102
103 void WriteHeader(const StringData &data);
104};
105
113 virtual void WriteHeader(const LanguagePackHeader *header) = 0;
114
120 virtual void Write(const char *buffer, size_t length) = 0;
121
125 virtual void Finalise() = 0;
126
128 virtual ~LanguageWriter() = default;
129
130 virtual void WriteLength(size_t length);
131 virtual void WriteLang(const StringData &data);
132};
133
134struct CmdStruct;
135
136struct CmdPair {
137 const CmdStruct *cmd;
138 std::string param;
139};
140
142 std::vector<CmdPair> non_consuming_commands;
143 std::array<const CmdStruct*, 32> consuming_commands{ nullptr }; // ordered by param #
144};
145
146const CmdStruct *TranslateCmdForCompare(const CmdStruct *a);
147ParsedCommandStruct ExtractCommandString(const char *s, bool warnings);
148
149void StrgenWarningI(const std::string &msg);
150void StrgenErrorI(const std::string &msg);
151[[noreturn]] void StrgenFatalI(const std::string &msg);
152#define StrgenWarning(format_string, ...) StrgenWarningI(fmt::format(FMT_STRING(format_string) __VA_OPT__(,) __VA_ARGS__))
153#define StrgenError(format_string, ...) StrgenErrorI(fmt::format(FMT_STRING(format_string) __VA_OPT__(,) __VA_ARGS__))
154#define StrgenFatal(format_string, ...) StrgenFatalI(fmt::format(FMT_STRING(format_string) __VA_OPT__(,) __VA_ARGS__))
155std::optional<std::string_view> ParseWord(const char **buf);
156
159 std::string file = "(unknown file)";
160 size_t cur_line = 0;
161 size_t errors = 0;
162 size_t warnings = 0;
163 bool show_warnings = false;
164 bool annotate_todos = false;
165 bool translation = false;
167};
168extern StrgenState _strgen;
169
170#endif /* STRGEN_H */
Container for the different cases of a string.
Definition strgen.h:20
uint8_t caseidx
The index of the case.
Definition strgen.h:21
std::string string
The translation of the case.
Definition strgen.h:22
Base class for writing the header, i.e.
Definition strgen.h:86
virtual ~HeaderWriter()=default
Especially destroy the subclasses.
virtual void Finalise(const StringData &data)=0
Finalise writing the file.
virtual void WriteStringID(const std::string &name, size_t stringid)=0
Write the string ID.
void WriteHeader(const StringData &data)
Write the header information.
Information about a single string.
Definition strgen.h:28
size_t line
Line of string in source-file.
Definition strgen.h:33
std::string english
English text.
Definition strgen.h:30
std::vector< Case > translated_cases
Cases of the translation.
Definition strgen.h:34
std::string translated
Translated text.
Definition strgen.h:31
void FreeTranslation()
Free all data related to the translation.
std::string name
Name of the string.
Definition strgen.h:29
size_t index
The index in the language file.
Definition strgen.h:32
Header of a language file.
Definition language.h:24
Base class for all language writers.
Definition strgen.h:107
virtual void WriteHeader(const LanguagePackHeader *header)=0
Write the header metadata.
virtual void Finalise()=0
Finalise writing the file.
virtual void WriteLength(size_t length)
Write the length as a simple gamma.
virtual void Write(const char *buffer, size_t length)=0
Write a number of bytes.
virtual ~LanguageWriter()=default
Especially destroy the subclasses.
virtual void WriteLang(const StringData &data)
Actually write the language.
Global state shared between strgen.cpp, game_text.cpp and strgen_base.cpp.
Definition strgen.h:158
std::string file
The filename of the input, so we can refer to it in errors/warnings.
Definition strgen.h:159
bool translation
Is the current file actually a translation or not.
Definition strgen.h:165
LanguagePackHeader lang
Header information about a language.
Definition strgen.h:166
size_t cur_line
The current line we're parsing in the input file.
Definition strgen.h:160
Information about the currently known strings.
Definition strgen.h:41
size_t tabs
The number of 'tabs' of strings.
Definition strgen.h:44
std::unordered_map< std::string, std::shared_ptr< LangString > > name_to_string
Lookup table for the strings.
Definition strgen.h:43
void Add(std::shared_ptr< LangString > ls)
Add a newly created LangString.
size_t max_strings
The maximum number of strings.
Definition strgen.h:45
size_t next_string_id
The next string ID to allocate.
Definition strgen.h:46
void FreeTranslation()
Free all data related to the translation.
LangString * Find(const std::string &s)
Find a LangString based on the string name.
std::vector< std::shared_ptr< LangString > > strings
List of all known strings.
Definition strgen.h:42
uint32_t Version() const
Make a hash of the file to get a unique "version number".
size_t CountInUse(size_t tab) const
Count the number of tab elements that are in use.
Helper for reading strings.
Definition strgen.h:57
const std::string file
The file we are reading.
Definition strgen.h:59
StringData & data
The data to fill during reading.
Definition strgen.h:58
virtual void HandlePragma(char *str, LanguagePackHeader &lang)
Handle the pragma of the file.
virtual void ParseFile()
Start parsing the file.
bool translation
Are we reading a translation, implies !master. However, the base translation will have this false.
Definition strgen.h:61
virtual std::optional< std::string > ReadLine()=0
Read a single line from the source of strings.
bool master
Are we reading the master file?
Definition strgen.h:60