This commit is contained in:
IntelOrca 2015-09-28 18:10:41 +01:00
parent adebebe2d4
commit c6b0d0919d
3 changed files with 14 additions and 5 deletions

View File

@ -47,6 +47,8 @@ public:
/**
* Appends the given string of the given length to the current string. Essentially used to ignore null terminators or copy
* the data faster as the length is already known.
* @param text Pointer to the UTF-8 text to append.
* @param textLength Number of bytes to copy. (Can be used to append single bytes rather than codepoints)
*/
void Append(const utf8 *text, int textLength) {
EnsureCapacity(_length + textLength + 1);

View File

@ -415,11 +415,16 @@ void LanguagePack::ParseString(IStringReader *reader)
while (reader->TryPeek(&codepoint) && !IsNewLine(codepoint)) {
if (codepoint == '{') {
uint32 token;
if (!ParseToken(reader, &token)) {
bool isByte;
if (ParseToken(reader, &token, &isByte)) {
if (isByte) {
sb.Append((const utf8*)&token, 1);
} else {
sb.Append((int)token);
}
} else {
// Syntax error or unknown token, ignore line entirely
return;
} else {
sb.Append((int)token);
}
} else {
reader->Skip();
@ -451,7 +456,7 @@ void LanguagePack::ParseString(IStringReader *reader)
_stringDataSB.Append(&sb);
}
bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token)
bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token, bool *isByte)
{
auto sb = StringBuilder();
int codepoint;
@ -472,12 +477,14 @@ bool LanguagePack::ParseToken(IStringReader *reader, uint32 *token)
const utf8 *tokenName = sb.GetBuffer();
*token = format_get_code(tokenName);
*isByte = false;
// Handle explicit byte values
if (*token == 0) {
int number;
if (sscanf(tokenName, "%d", &number) == 1) {
*token = Math::Clamp(0, number, 255);
*isByte = true;
}
}

View File

@ -73,5 +73,5 @@ private:
void ParseGroupScenario(IStringReader *reader);
void ParseString(IStringReader *reader);
bool ParseToken(IStringReader *reader, uint32 *token);
bool ParseToken(IStringReader *reader, uint32 *token, bool *isByte);
};