diff options
author | rubidium <rubidium@openttd.org> | 2007-08-05 14:08:38 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-08-05 14:08:38 +0000 |
commit | 155a97359730b10ec325339a3b832d33cf56e7b3 (patch) | |
tree | 654acd5f96b2843fc7ad3ee95a1151f095fd21fe | |
parent | 3245f97832cd0d30dd7ef6e641f515aedb1a7275 (diff) | |
download | openttd-155a97359730b10ec325339a3b832d33cf56e7b3.tar.xz |
(svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
-rw-r--r-- | src/strings.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/strings.cpp b/src/strings.cpp index 78df8facd..70e995ba2 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -680,7 +680,18 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c const char* s = GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender. int len; int gender = 0; - if (s != NULL && Utf8Consume(&s) == SCC_GENDER_INDEX) gender = (byte)s[0]; + if (s != NULL) { + wchar_t c = Utf8Consume(&s); + /* Switch case is always put before genders, so remove those bits */ + if (c == SCC_SWITCH_CASE) { + /* Skip to the last (i.e. default) case */ + for (uint num = (byte)*s++; num != 0; num--) s += 3 + (s[1] << 8) + s[2]; + + c = Utf8Consume(&s); + } + /* Does this string have a gender, if so, set it */ + if (c == SCC_GENDER_INDEX) gender = (byte)s[0]; + } str = ParseStringChoice(str, gender, buff, &len); buff += len; break; |