Codechange: simplify StringParameters now type cannot be nullptr

This commit is contained in:
Rubidium 2023-06-20 19:16:38 +02:00 committed by rubidium42
parent 428333aeba
commit 7a785a4224
2 changed files with 10 additions and 16 deletions

View File

@ -187,7 +187,7 @@ void CopyOutDParam(uint64 *dst, const char **strings, StringID string, int num)
MemCpyT(dst, _global_string_params.GetPointerToOffset(0), num);
for (int i = 0; i < num; i++) {
if (_global_string_params.HasTypeInformation() && _global_string_params.GetTypeAtOffset(i) == SCC_RAW_STRING_POINTER) {
if (_global_string_params.GetTypeAtOffset(i) == SCC_RAW_STRING_POINTER) {
strings[i] = stredup((const char *)(size_t)_global_string_params.GetParam(i));
dst[i] = (size_t)strings[i];
} else {
@ -851,12 +851,14 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara
{
size_t orig_offset = args.GetOffset();
if (!dry_run && args.HasTypeInformation()) {
if (!dry_run) {
/*
* FormatString was called without `dry_run` set, however `args` has
* space allocated for type information and thus wants type checks on
* the parameters. So, we need to gather the type information via the
* dry run first, before we can continue formatting the string.
* This function is normally called with `dry_run` false, then we call this function again
* with `dry_run` being true. The dry run is required for the gender formatting. For the
* gender determination we need to format a sub string to get the gender, but for that we
* need to know as what string control code type the specific parameter is encoded. Since
* gendered words can be before the "parameter" words, this needs to be determined before
* the actual formatting.
*/
std::string buffer;
StringBuilder dry_run_builder(buffer);

View File

@ -17,7 +17,7 @@ class StringParameters {
protected:
StringParameters *parent = nullptr; ///< If not nullptr, this instance references data from this parent instance.
uint64 *data; ///< Array with the actual data.
WChar *type; ///< Array with type information about the data. Can be nullptr when no type information is needed. See #StringControlCode.
WChar *type; ///< Array with type information about the data. See #StringControlCode.
WChar next_type = 0; ///< The type of the next data that is retrieved.
size_t offset = 0; ///< Current offset in the data/type arrays.
@ -114,8 +114,7 @@ public:
*/
StringParameters GetRemainingParameters(size_t offset)
{
return StringParameters(&this->data[offset], GetDataLeft(),
this->type == nullptr ? nullptr : &this->type[offset]);
return StringParameters(&this->data[offset], GetDataLeft(), &this->type[offset]);
}
/** Return the amount of elements which can still be read. */
@ -131,17 +130,10 @@ public:
return &this->data[offset];
}
/** Does this instance store information about the type of the parameters. */
bool HasTypeInformation() const
{
return this->type != nullptr;
}
/** Get the type of a specific element. */
WChar GetTypeAtOffset(size_t offset) const
{
assert(offset < this->num_param);
assert(this->HasTypeInformation());
return this->type[offset];
}